From 659ec263572821f752f87ea4f7e4c13fcdd20461 Mon Sep 17 00:00:00 2001 From: Peter Breitenlohner Date: Thu, 10 Sep 2015 06:46:36 +0000 Subject: poppler 0.36.0 git-svn-id: svn://tug.org/texlive/trunk@38335 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/libs/poppler/ChangeLog | 5 + Build/source/libs/poppler/Makefile.in | 4 +- Build/source/libs/poppler/configure | 30 +- .../libs/poppler/poppler-0.35.0-PATCHES/ChangeLog | 282 - .../libs/poppler/poppler-0.35.0-PATCHES/TL-Changes | 30 - .../poppler-0.35.0-PATCHES/patch-02-LLONG_MAX | 25 - .../patch-03-Object-functions | 43 - Build/source/libs/poppler/poppler-0.35.0/AUTHORS | 5 - .../libs/poppler/poppler-0.35.0/CMakeLists.txt | 741 - Build/source/libs/poppler/poppler-0.35.0/COPYING | 339 - Build/source/libs/poppler/poppler-0.35.0/ChangeLog | 58141 ------------------ .../poppler/poppler-0.35.0/ConfigureChecks.cmake | 61 - Build/source/libs/poppler/poppler-0.35.0/INSTALL | 236 - .../source/libs/poppler/poppler-0.35.0/Makefile.am | 131 - Build/source/libs/poppler/poppler-0.35.0/NEWS | 2363 - Build/source/libs/poppler/poppler-0.35.0/README | 37 - .../source/libs/poppler/poppler-0.35.0/README-XPDF | 423 - Build/source/libs/poppler/poppler-0.35.0/TODO | 40 - .../libs/poppler/poppler-0.35.0/config.h.cmake | 234 - .../source/libs/poppler/poppler-0.35.0/config.h.in | 276 - .../libs/poppler/poppler-0.35.0/configure.ac | 1050 - .../libs/poppler/poppler-0.35.0/fofi/FoFiBase.cc | 201 - .../libs/poppler/poppler-0.35.0/fofi/FoFiBase.h | 56 - .../poppler/poppler-0.35.0/fofi/FoFiEncodings.cc | 994 - .../poppler/poppler-0.35.0/fofi/FoFiEncodings.h | 34 - .../poppler/poppler-0.35.0/fofi/FoFiIdentifier.cc | 648 - .../poppler/poppler-0.35.0/fofi/FoFiIdentifier.h | 42 - .../poppler/poppler-0.35.0/fofi/FoFiTrueType.cc | 1863 - .../poppler/poppler-0.35.0/fofi/FoFiTrueType.h | 209 - .../libs/poppler/poppler-0.35.0/fofi/FoFiType1.cc | 359 - .../libs/poppler/poppler-0.35.0/fofi/FoFiType1.h | 62 - .../libs/poppler/poppler-0.35.0/fofi/FoFiType1C.cc | 2745 - .../libs/poppler/poppler-0.35.0/fofi/FoFiType1C.h | 266 - .../libs/poppler/poppler-0.35.0/fofi/Makefile.am | 28 - .../libs/poppler/poppler-0.35.0/goo/FixedPoint.cc | 135 - .../libs/poppler/poppler-0.35.0/goo/FixedPoint.h | 166 - .../libs/poppler/poppler-0.35.0/goo/GooHash.cc | 384 - .../libs/poppler/poppler-0.35.0/goo/GooHash.h | 92 - .../libs/poppler/poppler-0.35.0/goo/GooLikely.h | 22 - .../libs/poppler/poppler-0.35.0/goo/GooList.cc | 122 - .../libs/poppler/poppler-0.35.0/goo/GooList.h | 120 - .../libs/poppler/poppler-0.35.0/goo/GooMutex.h | 85 - .../libs/poppler/poppler-0.35.0/goo/GooString.cc | 962 - .../libs/poppler/poppler-0.35.0/goo/GooString.h | 233 - .../libs/poppler/poppler-0.35.0/goo/GooTimer.cc | 95 - .../libs/poppler/poppler-0.35.0/goo/GooTimer.h | 62 - .../libs/poppler/poppler-0.35.0/goo/ImgWriter.cc | 15 - .../libs/poppler/poppler-0.35.0/goo/ImgWriter.h | 33 - .../libs/poppler/poppler-0.35.0/goo/JpegWriter.cc | 184 - .../libs/poppler/poppler-0.35.0/goo/JpegWriter.h | 59 - .../libs/poppler/poppler-0.35.0/goo/Makefile.am | 66 - .../poppler/poppler-0.35.0/goo/NetPBMWriter.cc | 84 - .../libs/poppler/poppler-0.35.0/goo/NetPBMWriter.h | 52 - .../libs/poppler/poppler-0.35.0/goo/PNGWriter.cc | 189 - .../libs/poppler/poppler-0.35.0/goo/PNGWriter.h | 61 - .../libs/poppler/poppler-0.35.0/goo/TiffWriter.cc | 236 - .../libs/poppler/poppler-0.35.0/goo/TiffWriter.h | 60 - .../libs/poppler/poppler-0.35.0/goo/gfile.cc | 811 - .../source/libs/poppler/poppler-0.35.0/goo/gfile.h | 209 - .../source/libs/poppler/poppler-0.35.0/goo/gmem.cc | 326 - .../source/libs/poppler/poppler-0.35.0/goo/gmem.h | 92 - .../libs/poppler/poppler-0.35.0/goo/gmempp.cc | 32 - .../libs/poppler/poppler-0.35.0/goo/grandom.cc | 70 - .../libs/poppler/poppler-0.35.0/goo/grandom.h | 34 - .../libs/poppler/poppler-0.35.0/goo/gstrtod.cc | 147 - .../libs/poppler/poppler-0.35.0/goo/gstrtod.h | 43 - .../libs/poppler/poppler-0.35.0/goo/gtypes.h | 52 - .../libs/poppler/poppler-0.35.0/goo/gtypes_p.h | 30 - .../libs/poppler/poppler-0.35.0/gtk-doc.make | 289 - .../poppler-0.35.0/poppler-cairo-uninstalled.pc.in | 6 - .../poppler/poppler-0.35.0/poppler-cairo.pc.cmake | 9 - .../poppler/poppler-0.35.0/poppler-cairo.pc.in | 9 - .../poppler-0.35.0/poppler-cpp-uninstalled.pc.in | 7 - .../poppler/poppler-0.35.0/poppler-cpp.pc.cmake | 13 - .../libs/poppler/poppler-0.35.0/poppler-cpp.pc.in | 13 - .../poppler-0.35.0/poppler-glib-uninstalled.pc.in | 7 - .../poppler/poppler-0.35.0/poppler-glib.pc.cmake | 13 - .../libs/poppler/poppler-0.35.0/poppler-glib.pc.in | 13 - .../poppler-0.35.0/poppler-qt4-uninstalled.pc.in | 7 - .../poppler/poppler-0.35.0/poppler-qt4.pc.cmake | 13 - .../libs/poppler/poppler-0.35.0/poppler-qt4.pc.in | 13 - .../poppler-0.35.0/poppler-qt5-uninstalled.pc.in | 7 - .../poppler/poppler-0.35.0/poppler-qt5.pc.cmake | 13 - .../libs/poppler/poppler-0.35.0/poppler-qt5.pc.in | 13 - .../poppler-splash-uninstalled.pc.in | 7 - .../poppler/poppler-0.35.0/poppler-splash.pc.cmake | 9 - .../poppler/poppler-0.35.0/poppler-splash.pc.in | 9 - .../poppler-0.35.0/poppler-uninstalled.pc.in | 6 - .../libs/poppler/poppler-0.35.0/poppler.pc.cmake | 11 - .../libs/poppler/poppler-0.35.0/poppler.pc.in | 11 - .../libs/poppler/poppler-0.35.0/poppler/Annot.cc | 6872 --- .../libs/poppler/poppler-0.35.0/poppler/Annot.h | 1439 - .../libs/poppler/poppler-0.35.0/poppler/Array.cc | 152 - .../libs/poppler/poppler-0.35.0/poppler/Array.h | 84 - .../poppler/poppler-0.35.0/poppler/BuiltinFont.cc | 65 - .../poppler/poppler-0.35.0/poppler/BuiltinFont.h | 55 - .../poppler-0.35.0/poppler/BuiltinFontTables.cc | 4284 -- .../poppler-0.35.0/poppler/BuiltinFontTables.h | 23 - .../libs/poppler/poppler-0.35.0/poppler/CMap.cc | 598 - .../libs/poppler/poppler-0.35.0/poppler/CMap.h | 145 - .../poppler/poppler-0.35.0/poppler/CachedFile.cc | 257 - .../poppler/poppler-0.35.0/poppler/CachedFile.h | 146 - .../poppler-0.35.0/poppler/CairoFontEngine.cc | 832 - .../poppler-0.35.0/poppler/CairoFontEngine.h | 129 - .../poppler-0.35.0/poppler/CairoOutputDev.cc | 3329 -- .../poppler-0.35.0/poppler/CairoOutputDev.h | 517 - .../poppler-0.35.0/poppler/CairoRescaleBox.cc | 378 - .../poppler-0.35.0/poppler/CairoRescaleBox.h | 61 - .../libs/poppler/poppler-0.35.0/poppler/Catalog.cc | 1142 - .../libs/poppler/poppler-0.35.0/poppler/Catalog.h | 272 - .../poppler-0.35.0/poppler/CharCodeToUnicode.cc | 729 - .../poppler-0.35.0/poppler/CharCodeToUnicode.h | 146 - .../poppler/poppler-0.35.0/poppler/CharTypes.h | 24 - .../poppler-0.35.0/poppler/CompactFontTables.h | 480 - .../poppler-0.35.0/poppler/CurlCachedFile.cc | 99 - .../poppler-0.35.0/poppler/CurlCachedFile.h | 40 - .../poppler-0.35.0/poppler/CurlPDFDocBuilder.cc | 47 - .../poppler-0.35.0/poppler/CurlPDFDocBuilder.h | 33 - .../poppler/poppler-0.35.0/poppler/DCTStream.cc | 266 - .../poppler/poppler-0.35.0/poppler/DCTStream.h | 91 - .../poppler/poppler-0.35.0/poppler/DateInfo.cc | 118 - .../libs/poppler/poppler-0.35.0/poppler/DateInfo.h | 35 - .../libs/poppler/poppler-0.35.0/poppler/Decrypt.cc | 1417 - .../libs/poppler/poppler-0.35.0/poppler/Decrypt.h | 161 - .../libs/poppler/poppler-0.35.0/poppler/Dict.cc | 300 - .../libs/poppler/poppler-0.35.0/poppler/Dict.h | 112 - .../libs/poppler/poppler-0.35.0/poppler/Error.cc | 98 - .../libs/poppler/poppler-0.35.0/poppler/Error.h | 60 - .../poppler/poppler-0.35.0/poppler/ErrorCodes.h | 36 - .../poppler/poppler-0.35.0/poppler/FileSpec.cc | 295 - .../libs/poppler/poppler-0.35.0/poppler/FileSpec.h | 76 - .../poppler/poppler-0.35.0/poppler/FlateStream.cc | 128 - .../poppler/poppler-0.35.0/poppler/FlateStream.h | 77 - .../poppler-0.35.0/poppler/FontEncodingTables.cc | 1824 - .../poppler-0.35.0/poppler/FontEncodingTables.h | 20 - .../poppler/poppler-0.35.0/poppler/FontInfo.cc | 245 - .../libs/poppler/poppler-0.35.0/poppler/FontInfo.h | 103 - .../libs/poppler/poppler-0.35.0/poppler/Form.cc | 1612 - .../libs/poppler/poppler-0.35.0/poppler/Form.h | 563 - .../poppler/poppler-0.35.0/poppler/Function.cc | 1788 - .../libs/poppler/poppler-0.35.0/poppler/Function.h | 258 - .../libs/poppler/poppler-0.35.0/poppler/Gfx.cc | 5501 -- .../libs/poppler/poppler-0.35.0/poppler/Gfx.h | 387 - .../libs/poppler/poppler-0.35.0/poppler/GfxFont.cc | 2620 - .../libs/poppler/poppler-0.35.0/poppler/GfxFont.h | 444 - .../poppler/poppler-0.35.0/poppler/GfxState.cc | 7275 --- .../libs/poppler/poppler-0.35.0/poppler/GfxState.h | 1651 - .../poppler-0.35.0/poppler/GfxState_helpers.h | 82 - .../poppler/poppler-0.35.0/poppler/GlobalParams.cc | 2031 - .../poppler/poppler-0.35.0/poppler/GlobalParams.h | 336 - .../poppler-0.35.0/poppler/GlobalParamsWin.cc | 598 - .../libs/poppler/poppler-0.35.0/poppler/Hints.cc | 452 - .../libs/poppler/poppler-0.35.0/poppler/Hints.h | 95 - .../poppler-0.35.0/poppler/JArithmeticDecoder.cc | 355 - .../poppler-0.35.0/poppler/JArithmeticDecoder.h | 111 - .../poppler/poppler-0.35.0/poppler/JBIG2Stream.cc | 4292 -- .../poppler/poppler-0.35.0/poppler/JBIG2Stream.h | 169 - .../poppler-0.35.0/poppler/JPEG2000Stream.cc | 448 - .../poppler-0.35.0/poppler/JPEG2000Stream.h | 55 - .../poppler/poppler-0.35.0/poppler/JPXStream.cc | 3478 -- .../poppler/poppler-0.35.0/poppler/JPXStream.h | 338 - .../libs/poppler/poppler-0.35.0/poppler/Lexer.cc | 645 - .../libs/poppler/poppler-0.35.0/poppler/Lexer.h | 108 - .../poppler-0.35.0/poppler/Linearization.cc | 222 - .../poppler/poppler-0.35.0/poppler/Linearization.h | 45 - .../libs/poppler/poppler-0.35.0/poppler/Link.cc | 951 - .../libs/poppler/poppler-0.35.0/poppler/Link.h | 501 - .../poppler-0.35.0/poppler/LocalPDFDocBuilder.cc | 46 - .../poppler-0.35.0/poppler/LocalPDFDocBuilder.h | 33 - .../poppler/poppler-0.35.0/poppler/Makefile.am | 317 - .../poppler/MarkedContentOutputDev.cc | 212 - .../poppler/MarkedContentOutputDev.h | 130 - .../libs/poppler/poppler-0.35.0/poppler/Movie.cc | 285 - .../libs/poppler/poppler-0.35.0/poppler/Movie.h | 110 - .../poppler-0.35.0/poppler/NameToCharCode.cc | 116 - .../poppler-0.35.0/poppler/NameToCharCode.h | 40 - .../poppler-0.35.0/poppler/NameToUnicodeTable.h | 4484 -- .../libs/poppler/poppler-0.35.0/poppler/Object.cc | 252 - .../libs/poppler/poppler-0.35.0/poppler/Object.h | 373 - .../poppler-0.35.0/poppler/OptionalContent.cc | 553 - .../poppler-0.35.0/poppler/OptionalContent.h | 140 - .../libs/poppler/poppler-0.35.0/poppler/Outline.cc | 188 - .../libs/poppler/poppler-0.35.0/poppler/Outline.h | 89 - .../poppler/poppler-0.35.0/poppler/OutputDev.cc | 201 - .../poppler/poppler-0.35.0/poppler/OutputDev.h | 350 - .../libs/poppler/poppler-0.35.0/poppler/PDFDoc.cc | 1939 - .../libs/poppler/poppler-0.35.0/poppler/PDFDoc.h | 343 - .../poppler/poppler-0.35.0/poppler/PDFDocBuilder.h | 42 - .../poppler-0.35.0/poppler/PDFDocEncoding.cc | 69 - .../poppler-0.35.0/poppler/PDFDocEncoding.h | 34 - .../poppler-0.35.0/poppler/PDFDocFactory.cc | 72 - .../poppler/poppler-0.35.0/poppler/PDFDocFactory.h | 55 - .../poppler/poppler-0.35.0/poppler/PSOutputDev.cc | 7565 --- .../poppler/poppler-0.35.0/poppler/PSOutputDev.h | 546 - .../poppler/poppler-0.35.0/poppler/PSTokenizer.cc | 159 - .../poppler/poppler-0.35.0/poppler/PSTokenizer.h | 54 - .../libs/poppler/poppler-0.35.0/poppler/Page.cc | 860 - .../libs/poppler/poppler-0.35.0/poppler/Page.h | 287 - .../poppler-0.35.0/poppler/PageLabelInfo.cc | 230 - .../poppler/poppler-0.35.0/poppler/PageLabelInfo.h | 51 - .../poppler-0.35.0/poppler/PageLabelInfo_p.h | 153 - .../poppler-0.35.0/poppler/PageTransition.cc | 138 - .../poppler-0.35.0/poppler/PageTransition.h | 104 - .../libs/poppler/poppler-0.35.0/poppler/Parser.cc | 325 - .../libs/poppler/poppler-0.35.0/poppler/Parser.h | 82 - .../poppler/poppler-0.35.0/poppler/PopplerCache.cc | 163 - .../poppler/poppler-0.35.0/poppler/PopplerCache.h | 78 - .../poppler-0.35.0/poppler/PreScanOutputDev.cc | 369 - .../poppler-0.35.0/poppler/PreScanOutputDev.h | 182 - .../poppler/poppler-0.35.0/poppler/ProfileData.cc | 44 - .../poppler/poppler-0.35.0/poppler/ProfileData.h | 41 - .../poppler/poppler-0.35.0/poppler/Rendition.cc | 401 - .../poppler/poppler-0.35.0/poppler/Rendition.h | 157 - .../poppler-0.35.0/poppler/SecurityHandler.cc | 461 - .../poppler-0.35.0/poppler/SecurityHandler.h | 183 - .../libs/poppler/poppler-0.35.0/poppler/Sound.cc | 145 - .../libs/poppler/poppler-0.35.0/poppler/Sound.h | 74 - .../poppler-0.35.0/poppler/SplashOutputDev.cc | 4672 -- .../poppler-0.35.0/poppler/SplashOutputDev.h | 442 - .../poppler-0.35.0/poppler/StdinCachedFile.cc | 47 - .../poppler-0.35.0/poppler/StdinCachedFile.h | 27 - .../poppler-0.35.0/poppler/StdinPDFDocBuilder.cc | 43 - .../poppler-0.35.0/poppler/StdinPDFDocBuilder.h | 33 - .../poppler/poppler-0.35.0/poppler/Stream-CCITT.h | 478 - .../libs/poppler/poppler-0.35.0/poppler/Stream.cc | 5392 -- .../libs/poppler/poppler-0.35.0/poppler/Stream.h | 1258 - .../poppler-0.35.0/poppler/StructElement.cc | 1409 - .../poppler/poppler-0.35.0/poppler/StructElement.h | 310 - .../poppler-0.35.0/poppler/StructTreeRoot.cc | 175 - .../poppler-0.35.0/poppler/StructTreeRoot.h | 83 - .../poppler-0.35.0/poppler/TextOutputDev.cc | 5818 -- .../poppler/poppler-0.35.0/poppler/TextOutputDev.h | 880 - .../libs/poppler/poppler-0.35.0/poppler/UTF.cc | 116 - .../libs/poppler/poppler-0.35.0/poppler/UTF.h | 39 - .../libs/poppler/poppler-0.35.0/poppler/UTF8.h | 84 - .../poppler-0.35.0/poppler/UnicodeCClassTables.h | 1827 - .../poppler-0.35.0/poppler/UnicodeCompTables.h | 665 - .../poppler-0.35.0/poppler/UnicodeDecompTables.h | 8526 --- .../poppler/poppler-0.35.0/poppler/UnicodeMap.cc | 311 - .../poppler/poppler-0.35.0/poppler/UnicodeMap.h | 122 - .../poppler-0.35.0/poppler/UnicodeMapTables.h | 365 - .../poppler-0.35.0/poppler/UnicodeTypeTable.cc | 1223 - .../poppler-0.35.0/poppler/UnicodeTypeTable.h | 44 - .../poppler-0.35.0/poppler/ViewerPreferences.cc | 117 - .../poppler-0.35.0/poppler/ViewerPreferences.h | 76 - .../libs/poppler/poppler-0.35.0/poppler/XRef.cc | 1740 - .../libs/poppler/poppler-0.35.0/poppler/XRef.h | 281 - .../poppler-0.35.0/poppler/XpdfPluginAPI.cc | 243 - .../poppler/poppler-0.35.0/poppler/XpdfPluginAPI.h | 342 - .../poppler-0.35.0/poppler/gen-unicode-tables.py | 38 - .../poppler-0.35.0/poppler/poppler-config.h.cmake | 195 - .../poppler-0.35.0/poppler/poppler-config.h.in | 195 - .../poppler/poppler-0.35.0/poppler/strtok_r.cpp | 92 - .../libs/poppler/poppler-0.35.0/splash/Makefile.am | 73 - .../libs/poppler/poppler-0.35.0/splash/Splash.cc | 6459 -- .../libs/poppler/poppler-0.35.0/splash/Splash.h | 429 - .../poppler/poppler-0.35.0/splash/SplashBitmap.cc | 768 - .../poppler/poppler-0.35.0/splash/SplashBitmap.h | 109 - .../poppler/poppler-0.35.0/splash/SplashClip.cc | 411 - .../poppler/poppler-0.35.0/splash/SplashClip.h | 152 - .../poppler-0.35.0/splash/SplashErrorCodes.h | 50 - .../poppler/poppler-0.35.0/splash/SplashFTFont.cc | 513 - .../poppler/poppler-0.35.0/splash/SplashFTFont.h | 80 - .../poppler-0.35.0/splash/SplashFTFontEngine.cc | 180 - .../poppler-0.35.0/splash/SplashFTFontEngine.h | 81 - .../poppler-0.35.0/splash/SplashFTFontFile.cc | 148 - .../poppler-0.35.0/splash/SplashFTFontFile.h | 86 - .../poppler/poppler-0.35.0/splash/SplashFont.cc | 224 - .../poppler/poppler-0.35.0/splash/SplashFont.h | 121 - .../poppler-0.35.0/splash/SplashFontEngine.cc | 337 - .../poppler-0.35.0/splash/SplashFontEngine.h | 110 - .../poppler-0.35.0/splash/SplashFontFile.cc | 124 - .../poppler/poppler-0.35.0/splash/SplashFontFile.h | 95 - .../poppler-0.35.0/splash/SplashFontFileID.cc | 23 - .../poppler-0.35.0/splash/SplashFontFileID.h | 28 - .../poppler-0.35.0/splash/SplashGlyphBitmap.h | 24 - .../poppler/poppler-0.35.0/splash/SplashMath.h | 245 - .../poppler/poppler-0.35.0/splash/SplashPath.cc | 185 - .../poppler/poppler-0.35.0/splash/SplashPath.h | 123 - .../poppler/poppler-0.35.0/splash/SplashPattern.cc | 55 - .../poppler/poppler-0.35.0/splash/SplashPattern.h | 104 - .../poppler/poppler-0.35.0/splash/SplashScreen.cc | 387 - .../poppler/poppler-0.35.0/splash/SplashScreen.h | 80 - .../poppler/poppler-0.35.0/splash/SplashState.cc | 263 - .../poppler/poppler-0.35.0/splash/SplashState.h | 139 - .../poppler/poppler-0.35.0/splash/SplashT1Font.cc | 309 - .../poppler/poppler-0.35.0/splash/SplashT1Font.h | 69 - .../poppler-0.35.0/splash/SplashT1FontEngine.cc | 138 - .../poppler-0.35.0/splash/SplashT1FontEngine.h | 50 - .../poppler-0.35.0/splash/SplashT1FontFile.cc | 134 - .../poppler-0.35.0/splash/SplashT1FontFile.h | 70 - .../poppler/poppler-0.35.0/splash/SplashTypes.h | 199 - .../poppler/poppler-0.35.0/splash/SplashXPath.cc | 472 - .../poppler/poppler-0.35.0/splash/SplashXPath.h | 107 - .../poppler-0.35.0/splash/SplashXPathScanner.cc | 544 - .../poppler-0.35.0/splash/SplashXPathScanner.h | 108 - .../libs/poppler/poppler-0.36.0-PATCHES/ChangeLog | 289 + .../libs/poppler/poppler-0.36.0-PATCHES/TL-Changes | 30 + .../poppler-0.36.0-PATCHES/patch-02-LLONG_MAX | 25 + .../patch-03-Object-functions | 43 + Build/source/libs/poppler/poppler-0.36.0/AUTHORS | 5 + .../libs/poppler/poppler-0.36.0/CMakeLists.txt | 742 + Build/source/libs/poppler/poppler-0.36.0/COPYING | 339 + Build/source/libs/poppler/poppler-0.36.0/ChangeLog | 58499 +++++++++++++++++++ .../poppler/poppler-0.36.0/ConfigureChecks.cmake | 61 + Build/source/libs/poppler/poppler-0.36.0/INSTALL | 236 + .../source/libs/poppler/poppler-0.36.0/Makefile.am | 131 + Build/source/libs/poppler/poppler-0.36.0/NEWS | 2399 + Build/source/libs/poppler/poppler-0.36.0/README | 37 + .../source/libs/poppler/poppler-0.36.0/README-XPDF | 423 + Build/source/libs/poppler/poppler-0.36.0/TODO | 40 + .../libs/poppler/poppler-0.36.0/config.h.cmake | 234 + .../source/libs/poppler/poppler-0.36.0/config.h.in | 276 + .../libs/poppler/poppler-0.36.0/configure.ac | 1050 + .../libs/poppler/poppler-0.36.0/fofi/FoFiBase.cc | 201 + .../libs/poppler/poppler-0.36.0/fofi/FoFiBase.h | 56 + .../poppler/poppler-0.36.0/fofi/FoFiEncodings.cc | 994 + .../poppler/poppler-0.36.0/fofi/FoFiEncodings.h | 34 + .../poppler/poppler-0.36.0/fofi/FoFiIdentifier.cc | 648 + .../poppler/poppler-0.36.0/fofi/FoFiIdentifier.h | 42 + .../poppler/poppler-0.36.0/fofi/FoFiTrueType.cc | 1863 + .../poppler/poppler-0.36.0/fofi/FoFiTrueType.h | 209 + .../libs/poppler/poppler-0.36.0/fofi/FoFiType1.cc | 359 + .../libs/poppler/poppler-0.36.0/fofi/FoFiType1.h | 62 + .../libs/poppler/poppler-0.36.0/fofi/FoFiType1C.cc | 2745 + .../libs/poppler/poppler-0.36.0/fofi/FoFiType1C.h | 266 + .../libs/poppler/poppler-0.36.0/fofi/Makefile.am | 28 + .../libs/poppler/poppler-0.36.0/goo/FixedPoint.cc | 135 + .../libs/poppler/poppler-0.36.0/goo/FixedPoint.h | 166 + .../libs/poppler/poppler-0.36.0/goo/GooHash.cc | 384 + .../libs/poppler/poppler-0.36.0/goo/GooHash.h | 92 + .../libs/poppler/poppler-0.36.0/goo/GooLikely.h | 22 + .../libs/poppler/poppler-0.36.0/goo/GooList.cc | 122 + .../libs/poppler/poppler-0.36.0/goo/GooList.h | 120 + .../libs/poppler/poppler-0.36.0/goo/GooMutex.h | 85 + .../libs/poppler/poppler-0.36.0/goo/GooString.cc | 962 + .../libs/poppler/poppler-0.36.0/goo/GooString.h | 233 + .../libs/poppler/poppler-0.36.0/goo/GooTimer.cc | 95 + .../libs/poppler/poppler-0.36.0/goo/GooTimer.h | 62 + .../libs/poppler/poppler-0.36.0/goo/ImgWriter.cc | 15 + .../libs/poppler/poppler-0.36.0/goo/ImgWriter.h | 33 + .../libs/poppler/poppler-0.36.0/goo/JpegWriter.cc | 184 + .../libs/poppler/poppler-0.36.0/goo/JpegWriter.h | 59 + .../libs/poppler/poppler-0.36.0/goo/Makefile.am | 66 + .../poppler/poppler-0.36.0/goo/NetPBMWriter.cc | 84 + .../libs/poppler/poppler-0.36.0/goo/NetPBMWriter.h | 52 + .../libs/poppler/poppler-0.36.0/goo/PNGWriter.cc | 189 + .../libs/poppler/poppler-0.36.0/goo/PNGWriter.h | 61 + .../libs/poppler/poppler-0.36.0/goo/TiffWriter.cc | 236 + .../libs/poppler/poppler-0.36.0/goo/TiffWriter.h | 60 + .../libs/poppler/poppler-0.36.0/goo/gfile.cc | 811 + .../source/libs/poppler/poppler-0.36.0/goo/gfile.h | 209 + .../source/libs/poppler/poppler-0.36.0/goo/gmem.cc | 326 + .../source/libs/poppler/poppler-0.36.0/goo/gmem.h | 92 + .../libs/poppler/poppler-0.36.0/goo/gmempp.cc | 32 + .../libs/poppler/poppler-0.36.0/goo/grandom.cc | 70 + .../libs/poppler/poppler-0.36.0/goo/grandom.h | 34 + .../libs/poppler/poppler-0.36.0/goo/gstrtod.cc | 147 + .../libs/poppler/poppler-0.36.0/goo/gstrtod.h | 43 + .../libs/poppler/poppler-0.36.0/goo/gtypes.h | 52 + .../libs/poppler/poppler-0.36.0/goo/gtypes_p.h | 30 + .../libs/poppler/poppler-0.36.0/gtk-doc.make | 289 + .../poppler-0.36.0/poppler-cairo-uninstalled.pc.in | 6 + .../poppler/poppler-0.36.0/poppler-cairo.pc.cmake | 9 + .../poppler/poppler-0.36.0/poppler-cairo.pc.in | 9 + .../poppler-0.36.0/poppler-cpp-uninstalled.pc.in | 7 + .../poppler/poppler-0.36.0/poppler-cpp.pc.cmake | 13 + .../libs/poppler/poppler-0.36.0/poppler-cpp.pc.in | 13 + .../poppler-0.36.0/poppler-glib-uninstalled.pc.in | 7 + .../poppler/poppler-0.36.0/poppler-glib.pc.cmake | 13 + .../libs/poppler/poppler-0.36.0/poppler-glib.pc.in | 13 + .../poppler-0.36.0/poppler-qt4-uninstalled.pc.in | 7 + .../poppler/poppler-0.36.0/poppler-qt4.pc.cmake | 13 + .../libs/poppler/poppler-0.36.0/poppler-qt4.pc.in | 13 + .../poppler-0.36.0/poppler-qt5-uninstalled.pc.in | 7 + .../poppler/poppler-0.36.0/poppler-qt5.pc.cmake | 13 + .../libs/poppler/poppler-0.36.0/poppler-qt5.pc.in | 13 + .../poppler-splash-uninstalled.pc.in | 7 + .../poppler/poppler-0.36.0/poppler-splash.pc.cmake | 9 + .../poppler/poppler-0.36.0/poppler-splash.pc.in | 9 + .../poppler-0.36.0/poppler-uninstalled.pc.in | 6 + .../libs/poppler/poppler-0.36.0/poppler.pc.cmake | 11 + .../libs/poppler/poppler-0.36.0/poppler.pc.in | 11 + .../libs/poppler/poppler-0.36.0/poppler/Annot.cc | 7276 +++ .../libs/poppler/poppler-0.36.0/poppler/Annot.h | 1609 + .../libs/poppler/poppler-0.36.0/poppler/Array.cc | 152 + .../libs/poppler/poppler-0.36.0/poppler/Array.h | 84 + .../poppler/poppler-0.36.0/poppler/BuiltinFont.cc | 65 + .../poppler/poppler-0.36.0/poppler/BuiltinFont.h | 55 + .../poppler-0.36.0/poppler/BuiltinFontTables.cc | 4284 ++ .../poppler-0.36.0/poppler/BuiltinFontTables.h | 23 + .../libs/poppler/poppler-0.36.0/poppler/CMap.cc | 598 + .../libs/poppler/poppler-0.36.0/poppler/CMap.h | 145 + .../poppler/poppler-0.36.0/poppler/CachedFile.cc | 257 + .../poppler/poppler-0.36.0/poppler/CachedFile.h | 146 + .../poppler-0.36.0/poppler/CairoFontEngine.cc | 832 + .../poppler-0.36.0/poppler/CairoFontEngine.h | 129 + .../poppler-0.36.0/poppler/CairoOutputDev.cc | 3315 ++ .../poppler-0.36.0/poppler/CairoOutputDev.h | 517 + .../poppler-0.36.0/poppler/CairoRescaleBox.cc | 378 + .../poppler-0.36.0/poppler/CairoRescaleBox.h | 61 + .../libs/poppler/poppler-0.36.0/poppler/Catalog.cc | 1142 + .../libs/poppler/poppler-0.36.0/poppler/Catalog.h | 272 + .../poppler-0.36.0/poppler/CharCodeToUnicode.cc | 729 + .../poppler-0.36.0/poppler/CharCodeToUnicode.h | 146 + .../poppler/poppler-0.36.0/poppler/CharTypes.h | 24 + .../poppler-0.36.0/poppler/CompactFontTables.h | 480 + .../poppler-0.36.0/poppler/CurlCachedFile.cc | 99 + .../poppler-0.36.0/poppler/CurlCachedFile.h | 40 + .../poppler-0.36.0/poppler/CurlPDFDocBuilder.cc | 47 + .../poppler-0.36.0/poppler/CurlPDFDocBuilder.h | 33 + .../poppler/poppler-0.36.0/poppler/DCTStream.cc | 266 + .../poppler/poppler-0.36.0/poppler/DCTStream.h | 91 + .../poppler/poppler-0.36.0/poppler/DateInfo.cc | 118 + .../libs/poppler/poppler-0.36.0/poppler/DateInfo.h | 35 + .../libs/poppler/poppler-0.36.0/poppler/Decrypt.cc | 1417 + .../libs/poppler/poppler-0.36.0/poppler/Decrypt.h | 161 + .../libs/poppler/poppler-0.36.0/poppler/Dict.cc | 300 + .../libs/poppler/poppler-0.36.0/poppler/Dict.h | 112 + .../libs/poppler/poppler-0.36.0/poppler/Error.cc | 98 + .../libs/poppler/poppler-0.36.0/poppler/Error.h | 60 + .../poppler/poppler-0.36.0/poppler/ErrorCodes.h | 36 + .../poppler/poppler-0.36.0/poppler/FileSpec.cc | 295 + .../libs/poppler/poppler-0.36.0/poppler/FileSpec.h | 76 + .../poppler/poppler-0.36.0/poppler/FlateStream.cc | 128 + .../poppler/poppler-0.36.0/poppler/FlateStream.h | 77 + .../poppler-0.36.0/poppler/FontEncodingTables.cc | 1824 + .../poppler-0.36.0/poppler/FontEncodingTables.h | 20 + .../poppler/poppler-0.36.0/poppler/FontInfo.cc | 245 + .../libs/poppler/poppler-0.36.0/poppler/FontInfo.h | 103 + .../libs/poppler/poppler-0.36.0/poppler/Form.cc | 1612 + .../libs/poppler/poppler-0.36.0/poppler/Form.h | 563 + .../poppler/poppler-0.36.0/poppler/Function.cc | 1788 + .../libs/poppler/poppler-0.36.0/poppler/Function.h | 258 + .../libs/poppler/poppler-0.36.0/poppler/Gfx.cc | 5501 ++ .../libs/poppler/poppler-0.36.0/poppler/Gfx.h | 387 + .../libs/poppler/poppler-0.36.0/poppler/GfxFont.cc | 2620 + .../libs/poppler/poppler-0.36.0/poppler/GfxFont.h | 444 + .../poppler/poppler-0.36.0/poppler/GfxState.cc | 7273 +++ .../libs/poppler/poppler-0.36.0/poppler/GfxState.h | 1651 + .../poppler-0.36.0/poppler/GfxState_helpers.h | 82 + .../poppler/poppler-0.36.0/poppler/GlobalParams.cc | 2031 + .../poppler/poppler-0.36.0/poppler/GlobalParams.h | 336 + .../poppler-0.36.0/poppler/GlobalParamsWin.cc | 598 + .../libs/poppler/poppler-0.36.0/poppler/Hints.cc | 452 + .../libs/poppler/poppler-0.36.0/poppler/Hints.h | 95 + .../poppler-0.36.0/poppler/JArithmeticDecoder.cc | 355 + .../poppler-0.36.0/poppler/JArithmeticDecoder.h | 111 + .../poppler/poppler-0.36.0/poppler/JBIG2Stream.cc | 4292 ++ .../poppler/poppler-0.36.0/poppler/JBIG2Stream.h | 169 + .../poppler-0.36.0/poppler/JPEG2000Stream.cc | 448 + .../poppler-0.36.0/poppler/JPEG2000Stream.h | 55 + .../poppler/poppler-0.36.0/poppler/JPXStream.cc | 3478 ++ .../poppler/poppler-0.36.0/poppler/JPXStream.h | 338 + .../libs/poppler/poppler-0.36.0/poppler/Lexer.cc | 645 + .../libs/poppler/poppler-0.36.0/poppler/Lexer.h | 108 + .../poppler-0.36.0/poppler/Linearization.cc | 223 + .../poppler/poppler-0.36.0/poppler/Linearization.h | 45 + .../libs/poppler/poppler-0.36.0/poppler/Link.cc | 951 + .../libs/poppler/poppler-0.36.0/poppler/Link.h | 501 + .../poppler-0.36.0/poppler/LocalPDFDocBuilder.cc | 46 + .../poppler-0.36.0/poppler/LocalPDFDocBuilder.h | 33 + .../poppler/poppler-0.36.0/poppler/Makefile.am | 317 + .../poppler/MarkedContentOutputDev.cc | 212 + .../poppler/MarkedContentOutputDev.h | 130 + .../libs/poppler/poppler-0.36.0/poppler/Movie.cc | 285 + .../libs/poppler/poppler-0.36.0/poppler/Movie.h | 110 + .../poppler-0.36.0/poppler/NameToCharCode.cc | 116 + .../poppler-0.36.0/poppler/NameToCharCode.h | 40 + .../poppler-0.36.0/poppler/NameToUnicodeTable.h | 4484 ++ .../libs/poppler/poppler-0.36.0/poppler/Object.cc | 252 + .../libs/poppler/poppler-0.36.0/poppler/Object.h | 373 + .../poppler-0.36.0/poppler/OptionalContent.cc | 553 + .../poppler-0.36.0/poppler/OptionalContent.h | 140 + .../libs/poppler/poppler-0.36.0/poppler/Outline.cc | 188 + .../libs/poppler/poppler-0.36.0/poppler/Outline.h | 89 + .../poppler/poppler-0.36.0/poppler/OutputDev.cc | 201 + .../poppler/poppler-0.36.0/poppler/OutputDev.h | 350 + .../libs/poppler/poppler-0.36.0/poppler/PDFDoc.cc | 1955 + .../libs/poppler/poppler-0.36.0/poppler/PDFDoc.h | 343 + .../poppler/poppler-0.36.0/poppler/PDFDocBuilder.h | 42 + .../poppler-0.36.0/poppler/PDFDocEncoding.cc | 69 + .../poppler-0.36.0/poppler/PDFDocEncoding.h | 34 + .../poppler-0.36.0/poppler/PDFDocFactory.cc | 72 + .../poppler/poppler-0.36.0/poppler/PDFDocFactory.h | 55 + .../poppler/poppler-0.36.0/poppler/PSOutputDev.cc | 7565 +++ .../poppler/poppler-0.36.0/poppler/PSOutputDev.h | 546 + .../poppler/poppler-0.36.0/poppler/PSTokenizer.cc | 159 + .../poppler/poppler-0.36.0/poppler/PSTokenizer.h | 54 + .../libs/poppler/poppler-0.36.0/poppler/Page.cc | 860 + .../libs/poppler/poppler-0.36.0/poppler/Page.h | 287 + .../poppler-0.36.0/poppler/PageLabelInfo.cc | 230 + .../poppler/poppler-0.36.0/poppler/PageLabelInfo.h | 51 + .../poppler-0.36.0/poppler/PageLabelInfo_p.h | 153 + .../poppler-0.36.0/poppler/PageTransition.cc | 138 + .../poppler-0.36.0/poppler/PageTransition.h | 104 + .../libs/poppler/poppler-0.36.0/poppler/Parser.cc | 325 + .../libs/poppler/poppler-0.36.0/poppler/Parser.h | 82 + .../poppler/poppler-0.36.0/poppler/PopplerCache.cc | 163 + .../poppler/poppler-0.36.0/poppler/PopplerCache.h | 78 + .../poppler-0.36.0/poppler/PreScanOutputDev.cc | 369 + .../poppler-0.36.0/poppler/PreScanOutputDev.h | 182 + .../poppler/poppler-0.36.0/poppler/ProfileData.cc | 44 + .../poppler/poppler-0.36.0/poppler/ProfileData.h | 41 + .../poppler/poppler-0.36.0/poppler/Rendition.cc | 401 + .../poppler/poppler-0.36.0/poppler/Rendition.h | 157 + .../poppler-0.36.0/poppler/SecurityHandler.cc | 461 + .../poppler-0.36.0/poppler/SecurityHandler.h | 183 + .../libs/poppler/poppler-0.36.0/poppler/Sound.cc | 145 + .../libs/poppler/poppler-0.36.0/poppler/Sound.h | 74 + .../poppler-0.36.0/poppler/SplashOutputDev.cc | 4672 ++ .../poppler-0.36.0/poppler/SplashOutputDev.h | 442 + .../poppler-0.36.0/poppler/StdinCachedFile.cc | 47 + .../poppler-0.36.0/poppler/StdinCachedFile.h | 27 + .../poppler-0.36.0/poppler/StdinPDFDocBuilder.cc | 43 + .../poppler-0.36.0/poppler/StdinPDFDocBuilder.h | 33 + .../poppler/poppler-0.36.0/poppler/Stream-CCITT.h | 478 + .../libs/poppler/poppler-0.36.0/poppler/Stream.cc | 5388 ++ .../libs/poppler/poppler-0.36.0/poppler/Stream.h | 1258 + .../poppler-0.36.0/poppler/StructElement.cc | 1409 + .../poppler/poppler-0.36.0/poppler/StructElement.h | 310 + .../poppler-0.36.0/poppler/StructTreeRoot.cc | 175 + .../poppler-0.36.0/poppler/StructTreeRoot.h | 83 + .../poppler-0.36.0/poppler/TextOutputDev.cc | 5818 ++ .../poppler/poppler-0.36.0/poppler/TextOutputDev.h | 880 + .../libs/poppler/poppler-0.36.0/poppler/UTF.cc | 116 + .../libs/poppler/poppler-0.36.0/poppler/UTF.h | 39 + .../libs/poppler/poppler-0.36.0/poppler/UTF8.h | 84 + .../poppler-0.36.0/poppler/UnicodeCClassTables.h | 1827 + .../poppler-0.36.0/poppler/UnicodeCompTables.h | 665 + .../poppler-0.36.0/poppler/UnicodeDecompTables.h | 8526 +++ .../poppler/poppler-0.36.0/poppler/UnicodeMap.cc | 311 + .../poppler/poppler-0.36.0/poppler/UnicodeMap.h | 122 + .../poppler-0.36.0/poppler/UnicodeMapTables.h | 365 + .../poppler-0.36.0/poppler/UnicodeTypeTable.cc | 1223 + .../poppler-0.36.0/poppler/UnicodeTypeTable.h | 44 + .../poppler-0.36.0/poppler/ViewerPreferences.cc | 117 + .../poppler-0.36.0/poppler/ViewerPreferences.h | 76 + .../libs/poppler/poppler-0.36.0/poppler/XRef.cc | 1740 + .../libs/poppler/poppler-0.36.0/poppler/XRef.h | 281 + .../poppler-0.36.0/poppler/XpdfPluginAPI.cc | 243 + .../poppler/poppler-0.36.0/poppler/XpdfPluginAPI.h | 342 + .../poppler-0.36.0/poppler/gen-unicode-tables.py | 38 + .../poppler-0.36.0/poppler/poppler-config.h.cmake | 195 + .../poppler-0.36.0/poppler/poppler-config.h.in | 195 + .../poppler/poppler-0.36.0/poppler/strtok_r.cpp | 92 + .../libs/poppler/poppler-0.36.0/splash/Makefile.am | 73 + .../libs/poppler/poppler-0.36.0/splash/Splash.cc | 6461 ++ .../libs/poppler/poppler-0.36.0/splash/Splash.h | 429 + .../poppler/poppler-0.36.0/splash/SplashBitmap.cc | 795 + .../poppler/poppler-0.36.0/splash/SplashBitmap.h | 116 + .../poppler/poppler-0.36.0/splash/SplashClip.cc | 411 + .../poppler/poppler-0.36.0/splash/SplashClip.h | 152 + .../poppler-0.36.0/splash/SplashErrorCodes.h | 50 + .../poppler/poppler-0.36.0/splash/SplashFTFont.cc | 513 + .../poppler/poppler-0.36.0/splash/SplashFTFont.h | 80 + .../poppler-0.36.0/splash/SplashFTFontEngine.cc | 180 + .../poppler-0.36.0/splash/SplashFTFontEngine.h | 81 + .../poppler-0.36.0/splash/SplashFTFontFile.cc | 148 + .../poppler-0.36.0/splash/SplashFTFontFile.h | 86 + .../poppler/poppler-0.36.0/splash/SplashFont.cc | 224 + .../poppler/poppler-0.36.0/splash/SplashFont.h | 121 + .../poppler-0.36.0/splash/SplashFontEngine.cc | 337 + .../poppler-0.36.0/splash/SplashFontEngine.h | 110 + .../poppler-0.36.0/splash/SplashFontFile.cc | 124 + .../poppler/poppler-0.36.0/splash/SplashFontFile.h | 95 + .../poppler-0.36.0/splash/SplashFontFileID.cc | 23 + .../poppler-0.36.0/splash/SplashFontFileID.h | 28 + .../poppler-0.36.0/splash/SplashGlyphBitmap.h | 24 + .../poppler/poppler-0.36.0/splash/SplashMath.h | 245 + .../poppler/poppler-0.36.0/splash/SplashPath.cc | 185 + .../poppler/poppler-0.36.0/splash/SplashPath.h | 123 + .../poppler/poppler-0.36.0/splash/SplashPattern.cc | 55 + .../poppler/poppler-0.36.0/splash/SplashPattern.h | 104 + .../poppler/poppler-0.36.0/splash/SplashScreen.cc | 387 + .../poppler/poppler-0.36.0/splash/SplashScreen.h | 80 + .../poppler/poppler-0.36.0/splash/SplashState.cc | 263 + .../poppler/poppler-0.36.0/splash/SplashState.h | 139 + .../poppler/poppler-0.36.0/splash/SplashT1Font.cc | 309 + .../poppler/poppler-0.36.0/splash/SplashT1Font.h | 69 + .../poppler-0.36.0/splash/SplashT1FontEngine.cc | 138 + .../poppler-0.36.0/splash/SplashT1FontEngine.h | 50 + .../poppler-0.36.0/splash/SplashT1FontFile.cc | 134 + .../poppler-0.36.0/splash/SplashT1FontFile.h | 70 + .../poppler/poppler-0.36.0/splash/SplashTypes.h | 199 + .../poppler/poppler-0.36.0/splash/SplashXPath.cc | 472 + .../poppler/poppler-0.36.0/splash/SplashXPath.h | 107 + .../poppler-0.36.0/splash/SplashXPathScanner.cc | 544 + .../poppler-0.36.0/splash/SplashXPathScanner.h | 108 + Build/source/libs/poppler/version.ac | 2 +- 590 files changed, 219547 insertions(+), 218533 deletions(-) delete mode 100644 Build/source/libs/poppler/poppler-0.35.0-PATCHES/ChangeLog delete mode 100644 Build/source/libs/poppler/poppler-0.35.0-PATCHES/TL-Changes delete mode 100644 Build/source/libs/poppler/poppler-0.35.0-PATCHES/patch-02-LLONG_MAX delete mode 100644 Build/source/libs/poppler/poppler-0.35.0-PATCHES/patch-03-Object-functions delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/AUTHORS delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/CMakeLists.txt delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/COPYING delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/ChangeLog delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/ConfigureChecks.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/INSTALL delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/Makefile.am delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/NEWS delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/README delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/README-XPDF delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/TODO delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/config.h.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/config.h.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/configure.ac delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiBase.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiBase.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiEncodings.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiEncodings.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiIdentifier.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiIdentifier.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiTrueType.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiTrueType.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1C.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1C.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/fofi/Makefile.am delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/FixedPoint.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/FixedPoint.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooHash.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooHash.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooLikely.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooList.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooList.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooMutex.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooString.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooString.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooTimer.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/GooTimer.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/ImgWriter.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/ImgWriter.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/JpegWriter.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/JpegWriter.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/Makefile.am delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/NetPBMWriter.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/NetPBMWriter.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/PNGWriter.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/PNGWriter.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/TiffWriter.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/TiffWriter.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/gfile.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/gfile.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/gmem.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/gmem.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/gmempp.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/grandom.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/grandom.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/gstrtod.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/gstrtod.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/gtypes.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/goo/gtypes_p.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/gtk-doc.make delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-cairo-uninstalled.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-cairo.pc.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-cairo.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-cpp-uninstalled.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-cpp.pc.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-cpp.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-glib-uninstalled.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-glib.pc.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-glib.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-qt4-uninstalled.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-qt4.pc.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-qt4.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-qt5-uninstalled.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-qt5.pc.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-qt5.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-splash-uninstalled.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-splash.pc.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-splash.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler-uninstalled.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler.pc.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler.pc.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Annot.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Annot.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Array.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Array.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFont.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFont.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFontTables.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFontTables.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CMap.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CMap.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CachedFile.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CachedFile.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CairoFontEngine.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CairoFontEngine.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CairoOutputDev.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CairoOutputDev.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CairoRescaleBox.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CairoRescaleBox.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Catalog.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Catalog.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CharCodeToUnicode.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CharCodeToUnicode.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CharTypes.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CompactFontTables.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CurlCachedFile.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CurlCachedFile.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CurlPDFDocBuilder.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/CurlPDFDocBuilder.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/DCTStream.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/DCTStream.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/DateInfo.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/DateInfo.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Decrypt.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Decrypt.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Dict.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Dict.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Error.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Error.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/ErrorCodes.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/FileSpec.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/FileSpec.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/FlateStream.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/FlateStream.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/FontEncodingTables.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/FontEncodingTables.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/FontInfo.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/FontInfo.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Form.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Form.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Function.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Function.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Gfx.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Gfx.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/GfxFont.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/GfxFont.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState_helpers.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParams.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParams.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParamsWin.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Hints.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Hints.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/JArithmeticDecoder.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/JArithmeticDecoder.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/JBIG2Stream.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/JBIG2Stream.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/JPEG2000Stream.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/JPEG2000Stream.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/JPXStream.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/JPXStream.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Lexer.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Lexer.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Linearization.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Linearization.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Link.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Link.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/LocalPDFDocBuilder.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/LocalPDFDocBuilder.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Makefile.am delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/MarkedContentOutputDev.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/MarkedContentOutputDev.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Movie.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Movie.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/NameToCharCode.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/NameToCharCode.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/NameToUnicodeTable.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Object.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Object.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/OptionalContent.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/OptionalContent.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Outline.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Outline.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/OutputDev.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/OutputDev.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDoc.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDoc.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocBuilder.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocEncoding.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocEncoding.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocFactory.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocFactory.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PSOutputDev.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PSOutputDev.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PSTokenizer.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PSTokenizer.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Page.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Page.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo_p.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PageTransition.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PageTransition.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Parser.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Parser.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PopplerCache.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PopplerCache.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PreScanOutputDev.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/PreScanOutputDev.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/ProfileData.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/ProfileData.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Rendition.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Rendition.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/SecurityHandler.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/SecurityHandler.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Sound.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Sound.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/SplashOutputDev.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/SplashOutputDev.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/StdinCachedFile.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/StdinCachedFile.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/StdinPDFDocBuilder.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/StdinPDFDocBuilder.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Stream-CCITT.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Stream.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/Stream.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/StructElement.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/StructElement.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/StructTreeRoot.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/StructTreeRoot.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/TextOutputDev.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/TextOutputDev.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UTF.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UTF.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UTF8.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeCClassTables.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeCompTables.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeDecompTables.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMap.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMap.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMapTables.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeTypeTable.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeTypeTable.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/ViewerPreferences.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/ViewerPreferences.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/XRef.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/XRef.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/XpdfPluginAPI.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/XpdfPluginAPI.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/gen-unicode-tables.py delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/poppler-config.h.cmake delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/poppler-config.h.in delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/poppler/strtok_r.cpp delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/Makefile.am delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/Splash.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/Splash.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashBitmap.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashBitmap.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashClip.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashClip.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashErrorCodes.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFont.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFont.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontEngine.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontEngine.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontFile.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontFile.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFont.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFont.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontEngine.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontEngine.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFile.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFile.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFileID.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFileID.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashGlyphBitmap.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashMath.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashPath.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashPath.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashPattern.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashPattern.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashScreen.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashScreen.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashState.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashState.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1Font.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1Font.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontEngine.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontEngine.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontFile.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontFile.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashTypes.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPath.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPath.h delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPathScanner.cc delete mode 100644 Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPathScanner.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0-PATCHES/ChangeLog create mode 100644 Build/source/libs/poppler/poppler-0.36.0-PATCHES/TL-Changes create mode 100644 Build/source/libs/poppler/poppler-0.36.0-PATCHES/patch-02-LLONG_MAX create mode 100644 Build/source/libs/poppler/poppler-0.36.0-PATCHES/patch-03-Object-functions create mode 100644 Build/source/libs/poppler/poppler-0.36.0/AUTHORS create mode 100644 Build/source/libs/poppler/poppler-0.36.0/CMakeLists.txt create mode 100644 Build/source/libs/poppler/poppler-0.36.0/COPYING create mode 100644 Build/source/libs/poppler/poppler-0.36.0/ChangeLog create mode 100644 Build/source/libs/poppler/poppler-0.36.0/ConfigureChecks.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/INSTALL create mode 100644 Build/source/libs/poppler/poppler-0.36.0/Makefile.am create mode 100644 Build/source/libs/poppler/poppler-0.36.0/NEWS create mode 100644 Build/source/libs/poppler/poppler-0.36.0/README create mode 100644 Build/source/libs/poppler/poppler-0.36.0/README-XPDF create mode 100644 Build/source/libs/poppler/poppler-0.36.0/TODO create mode 100644 Build/source/libs/poppler/poppler-0.36.0/config.h.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/config.h.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/configure.ac create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiBase.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiBase.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiEncodings.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiEncodings.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiIdentifier.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiIdentifier.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiTrueType.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiTrueType.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1C.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1C.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/fofi/Makefile.am create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/FixedPoint.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/FixedPoint.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooHash.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooHash.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooLikely.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooList.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooList.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooMutex.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooString.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooString.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooTimer.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/GooTimer.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/ImgWriter.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/ImgWriter.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/JpegWriter.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/JpegWriter.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/Makefile.am create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/NetPBMWriter.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/NetPBMWriter.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/PNGWriter.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/PNGWriter.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/TiffWriter.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/TiffWriter.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/gfile.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/gfile.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/gmem.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/gmem.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/gmempp.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/grandom.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/grandom.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/gstrtod.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/gstrtod.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/gtypes.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/goo/gtypes_p.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/gtk-doc.make create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-cairo-uninstalled.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-cairo.pc.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-cairo.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-cpp-uninstalled.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-cpp.pc.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-cpp.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-glib-uninstalled.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-glib.pc.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-glib.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-qt4-uninstalled.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-qt4.pc.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-qt4.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-qt5-uninstalled.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-qt5.pc.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-qt5.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-splash-uninstalled.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-splash.pc.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-splash.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler-uninstalled.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler.pc.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler.pc.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Annot.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Annot.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Array.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Array.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFont.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFont.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFontTables.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFontTables.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CMap.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CMap.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CachedFile.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CachedFile.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CairoFontEngine.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CairoFontEngine.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CairoOutputDev.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CairoOutputDev.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CairoRescaleBox.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CairoRescaleBox.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Catalog.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Catalog.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CharCodeToUnicode.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CharCodeToUnicode.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CharTypes.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CompactFontTables.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CurlCachedFile.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CurlCachedFile.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CurlPDFDocBuilder.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/CurlPDFDocBuilder.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/DCTStream.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/DCTStream.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/DateInfo.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/DateInfo.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Decrypt.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Decrypt.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Dict.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Dict.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Error.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Error.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/ErrorCodes.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/FileSpec.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/FileSpec.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/FlateStream.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/FlateStream.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/FontEncodingTables.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/FontEncodingTables.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/FontInfo.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/FontInfo.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Form.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Form.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Function.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Function.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Gfx.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Gfx.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/GfxFont.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/GfxFont.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState_helpers.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParams.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParams.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParamsWin.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Hints.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Hints.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/JArithmeticDecoder.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/JArithmeticDecoder.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/JBIG2Stream.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/JBIG2Stream.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/JPEG2000Stream.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/JPEG2000Stream.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/JPXStream.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/JPXStream.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Lexer.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Lexer.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Linearization.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Linearization.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Link.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Link.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/LocalPDFDocBuilder.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/LocalPDFDocBuilder.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Makefile.am create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/MarkedContentOutputDev.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/MarkedContentOutputDev.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Movie.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Movie.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/NameToCharCode.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/NameToCharCode.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/NameToUnicodeTable.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Object.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Object.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/OptionalContent.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/OptionalContent.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Outline.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Outline.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/OutputDev.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/OutputDev.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDoc.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDoc.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocBuilder.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocEncoding.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocEncoding.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocFactory.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocFactory.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PSOutputDev.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PSOutputDev.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PSTokenizer.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PSTokenizer.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Page.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Page.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo_p.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PageTransition.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PageTransition.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Parser.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Parser.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PopplerCache.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PopplerCache.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PreScanOutputDev.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/PreScanOutputDev.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/ProfileData.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/ProfileData.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Rendition.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Rendition.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/SecurityHandler.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/SecurityHandler.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Sound.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Sound.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/SplashOutputDev.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/SplashOutputDev.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/StdinCachedFile.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/StdinCachedFile.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/StdinPDFDocBuilder.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/StdinPDFDocBuilder.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Stream-CCITT.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Stream.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/Stream.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/StructElement.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/StructElement.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/StructTreeRoot.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/StructTreeRoot.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/TextOutputDev.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/TextOutputDev.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UTF.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UTF.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UTF8.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeCClassTables.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeCompTables.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeDecompTables.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMap.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMap.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMapTables.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeTypeTable.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeTypeTable.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/ViewerPreferences.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/ViewerPreferences.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/XRef.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/XRef.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/XpdfPluginAPI.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/XpdfPluginAPI.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/gen-unicode-tables.py create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/poppler-config.h.cmake create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/poppler-config.h.in create mode 100644 Build/source/libs/poppler/poppler-0.36.0/poppler/strtok_r.cpp create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/Makefile.am create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/Splash.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/Splash.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashBitmap.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashBitmap.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashClip.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashClip.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashErrorCodes.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFont.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFont.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontEngine.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontEngine.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontFile.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontFile.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFont.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFont.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontEngine.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontEngine.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFile.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFile.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFileID.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFileID.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashGlyphBitmap.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashMath.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashPath.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashPath.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashPattern.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashPattern.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashScreen.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashScreen.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashState.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashState.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1Font.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1Font.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontEngine.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontEngine.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontFile.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontFile.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashTypes.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPath.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPath.h create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPathScanner.cc create mode 100644 Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPathScanner.h (limited to 'Build/source/libs/poppler') diff --git a/Build/source/libs/poppler/ChangeLog b/Build/source/libs/poppler/ChangeLog index 6eae6543a22..ac836d00128 100644 --- a/Build/source/libs/poppler/ChangeLog +++ b/Build/source/libs/poppler/ChangeLog @@ -1,3 +1,8 @@ +2015-09-10 Peter Breitenlohner + + Import poppler-0.36.0. + * version.ac: Adjust. + 2015-08-10 Peter Breitenlohner Import poppler-0.35.0. diff --git a/Build/source/libs/poppler/Makefile.in b/Build/source/libs/poppler/Makefile.in index 7e5ebf47345..bc38c7974ce 100644 --- a/Build/source/libs/poppler/Makefile.in +++ b/Build/source/libs/poppler/Makefile.in @@ -276,7 +276,7 @@ am__DIST_COMMON = $(srcdir)/../../am/dist_hook.am \ $(top_srcdir)/../../build-aux/depcomp \ $(top_srcdir)/../../build-aux/install-sh \ $(top_srcdir)/../../build-aux/missing \ - $(top_srcdir)/poppler-0.35.0/poppler/poppler-config.h.in \ + $(top_srcdir)/poppler-0.36.0/poppler/poppler-config.h.in \ ../../build-aux/compile ../../build-aux/config.guess \ ../../build-aux/config.sub ../../build-aux/depcomp \ ../../build-aux/install-sh ../../build-aux/ltmain.sh \ @@ -597,7 +597,7 @@ poppler-config.h: stamp-h2 @test -f $@ || rm -f stamp-h2 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h2 -stamp-h2: $(top_srcdir)/poppler-0.35.0/poppler/poppler-config.h.in $(top_builddir)/config.status +stamp-h2: $(top_srcdir)/poppler-0.36.0/poppler/poppler-config.h.in $(top_builddir)/config.status @rm -f stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status poppler-config.h diff --git a/Build/source/libs/poppler/configure b/Build/source/libs/poppler/configure index a25b547b9f5..d8934ab54b1 100755 --- a/Build/source/libs/poppler/configure +++ b/Build/source/libs/poppler/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for poppler (TeX Live) 0.35.0. +# Generated by GNU Autoconf 2.69 for poppler (TeX Live) 0.36.0. # # Report bugs to . # @@ -580,12 +580,12 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='poppler (TeX Live)' PACKAGE_TARNAME='poppler--tex-live-' -PACKAGE_VERSION='0.35.0' -PACKAGE_STRING='poppler (TeX Live) 0.35.0' +PACKAGE_VERSION='0.36.0' +PACKAGE_STRING='poppler (TeX Live) 0.36.0' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' -ac_unique_file="poppler-0.35.0/poppler/Array.cc" +ac_unique_file="poppler-0.36.0/poppler/Array.cc" # Factoring default headers for most tests. ac_includes_default="\ #include @@ -1306,7 +1306,7 @@ 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 (TeX Live) 0.35.0 to adapt to many kinds of systems. +\`configure' configures poppler (TeX Live) 0.36.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1373,7 +1373,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of poppler (TeX Live) 0.35.0:";; + short | recursive ) echo "Configuration of poppler (TeX Live) 0.36.0:";; esac cat <<\_ACEOF @@ -1486,7 +1486,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -poppler (TeX Live) configure 0.35.0 +poppler (TeX Live) configure 0.36.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2076,7 +2076,7 @@ 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 (TeX Live) $as_me 0.35.0, which was +It was created by poppler (TeX Live) $as_me 0.36.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3999,7 +3999,7 @@ fi # Define the identity of the package. PACKAGE='poppler--tex-live-' - VERSION='0.35.0' + VERSION='0.36.0' # Some tools Automake needs. @@ -6573,12 +6573,12 @@ fi ac_config_headers="$ac_config_headers config.h" -ac_config_headers="$ac_config_headers poppler-config.h:poppler-0.35.0/poppler/poppler-config.h.in" +ac_config_headers="$ac_config_headers poppler-config.h:poppler-0.36.0/poppler/poppler-config.h.in" cat >>confdefs.h <<_ACEOF -#define POPPLER_VERSION "0.35.0" +#define POPPLER_VERSION "0.36.0" _ACEOF @@ -6712,7 +6712,7 @@ fi $as_echo "#define ENABLE_ZLIB 1" >>confdefs.h -POPPLER_TREE=poppler-0.35.0 +POPPLER_TREE=poppler-0.36.0 ac_config_files="$ac_config_files Makefile include/Makefile include/goo/Makefile include/fofi/Makefile" @@ -7272,7 +7272,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by poppler (TeX Live) $as_me 0.35.0, which was +This file was extended by poppler (TeX Live) $as_me 0.36.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -7338,7 +7338,7 @@ _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 (TeX Live) config.status 0.35.0 +poppler (TeX Live) config.status 0.36.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -7469,7 +7469,7 @@ do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; - "poppler-config.h") CONFIG_HEADERS="$CONFIG_HEADERS poppler-config.h:poppler-0.35.0/poppler/poppler-config.h.in" ;; + "poppler-config.h") CONFIG_HEADERS="$CONFIG_HEADERS poppler-config.h:poppler-0.36.0/poppler/poppler-config.h.in" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "include/goo/Makefile") CONFIG_FILES="$CONFIG_FILES include/goo/Makefile" ;; diff --git a/Build/source/libs/poppler/poppler-0.35.0-PATCHES/ChangeLog b/Build/source/libs/poppler/poppler-0.35.0-PATCHES/ChangeLog deleted file mode 100644 index 59065cd60ea..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0-PATCHES/ChangeLog +++ /dev/null @@ -1,282 +0,0 @@ -2015-09-01 Peter Breitenlohner - - * patch-03-Object-functions (new): Declare parameter of Object - member functions initCmd, isStream, and streamIs as const. - -2015-08-10 Peter Breitenlohner - - Imported poppler-0.35.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2015-07-09 Peter Breitenlohner - - Imported poppler-0.34.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2015-06-12 Peter Breitenlohner - - Imported poppler-0.33.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2015-03-08 Peter Breitenlohner - - Imported poppler-0.32.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2015-02-06 Peter Breitenlohner - - Imported poppler-0.31.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2015-01-07 Peter Breitenlohner - - Imported poppler-0.30.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2014-12-05 Peter Breitenlohner - - Imported poppler-0.29.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2014-11-04 Peter Breitenlohner - - Imported poppler-0.28.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - * patch-10-UTF-16BE (removed): Included upstream. - -2014-10-08 Peter Breitenlohner - - * patch-10-UTF-16BE (new): Backport from poppler git - (submitted by Luigi Scarso ). - -2014-09-29 Peter Breitenlohner - - Imported poppler-0.26.5 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2014-08-22 Peter Breitenlohner - - Imported poppler-0.26.4 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2014-07-21 Peter Breitenlohner - - Imported poppler-0.26.3 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2014-06-20 Peter Breitenlohner - - Imported poppler-0.26.2 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2014-05-24 Peter Breitenlohner - - Imported poppler-0.26.1 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2014-05-19 Peter Breitenlohner - - Imported poppler-0.26.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - - * patch-03-NOMINMAX (removed): Now included upstream. - -2014-03-27 Peter Breitenlohner - - Imported poppler-0.25.2 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - - * patch-03-NOMINMAX (new): Avoid to redefine NOMINMAX. - -2014-01-03 Peter Breitenlohner - - Imported poppler-0.25.1 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2013-12-12 Peter Breitenlohner - - Imported poppler-0.25.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2013-12-02 Peter Breitenlohner - - Imported poppler-0.24.4 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2013-10-28 Peter Breitenlohner - - Imported poppler-0.24.3 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2013-09-30 Peter Breitenlohner - - Imported poppler-0.24.2 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2013-09-10 Peter Breitenlohner - - Imported poppler-0.24.1 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2013-07-30 Peter Breitenlohner - - Imported poppler-0.24.0 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2013-07-19 Peter Breitenlohner - - Imported poppler-0.23.4 source tree from: - http://poppler.freedesktop.org/ - - * patch-02-LLONG_MAX: Adapted. - -2013-07-02 Peter Breitenlohner - - Imported poppler-0.23.3 source tree from: - http://poppler.freedesktop.org/ - - * patch-01-MINGW_PRINTF_FORMAT (removed): Now included upstream. - * patch-02-LLONG_MAX: Adapted. - -2013-06-18 Peter Breitenlohner - - Imported poppler-0.23.2 source tree from: - http://poppler.freedesktop.org/ - - * patch-01-disable-jpeg (removed): Now included upstream. - * patch-02-warnings (removed): Obsoleted by gcc-4.6. - - * patch-01-MINGW_PRINTF_FORMAT (new): MinGW32 may not define - __MINGW_PRINTF_FORMAT (and __USE_MINGW_ANSI_STDIO could be 0). - * patch-02-LLONG_MAX (new): If necessary define LLONG_MAX etc. - -2013-03-12 Peter Breitenlohner - - Imported poppler-0.22.2 source tree from: - http://poppler.freedesktop.org/ - * patch-02-warnings: Adapted. - - * patch-01-disable-jpeg (new): We build without libjpeg. - -2012-12-31 Peter Breitenlohner - - Imported poppler-0.22.0 source tree from: - http://poppler.freedesktop.org/ - * patch-02-warnings: Adapted. - -2012-10-15 Peter Breitenlohner - - Imported poppler-0.21.0 source tree from: - http://poppler.freedesktop.org/ - * patch-02-warnings: Adapted. - -2012-07-11 Peter Breitenlohner - - Imported poppler-0.20.2 source tree from: - http://poppler.freedesktop.org/ - * patch-02-warnings: Adapted. - -2012-05-11 Peter Breitenlohner - - Imported poppler-0.20.0 source tree from: - http://poppler.freedesktop.org/ - * patch-01-missing-param (removed): Obsolete. - * patch-02-warnings: Adapted. - -2012-05-09 Peter Breitenlohner - - Imported poppler-0.19.4 source tree from: - http://poppler.freedesktop.org/ - * patch-03-POPPLER_VERSION (removed): Obsolete. - * patch-01-missing-param (new): Bug fix, missing new func param. - * patch-02-warnings: Adapted. - -2012-02-23 Peter Breitenlohner - - Imported poppler-0.18.4 source tree from: - http://poppler.freedesktop.org/ - * patch-01-PDF_PARSER_ONLY (removed): Obsolete. - * patch-0[23]-*: Adapted. - -2011-10-18 Peter Breitenlohner - - * patch-04-mingw (removed): Instead add `-lgdi32'. - -2011-10-11 Peter Breitenlohner - - * patch-04-mingw (new): Split off ... - * patch-01-PDF_PARSER_ONLY: ... from here. - -2011-10-10 Peter Breitenlohner - - * patch-03-POPPLER_VERSION: Reorg definition of POPPLER_VERSION. - -2011-10-08 Peter Breitenlohner - - Imported poppler-0.18.0 source tree from: - http://poppler.freedesktop.org/ - * patch-0[123]-*: Adapted. - -2011-04-14 Peter Breitenlohner - - * patch-01-PDF_PARSER_ONLY: Fix PDF_PARSER_ONLY for MinGW. - - * patch-03-POPPLER_VERSION (new): #define POPPLER_VERSION. - -2011-04-12 Peter Breitenlohner - - * patch-02-warnings (new): - poppler/Movie.cc: Cast -1 to Gulong. - goo/PNGWriter.h: Add newline at end of file. - -2011-04-12 Taco Hoekwater - - Imported poppler-0.12.4 source tree from: - http://poppler.freedesktop.org/ - - * patch-01-PDF_PARSER_ONLY (new): Implement PDF_PARSER_ONLY. - diff --git a/Build/source/libs/poppler/poppler-0.35.0-PATCHES/TL-Changes b/Build/source/libs/poppler/poppler-0.35.0-PATCHES/TL-Changes deleted file mode 100644 index 0b14de1f3e6..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0-PATCHES/TL-Changes +++ /dev/null @@ -1,30 +0,0 @@ -Changes applied to the poppler-0.35.0 tree as obtained from: - http://poppler.freedesktop.org/ - -Removed: - Makefile.in - aclocal.m4 - compile - config.guess - config.sub - configure - depcomp - install-sh - ltmain.sh - missing - test-driver - fofi/Makefile.in - goo/Makefile.in - poppler/Makefile.in - splash/Makefile.in - -Removed unused dirs: - cmake - cpp - glib - m4 - qt4 - qt5 - test - utils - diff --git a/Build/source/libs/poppler/poppler-0.35.0-PATCHES/patch-02-LLONG_MAX b/Build/source/libs/poppler/poppler-0.35.0-PATCHES/patch-02-LLONG_MAX deleted file mode 100644 index 138654abcb9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0-PATCHES/patch-02-LLONG_MAX +++ /dev/null @@ -1,25 +0,0 @@ -diff -ur poppler-0.35.0.orig/goo/GooString.h poppler-0.35.0/goo/GooString.h ---- poppler-0.35.0.orig/goo/GooString.h 2015-07-12 17:05:10.000000000 +0200 -+++ poppler-0.35.0/goo/GooString.h 2015-08-10 09:38:59.000000000 +0200 -@@ -35,6 +35,21 @@ - #endif - - #include // for LLONG_MAX and ULLONG_MAX -+ -+/* and/or the compiler may or may not define these. */ -+/* Minimum and maximum values a `signed long long int' can hold. */ -+#ifndef LLONG_MAX -+# define LLONG_MAX 9223372036854775807LL -+#endif -+#ifndef LLONG_MIN -+# define LLONG_MIN (-LLONG_MAX - 1LL) -+#endif -+ -+/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */ -+#ifndef ULLONG_MAX -+# define ULLONG_MAX 18446744073709551615ULL -+#endif -+ - #include - #include // for NULL - #include "gtypes.h" diff --git a/Build/source/libs/poppler/poppler-0.35.0-PATCHES/patch-03-Object-functions b/Build/source/libs/poppler/poppler-0.35.0-PATCHES/patch-03-Object-functions deleted file mode 100644 index cc76a16cd22..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0-PATCHES/patch-03-Object-functions +++ /dev/null @@ -1,43 +0,0 @@ -diff -ur poppler-0.35.0.orig/poppler/Object.h poppler-0.35.0/poppler/Object.h ---- poppler-0.35.0.orig/poppler/Object.h 2014-02-09 16:10:32.000000000 +0100 -+++ poppler-0.35.0/poppler/Object.h 2015-09-01 10:16:06.000000000 +0200 -@@ -140,7 +140,7 @@ - Object *initStream(Stream *streamA); - Object *initRef(int numA, int genA) - { initObj(objRef); ref.num = numA; ref.gen = genA; return this; } -- Object *initCmd(char *cmdA) -+ Object *initCmd(const char *cmdA) - { initObj(objCmd); cmd = copyString(cmdA); return this; } - Object *initError() - { initObj(objError); return this; } -@@ -186,7 +186,7 @@ - GBool isName(const char *nameA) - { return type == objName && !strcmp(name, nameA); } - GBool isDict(const char *dictType); -- GBool isStream(char *dictType); -+ GBool isStream(const char *dictType); - GBool isCmd(const char *cmdA) - { return type == objCmd && !strcmp(cmd, cmdA); } - -@@ -233,7 +233,7 @@ - Object *dictGetValNF(int i, Object *obj); - - // Stream accessors. -- GBool streamIs(char *dictType); -+ GBool streamIs(const char *dictType); - void streamReset(); - void streamClose(); - int streamGetChar(); -@@ -337,10 +337,10 @@ - - #include "Stream.h" - --inline GBool Object::streamIs(char *dictType) -+inline GBool Object::streamIs(const char *dictType) - { OBJECT_TYPE_CHECK(objStream); return stream->getDict()->is(dictType); } - --inline GBool Object::isStream(char *dictType) -+inline GBool Object::isStream(const char *dictType) - { return type == objStream && streamIs(dictType); } - - inline void Object::streamReset() diff --git a/Build/source/libs/poppler/poppler-0.35.0/AUTHORS b/Build/source/libs/poppler/poppler-0.35.0/AUTHORS deleted file mode 100644 index a785e403211..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/AUTHORS +++ /dev/null @@ -1,5 +0,0 @@ -xpdf is written by Derek Noonburg - -libpoppler is a fork of xpdf-3.00 - -Current Maintainer: Albert Astals Cid diff --git a/Build/source/libs/poppler/poppler-0.35.0/CMakeLists.txt b/Build/source/libs/poppler/poppler-0.35.0/CMakeLists.txt deleted file mode 100644 index c587ea67e3d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/CMakeLists.txt +++ /dev/null @@ -1,741 +0,0 @@ -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) -include(CheckFileOffsetBits) -CHECK_FILE_OFFSET_BITS() - -find_package (ECM 1.6.0 QUIET NO_MODULE) -if (ECM_FOUND) - include("${ECM_MODULE_DIR}/ECMEnableSanitizers.cmake") -endif() - -set(POPPLER_MAJOR_VERSION "0") -set(POPPLER_MINOR_VERSION "35") -set(POPPLER_MICRO_VERSION "0") -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_QT5_TESTS "Whether compile the Qt5 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) -set(ENABLE_LIBOPENJPEG "auto" CACHE STRING "Use libopenjpeg for JPX streams. Possible values: auto, openjpeg1, openjpeg2. 'auto' prefers openjpeg1 over openjpeg2 if both are available. Unset to not use openjpeg.") -set(ENABLE_CMS "auto" CACHE STRING "Use color management system. Possible values: auto, lcms1, lcms2. 'auto' prefers lcms2 over lcms1 if both are available. Unset to disable color management system.") -option(ENABLE_LIBCURL "Build libcurl based HTTP support." OFF) -option(ENABLE_ZLIB "Build with zlib (not totally safe)." OFF) -option(SPLASH_CMYK "Include support for CMYK rasterization." 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.7.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) -if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_GREATER 2.8.7) - find_package(Qt5Core) - find_package(Qt5Gui) - find_package(Qt5Xml) - find_package(Qt5Widgets) - find_package(Qt5Test) - if (Qt5Core_FOUND AND Qt5Gui_FOUND AND Qt5Xml_FOUND AND Qt5Widgets_FOUND AND Qt5Test_FOUND) - set(QT5_FOUND true) - else () - message("-- Package Qt5Core or Qt5Gui or Qt5Xml or Qt5Widgets or Qt5Test not found") - set(QT5_FOUND false) - endif() -else(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_GREATER 2.8.7) - set(QT5_FOUND false) - message("-- CMake >= 2.8.8 is needed to enable Qt5") -endif(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_GREATER 2.8.7) - -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) -set(USE_OPENJPEG1 FALSE) -set(USE_OPENJPEG2 FALSE) -set(WITH_OPENJPEG FALSE) -if(ENABLE_LIBOPENJPEG STREQUAL "auto") - find_package(LIBOPENJPEG) - set(USE_OPENJPEG1 ${LIBOPENJPEG_FOUND}) - set(WITH_OPENJPEG ${LIBOPENJPEG_FOUND}) - if(NOT LIBOPENJPEG_FOUND) - find_package(LIBOPENJPEG2) - set(USE_OPENJPEG2 ${LIBOPENJPEG2_FOUND}) - set(WITH_OPENJPEG ${LIBOPENJPEG2_FOUND}) - endif() -elseif(ENABLE_LIBOPENJPEG STREQUAL "openjpeg1") - find_package(LIBOPENJPEG) - set(USE_OPENJPEG1 ${LIBOPENJPEG_FOUND}) - set(WITH_OPENJPEG ${LIBOPENJPEG_FOUND}) -elseif(ENABLE_LIBOPENJPEG STREQUAL "openjpeg2") - find_package(LIBOPENJPEG2) - set(USE_OPENJPEG2 ${LIBOPENJPEG2_FOUND}) - set(WITH_OPENJPEG ${LIBOPENJPEG2_FOUND}) -endif() -set(ENABLE_LIBOPENJPEG "${WITH_OPENJPEG}") -if(ENABLE_CMS STREQUAL "auto") - find_package(LCMS2) - set(USE_CMS ${LCMS2_FOUND}) - if(NOT LCMS2_FOUND) - find_package(LCMS) - set(USE_CMS ${LCMS_FOUND}) - set(USE_LCMS1 ${LCMS_FOUND}) - endif(NOT LCMS2_FOUND) -elseif(ENABLE_CMS STREQUAL "lcms1") - find_package(LCMS) - set(USE_CMS ${LCMS_FOUND}) - set(USE_LCMS1 ${LCMS_FOUND}) -elseif(ENABLE_CMS STREQUAL "lcms2") - find_package(LCMS2) - set(USE_CMS ${LCMS2_FOUND}) -endif() -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(MINGW) - # Use mingw's ansi stdio extensions - add_definitions(-D__USE_MINGW_ANSI_STDIO=1) -endif(MINGW) -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(LIBOPENJPEG2_FOUND) - include_directories(${LIBOPENJPEG2_INCLUDE_DIRS}) -endif() -if(LCMS_FOUND) - include_directories(${LCMS_INCLUDE_DIR}) -endif(LCMS_FOUND) -if(LCMS2_FOUND) - include_directories(${LCMS2_INCLUDE_DIR}) -endif(LCMS2_FOUND) - -# Recent versions of poppler-data install a .pc file. -# Use it to determine the encoding data path, if available. -# Default to the same prefix otherwise. -pkg_check_modules(POPPLER_DATA poppler-data) -if(POPPLER_DATA_FOUND) - execute_process(COMMAND "${PKG_CONFIG_EXECUTABLE}" --variable=poppler_datadir poppler-data - RESULT_VARIABLE _result_var - OUTPUT_VARIABLE _output_var OUTPUT_STRIP_TRAILING_WHITESPACE) - if(_result_var STREQUAL "0" AND NOT _output_var STREQUAL "") - set(POPPLER_DATADIR "${_output_var}") - endif(_result_var STREQUAL "0" AND NOT _output_var STREQUAL "") -endif(POPPLER_DATA_FOUND) -if(NOT DEFINED POPPLER_DATADIR) - set(POPPLER_DATADIR "${CMAKE_INSTALL_PREFIX}/share/poppler") -endif(NOT DEFINED POPPLER_DATADIR) - -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_C_FLAGS "-Wall ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_YES} ${CMAKE_CXX_FLAGS}") -endif(_comp_warnings STREQUAL "yes") -if(_comp_warnings STREQUAL "kde") - set(CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS}") - 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/NetPBMWriter.cc - goo/PNGWriter.cc - goo/TiffWriter.cc - goo/JpegWriter.cc - goo/ImgWriter.cc - goo/gstrtod.cc - goo/grandom.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/MarkedContentOutputDev.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/StructTreeRoot.cc - poppler/StructElement.cc - poppler/strtok_r.cpp - poppler/UnicodeMap.cc - poppler/UnicodeTypeTable.cc - poppler/UTF.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}) - add_definitions(-DUSE_OPENJPEG1) -elseif (LIBOPENJPEG2_FOUND) - set(poppler_SRCS ${poppler_SRCS} - poppler/JPEG2000Stream.cc - ) - add_definitions(-DUSE_OPENJPEG2) -MESSAGE(${LIBOPENJPEG2_LIBRARIES}) - set(poppler_LIBS ${poppler_LIBS} ${LIBOPENJPEG2_LIBRARIES}) -else () - set(poppler_SRCS ${poppler_SRCS} - poppler/JPXStream.cc - ) -endif() -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(HAVE_PTHREAD) - set(poppler_LIBS ${poppler_LIBS} ${CMAKE_THREAD_LIBS_INIT}) -endif() - -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 54.0.0 SOVERSION 54) -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/MarkedContentOutputDev.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/StructElement.h - poppler/StructTreeRoot.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/UTF.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 - goo/grandom.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) - if(JPEG_FOUND) - install(FILES - goo/JpegWriter.h - DESTINATION include/poppler/goo) - endif(JPEG_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) - elseif(LIBOPENJPEG2_FOUND) - install(FILES - poppler/JPEG2000Stream.h - DESTINATION include/poppler) - else() - install(FILES - poppler/JPXStream.h - DESTINATION include/poppler) - endif() - 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(QT5_FOUND) - add_subdirectory(qt5) -endif(QT5_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(QT5_FOUND) - poppler_create_install_pkgconfig(poppler-qt5.pc lib${LIB_SUFFIX}/pkgconfig) -endif(QT5_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) -if(SPLASH_CMYK) - message(" with CMYK support") -endif() -show_end_message_yesno("cairo output" CAIRO_FOUND) -show_end_message_yesno("qt4 wrapper" QT4_FOUND) -show_end_message_yesno("qt5 wrapper" QT5_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" WITH_OPENJPEG) -if(USE_OPENJPEG1) - message(" with openjpeg1") -endif() -if(USE_OPENJPEG2) - message(" with openjpeg2") -endif() -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/Build/source/libs/poppler/poppler-0.35.0/COPYING b/Build/source/libs/poppler/poppler-0.35.0/COPYING deleted file mode 100644 index d511905c164..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - 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. - - - Copyright (C) - - 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. - - , 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/Build/source/libs/poppler/poppler-0.35.0/ChangeLog b/Build/source/libs/poppler/poppler-0.35.0/ChangeLog deleted file mode 100644 index 8b04982fbfc..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/ChangeLog +++ /dev/null @@ -1,58141 +0,0 @@ -commit 1213501882cf2ec6e3dcb3c078391040c8cb0a57 -Author: Albert Astals Cid -Date: Sun Aug 9 18:27:06 2015 +0200 - - 0.35.0 - - CMakeLists.txt | 4 ++-- - NEWS | 29 +++++++++++++++++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/CMakeLists.txt | 2 +- - qt4/src/Doxyfile | 2 +- - qt4/src/Makefile.am | 2 +- - qt5/src/CMakeLists.txt | 2 +- - qt5/src/Doxyfile | 2 +- - qt5/src/Makefile.am | 2 +- - 11 files changed, 40 insertions(+), 11 deletions(-) - -commit a7b1151ce7a14d359d85bacfe02352cdeb8d9a8f -Author: Hib Eris -Date: Sun Jul 26 10:38:37 2015 +0200 - - glib-demo: Prefer gtk_label_set_{x,y}align() over deprecated - gtk_misc_set_alignment() - - https://bugs.freedesktop.org/show_bug.cgi?id=88788 - - glib/demo/main.c | 16 ++++++++++++---- - 1 file changed, 12 insertions(+), 4 deletions(-) - -commit e6e7d1492b518d57136031a94069a994182693cc -Author: Hib Eris -Date: Sun May 31 12:32:36 2015 +0200 - - pdftocairo: Fix cast to pointer from integer of different size - on win64 - - Fixes warning: - - [ 322s] CXX pdftocairo-pdftocairo-win32.o - [ 324s] In file included from - /usr/x86_64-w64-mingw32/sys-root/mingw/include/windows.h:72:0, - [ 324s] from - /usr/x86_64-w64-mingw32/sys-root/mingw/include/cairo/cairo-win32.h:44, - [ 324s] from pdftocairo-win32.cc:16: - [ 324s] pdftocairo-win32.cc: In function 'HWND__* - createGroupBox(HWND, HINSTANCE, int, const char*, RECT*)': - [ 324s] pdftocairo-win32.cc:170:23: warning: cast to pointer from - integer of different size [-Wint-to-pointer-cast] - [ 324s] parent, (HMENU)id, - [ 324s] ^ - [ 324s] pdftocairo-win32.cc: In function 'HWND__* - createCheckBox(HWND, HINSTANCE, int, const char*, RECT*)': - [ 324s] pdftocairo-win32.cc:186:23: warning: cast to pointer from - integer of different size [-Wint-to-pointer-cast] - [ 324s] parent, (HMENU)id, - [ 324s] ^ - [ 324s] pdftocairo-win32.cc: In function 'HWND__* - createStaticText(HWND, HINSTANCE, int, const char*, RECT*)': - [ 324s] pdftocairo-win32.cc:202:23: warning: cast to pointer from - integer of different size [-Wint-to-pointer-cast] - [ 324s] parent, (HMENU)id, - [ 324s] ^ - [ 324s] pdftocairo-win32.cc: In function 'HWND__* - createPageScaleComboBox(HWND, HINSTANCE, int, RECT*)': - [ 324s] pdftocairo-win32.cc:219:23: warning: cast to pointer from - integer of different size [-Wint-to-pointer-cast] - [ 324s] parent, (HMENU)id, - [ 324s] ^ - - https://bugs.freedesktop.org/show_bug.cgi?id=91465 - - utils/pdftocairo-win32.cc | 26 +++++++++++++------------- - 1 file changed, 13 insertions(+), 13 deletions(-) - -commit f3a0191abbf67c8b0f83739e1844a2fabe4138a4 -Author: Hib Eris -Date: Thu Jul 23 21:44:57 2015 +0200 - - Explicitly link poppler-glib against pthread - - Debian complains about missing symbols: - - dpkg-shlibdeps: warning: symbol pthread_mutexattr_destroy used by - debian/libpoppler-glib8/usr/lib/i386-linux-gnu/libpoppler-glib.so.8.6.0 - found in none of the libraries - dpkg-shlibdeps: warning: symbol pthread_mutexattr_init used by - debian/libpoppler-glib8/usr/lib/i386-linux-gnu/libpoppler-glib.so.8.6.0 - found in none of the libraries - dpkg-shlibdeps: warning: symbol pthread_mutexattr_settype used by - debian/libpoppler-glib8/usr/lib/i386-linux-gnu/libpoppler-glib.so.8.6.0 - found in none of the libraries - - https://bugs.freedesktop.org/show_bug.cgi?id=91450 - - glib/Makefile.am | 1 + - 1 file changed, 1 insertion(+) - -commit fb264bfa8bf7142cabc8d94a86594cf0e7c9f134 -Author: Hib Eris -Date: Fri Jul 24 22:18:26 2015 +0200 - - glib-demo: Remove code for no longer supported gtk versions - - https://bugs.freedesktop.org/show_bug.cgi?id=88788 - - glib/demo/annots.c | 8 -------- - glib/demo/selections.c | 16 ---------------- - 2 files changed, 24 deletions(-) - -commit dd0883649ac296c6033474fe5991c534ac2ce594 -Author: Hib Eris -Date: Fri Jul 24 22:09:57 2015 +0200 - - glib-demo: Remove use of deprecated - gtk_dialog_set_alternative_button_order() - - https://bugs.freedesktop.org/show_bug.cgi?id=88788 - - glib/demo/main.c | 4 ---- - 1 file changed, 4 deletions(-) - -commit ffc798a7fcf95d2aaf123772072ef956ceb2dff7 -Author: Hib Eris -Date: Sun Jan 25 18:16:04 2015 +0100 - - glib-demo: Remove deprecated use of gtk_misc_set_alignment() - - https://bugs.freedesktop.org/show_bug.cgi?id=88788 - - glib/demo/main.c | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - -commit 56915b2989fc244b58a454fe40412eb731e706bd -Author: Hib Eris -Date: Sun Jan 25 13:10:31 2015 +0100 - - glib-demo: Remove use of deprecated GtkAlignment - - https://bugs.freedesktop.org/show_bug.cgi?id=88788 - - glib/demo/annots.c | 23 +++++++++++--------- - glib/demo/forms.c | 23 +++++++++++--------- - glib/demo/info.cc | 18 +++++++++------ - glib/demo/main.c | 12 +--------- - glib/demo/page.c | 34 ++++++++++++++++++----------- - glib/demo/text.c | 18 +++++++++------ - glib/demo/utils.c | 64 - +++++++++++++++++++++++++++++++----------------------- - 7 files changed, 107 insertions(+), 85 deletions(-) - -commit 49e33e1213a7957d4814656960bf269abcabc7c3 -Author: Hib Eris -Date: Sun Jan 25 12:21:41 2015 +0100 - - glib-demo: Remove deprecated use of gtk_tree_view_set_rules_hint() - - The use of rules-hint is deprecated in gtk because it is - considered bad application API and is not really usefull. - - See - https://git.gnome.org/browse/gtk+/commit/?id=0ed766ec866a2da7e3db05b1db2fc2519d6b1cdc - - https://bugs.freedesktop.org/show_bug.cgi?id=88788 - - glib/demo/attachments.c | 1 - - glib/demo/find.c | 1 - - glib/demo/fonts.c | 1 - - glib/demo/transitions.c | 1 - - 4 files changed, 4 deletions(-) - -commit 70f3c5ff0010775e5fcd590db1b8d475694fe3a4 -Author: William Bader -Date: Sat Jul 18 16:36:30 2015 +0200 - - Updated patch to add configure --enable-build-type - - Bug #90796 - - configure.ac | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 52 insertions(+) - -commit 1aa2f6e8a41a6a86dc02bf7c5cbc62355e780961 -Author: Albert Astals Cid -Date: Fri Jul 17 00:40:56 2015 +0200 - - Silly micro optimization: Move vars inside case {} - - poppler/SplashOutputDev.cc | 19 ++++++++++++------- - 1 file changed, 12 insertions(+), 7 deletions(-) - -commit 705615f7569bbadb555bbf45c15c7c01f1690db5 -Author: Albert Astals Cid -Date: Fri Jul 17 00:38:58 2015 +0200 - - More typo fix - - poppler/Catalog.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 3b6b3fefe97b885e42966fece84a123fc4671b20 -Author: William Bader -Date: Fri Jul 17 00:37:46 2015 +0200 - - [Splash] Fix wrong writes on non rgb outputs - - Bug #90570 - - poppler/SplashOutputDev.cc | 52 - +++++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 51 insertions(+), 1 deletion(-) - -commit 885b23bfd16a3e4970a52956493e92a160b2d0a8 -Author: Dmytro Morgun -Date: Fri Jul 17 00:30:08 2015 +0200 - - GlobalParamsWin bug/fixes - - Bug #91053 - - poppler/GlobalParamsWin.cc | 57 - ++++++++++++++++++++++++++-------------------- - 1 file changed, 32 insertions(+), 25 deletions(-) - -commit 0ce4da8ab16b4a5497688a6cf86175aaec0f585f -Author: Albert Astals Cid -Date: Wed Jul 15 23:59:11 2015 +0200 - - Make sure pageRootRef is a ref before using it - - Bug #91344 - - poppler/Catalog.cc | 32 ++++++++++++++++++-------------- - 1 file changed, 18 insertions(+), 14 deletions(-) - -commit b71431513b45f8a1aa4154332dae56af241258f8 -Author: Albert Astals Cid -Date: Wed Jul 15 13:10:27 2015 +0200 - - Typo fix in warning - - poppler/Catalog.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit ccd780f9504f5b077ea12370fd5380ff7da5cd23 -Author: Dmytro Morgun -Date: Wed Jul 15 00:26:55 2015 +0200 - - [Windows] remove ifndef - - splash/SplashFontEngine.cc | 9 +-------- - 1 file changed, 1 insertion(+), 8 deletions(-) - -commit 2ed8465074c4fc2c88f745b29bdae92410751327 -Author: William Bader -Date: Wed Jul 15 00:07:48 2015 +0200 - - Allow configuring SPLASH_CMYK support from cmake/configure - - Bug #90795 - - CMakeLists.txt | 4 ++++ - config.h.cmake | 3 +++ - configure.ac | 7 +++++++ - poppler/SplashOutputDev.cc | 4 ++-- - qt4/src/poppler-document.cc | 3 ++- - qt4/src/poppler-page.cc | 4 ++-- - qt5/src/poppler-document.cc | 3 ++- - qt5/src/poppler-page.cc | 4 ++-- - splash/Splash.cc | 2 +- - splash/SplashBitmap.cc | 4 ++-- - 10 files changed, 27 insertions(+), 11 deletions(-) - -commit 334dc56f2f9adf4daa33c20ce034a5b1f8259baf -Author: Albert Astals Cid -Date: Sun Jul 12 23:29:30 2015 +0200 - - [qt] KeepAlphaChannel -> IgnorePaperColor - - qt4/src/poppler-page.cc | 13 ++++++------- - qt4/src/poppler-qt4.h | 4 ++-- - qt5/src/poppler-page.cc | 13 ++++++------- - qt5/src/poppler-qt5.h | 4 ++-- - 4 files changed, 16 insertions(+), 18 deletions(-) - -commit 2a1363a4a3129fe4b5e4fae1018dc8919a2d796a -Author: Albert Astals Cid -Date: Sun Jul 12 23:22:32 2015 +0200 - - Update (C) - - splash/SplashBitmap.cc | 1 + - splash/SplashBitmap.h | 1 + - 2 files changed, 2 insertions(+) - -commit e903b2364f55c4f6417d826ab85dcb60cd240563 -Author: Albert Astals Cid -Date: Sun Jul 12 23:20:20 2015 +0200 - - [qt] fix spacing in header - - qt4/src/poppler-qt4.h | 4 ++-- - qt5/src/poppler-qt5.h | 4 ++-- - 2 files changed, 4 insertions(+), 4 deletions(-) - -commit 810c659faea542c3bd6e9c48c9a7c60b886a9269 -Author: Adam Reichold -Date: Fri Jul 3 00:31:56 2015 +0200 - - Switch default image format of Qt frontends - - This changes the Poppler::Page::renderToImage method w.r.t. to - the image - formats used to render using Splash, i.e. the default will be RGB8. If - overprint preview is requested, DeviceN8 will be used and converted to - XBGR8 for display. If the internal alpha channel is requested, - XBGR8 will - be used and augmented by Splash's separate alpha channel. - - This yields some improvements w.r.t. to rendering including alpha - blending - with the paper colour, i.e. synthetic benchmarks using structurally - simple - documents yield more than two percent improvement. - - qt4/src/poppler-page.cc | 115 - +++++++++++++++++++++++++++++------------------- - qt5/src/poppler-page.cc | 114 - ++++++++++++++++++++++++++++------------------- - 2 files changed, 138 insertions(+), 91 deletions(-) - -commit 8fea54e48ec9ba35122c565f761e7e7f016a34f9 -Author: Adam Reichold -Date: Thu Jul 2 21:08:38 2015 +0200 - - Improve efficiency of Poppler::Page::renderToImage - - Improves the efficiency of rendering into a QImage using - the Splash output device by removing a copy of the raw bitmap data - since Qt5 will properly free this data using a function supplied - during construction, i.e. in this case gfree. - - This improves performance in synthentic rendering benchmarks - by approximately four percent and reduces the maximum working - set size. - - qt5/src/poppler-page.cc | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - -commit 09db5a71fff4b7a0ed1d5d7e76c8270e2f6e9a8d -Author: Adam Reichold -Date: Thu Jul 2 21:02:59 2015 +0200 - - Add KeepAlphaChannel render flag to Qt frontends - - Adds a new render flag which will indicate that the image return by - Poppler::Page::renderToImage will not be opaque and alpha blended with - the paper colour, but retain its actually background transparency. - - This improves performance in synthentic rendering benchmarks by almost - five percent and the additional alpha blending that is then done - by the - consuming application is often a hardware-accellerated operation. - - qt4/src/poppler-page.cc | 6 ++++-- - qt4/src/poppler-qt4.h | 3 ++- - qt5/src/poppler-page.cc | 6 ++++-- - qt5/src/poppler-qt5.h | 3 ++- - 4 files changed, 12 insertions(+), 6 deletions(-) - -commit d604a075c6b171d5c3fe26c146d3469c4bc0af3f -Author: Adam Reichold -Date: Thu Jul 2 21:00:16 2015 +0200 - - Make SplashBitmap XBGR transfer alpha channel - - Adds an option to SplashBitmap::convertToXBGR and - SplashBitmap::getXBGRLine - so that both optionally transfer Splash's internal alpha channel - into the - fourth component of the resulting bitmap data. - - splash/SplashBitmap.cc | 27 ++++++++++++++++++++++----- - splash/SplashBitmap.h | 4 ++-- - 2 files changed, 24 insertions(+), 7 deletions(-) - -commit 17adfc848f99a5c5bfad35c94289ccf03fba1a16 -Author: Adam Reichold -Date: Sun Jul 12 17:05:24 2015 +0200 - - Adjust memory layout computation of GooString - - GooString uses the small string optimization but the static buffer - size is - hard-coded and hence the final object size becomes dependent on - architecture. - This adds a helper class to compute the memory layout at compile - time so that - the target object size of e.g. 32 or another multiple of 16 is - achieved. - - This also adds an overload so that the C string returned by - GooString's - getCString method respect the constness of this and fixes a constness - issue - in the lexer tests. - - goo/GooString.h | 24 ++++++++++++++++-------- - qt4/tests/check_lexer.cpp | 2 +- - qt5/tests/check_lexer.cpp | 2 +- - 3 files changed, 18 insertions(+), 10 deletions(-) - -commit d1720740f3381f489f1ee83ce1ce53e73aafd537 -Author: Albert Astals Cid -Date: Wed Jul 8 23:22:13 2015 +0200 - - Poppler 0.34 - - CMakeLists.txt | 4 ++-- - NEWS | 13 +++++++++++++ - configure.ac | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 19 insertions(+), 6 deletions(-) - -commit 2fc1f540754391ffa87d7fe9f3438e134d821207 -Author: Thomas Freitag -Date: Tue Jul 7 18:48:51 2015 +0200 - - [Splash] Fix crash in PDF with nested softmasks - - Bug #91240 - - poppler/SplashOutputDev.cc | 20 ++++++++++++-------- - 1 file changed, 12 insertions(+), 8 deletions(-) - -commit 0b8919f19dd501c9962bca05c9b0559464e923c3 -Author: Dmytro Morgun -Date: Mon Jul 6 00:28:27 2015 +0200 - - Fix pedantic memory leak - - poppler/StructElement.cc | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -commit 2ef22af960d3d800087209fea047009a8419134c -Author: Albert Astals Cid -Date: Sun Jul 5 16:03:57 2015 +0200 - - [cmake] Make sure ENABLE_LIBOPENJPEG is either 0 or 1 - - Otherwise if it was auto it gets translated to 1 for the cmakedefine - boolean - which is wrong when the auto ends up meaning "i din't find it" - - CMakeLists.txt | 2 ++ - 1 file changed, 2 insertions(+) - -commit 50455bcf4f1644060b2187d4e60c3798793041cc -Author: Tamas Szekeres -Date: Fri Jul 3 20:24:01 2015 +0200 - - std::max/min need - - Bug #88511 - - cpp/poppler-font.cpp | 3 +++ - cpp/poppler-global.cpp | 3 +++ - poppler/Annot.cc | 2 ++ - poppler/SplashOutputDev.cc | 2 ++ - 4 files changed, 10 insertions(+) - -commit 346fc70dbf2803e23e70b093401aa2cda216492b -Author: Albert Astals Cid -Date: Fri Jul 3 20:19:01 2015 +0200 - - Forgot the (C) - - poppler/PSOutputDev.cc | 1 + - 1 file changed, 1 insertion(+) - -commit df09c1a84dfe80d2e6cfde3308c79da5b2ea7428 -Author: Marek Kasik -Date: Fri Jul 3 20:14:23 2015 +0200 - - Embed Type1 fonts to PostScript files correctly - - Remove PFB headers from embedded Type1 fonts - before embedding them into a PostScript file. - - Bug #19747 - - poppler/PSOutputDev.cc | 57 - +++++++++++++++++++++++++++++++++++++++++++------- - 1 file changed, 50 insertions(+), 7 deletions(-) - -commit 11f117cc71641b89783b207232171f850a2b64ff -Author: Carlos Garcia Campos -Date: Thu Jun 4 10:51:36 2015 +0200 - - regtest: Disable pretty diffs for text files in HTML reports - - difflib is entering in an infinite loop with some files, so disable it - for now. We need to either fix that somehow or find a different way to - generate pretty diffs of text files. - - regtest/HTMLReport.py | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -commit 3db4cb6f07229e26405bfb512c626a272f6351f5 -Author: Thomas Freitag -Date: Sun May 24 18:41:30 2015 +0200 - - Splash: Speed up of rendering icc based images - - Bug #90171 - - poppler/SplashOutputDev.cc | 142 - +++++++++++++++++++++++++++++++++++++++++++-- - poppler/SplashOutputDev.h | 8 ++- - splash/Splash.cc | 17 ++++-- - splash/Splash.h | 9 ++- - 4 files changed, 163 insertions(+), 13 deletions(-) - -commit c50720dcc9e15516e0e19072c0df03fbdee63dec -Author: Adrian Johnson -Date: Fri May 22 21:44:55 2015 +0930 - - glib: update new symbols section - - glib/reference/poppler-docs.sgml | 8 ++++++++ - 1 file changed, 8 insertions(+) - -commit b271a19ec30b20bc11f2240ae6b96672e3cafafb -Author: Albert Astals Cid -Date: Thu May 14 21:56:47 2015 +0200 - - Poppler 0.33 - - CMakeLists.txt | 4 ++-- - NEWS | 25 +++++++++++++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - glib/CMakeLists.txt | 2 +- - glib/Makefile.am | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 9 files changed, 34 insertions(+), 9 deletions(-) - -commit 2b2fb719aa5ffe32fbc3fb500444b1643b1c6099 -Author: Albert Astals Cid -Date: Thu May 14 20:17:12 2015 +0200 - - Add missing (C) - - poppler/Annot.cc | 1 + - poppler/Annot.h | 2 +- - poppler/CairoFontEngine.cc | 1 + - poppler/Page.cc | 3 ++- - 4 files changed, 5 insertions(+), 2 deletions(-) - -commit ae76b75c6a5383eb52f58fba0faba69ae8698ef9 -Author: William Bader -Date: Thu May 14 20:06:22 2015 +0200 - - Fix regression in pdftops parameter passing - - Recent changes to the command line processing moved some options - from GlobalParams to PSOutputDev. - The options used to be set by calling setters in GlobalParams before - creating the PSOutputDev. - Now the options are set by calling setters in PSOutputDev after it - is created. - The problem is that PSOutputDev() calls init() which uses options - that now can not be set until later after PSOutputDev() returns. - These patches split some of the code of init() into a new postInit() - that is automatically called later after the pdftops main program - has had a chance to set the command line options. - When I was looking through the code, I also fixed a misspelling of - sanitizedTitle as sanitizedTile. - - Bug #89827 - - poppler/PSOutputDev.cc | 138 - +++++++++++++++++++++++++++++++------------------ - poppler/PSOutputDev.h | 11 ++-- - 2 files changed, 96 insertions(+), 53 deletions(-) - -commit c516b341a9c2e0c9a985bc14ad3cae73bf10fb02 -Author: Thomas Petazzoni -Date: Sun May 3 15:27:19 2015 +0200 - - Fix invalid shell comparaison in libtiff test - - Bug #115523 - - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 040b316f0cb1ac933dce616fabe24c93f96fe1cd -Author: Jason Crain -Date: Sat Apr 18 12:44:47 2015 -0500 - - glib: Fix segfault when creating PopplerAction - - Screen annotations and form fields currently pass a NULL pointer to - _poppler_action_new. Pass the PopplerDocument instead. - - Bug #90093 - - glib/poppler-annot.cc | 4 ++-- - glib/poppler-form-field.cc | 2 +- - glib/poppler-page.cc | 2 +- - glib/poppler-private.h | 2 +- - 4 files changed, 5 insertions(+), 5 deletions(-) - -commit 056ee89122385bc2df7cb2c05e1cb1770af8ecce -Author: Carlos Garcia Campos -Date: Sat Apr 18 12:16:56 2015 +0200 - - glib: Add poppler_annot_markup_set_popup_rectangle() - - It updates the popup rectangle of a markup annotation that already - has a - popup associated. - - glib/poppler-annot.cc | 31 +++++++++++++++++++++++++++++++ - glib/poppler-annot.h | 2 ++ - glib/reference/poppler-sections.txt | 1 + - 3 files changed, 34 insertions(+) - -commit 1aae63ebc6fffe9fa1a2898e4ed733c22e312015 -Author: Carlos Garcia Campos -Date: Sat Apr 18 11:46:41 2015 +0200 - - annots: Add popup annots without a markup annot associated to the - list of annots - - For consistency with Annots::createAnnot(). - - poppler/Annot.h | 2 +- - poppler/Page.cc | 6 +++++- - 2 files changed, 6 insertions(+), 2 deletions(-) - -commit 05ef3f9feee760544108c68e0d45d1de25fd8901 -Author: Philipp Reinkemeier -Date: Mon Feb 16 09:11:58 2015 +0100 - - annots: Fixed adding annotation of Subtype Popup to pdf page - - https://bugs.freedesktop.org/show_bug.cgi?id=89136 - - poppler/Annot.cc | 19 +++++++++++++++++++ - poppler/Page.cc | 11 ++++++++++- - 2 files changed, 29 insertions(+), 1 deletion(-) - -commit 8ca43bebf36f8da085917f28230e25524de4f4f4 -Author: Jason Crain -Date: Tue Mar 24 02:51:47 2015 -0500 - - cairo: Fix memory leak in CairoFreeTypeFont::create - - - Free embedded font data in _ft_done_face when the cairo font is - destroyed. - - Free embedded font data if _ft_new_face finds it's a duplicate of an - already open font. - - Free embedded font data and codeToGID array if font creation fails. - - Bug #89952 - - poppler/CairoFontEngine.cc | 16 +++++++++++----- - 1 file changed, 11 insertions(+), 5 deletions(-) - -commit edc7bb4fe7b5e718431de12bee1d95036d06efa0 -Author: Jason Crain -Date: Sat Apr 4 18:40:48 2015 +0200 - - Combine base characters and diacritical marks - - LaTeX adds base characters and diacritical marks as separate - characters. When a base character and diacritical mark are drawn over - each other, this patch converts them into a combining character - sequence. - - Bug #87215 - C# poppler-0.31.0.tar.xz - - poppler/TextOutputDev.cc | 419 - ++++++++++++++++++++++++++++++++++------------- - poppler/TextOutputDev.h | 31 +++- - 2 files changed, 336 insertions(+), 114 deletions(-) - -commit 96c35dfde6722ff8c5ef7ff59e37be90d273acab -Author: Albert Astals Cid -Date: Fri Mar 27 22:42:34 2015 +0100 - - pdftohtml: Set exit status adecuately - - Based on a patch by Matt Atkinson - Bug #83609 - - utils/pdftohtml.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit 0969801c12a6ec0fbc079c8203cece9c70466955 -Author: Albert Astals Cid -Date: Thu Mar 26 16:08:20 2015 +0100 - - Fix previous commit about initializing on failure - - It's the nComps of the destination not of the origin we need - - poppler/SplashOutputDev.cc | 15 +++++++++++++-- - 1 file changed, 13 insertions(+), 2 deletions(-) - -commit ede6d00688fcf0e3c843b0a507304f5a98395d41 -Author: Albert Astals Cid -Date: Thu Mar 26 15:44:40 2015 +0100 - - memset on error to have reproducible outputs - - poppler/SplashOutputDev.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 4bb2c9b98299f429752b4c60820cea31ef05f7e0 -Author: Jason Crain -Date: Wed Mar 25 21:04:19 2015 +0100 - - Use width from W array for WMode positioning - - Bug #89621 - - poppler/GfxFont.cc | 36 ++++++++++++------------------------ - poppler/GfxFont.h | 2 ++ - 2 files changed, 14 insertions(+), 24 deletions(-) - -commit 033dbbd7fef8c04c7f4961455cc1cd8d6d1bd93b -Author: Albert Astals Cid -Date: Sun Mar 15 14:06:15 2015 +0100 - - Fix the previous pdfDocEncoding fix - - Since actually the previous fix didn't account for non ascii - characters as output of pdfDocEncoding - - qt4/src/poppler-private.cc | 36 +++++++++++++++--------------------- - qt5/src/poppler-private.cc | 36 +++++++++++++++--------------------- - 2 files changed, 30 insertions(+), 42 deletions(-) - -commit bc8076d8f638ccb44f8e3b94aaae96850b025deb -Author: Albert Astals Cid -Date: Sun Mar 15 13:32:41 2015 +0100 - - Fix PDF Text String -> QString conversion - - If they are not UTF16-BE they are in PDFDocEncoding (not ascii) - - Fixes KDE bug #344849 - - qt4/src/poppler-private.cc | 5 +++-- - qt5/src/poppler-private.cc | 5 +++-- - 2 files changed, 6 insertions(+), 4 deletions(-) - -commit d7cc90a8b60d7e353db6e0acdd0b789485e32972 -Author: Albert Astals Cid -Date: Sat Mar 7 15:04:52 2015 +0100 - - 0.32.0 - - CMakeLists.txt | 4 ++-- - NEWS | 16 ++++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 7 files changed, 23 insertions(+), 7 deletions(-) - -commit c13297d154ded11721fe7d3abdba459ca628cef8 -Author: Albert Astals Cid -Date: Sat Mar 7 14:58:10 2015 +0100 - - Update (C) - - poppler/SecurityHandler.cc | 2 +- - poppler/SplashOutputDev.cc | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit c909964bff671d5ff0d8eee5f613ded4562f8afd -Author: Albert Astals Cid -Date: Sat Mar 7 14:54:43 2015 +0100 - - Do not assert on broken document - - Bug #89422 - - poppler/SecurityHandler.cc | 14 +++++++++----- - 1 file changed, 9 insertions(+), 5 deletions(-) - -commit 3705fcee0309c50b5fecd563e8e466cbe2c5972b -Author: Thomas Freitag -Date: Fri Mar 6 15:19:58 2015 +0100 - - Fix Wrong colour shown when GouraudTriangleShFill uses a DeviceN - colorspace - - Bug #89182 - - poppler/SplashOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit b7fde1ec83a5fff9bec73becc22e581583a30d43 -Author: Albert Astals Cid -Date: Wed Feb 25 21:51:34 2015 +0100 - - Fix last commit regression - - It seems it actually needs to be pipe->shape and not pipe->usesShape - (i.e. it seems at some point we use pipe->shape with useShape - being false) - Otherwise we had a regression on - eci_altona-test-suite-v2_technical2_x4.pdf - - splash/Splash.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 7980fe868a8ef2ee3315f0bcb606c448d6604039 -Author: William Bader -Date: Wed Feb 25 15:00:33 2015 +0100 - - Fix uninitialized variable in Splash::pipeRun - - Use useShape is actually the guard for shape, so use it in the if - - splash/Splash.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 57b6b78a0831fb31c06fd1bc6e9803de524f9d2d -Author: Thomas Freitag -Date: Tue Feb 24 23:34:57 2015 +0100 - - pdfseparate: use always an unique instance for PDFDoc for savePageAs - - utils/pdfseparate.cc | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -commit 8a30d219df71ead323649ff0dfd4a724b5e7bd18 -Author: William Bader -Date: Sat Feb 21 23:55:10 2015 +0100 - - Fix memcpy introduced in ec956ab8552dbe10fac4e649951042bddc424b7d - - goo/GooString.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit ec956ab8552dbe10fac4e649951042bddc424b7d -Author: William Bader -Date: Tue Feb 17 22:55:14 2015 +0100 - - Reduce use of gmalloc() in GooString::appendfv() - - Bug #89096 - - goo/GooString.cc | 18 ++++++++++++++---- - 1 file changed, 14 insertions(+), 4 deletions(-) - -commit 132ef18324f62c1f2a08dcd794b379fadaa4daf5 -Author: Petr Gajdos -Date: Wed Feb 11 19:37:21 2015 +0100 - - Annot BG/BC: Empty Array means no color - - poppler/Annot.cc | 15 +++++++++++++-- - 1 file changed, 13 insertions(+), 2 deletions(-) - -commit bf4aae25a244b1033a2479b9a8f633224f7d5de5 -Author: William Bader -Date: Wed Feb 11 17:35:40 2015 +0100 - - Off by one fix to the previous crash fix - - fofi/FoFiTrueType.cc | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - -commit 97dd46bae5424818ca808c20506d7d96f7b85fb5 -Author: William Bader -Date: Mon Feb 9 22:30:51 2015 +0100 - - pdftops: Add aaRaster and overprint to man file - - utils/pdftops.1 | 9 +++++++++ - 1 file changed, 9 insertions(+) - -commit c114a90063d755639d2b0dbf816690a66b54bee0 -Author: Albert Astals Cid -Date: Sun Feb 8 00:24:11 2015 +0100 - - Fix crash in fuzzed file from Bug #84988 - - poppler/TextOutputDev.cc | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -commit 22895623e6cd2a5923f552421d44cc80cab77dd8 -Author: Albert Astals Cid -Date: Sat Feb 7 22:28:21 2015 +0100 - - Fix malformed file crash from bug #86854 - - poppler/PSOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit cdb7ad95f7c8fbf63ade040d8a07ec96467042fc -Author: Albert Astals Cid -Date: Sat Feb 7 22:21:16 2015 +0100 - - Fix malformed file crash in bug #85243 - - fofi/FoFiTrueType.cc | 15 +++++++++++++-- - 1 file changed, 13 insertions(+), 2 deletions(-) - -commit 6641b935e1fc0c4151a723b6b476d987b8324ed2 -Author: Albert Astals Cid -Date: Sat Feb 7 21:58:23 2015 +0100 - - If ECM is around include the sanitizers module - - This way you can run - cmake -DECM_ENABLE_SANITIZERS='address' - and get an ASAN built poppler - - CMakeLists.txt | 5 +++++ - 1 file changed, 5 insertions(+) - -commit 92e41685dcef538a7fc669ca357ce9f448a8078e -Author: Albert Astals Cid -Date: Sat Feb 7 21:54:39 2015 +0100 - - Fix crash in malformed file from bug #85275 - - poppler/SplashOutputDev.cc | 4 ++-- - splash/Splash.cc | 10 +++++++++- - splash/SplashBitmap.cc | 4 ++-- - 3 files changed, 13 insertions(+), 5 deletions(-) - -commit 9842b3b00492eda21297d5d65f769f77a565f6ac -Author: Aleksei Volkov -Date: Sat Feb 7 20:46:26 2015 +0100 - - No need to check for hmtx, freetype does for us - - Bug #88939 - - fofi/FoFiTrueType.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 4849eb43892640062c485e48ba7a29b5a0cc9587 -Author: William Bader -Date: Sat Feb 7 16:41:53 2015 +0100 - - Make the colorpsace optimization and option and not the default - - Bug #88971 - - poppler/PSOutputDev.cc | 25 ++++++++++++++++--------- - poppler/PSOutputDev.h | 4 ++++ - utils/pdftops.1 | 10 +++++++++- - utils/pdftops.cc | 4 ++++ - 4 files changed, 33 insertions(+), 10 deletions(-) - -commit 8e16e423a718b92514885e771e31048f1ae2a766 -Author: Albert Astals Cid -Date: Thu Feb 5 20:18:13 2015 +0100 - - 0.31.0 - - And copyright updating - - CMakeLists.txt | 4 ++-- - NEWS | 17 +++++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - poppler/CairoOutputDev.cc | 1 + - poppler/CairoOutputDev.h | 1 + - poppler/JBIG2Stream.cc | 1 + - poppler/JBIG2Stream.h | 1 + - poppler/Makefile.am | 2 +- - poppler/Stream.cc | 1 + - qt4/src/CMakeLists.txt | 2 +- - qt4/src/Doxyfile | 2 +- - qt4/src/Makefile.am | 2 +- - qt5/src/CMakeLists.txt | 2 +- - qt5/src/Doxyfile | 2 +- - qt5/src/Makefile.am | 2 +- - 16 files changed, 33 insertions(+), 11 deletions(-) - -commit f932315e559a7857d9c5642eb04efc0d2b717789 -Author: suzuki toshiya -Date: Tue Jan 20 22:05:29 2015 +1030 - - cairo: support embedding JBIG2 image data - - http://lists.freedesktop.org/archives/poppler/2014-December/011183.html - - poppler/CairoOutputDev.cc | 117 - ++++++++++++++++++++++++++++++++++++++-------- - poppler/CairoOutputDev.h | 3 ++ - poppler/JBIG2Stream.cc | 9 +++- - poppler/JBIG2Stream.h | 4 +- - poppler/Stream.cc | 13 +++++- - 5 files changed, 121 insertions(+), 25 deletions(-) - -commit 78abf540057181b708c546aee421f81a1dd58331 -Author: Adam Reichold -Date: Wed Jan 21 22:30:45 2015 +0100 - - Worlds -> Words - - qt4/src/poppler-page.cc | 4 ++-- - qt4/src/poppler-qt4.h | 2 +- - qt4/tests/check_search.cpp | 4 ++-- - qt5/src/poppler-page.cc | 4 ++-- - qt5/src/poppler-qt5.h | 2 +- - qt5/tests/check_search.cpp | 4 ++-- - 6 files changed, 10 insertions(+), 10 deletions(-) - -commit 027eac4e565576ca2e7042e21426e28abd775d98 -Author: Adam Reichold -Date: Tue Jan 20 00:09:09 2015 +0100 - - Expose whole-words search option in Qt frontends - - qt4/src/poppler-page-private.h | 5 +- - qt4/src/poppler-page.cc | 114 - +++++++++++++++++++++++++------------ - qt4/src/poppler-qt4.h | 44 +++++++++++++- - qt4/tests/check_search.cpp | 112 +++++++++++++++++++++++++++++++----- - qt5/src/poppler-page-private.h | 5 +- - qt5/src/poppler-page.cc | 116 - +++++++++++++++++++++++++------------ - qt5/src/poppler-qt5.h | 46 +++++++++++++-- - qt5/tests/check_search.cpp | 126 - +++++++++++++++++++++++++++++++++-------- - 8 files changed, 447 insertions(+), 121 deletions(-) - -commit 30a0baa353c374165e5f411efc4203746f14a74d -Author: Albert Astals Cid -Date: Sun Jan 18 15:39:53 2015 +0100 - - Move more variables from GlobalParams to PSOutputDev - - poppler/CairoFontEngine.cc | 4 +- - poppler/GfxFont.cc | 15 ++--- - poppler/GfxFont.h | 7 ++- - poppler/GlobalParams.cc | 144 - --------------------------------------------- - poppler/GlobalParams.h | 28 --------- - poppler/PSOutputDev.cc | 121 +++++++++++++++++++------------------ - poppler/PSOutputDev.h | 30 +++++++++- - poppler/SplashOutputDev.cc | 2 +- - qt4/src/ArthurOutputDev.cc | 4 +- - qt5/src/ArthurOutputDev.cc | 4 +- - utils/pdftops.cc | 36 ++++-------- - 11 files changed, 116 insertions(+), 279 deletions(-) - -commit 8fed995c3457d64669ae12901450b7c811599dba -Author: Albert Astals Cid -Date: Sun Jan 18 14:52:53 2015 +0100 - - Forgot to delete this in the previous commit - - poppler/GlobalParams.h | 1 - - 1 file changed, 1 deletion(-) - -commit 4992ff7fa062462507733494827fdad7eaaa95b3 -Author: Albert Astals Cid -Date: Sun Jan 18 13:57:36 2015 +0100 - - Move raster mono and resolution from GlobalParams to PSOutputDev - - poppler/GlobalParams.cc | 32 -------------------------------- - poppler/GlobalParams.h | 7 ------- - poppler/PSOutputDev.cc | 18 +++++++----------- - poppler/PSOutputDev.h | 6 ++++++ - utils/pdftops.cc | 7 ++++--- - 5 files changed, 17 insertions(+), 53 deletions(-) - -commit 54908f675eda96c363528198e8c530921df2f45a -Author: Albert Astals Cid -Date: Sun Jan 18 13:34:45 2015 +0100 - - Move psUncompressPreloadedImages from GlobalParams to PSOutputDev - - It belongs there and PSOutputDev is always created by the external - user - so in case someone wants to set it, it is the same amount of work - to set it in GlobalParams than in PSOutputDev - - poppler/GlobalParams.cc | 16 ---------------- - poppler/GlobalParams.h | 3 --- - poppler/PSOutputDev.cc | 9 +++++---- - poppler/PSOutputDev.h | 2 ++ - 4 files changed, 7 insertions(+), 23 deletions(-) - -commit 136d7aa5e79f153dfcb216c58598e33a8ff16630 -Author: Albert Astals Cid -Date: Sun Jan 18 13:28:26 2015 +0100 - - Remove declared but not defined function - - poppler/GlobalParams.h | 1 - - 1 file changed, 1 deletion(-) - -commit fdba9154d9a176759c765180805e608d4959c34e -Author: Adam Reichold -Date: Fri Jan 16 19:57:59 2015 +0100 - - pdftoppm: parse the flags earlier and only once - - utils/pdftoppm.cc | 42 +++++++++++++++--------------------------- - 1 file changed, 15 insertions(+), 27 deletions(-) - -commit 6b072500b5ac936631be6b29b7d5a591848a18f3 -Author: William Bader -Date: Wed Jan 14 23:28:03 2015 +0100 - - Add rasterization option to pdftops - - Also removes GlobalParams stuff \o/ - - Coded in conjuntion with Albert - - Bug #85934 - - cpp/poppler-page-renderer.cpp | 5 ++-- - poppler/GlobalParams.cc | 58 - ++----------------------------------------- - poppler/GlobalParams.h | 16 +++--------- - poppler/PSOutputDev.cc | 14 +++++------ - poppler/PSOutputDev.h | 5 +++- - poppler/SplashOutputDev.cc | 19 ++++++-------- - poppler/SplashOutputDev.h | 11 +++++--- - qt4/src/poppler-page.cc | 7 +++--- - qt5/src/poppler-page.cc | 7 +++--- - utils/pdftohtml.cc | 9 +++---- - utils/pdftoppm.cc | 49 ++++++++++++++++++++++++++---------- - utils/pdftops.cc | 14 ++++++++++- - 12 files changed, 96 insertions(+), 118 deletions(-) - -commit dc9751e6ac47a708ba6e7a68560bdce6a2e4a010 -Author: Albert Astals Cid -Date: Fri Jan 9 15:50:02 2015 +0100 - - Compile++ - - poppler/GfxState.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit d91876a0c7a936b1f6f461d80131d7586a6c1a5e -Author: Albert Astals Cid -Date: Thu Jan 8 20:13:06 2015 +0100 - - Accept malformed documents whose root is a Page instead of a Pages - - gs and Adobe Reader do it so it's "common" enough - - Bug #88172 - - poppler/Catalog.cc | 37 ++++++++++++++++++++++++++++++++----- - 1 file changed, 32 insertions(+), 5 deletions(-) - -commit 7ce86b9be058408eb567d8d0b9747853a66c116f -Author: Albert Astals Cid -Date: Thu Jan 8 17:35:28 2015 +0100 - - Remove assert in gouraudFillTriangle - - We don't *need* the assert, an error() is fine and the malformed - document - will just get rendered wrongly instead of "crashing" - - Bugs #85274 - - poppler/Gfx.cc | 28 +++++++++++++++++----------- - 1 file changed, 17 insertions(+), 11 deletions(-) - -commit 9e9df4b20d17478996780008bc9802a857d173fc -Author: Albert Astals Cid -Date: Thu Jan 8 17:01:52 2015 +0100 - - Fix crash on broken document - - Bug #85281 - - poppler/GfxState.cc | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -commit 636faafcb84b856580398f7883b6406d645c85d1 -Author: Adam Reichold -Date: Tue Jan 6 22:57:20 2015 +0100 - - JPEG2000Stream: Inline doGetChar and doLookChar - - poppler/JPEG2000Stream.cc | 49 - +++++++++++++++++++++++++---------------------- - poppler/JPEG2000Stream.h | 7 ++----- - 2 files changed, 28 insertions(+), 28 deletions(-) - -commit c13bffe92963c4969037695992f4c2776bbe973f -Author: Albert Astals Cid -Date: Sun Jan 4 23:17:42 2015 +0100 - - 0.30 - - CMakeLists.txt | 4 ++-- - NEWS | 18 ++++++++++++++++++ - configure.ac | 2 +- - cpp/CMakeLists.txt | 2 +- - cpp/Doxyfile | 2 +- - cpp/Makefile.am | 2 +- - poppler/Makefile.am | 2 +- - poppler/PDFDoc.cc | 1 + - poppler/TextOutputDev.cc | 2 +- - poppler/poppler-config.h.cmake | 2 +- - poppler/poppler-config.h.in | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 13 files changed, 31 insertions(+), 12 deletions(-) - -commit e499fdab2e96cb3069db7ac8ffa0df20ccccddc9 -Author: Thomas Freitag -Date: Sun Jan 4 20:23:39 2015 +0100 - - extended openjpeg2 support - - poppler/JPEG2000Stream.cc | 101 - +++++++++++++++++++++++++++++++++++----------- - 1 file changed, 78 insertions(+), 23 deletions(-) - -commit 2841f3c34dd6366a70e4d6d307a08b3fbc3e9897 -Author: Adrian Johnson -Date: Sun Jan 4 20:22:47 2015 +0100 - - Cmake support for openjpeg2 - - With some tweaks from Albert - - CMakeLists.txt | 56 - +++++++++++++++++++++++++++++------- - cmake/modules/FindLIBOPENJPEG2.cmake | 30 +++++++++++++++++++ - 2 files changed, 76 insertions(+), 10 deletions(-) - -commit 117af9c6bbd923954ef7de63adec8c22d51da1e4 -Author: Adrian Johnson -Date: Sun Jan 4 19:42:34 2015 +0100 - - Initial attempt at libopenjpeg2 support - - OpenJPEG 2 has a new pkg-config name and API. - - - Update configure.ac to find openjpeg 2 and provide V1/v2 macros - - Update JPEG2000Stream to use new API depending on openjpeg v1/v2 - macros - - OpenJPEG 2.1 changed the API so provide a version macro to make - it easier - to handle the the 2.1 change and any future changes. - - Move openjpeg.h into the .cc file - - configure.ac | 80 ++++++++---- - poppler/JPEG2000Stream.cc | 313 - +++++++++++++++++++++++++++++++++++++--------- - poppler/JPEG2000Stream.h | 41 ++---- - 3 files changed, 323 insertions(+), 111 deletions(-) - -commit 9caf7525409d699c16896653528486451123b485 -Author: Albert Astals Cid -Date: Sun Jan 4 18:48:02 2015 +0100 - - Make PSOutputDev accept a list of pages indeces - - Instead of first, last - - Bug #84833 - - Reviewed in the mailing list, see "Can anyone have a look at my - patch?" - - glib/poppler-page.cc | 10 ++++++--- - poppler/PSOutputDev.cc | 50 - ++++++++++++++++++++++++----------------- - poppler/PSOutputDev.h | 14 +++++++----- - qt4/src/poppler-ps-converter.cc | 11 ++++++--- - qt5/src/poppler-ps-converter.cc | 11 ++++++--- - utils/pdftops.cc | 15 +++++++++---- - 6 files changed, 71 insertions(+), 40 deletions(-) - -commit 173f182fb568843f97e7d45d1b16bebbd2aa7413 -Author: Li Junling -Date: Fri Jan 2 17:23:24 2015 +0100 - - Find last 'startxref' in the last 24K instead of the last 1K - - Bug #85919 - - poppler/PDFDoc.cc | 38 ++++++++++++++++++++++---------------- - 1 file changed, 22 insertions(+), 16 deletions(-) - -commit 0b1cd9403b8a240e58ec4f1832588d25f8295278 -Author: Jason Crain -Date: Sat Dec 20 03:22:23 2014 -0600 - - Free BBox object on error - - poppler/Gfx.cc | 1 + - 1 file changed, 1 insertion(+) - -commit acc33a6950031ac4a5c759d043d24df0cfa7e8b6 -Author: Jason Crain -Date: Sat Dec 20 02:24:49 2014 -0600 - - Check for invalid matrix in annotation - - Bug #84990 - - poppler/Gfx.cc | 12 ++++++++++-- - 1 file changed, 10 insertions(+), 2 deletions(-) - -commit 56aff7d78658f586e3c4cd41685f189dafb3098a -Author: Thomas Freitag -Date: Tue Dec 23 15:49:15 2014 +0100 - - pdfunite: Support output intents, optional content and acroform - - utils/pdfunite.cc | 116 - ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 116 insertions(+) - -commit 9e734063e6a6a4b9743c9aa27d3d3127b5a960d7 -Author: Jason Crain -Date: Fri Dec 19 01:56:45 2014 -0600 - - Move array reallocation from visitLine to startLine - - Fixes potential memory corruption from writing after end of lines - array. - - https://bugs.freedesktop.org/show_bug.cgi?id=84555 - - poppler/TextOutputDev.cc | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -commit 0c47b769a77795bd866b6686b79fd20ad6f554bf -Author: Daniel Macks -Date: Sun Dec 14 18:52:48 2014 +0100 - - Only consider adding -fno-check-new if compiler supports it - - Helps compiling on old clang's - - Bug #76963 - - configure.ac | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -commit c9c90d50e3708f6fac313aa8b458aef6dba5dcfb -Author: Hans-Peter Deifel -Date: Fri Dec 12 13:09:51 2014 +0100 - - cpp: New API to set debug output function - - Adds the global function set_debug_error_function, that allows users - to install their own function to print internal poppler errors. - - cpp/poppler-global.cpp | 29 +++++++++++++++++++++++++++++ - cpp/poppler-global.h | 5 +++++ - cpp/poppler-private.cpp | 15 ++++++++++++--- - cpp/poppler-private.h | 3 +++ - 4 files changed, 49 insertions(+), 3 deletions(-) - -commit fa8f276a10911c97d2777fff3270771802bc3892 -Author: Albert Astals Cid -Date: Thu Dec 4 23:11:12 2014 +0100 - - 0.29.0 - - CMakeLists.txt | 4 ++-- - NEWS | 15 +++++++++++++++ - configure.ac | 4 ++-- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 7 files changed, 23 insertions(+), 8 deletions(-) - -commit fee700cfecb9d7d5fa938704a5f457f15aaa4676 -Author: Albert Astals Cid -Date: Mon Dec 1 20:52:42 2014 +0100 - - Run dos2unix as suggested by Volker Grabsch - - splash/SplashState.h | 278 ++++++++++---------- - test/perf-test-preview-dummy.cc | 44 ++-- - test/perf-test-preview-win.cc | 544 - ++++++++++++++++++++-------------------- - 3 files changed, 433 insertions(+), 433 deletions(-) - -commit d3fe0661c6dc6050e14cd5cb4afa089b7d7d66b0 -Author: Richard PALO -Date: Sun Nov 30 22:46:22 2014 +0100 - - warning: "_FILE_OFFSET_BITS" redefined - - Bug #86870 - - test/perf-test.cc | 2559 - +++++++++++++++++++++++++++-------------------------- - 1 file changed, 1280 insertions(+), 1279 deletions(-) - -commit 18884065e11fee82506915095619107a43172ecb -Author: Richard PALO -Date: Sun Nov 30 22:36:29 2014 +0100 - - The isfinite macro is defined on SunOS under c99 - - Bug #86869 - - poppler/SplashOutputDev.cc | 3 +++ - 1 file changed, 3 insertions(+) - -commit bcb470064dd9f75ab0b0a0d9b7319fe8f1e558ae -Author: Adrian Johnson -Date: Tue Nov 25 05:53:38 2014 +1030 - - cofigure: print "no" instead of "auto" if lcms not found - - configure.ac | 2 ++ - 1 file changed, 2 insertions(+) - -commit 832046c57ab2909d329340f1c941b29e8246ff73 -Author: Thomas Freitag -Date: Fri Nov 28 11:08:34 2014 +0100 - - Use correct LAB byte array for lcms input - - Bug #86388 - - poppler/GfxState.cc | 51 - ++++++++++++++++++++++++++++++++++++++------------- - poppler/GfxState.h | 4 +++- - 2 files changed, 41 insertions(+), 14 deletions(-) - -commit a604bc3a2ed9f9181aa3b12d795608fcf5e08220 -Author: Thomas Freitag -Date: Fri Nov 14 11:56:50 2014 +0100 - - Solve blend mode problem in CYMK and DeviceN for separable blend modes - - Fixes part of #68986 - - poppler/SplashOutputDev.cc | 277 - +++++++++++++++++++++++++-------------------- - 1 file changed, 155 insertions(+), 122 deletions(-) - -commit b7802ff39db270dda2aa20f005fb87c22ed34137 -Author: Thomas Freitag -Date: Fri Nov 14 11:47:38 2014 +0100 - - Use Default colorspaces if present instead of Device colorspaces - - Fixes part of #68986 - - poppler/CairoOutputDev.cc | 4 +- - poppler/Gfx.cc | 40 +++++----- - poppler/GfxState.cc | 197 - ++++++++++++++++++++++++++++++++++------------ - poppler/GfxState.h | 31 ++++---- - poppler/Page.cc | 4 +- - 5 files changed, 188 insertions(+), 88 deletions(-) - -commit 07aa6f4030418883d8d45a8dfa3d80d2dadca4e7 -Author: Thomas Freitag -Date: Thu Nov 13 12:26:25 2014 +0100 - - write correct size in trailer dict - - Bug #86063 - - poppler/PDFDoc.cc | 7 ++----- - 1 file changed, 2 insertions(+), 5 deletions(-) - -commit 51e7c29cabedc72e097023e6d8d6d68ed43fa20c -Author: Carlos Garcia Campos -Date: Fri Nov 7 18:30:36 2014 +0100 - - regtest: Update references also for tests that no longer crash - - We are currently updating the refs only when we have checksums to - compare, but if a test used to crash there's no md5 file in refs. - - regtest/TestRun.py | 2 ++ - regtest/backends/__init__.py | 24 ++++++++++++++++++++++++ - 2 files changed, 26 insertions(+) - -commit d205908930d5dc4ec3a1a1a2c2b93fbb92c2c867 -Author: William Bader -Date: Wed Nov 5 20:23:49 2014 +0100 - - Make it proper C - - glib/demo/annots.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit fa1d636b00210b9c52787ab3c833fe9aa2e293fa -Author: Albert Astals Cid -Date: Tue Nov 4 20:00:08 2014 +0100 - - 0.28.1 - - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 4 files changed, 4 insertions(+), 4 deletions(-) - -commit 7debbb05df18afc86df8a4fd37980728ec2e5788 -Author: Albert Astals Cid -Date: Tue Nov 4 19:29:58 2014 +0100 - - Fix typo - - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit d5489ef37742227176e800390a990f2b882d9710 -Author: Albert Astals Cid -Date: Tue Nov 4 01:27:05 2014 +0100 - - 0.28.0 - - CMakeLists.txt | 6 +++--- - NEWS | 43 +++++++++++++++++++++++++++++++++++++++++++ - configure.ac | 4 ++-- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/CMakeLists.txt | 2 +- - qt4/src/Doxyfile | 2 +- - qt4/src/Makefile.am | 2 +- - qt5/src/CMakeLists.txt | 2 +- - qt5/src/Doxyfile | 2 +- - qt5/src/Makefile.am | 2 +- - 11 files changed, 56 insertions(+), 13 deletions(-) - -commit f87115a1129e4e03802769181a3392c8dce3192a -Author: Hib Eris -Date: Tue Nov 4 01:25:18 2014 +0100 - - Don't ship the moc files - - qt4/demos/Makefile.am | 1 - - qt5/demos/Makefile.am | 1 - - 2 files changed, 2 deletions(-) - -commit 0a9c38076f1555196029372b7e08714b43c7a58d -Author: Albert Astals Cid -Date: Mon Nov 3 21:43:28 2014 +0100 - - Update (C) - - fofi/FoFiType1.cc | 1 + - poppler/PDFDoc.cc | 4 ++-- - poppler/PDFDoc.h | 2 +- - poppler/XRef.cc | 2 +- - qt4/src/poppler-annotation-private.h | 2 +- - qt4/src/poppler-annotation.cc | 2 +- - qt4/src/poppler-page.cc | 2 +- - qt4/src/poppler-qt4.h | 2 +- - qt5/src/poppler-annotation-private.h | 2 +- - qt5/src/poppler-annotation.cc | 2 +- - qt5/src/poppler-page.cc | 2 +- - qt5/src/poppler-qt5.h | 2 +- - utils/pdfdetach.cc | 1 + - utils/pdftocairo-win32.cc | 12 ++++++++++++ - utils/pdftocairo-win32.h | 12 ++++++++++++ - utils/pdftocairo.cc | 3 ++- - 16 files changed, 40 insertions(+), 13 deletions(-) - -commit 73cf1e87c9803bbe4271be297b486d9932677d46 -Author: Albert Astals Cid -Date: Mon Nov 3 21:37:13 2014 +0100 - - Need to dist this file - - utils/Makefile.am | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 2fd0cd652cfc03c9af35a59192729e4ed26e8146 -Author: Albert Astals Cid -Date: Mon Nov 3 19:20:23 2014 +0100 - - Fix memory leaks when running pdfseparate - - Bug #84768 - - poppler/PDFDoc.cc | 102 - +++++++++++++++++++++------------------------------ - poppler/PDFDoc.h | 2 +- - utils/pdfseparate.cc | 8 +++- - utils/pdfunite.cc | 4 +- - 4 files changed, 50 insertions(+), 66 deletions(-) - -commit d6ea8acbb348fdb43601a963ba5407e933565003 -Author: Adrian Johnson -Date: Mon Nov 3 19:11:25 2014 +0100 - - fix crash in Xref::getEntry - - Bug 85234 - - poppler/XRef.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit bd142810b9f66b017a58b3e1840d4d72794f1ef4 -Author: Jason Crain -Date: Thu May 15 02:22:44 2014 -0500 - - cairo: Use matrix to determine pattern size - - https://bugs.freedesktop.org/show_bug.cgi?id=33364 - - poppler/CairoOutputDev.cc | 22 ++++++++++++++++++---- - 1 file changed, 18 insertions(+), 4 deletions(-) - -commit 06dd7dc337c7db6122329e98783a126d59035aff -Author: Hib Eris -Date: Thu May 29 12:45:33 2014 +0200 - - Include windows.h, not Windows.h - - Fixes building on file systems that are case sensitive, e.g. when - cross compiling on Linux for win32. - - https://bugs.freedesktop.org/show_bug.cgi?id=79407 - - qt4/tests/stress-threads-qt4.cpp | 2 +- - qt5/tests/stress-threads-qt5.cpp | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 76a350b11160ac203a41b27fbc85a3264bfe4735 -Author: Carlos Garcia Campos -Date: Thu Oct 30 18:25:06 2014 +0100 - - regtest: Try to fix again the paths of the resources in the generated - HTML report - - Use always relatives paths for the resources under the out directory, - and absolute paths for all other resources when no-absolute-path - command - line option is used. - - regtest/HTMLReport.py | 47 - +++++++++++++++++++++++------------------------ - 1 file changed, 23 insertions(+), 24 deletions(-) - -commit c93d6b264dc77c46c72281d966bf826274a43d15 -Author: Carlos Garcia Campos -Date: Wed Oct 29 17:37:06 2014 +0100 - - regtest: respect --no-absolute-paths when creating the pretty - diff links - - regtest/HTMLReport.py | 16 ++++++++++------ - 1 file changed, 10 insertions(+), 6 deletions(-) - -commit 9f953e47a6ea92d806aeea61e227af54c889c6be -Author: Carlos Garcia Campos -Date: Mon Oct 27 19:53:28 2014 +0100 - - regtest: Add an option to create the HTML report without absolute - paths - - It uses the paths as received from the command line attributes. - - regtest/HTMLReport.py | 15 +++++++++++---- - regtest/commands/create-report.py | 4 ++++ - 2 files changed, 15 insertions(+), 4 deletions(-) - -commit 3d840231bc6f0714da361493ef32913af2eb78d7 -Author: Carlos Garcia Campos -Date: Sun Oct 26 12:09:28 2014 +0100 - - regtest: Fix png diff generation with python-pil pillow fork - - Use from PIL import Image instead of just import Image, since pillow - only doesn't support import Image without using PIL.Image. - - regtest/backends/__init__.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 68e58ec5465efc289d85ae104941db92450a3168 -Author: Carlos Garcia Campos -Date: Sun Oct 26 11:21:23 2014 +0100 - - regtest: Limit the number of worker threads to the number of documents - to test - - We are always spawning all the threads even if the documents to - test is - less than the worker threads. Also optimize the case of running - only one - test to not spwn any thread. - - regtest/TestRun.py | 27 ++++++++++++++++++--------- - 1 file changed, 18 insertions(+), 9 deletions(-) - -commit 7c21b95852e891060cd2e276949acf0945306ab7 -Author: Carlos Garcia Campos -Date: Sun Oct 26 11:08:45 2014 +0100 - - regtest: Allow to run groups of tests individually - - Now it's possible to pass more than one argument to run-tests - command and - optionally the docs directory. When more than one test is passed - and the - docs directory is not provided, the common base path of all passed - tests - is used as docs directory. The tests passed can be documents or - directories, using absolute paths or paths relative to the docs - directory. - This also allows us to update the refs for a group of tests. - - regtest/TestRun.py | 26 ++++++++++++++++++++++++-- - regtest/Utils.py | 7 +++++-- - regtest/commands/run-tests.py | 29 ++++++++++++++++++++--------- - 3 files changed, 49 insertions(+), 13 deletions(-) - -commit 53be607edc18a861aeb0b6663bac3c05de46c84c -Author: Hib Eris -Date: Fri Oct 24 11:35:17 2014 +0200 - - Fix warning on unused variable in pdftocairo.cc - - Fixes warning: - - CXX pdftocairo-pdftocairo.o - pdftocairo.cc:130:14: warning: ‘setupdlg’ defined but not used - [-Wunused-variable] - static GBool setupdlg = gFalse; - ^ - - https://bugs.freedesktop.org/show_bug.cgi?id=85400 - - utils/pdftocairo.cc | 2 ++ - 1 file changed, 2 insertions(+) - -commit f966b8766d40b2c912e69a1e17ef8cc4bd52be95 -Author: Carlos Garcia Campos -Date: Tue Oct 21 16:42:27 2014 +0200 - - fofi: Fix a crash when parsing an invalid font due to a integer - overflow - - This fixes a crash rendering trust_metrics.f2495.f0.pdf. - - fofi/FoFiType1.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 4963332ca4db13d8a9186b06d2aa0d59abbc10ee -Author: Adrian Johnson -Date: Sun Oct 5 21:58:37 2014 +1030 - - pdftocairo: add -printdlg output option for win32 - - when set the win32 print dialog is displayed before printing - - configure.ac | 2 +- - utils/pdftocairo-win32.cc | 303 - ++++++++++++++++++++++++++++++++++++++++++++-- - utils/pdftocairo-win32.h | 14 +-- - utils/pdftocairo.1 | 14 ++- - utils/pdftocairo.cc | 31 ++++- - 5 files changed, 337 insertions(+), 27 deletions(-) - -commit d8fe025c36f555a5438677e20df803eee216bb13 -Author: Adrian Johnson -Date: Sun Oct 5 18:11:09 2014 +1030 - - pdftocairo: add a -setupdlg option that will the show printer - properties - - dialog when printing to a win32 printer. - - utils/pdftocairo-win32.cc | 22 +++++++++++++++++++--- - utils/pdftocairo-win32.h | 3 ++- - utils/pdftocairo.1 | 5 +++++ - utils/pdftocairo.cc | 24 ++++++++++++++++-------- - 4 files changed, 42 insertions(+), 12 deletions(-) - -commit c091aa14513859ab76223f5e4e6055d92082433c -Author: Adrian Johnson -Date: Sun Sep 14 20:43:47 2014 +0930 - - pdftocairo: fix a number of bugs in win32 printing - - - make origPageSizes work - - make landscape pages work - - make -noshrink option work - - return actual page size in use back to main() so fit page transform - works - - hdc should be destroyed after cairo surface - - improve option parsing and rename duplex values - - Add third call to DocumentProperties as discussed in bug 79936 - - fix error messages - - utils/pdftocairo-win32.cc | 181 - ++++++++++++++++++++++++++-------------------- - utils/pdftocairo-win32.h | 2 +- - utils/pdftocairo.1 | 5 +- - utils/pdftocairo.cc | 49 ++++++------- - 4 files changed, 132 insertions(+), 105 deletions(-) - -commit cc3b39d49c656e912a7461212f3bb4e58c6444e7 -Author: Adrian Johnson -Date: Fri Sep 12 18:17:49 2014 +0930 - - make pdftocairo-win32.cc a standalone .cc file - - instead of #including it in pdftocairo.cc - - utils/CMakeLists.txt | 1 + - utils/Makefile.am | 3 +- - utils/pdftocairo-win32.cc | 74 - +++++++++++++++++++++++------------------------ - utils/pdftocairo-win32.h | 22 ++++++++++++++ - utils/pdftocairo.cc | 24 +++++++++------ - 5 files changed, 77 insertions(+), 47 deletions(-) - -commit 700205af19ef1ae5f2c713d118ebd5dd4a0afba3 -Author: Adrian Johnson -Date: Sun Sep 7 20:18:36 2014 +0930 - - pdftocairo: Allow an output file for win32 printing to be specified - - Can be used for testing win32 print output without wasting paper. - - utils/pdftocairo-win32.cc | 12 ++++++++---- - utils/pdftocairo.1 | 4 ++++ - utils/pdftocairo.cc | 13 +++++++------ - 3 files changed, 19 insertions(+), 10 deletions(-) - -commit 40d3ae87befad489fd8c0b38ff2561a0782cae0b -Author: Rodrigo Rivas Costa -Date: Sat Sep 6 21:04:10 2014 +0930 - - Add support for printing to a Windows printer from pdftocairo - - Bug 79936 - - configure.ac | 2 +- - utils/pdftocairo-win32.cc | 219 - ++++++++++++++++++++++++++++++++++++++++++++++ - utils/pdftocairo.1 | 23 ++++- - utils/pdftocairo.cc | 61 ++++++++++--- - 4 files changed, 292 insertions(+), 13 deletions(-) - -commit ee4a389872d86b619c677888da8f13f1f6c54472 -Author: Adrian Johnson -Date: Mon Oct 20 22:32:30 2014 +1030 - - PDFDoc: fix crash when getPage() returns NULL - - Bug 85235 - - poppler/PDFDoc.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 0c3f53e34ec287dab2784e1f3411ad06b62dffc7 -Author: Adrian Johnson -Date: Mon Oct 20 22:17:20 2014 +1030 - - PDFDOC: Check for EOF when reading raw stream - - Bug 85233 - - poppler/PDFDoc.cc | 4 ++++ - 1 file changed, 4 insertions(+) - -commit 88dbd4df0998233939b4a51cedbfc65c58a315f9 -Author: Adrian Johnson -Date: Sun Oct 19 22:47:15 2014 +1030 - - pdfdetach: fix crash when getPage() returns null - - Bug 85145 - - utils/pdfdetach.cc | 2 ++ - 1 file changed, 2 insertions(+) - -commit e0179304cdef615fcf639046410d214fd5b5f276 -Author: Adrian Johnson -Date: Sun Oct 19 21:36:39 2014 +1030 - - cairo: fix crash when no group color space - - Bug 85137 - - poppler/CairoOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 745f1241bf903969e50f0e1139641e389a9c331f -Author: Scott West -Date: Tue Oct 7 23:54:52 2014 +0200 - - Fix memory leak in Dict.remove. - - The entry was previously just overwritten now it is freed - - Small fixes by Albert oo - - Bug #84607 - - poppler/Dict.cc | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -commit b8810703ca76f0bbc8185ab87679cf18eb006d52 -Author: Luigi Scarso -Date: Tue Oct 7 22:45:05 2014 +0200 - - Make Attribute::getName() work when UTF-16BE is used - - Contains some ideas by me - Bug #84722 - - goo/GooString.h | 9 +++++---- - poppler/StructElement.cc | 17 +++++++++++------ - poppler/StructElement.h | 7 +++++-- - 3 files changed, 21 insertions(+), 12 deletions(-) - -commit 96a04336c7a6331727724125686a0d6f42f19f46 -Author: Adrian Johnson -Date: Mon Oct 6 10:21:51 2014 +1030 - - cairo: only embed mime data if image decode map is identity - - https://bugs.launchpad.net/ubuntu/+source/cairo/+bug/1317517 - - poppler/CairoOutputDev.cc | 19 ++++++++++++++++--- - poppler/CairoOutputDev.h | 3 ++- - 2 files changed, 18 insertions(+), 4 deletions(-) - -commit 18541054bebce3f9d4729629785bf140d67d2da0 -Author: Adrian Johnson -Date: Wed Sep 24 21:20:42 2014 +0930 - - cairo: Only embed mime data for gray/rgb/cmyk colorspaces - - Bug 80719 - - poppler/CairoOutputDev.cc | 39 +++++++++++++++++++++++++++++++-------- - poppler/CairoOutputDev.h | 2 +- - 2 files changed, 32 insertions(+), 9 deletions(-) - -commit cbf2652c483d7010fc36191c8b209a57eeec93d8 -Author: Adrian Johnson -Date: Thu Jan 26 00:37:17 2012 +1030 - - cairo: don't render text when text matrix is not invertable - - Emulates acroread behavior. - - Bug 78042 - - poppler/CairoOutputDev.cc | 14 +++++++++----- - poppler/CairoOutputDev.h | 1 + - 2 files changed, 10 insertions(+), 5 deletions(-) - -commit 4fe17e97a4bd7873caad771c446199b282039697 -Author: Carlos Garcia Campos -Date: Sun Oct 5 11:30:43 2014 +0200 - - glib: Build introspection linking to the uninstalled libraries - - https://bugs.freedesktop.org/show_bug.cgi?id=84526 - - glib/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit a2477da56a4d1c534175940d7c01a9d3db6c72d4 -Author: Albert Astals Cid -Date: Wed Oct 1 22:33:11 2014 +0200 - - Fix 303287ebdad0de9fb2655c4d7eab627c0045ea04 - - It may happen that j is bigger than macGlyphNames size, so don't - try to access it - - fofi/FoFiTrueType.cc | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -commit ce95ecda450361496aedd5d5cd0bf47fd2c66703 -Author: Albert Astals Cid -Date: Tue Sep 30 19:50:20 2014 +0200 - - Fix assert in 5068.asan.0.6052.pdf - - poppler/Gfx.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit 01723aa17e836e818158dbdc56df642a290be300 -Author: Adrian Johnson -Date: Tue Sep 30 18:48:47 2014 +0200 - - Map Standard/Expert encoding ligatures to AGLFN names - - for use with substitute fonts that are not compatible with the - Standard 14 fonts. - - Bug 80093 - - poppler/CairoFontEngine.cc | 12 +++++++++--- - poppler/GfxFont.cc | 29 ++++++++++++++++++++++++++++- - poppler/GfxFont.h | 7 ++++++- - splash/SplashFTFontFile.cc | 8 ++++++++ - 4 files changed, 51 insertions(+), 5 deletions(-) - -commit 529db4a94607c1ad909764d26f740c601bbe896f -Author: Hib Eris -Date: Mon Sep 29 22:59:15 2014 +0200 - - Fix build with --disable-utils - - Since 21b5fd655ce45b90668d1416d21c526ab7eb3ad6, building Poppler - fails when configured - with '--disable-utils'. - - Bug #84448 - - Makefile.am | 6 +----- - utils/Makefile.am | 4 ++++ - 2 files changed, 5 insertions(+), 5 deletions(-) - -commit c54f6aceed983a221d88ce5c21becbf8aab2931b -Author: Thomas Freitag -Date: Mon Sep 29 21:42:46 2014 +0200 - - use alt colorspace to get CMYK values for an ICC based CMYK colorspace - - The reason for the pale image is that GfxICCBasedColorSpace::getCMYK() - uses the cms transformation to get RGB values and the convert it - back to CMYK even for a ICC based CMYK colorspace instead of just - returning the CMYK values itself. - - Bug #79019 - - poppler/GfxState.cc | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - -commit 21b5fd655ce45b90668d1416d21c526ab7eb3ad6 -Author: Hib Eris -Date: Sun Sep 14 11:20:23 2014 +0200 - - Refactor Makefiles to build a noinst library for parsing args - - Prevents this automake warning about possible forward-incompatibility: - - $ ./autogen.sh - ... - cpp/tests/Makefile.am:16: warning: source file - '$(top_srcdir)/utils/parseargs.cc' is in a subdirectory, - cpp/tests/Makefile.am:16: but option 'subdir-objects' is disabled - automake: warning: possible forward-incompatibility. - automake: At least a source file is in a subdirectory, but the - 'subdir-objects' - automake: automake option hasn't been enabled. For now, the - corresponding output - automake: object file(s) will be placed in the top-level directory. - However, - automake: this behaviour will change in future Automake versions: - they will - automake: unconditionally cause object files to be placed in the - same subdirectory - automake: of the corresponding sources. - automake: You are advised to start using 'subdir-objects' option - throughout your - automake: project, to avoid future incompatibilities. - cpp/tests/Makefile.am:20: warning: source file - '$(top_srcdir)/utils/parseargs.cc' is in a subdirectory, - cpp/tests/Makefile.am:20: but option 'subdir-objects' is disabled - parallel-tests: installing './test-driver' - test/Makefile.am:58: warning: source file '../utils/parseargs.cc' - is in a subdirectory, - test/Makefile.am:58: but option 'subdir-objects' is disabled - - $ automake --version - automake (GNU automake) 1.14.1 - ... - - https://bugs.freedesktop.org/show_bug.cgi?id=83839 - - cpp/tests/Makefile.am | 3 +-- - test/Makefile.am | 8 ++++---- - utils/.gitignore | 2 ++ - utils/Makefile.am | 42 ++++++++++++++++++------------------------ - 4 files changed, 25 insertions(+), 30 deletions(-) - -commit 70a851b0cc58241d1f2f6bc48af2614595326c8f -Author: Adrian Johnson -Date: Sat Sep 6 21:16:04 2014 +0930 - - Update .gitignore - - .gitignore | 2 ++ - 1 file changed, 2 insertions(+) - -commit d44e7e3560bdc79253df98db05385dce3e8ccbb4 -Author: Adrian Johnson -Date: Sat Sep 6 21:53:21 2014 +0930 - - Don't use -fPIC on mingw - - it emits a warning for every file stating that -fPIC is ignored - - configure.ac | 12 +++++++++++- - 1 file changed, 11 insertions(+), 1 deletion(-) - -commit 2723371b2e2f7684301ea1c5272ab49851f28c03 -Author: Adrian Johnson -Date: Sat Sep 6 21:19:46 2014 +0930 - - make autogen.sh work with variables with spaces - - eg ./autogen.sh CXXFLAGS="-O0 -g3" - - autogen.sh | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit ebc814a7e31511308bbcd8856d0356f4d7cc74be -Author: Hib Eris -Date: Sun Sep 14 11:45:12 2014 +0200 - - Add compile to .gitignore - - Automake automatically creates a wrapper script called 'compile' for - compilers which do not understand '-c -o'. - - $ automake --version - automake (GNU automake) 1.14.1 - - https://bugs.freedesktop.org/show_bug.cgi?id=83840 - - .gitignore | 1 + - 1 file changed, 1 insertion(+) - -commit 8ce31485faa26994c52f4d032cc5a8355aba23d1 -Merge: 4589ce1 303287e -Author: Albert Astals Cid -Date: Fri Sep 26 00:40:43 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit 303287ebdad0de9fb2655c4d7eab627c0045ea04 -Author: Thomas Freitag -Date: Fri Sep 26 00:25:38 2014 +0200 - - Fix rendering of file with a wrong embedded font - - Bug #84270 - - fofi/FoFiTrueType.cc | 22 ++++++++++++++-------- - 1 file changed, 14 insertions(+), 8 deletions(-) - -commit f94ba85a736b4c90c05e7782939f32506472658e -Author: Carlos Garcia Campos -Date: Fri Sep 12 19:22:20 2014 +0200 - - glib: Fix use of uninitialized members in PopplerInputStream - - https://bugs.freedesktop.org/show_bug.cgi?id=82630 - - glib/poppler-input-stream.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit 4589ce17caf94e7c5fa856906d3a8cc08e999d73 -Author: Carlos Garcia Campos -Date: Fri Sep 12 19:22:20 2014 +0200 - - glib: Fix use of uninitialized members in PopplerInputStream - - https://bugs.freedesktop.org/show_bug.cgi?id=82630 - - glib/poppler-input-stream.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit fe67324d450c356b7c876cf50da705156112513a -Merge: e62e18e f74a596 -Author: Albert Astals Cid -Date: Thu Aug 21 21:39:52 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit f74a5964078224c01bd5642aabc928d185bb0b69 -Author: Albert Astals Cid -Date: Thu Aug 21 20:07:54 2014 +0200 - - 0.26.4 - - CMakeLists.txt | 2 +- - NEWS | 12 ++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 17 insertions(+), 5 deletions(-) - -commit ce92e4ccefc7dad79db7f0af7a792ffa47824849 -Author: Albert Astals Cid -Date: Thu Aug 21 20:03:42 2014 +0200 - - Update (C) years - - poppler/Annot.cc | 1 + - poppler/CairoOutputDev.cc | 2 +- - 2 files changed, 2 insertions(+), 1 deletion(-) - -commit 42315c28809e62da7872add917e82853cf8c7e33 -Author: Albert Astals Cid -Date: Thu Aug 21 19:58:35 2014 +0200 - - Make sure e is always initialized - - goo/gfile.cc | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - -commit e62e18e1b318d6fa664d236723de3c06ae43e86b -Author: Jehan Pagès -Date: Tue Aug 12 21:05:03 2014 +0200 - - poppler: use poppler-data pkg-config for both cmake and autotools - builds - - CMakeLists.txt | 16 ++++++++++++++++ - config.h.cmake | 2 +- - configure.ac | 7 ++++++- - 3 files changed, 23 insertions(+), 2 deletions(-) - -commit 572c60764bbbd2080bfd7a926c646ad20b467aea -Author: Hib Eris -Date: Tue Aug 12 18:12:45 2014 +0200 - - Makefile.am cleanups - - Bug #79411 - - configure.ac | 13 +++-- - cpp/Makefile.am | 66 +++++++++++++------------ - cpp/tests/Makefile.am | 13 ++--- - fofi/Makefile.am | 6 +-- - glib/Makefile.am | 29 ++++++----- - glib/demo/Makefile.am | 18 +++---- - glib/reference/Makefile.am | 3 +- - goo/Makefile.am | 38 +++++++-------- - poppler/Makefile.am | 118 - ++++++++++++++++++++++----------------------- - qt4/demos/Makefile.am | 59 +++++++++++------------ - qt4/src/Makefile.am | 31 ++++++------ - qt4/tests/Makefile.am | 97 +++++++++++++------------------------ - qt5/demos/Makefile.am | 59 +++++++++++------------ - qt5/src/Makefile.am | 27 ++++++----- - qt5/tests/Makefile.am | 98 ++++++++++++++----------------------- - splash/Makefile.am | 42 ++++++++-------- - test/Makefile.am | 68 +++++++++----------------- - utils/Makefile.am | 97 ++++++++++++++++++------------------- - 18 files changed, 405 insertions(+), 477 deletions(-) - -commit 4a4fe80d85a31b10822c7cd8eb5a0698bf306a52 -Author: Hib Eris -Date: Fri Aug 1 07:16:36 2014 +0200 - - glib-demo: Replace use of deprecated gtk stock items - - https://bugs.freedesktop.org/show_bug.cgi?id=82384 - - glib/demo/annots.c | 8 ++++---- - glib/demo/attachments.c | 4 ++-- - glib/demo/main.c | 6 +++--- - glib/demo/page.c | 6 +++--- - glib/demo/utils.c | 4 ++-- - 5 files changed, 14 insertions(+), 14 deletions(-) - -commit ec6bad36cf5e9521f35285a3295976c05a69f76a -Author: Hib Eris -Date: Fri Aug 1 07:51:10 2014 +0200 - - glib-demo: Remove use of deprecated gtk_dialog_get_action_area() - - https://bugs.freedesktop.org/show_bug.cgi?id=82385 - - glib/demo/main.c | 5 +---- - 1 file changed, 1 insertion(+), 4 deletions(-) - -commit b72a534d6c7d8bc026812b68f9d9ac6bf9a2200a -Merge: f2e4154 ef3f758 -Author: Albert Astals Cid -Date: Sun Aug 3 01:06:57 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit ef3f7585fac086de0919aa0bb0ef91a5070ac23e -Author: Jiri Slaby -Date: Sun Aug 3 01:05:00 2014 +0200 - - Improve non-latin characters in inline notes - - Preview commit had by mistake changes in these two files that - belong here - - Bug #65956 - - poppler/Annot.cc | 1 + - poppler/CharCodeToUnicode.cc | 1 + - 2 files changed, 2 insertions(+) - -commit 1b9c54286a4cdfaa284795933c20acf3c7e13bfc -Author: Ed Porras -Date: Sun Aug 3 01:01:35 2014 +0200 - - Don't check for inlineImg twice - - Bug #82059 - - poppler/Annot.cc | 2 +- - poppler/CharCodeToUnicode.cc | 2 +- - poppler/SplashOutputDev.cc | 9 ++++----- - 3 files changed, 6 insertions(+), 7 deletions(-) - -commit f2e4154eff52b86e62490a3ccba470824c9cf436 -Author: Thomas Freitag -Date: Sat Jul 26 00:12:37 2014 +0200 - - pdfseparate: additonal handling for annotations - - Bug #77549 - - poppler/PDFDoc.cc | 46 ++++++++++++++++++++++++++++------------------ - poppler/PDFDoc.h | 6 +++--- - utils/pdfunite.cc | 2 +- - 3 files changed, 32 insertions(+), 22 deletions(-) - -commit e7825f7cbbe7cc9c324fcb34c2e0dcae75f4172a -Author: Carlos Garcia Campos -Date: Fri Jul 25 15:45:55 2014 +0200 - - glib: Fix a memory leak when getting text layout and attributes - - glib/poppler-page.cc | 4 ++++ - 1 file changed, 4 insertions(+) - -commit b729bf92ea1522a1eed9579e53e7580215cb9555 -Author: Carlos Garcia Campos -Date: Fri Jul 25 15:45:55 2014 +0200 - - glib: Fix a memory leak when getting text layout and attributes - - glib/poppler-page.cc | 4 ++++ - 1 file changed, 4 insertions(+) - -commit a1ecff0f0ab81fe76f63244250d96e7ef275f402 -Author: Carlos Garcia Campos -Date: Fri Jul 25 11:25:42 2014 +0200 - - glib: Return NULL in poppler_annot_get_contents also for empty strings - - glib/poppler-annot.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit ab1113d10ef712c7c44cd4b4bb6bc79f9ca3702c -Author: Anuj Khare -Date: Thu Jul 24 19:47:22 2014 +0200 - - annots: Fix a crash when adding annot without contents - - Having no content in an annotation results in a crash when generating - its appearance, since the contents pointer is dereferenced. - For consistency, the same has been done in Annot::initialize. - - poppler/Annot.cc | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -commit f302864ed354b313ec39433f65ca3b107b55789d -Author: Carlos Garcia Campos -Date: Fri Jul 25 11:25:42 2014 +0200 - - glib: Return NULL in poppler_annot_get_contents also for empty strings - - glib/poppler-annot.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 13a5c5f4b61d05f2d18f94ad15e210a47021a576 -Author: Anuj Khare -Date: Thu Jul 24 19:47:22 2014 +0200 - - annots: Fix a crash when adding annot without contents - - Having no content in an annotation results in a crash when generating - its appearance, since the contents pointer is dereferenced. - For consistency, the same has been done in Annot::initialize. - - poppler/Annot.cc | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -commit 94ea9d8e1631abfbb8cc078100942d46b1356970 -Author: Carlos Garcia Campos -Date: Thu Jul 24 10:46:17 2014 +0200 - - cairo: Make sure we always push a transparency group in - setSoftMaskFromImageMask() - - Because that's what unsetSoftMaskFromImageMask() assumes. - - https://bugs.freedesktop.org/show_bug.cgi?id=81624 - - poppler/CairoOutputDev.cc | 64 - +++++++++++++++++++++++------------------------ - 1 file changed, 31 insertions(+), 33 deletions(-) - -commit 02c127b355bb8a98684a5d0af063c60b8bfd09dd -Author: Carlos Garcia Campos -Date: Thu Jul 24 10:46:17 2014 +0200 - - cairo: Make sure we always push a transparency group in - setSoftMaskFromImageMask() - - Because that's what unsetSoftMaskFromImageMask() assumes. - - https://bugs.freedesktop.org/show_bug.cgi?id=81624 - - poppler/CairoOutputDev.cc | 64 - +++++++++++++++++++++++------------------------ - 1 file changed, 31 insertions(+), 33 deletions(-) - -commit c841a703c4c1750fd7ac0d04c6c3e7d4af80b8fa -Author: Albert Astals Cid -Date: Mon Jul 21 00:29:28 2014 +0200 - - Improve Overprintmode and shadings - - Bug #80998 - - poppler/SplashOutputDev.cc | 6 ++++-- - poppler/SplashOutputDev.h | 8 +++++++- - splash/Splash.cc | 24 ++++++++++++++++++++++-- - splash/SplashPattern.h | 6 +++++- - 4 files changed, 38 insertions(+), 6 deletions(-) - -commit ce782112746f629a8e7be6f2daf6ece6ab19917d -Merge: 2c0cb68 26372cf -Author: Albert Astals Cid -Date: Sun Jul 20 20:35:13 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit 26372cfae029a1124e042855c58bf5b70f281c76 -Author: Ed Porras -Date: Sun Jul 20 20:33:48 2014 +0200 - - printf -> error - - Bug #81513 - - poppler/Catalog.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 87d12c09281e3d12cda0fadcd65ab78928dff283 -Author: Albert Astals Cid -Date: Sun Jul 20 18:20:57 2014 +0200 - - 0.26.3 - - CMakeLists.txt | 2 +- - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 5 files changed, 5 insertions(+), 5 deletions(-) - -commit 69e5b81640c9bb31f0876fa8eb7ba28dbf38923f -Author: Albert Astals Cid -Date: Sun Jul 20 18:18:29 2014 +0200 - - News for 0.26.3 - - NEWS | 21 +++++++++++++++++++++ - 1 file changed, 21 insertions(+) - -commit c368c0714d57c089057d974908295d850a1b5108 -Author: Albert Astals Cid -Date: Sun Jul 20 18:15:22 2014 +0200 - - Update Thomas' (C) - - splash/SplashXPathScanner.cc | 2 +- - splash/SplashXPathScanner.h | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 639179318c43a907a27e86778b720d33d481a9f9 -Author: Pino Toscano -Date: Thu Jul 17 07:33:10 2014 +0200 - - glib: use C90-style comments in public headers - - glib/poppler-media.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 2c0cb689910e8579bf428b3999bcac0cb27b0e51 -Merge: 0b639cd 1161e72 -Author: Albert Astals Cid -Date: Sat Jul 12 17:21:07 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit 1161e728de9ca7c9a5fb0e24c4a5e4a79c65a849 -Author: Thomas Freitag -Date: Sat Jul 12 17:04:42 2014 +0200 - - Error out instead of exiting if allInter grows too much - - Bug #78714 - - splash/SplashXPathScanner.cc | 25 +++++++++++++++++-------- - splash/SplashXPathScanner.h | 2 +- - 2 files changed, 18 insertions(+), 9 deletions(-) - -commit e82a24a585d251f767725f61700dc1f8fe169a52 -Author: Pino Toscano -Date: Sat Jul 12 08:35:45 2014 +0200 - - cmake: sync poppler-config.h.cmake with poppler-config.h.in - - poppler/poppler-config.h.cmake | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -commit 0b639cd2ac1071f5b741031a78d8e2bc18d2b7d7 -Merge: bb16c71 a5ad55b -Author: Albert Astals Cid -Date: Fri Jul 11 00:32:46 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit a5ad55b7cb9dc4e62754954291e4ecb8e05b5d67 -Author: Albert Astals Cid -Date: Fri Jul 11 00:32:07 2014 +0200 - - Add Hib's (C) - - poppler/poppler-config.h.in | 1 + - 1 file changed, 1 insertion(+) - -commit 4f4ee736075d5b1d1bf4911a26c2f80a7122fe04 -Author: Aki Koskinen -Date: Fri Jul 11 00:30:52 2014 +0200 - - Fix compilation of Qt5 frontend with MinGW - - qt5/src/poppler-private.h | 7 ++----- - 1 file changed, 2 insertions(+), 5 deletions(-) - -commit ddd91675792d9d496b06223867e05d2a190b878b -Author: Hib Eris -Date: Thu May 29 16:58:55 2014 +0200 - - Include stdio.h from poppler-config.h - - In poppler-config.h there is a check for __MINGW_PRINTF_FORMAT, - which is set by stdio.h. - - This fixes this warning when compling with the mingw-w64-compiler: - - XRef.cc: In member function 'virtual void - XRef::XRefTableWriter::writeEntry(Goffset, int, XRefEntryType)': - XRef.cc:1460:94: warning: unknown conversion type character 'l' - in format [-Wformat=] - outStr->printf("%010lli %05i %c\r\n", (long long)offset, gen, - (type==xrefEntryFree)?'f':'n'); - ^ - XRef.cc:1460:94: warning: format '%i' expects argument of type 'int', - but argument 3 has type 'Goffset {aka long long int}' [-Wformat=] - XRef.cc:1460:94: warning: too many arguments for format - [-Wformat-extra-args] - - https://bugs.freedesktop.org/show_bug.cgi?id=79762 - - poppler/poppler-config.h.in | 2 ++ - 1 file changed, 2 insertions(+) - -commit bb16c7162c73b871e26f508823c0ee259b7e5420 -Author: Hib Eris -Date: Sat Jun 7 12:00:52 2014 +0200 - - Move automake version check from autogen.sh to configure.ac - - https://bugs.freedesktop.org/show_bug.cgi?id=79797 - - autogen.sh | 18 ------------------ - configure.ac | 2 +- - 2 files changed, 1 insertion(+), 19 deletions(-) - -commit 74c72223cf609e7c24594f95cab6f9865ad562ac -Merge: f8f7b3a 47a947f -Author: Albert Astals Cid -Date: Fri Jul 11 00:23:04 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit 47a947f1dc664793a7037888a46a297a46c79d6c -Author: Hib Eris -Date: Thu Jun 19 10:11:21 2014 +0200 - - Fix moc-qt5 detection - - https://bugs.freedesktop.org/show_bug.cgi?id=80250 - - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit f8f7b3a61bc7eb1e569c25a630b5e127b5dcae62 -Merge: 805ff76 aa6205d -Author: Albert Astals Cid -Date: Wed Jul 9 00:23:22 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit aa6205d195c56a77e897bad125bf213aba138422 -Author: Jason Crain -Date: Mon Jul 7 23:52:39 2014 -0500 - - Increase required Qt4 version to 4.7.0 - - We use Qt::LayoutDirectionAuto, introduced in 4.7.0. - - bug #81005 - - CMakeLists.txt | 2 +- - configure.ac | 8 ++++---- - 2 files changed, 5 insertions(+), 5 deletions(-) - -commit 805ff76112ebfd57276ea78f1f0891abc61a6c03 -Author: Yaakov Selkowitz -Date: Mon Apr 11 16:26:11 2011 -0500 - - Do not dist gir_DATA - - See https://bugzilla.gnome.org/show_bug.cgi?id=621611 for rationale. - - glib/Makefile.am | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit e5862155b1c549b6774bb4f25c09c45857ff1734 -Author: Hib Eris -Date: Wed Jun 4 20:58:56 2014 +0200 - - Add Changelog to .gitignore - - https://bugs.freedesktop.org/show_bug.cgi?id=79744 - - .gitignore | 1 + - 1 file changed, 1 insertion(+) - -commit 5f22649694d64c4170db82847b599576d5377176 -Author: Hib Eris -Date: Wed Jun 4 20:56:23 2014 +0200 - - Add *.gir, *.typelib to glib/.gitignore - - https://bugs.freedesktop.org/show_bug.cgi?id=79744 - - glib/.gitignore | 2 ++ - 1 file changed, 2 insertions(+) - -commit b63f57985719c7884b67f46fc4afd4954c44c5ab -Author: Hib Eris -Date: Wed Jun 4 20:54:30 2014 +0200 - - Add poppler-undeclared.txt to .gitignore - - https://bugs.freedesktop.org/show_bug.cgi?id=79744 - - glib/reference/.gitignore | 1 + - 1 file changed, 1 insertion(+) - -commit 5e0f4e2516d5a3997ea9c9a9927e24d4f3abe136 -Author: Hib Eris -Date: Wed Jun 4 20:52:15 2014 +0200 - - Add poppler-forms, stress-threads-qt, test-render-to-file to - .gitignore - - https://bugs.freedesktop.org/show_bug.cgi?id=79744 - - qt4/tests/.gitignore | 3 +++ - qt5/tests/.gitignore | 3 +++ - 2 files changed, 6 insertions(+) - -commit 4d2400e7bb8ae9208030b9615dda7c53e571be8b -Author: Hib Eris -Date: Wed Jun 4 10:09:16 2014 +0200 - - Add test-driver to .gitignore - - https://bugs.freedesktop.org/show_bug.cgi?id=79744 - - .gitignore | 1 + - 1 file changed, 1 insertion(+) - -commit 4c35e0213be26f21b628ff8d9f170252bb0106c9 -Author: Hib Eris -Date: Wed Jun 4 10:06:20 2014 +0200 - - Add poppler-qt5.pc to .gitignore - - https://bugs.freedesktop.org/show_bug.cgi?id=79744 - - .gitignore | 2 ++ - 1 file changed, 2 insertions(+) - -commit 2b455b85168d5c9d8641d9a91bfde81ccab18e54 -Author: Pino Toscano -Date: Sun Jul 6 11:13:54 2014 +0200 - - glib: fix typo in apidox - - glib/poppler.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 266a61ab1c9f536a4fb7d68c8f285c854eb2d6e9 -Author: Albert Astals Cid -Date: Thu Jun 19 20:16:19 2014 +0200 - - 0.26.2 - - CMakeLists.txt | 2 +- - NEWS | 10 ++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 15 insertions(+), 5 deletions(-) - -commit 3381ee20efca2ce27733182d0d6720c1e6936a7f -Author: Albert Astals Cid -Date: Thu Jun 19 19:57:31 2014 +0200 - - Update (C) - - poppler/Lexer.cc | 2 +- - utils/pdftohtml.cc | 1 + - 2 files changed, 2 insertions(+), 1 deletion(-) - -commit 8a5e59c6ea7ccd0ecbdb4b37bf3fe4e74e1c0e8e -Merge: 1b70533 310fbee -Author: Albert Astals Cid -Date: Wed Jun 18 00:37:03 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit 310fbeec692b02d555e3e8dd6c851be11b25e26a -Author: Albert Astals Cid -Date: Wed Jun 18 00:31:48 2014 +0200 - - Make sure we have an xref before using - - KDE bug #335413 had this backtrace - XRef::getNumEntry (this=0x0, offset=-1) at XRef.cc:1300 - 0x00007f29aec1681e in Lexer::getObj (this=0x1648760, - obj=obj@entry=0x1bdf978, cmdA=cmdA@entry=0x7f29aeca66c8 "endstream", - objNum=objNum@entry=0) at Lexer.cc:594 - 0x00007f29aec20dfd in Parser::shift (this=this@entry=0x1bdf950, - cmdA=cmdA@entry=0x7f29aeca66c8 "endstream", objNum=objNum@entry=0) - at Parser.cc:323 - 0x00007f29aec20fde in Parser::makeStream (this=this@entry=0x1bdf950, - dict=dict@entry=0x7fff2541cad0, fileKey=fileKey@entry=0x0, - encAlgorithm=encAlgorithm@entry=cryptRC4, keyLength=keyLength@entry=0, - objNum=objNum@entry=0, objGen=objGen@entry=0, - recursion=recursion@entry=1, strict=strict@entry=false) at - Parser.cc:245 - 0x00007f29aec216b8 in Parser::getObj (this=this@entry=0x1bdf950, - obj=obj@entry=0x7fff2541cad0, simpleOnly=simpleOnly@entry=false, - fileKey=fileKey@entry=0x0, encAlgorithm=encAlgorithm@entry=cryptRC4, - keyLength=keyLength@entry=0, objNum=objNum@entry=0, - objGen=objGen@entry=0, recursion=recursion@entry=0, - strict=strict@entry=false) at Parser.cc:131 - 0x00007f29aec350fc in XRef::readXRef - (this=this@entry=0xfe43a0, pos=pos@entry=0xfe4438, - followedXRefStm=followedXRefStm@entry=0x7fff2541cb30, - xrefStreamObjsNum=xrefStreamObjsNum@entry=0x0) at XRef.cc:551 - 0x00007f29aec35319 in XRef::XRef (this=0xfe43a0, - strA=0x1c54ff0, pos=, mainXRefEntriesOffsetA=0, - wasReconstructed=0x7fff2541cbaf, reconstruct=) - at XRef.cc:342 - 0x00007f29aec2534f in PDFDoc::setup (this=this@entry=0x311e1b0, - ownerPassword=ownerPassword@entry=0x1165830, - userPassword=userPassword@entry=0x447f550) at PDFDoc.cc:262 - - poppler/Lexer.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 1b705331019b155f2138d4b9f5a5bd03ec59193d -Author: Hib Eris -Date: Sun Jun 8 17:07:15 2014 +0200 - - [glib] doc: Move poppler_date_parse to utility functions section - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/reference/poppler-docs.sgml | 1 + - glib/reference/poppler-sections.txt | 7 ++++++- - 2 files changed, 7 insertions(+), 1 deletion(-) - -commit d661553b0a13855aa5a1240e9c04a0e49dafd910 -Author: Hib Eris -Date: Sun Jun 8 16:11:26 2014 +0200 - - [glib] doc: Document PopplerFindFlags:POPPLER_FIND_DEFAULT - - Fixes warning: - DOC Building XML - ../../glib/poppler.h:157: warning: Value description for - PopplerFindFlags::POPPLER_FIND_DEFAULT is missing in source code - comment - block. - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/poppler.h | 1 + - 1 file changed, 1 insertion(+) - -commit 237a1402ab836d10eb5fdc1aa6ceccabea10a316 -Author: Hib Eris -Date: Sun Jun 8 16:07:14 2014 +0200 - - [glib] doc: Use instead of - - Fixes: - DOC Building HTML - Element em in namespace '' encountered in para, but no template - matches. - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/poppler-structure-element.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 66abf3992228be2559542e9d2753f45f06ae7728 -Author: Hib Eris -Date: Sun Jun 8 16:02:01 2014 +0200 - - [glib] doc: Add PopplerBackend documentation - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/poppler.h | 8 ++++++++ - 1 file changed, 8 insertions(+) - -commit a30ec8e4abe3875aad068c83265b47f9beea33d1 -Author: Hib Eris -Date: Sun Jun 8 15:05:52 2014 +0200 - - [glib] doc: Add missing POPPLER_TYPE_POINT - - And while we are here, also move poppler_point_get_type() and - poppler_quadrilateral_get_type() to private subsection. - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/reference/poppler-sections.txt | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - -commit 6eb0537ac5163356c8e8f689d2408fa695e99423 -Author: Hib Eris -Date: Sun Jun 8 14:59:15 2014 +0200 - - [glib] doc: Fix typo - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/reference/poppler-sections.txt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 96adcad85d76409cb8ed4266a08ae776b42661e4 -Author: Hib Eris -Date: Sun Jun 8 14:53:42 2014 +0200 - - [glib] doc: Add poppler_annot_set_flags() to documentation - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/reference/poppler-sections.txt | 1 + - 1 file changed, 1 insertion(+) - -commit f3519352c70537009cc6bd660c0bd3e727db8b8a -Author: Hib Eris -Date: Sun Jun 8 14:38:13 2014 +0200 - - [glib] doc: Move PopplerFindFlags to PopplerPage section - - And also add the missing POPPLER_TYPE_FIND_FLAGS and - poppler_find_flags_get_type. - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/reference/poppler-sections.txt | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -commit 45b0d49330d9d089b2480b91e418924a490c82ce -Author: Hib Eris -Date: Sun Jun 8 14:22:28 2014 +0200 - - [glib] doc: Move PopplerPrintFlags to PopplerPage section - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/reference/poppler-sections.txt | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -commit ce357147d17004a2772ca3b32d106da511bba360 -Author: Hib Eris -Date: Sun Jun 8 13:22:51 2014 +0200 - - [glib] doc: Move poppler_get_{version, backend} documentation to - features section - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/reference/poppler-sections.txt | 15 +++++++++------ - 1 file changed, 9 insertions(+), 6 deletions(-) - -commit 1bfd6b69e7e98d4b3e6e891a46b58c9109b8c14c -Author: Hib Eris -Date: Sun Jun 8 12:57:25 2014 +0200 - - [glib] doc: Move PopplerColor documentation to it's own section - - https://bugs.freedesktop.org/show_bug.cgi?id=79798 - - glib/poppler-page.cc | 6 ++++++ - glib/reference/poppler-docs.sgml | 1 + - glib/reference/poppler-sections.txt | 21 +++++++++++++++------ - 3 files changed, 22 insertions(+), 6 deletions(-) - -commit 2dd9b95fd910023a7d9d23f2c2e41dcab91d3c31 -Merge: fed71eb b36d27b -Author: Albert Astals Cid -Date: Fri Jun 6 21:43:49 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit b36d27b42417d15866a5729409e39d6f7c2b0289 -Author: Hib Eris -Date: Fri Jun 6 21:42:10 2014 +0200 - - Fix typo in configure.ac - - Bug #79742 - - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit fed71ebd8e43e24eace9dcebe24bd318ff3d04a6 -Author: Hib Eris -Date: Thu May 29 13:22:05 2014 +0200 - - Change pagenum arguments in PDFDoc::markAnnotations from Guint to int - - Bug #79410 - Fixes compile warning: - - CXX PDFDoc.lo - PDFDoc.cc: In member function 'GBool PDFDoc::markAnnotations(Object*, - XRef*, XRef*, Guint, Guint, Guint)': - PDFDoc.cc:1607:40: warning: comparison between signed and unsigned - integer expressions [-Wsign-compare] - if (obj2.getRef().num == oldPageNum) { - ^ - PDFDoc.cc:1617:47: warning: comparison between signed and unsigned - integer expressions [-Wsign-compare] - } else if (obj2.getRef().num == newPageNum) { - - https://bugs.freedesktop.org/show_bug.cgi?id=79410 - - poppler/PDFDoc.cc | 4 ++-- - poppler/PDFDoc.h | 4 ++-- - 2 files changed, 4 insertions(+), 4 deletions(-) - -commit f5e702060a84362bfdf75260531920d4ba8b7333 -Author: Pino Toscano -Date: Sat May 24 15:59:42 2014 +0200 - - pdftohtml: exit with 0 with -v and -h - - utils/pdftohtml.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 700bf398ef7b20306f5035e423becfaa3d28fb10 -Author: Albert Astals Cid -Date: Fri May 23 20:05:41 2014 +0200 - - 0.26.1 - - CMakeLists.txt | 2 +- - NEWS | 12 ++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 17 insertions(+), 5 deletions(-) - -commit 93373cd113d046b65538fe983b46842d689a2112 -Author: Albert Astals Cid -Date: Sun May 11 18:31:10 2014 +0200 - - Qt: Add a new page->annotations() call that let's you specify subtypes - - This way we don't return annotations you may not be interested in - - qt4/src/poppler-annotation-private.h | 4 +-- - qt4/src/poppler-annotation.cc | 48 - ++++++++++++++++++++++++++++++++++-- - qt4/src/poppler-page.cc | 7 +++++- - qt4/src/poppler-qt4.h | 14 +++++++++++ - qt5/src/poppler-annotation-private.h | 4 +-- - qt5/src/poppler-annotation.cc | 48 - ++++++++++++++++++++++++++++++++++-- - qt5/src/poppler-page.cc | 7 +++++- - qt5/src/poppler-qt5.h | 15 +++++++++++ - 8 files changed, 137 insertions(+), 10 deletions(-) - -commit d2892cd893e4379914a08e66682ed5c423743a41 -Merge: 0844220 7e9fc61 -Author: Albert Astals Cid -Date: Wed May 7 22:27:41 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit 7e9fc61e287889eefd6b08ef5991d31fed79cafd -Author: Albert Astals Cid -Date: Wed May 7 22:25:59 2014 +0200 - - Fix libopenjpeg 1.5 detection on some systems - - Someone somewhere decided the pc file will be called libopenjpeg1 - instead of libopenjpeg - - Bug #78389 - - configure.ac | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit 0844220347f984c3d9b04fe53e690ee0e8c74afe -Merge: 84278d8 0a6c1ff -Author: Albert Astals Cid -Date: Wed May 7 21:56:07 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit 0a6c1ff777aa23c7a5654b313b639e66600883b9 -Author: Thomas Freitag -Date: Wed May 7 21:54:46 2014 +0200 - - Only add annotations of the current page when splitting - - Bug #77549 - - poppler/PDFDoc.cc | 153 - +++++++++++++++++++++++++++++++++++++++++++++++++++++- - poppler/PDFDoc.h | 4 +- - utils/pdfunite.cc | 9 +++- - 3 files changed, 162 insertions(+), 4 deletions(-) - -commit 84278d8adbb1f6e9a28588fcb4db30c9ef70adde -Merge: 7b94b11 5b2cdef -Author: Albert Astals Cid -Date: Sun May 4 22:21:25 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit 5b2cdef49a8a0a92fd323fbe45841a5098a42ece -Author: Olly Betts -Date: Sun May 4 22:20:30 2014 +0200 - - Fix extraction of text in some files - - Bug #78145 - - poppler/GfxFont.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 7b94b119f07713af7b8b9f1ac3ea3f1d35c1e240 -Merge: c859d2b bae836c -Author: Albert Astals Cid -Date: Sun May 4 16:21:24 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.26' - -commit bae836cd3dd3511ca9cf4745626142334bafd1a6 -Author: Marek Kasik -Date: Sun May 4 16:20:33 2014 +0200 - - Use field value V for radio buttons - - Turn on radio button only if its appearance state is equal to - the value - of name object "V" of the field. - - Bug #75979 - - poppler/Annot.cc | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -commit a748b3a059938e6ae98b51eb82bab7c33a5e23c7 -Author: Carlos Garcia Campos -Date: Wed Apr 30 09:25:31 2014 +0200 - - glib: Fix multiple definition of PopplerTextSpan - - https://bugs.freedesktop.org/show_bug.cgi?id=78103 - - glib/poppler-structure-element.h | 3 --- - 1 file changed, 3 deletions(-) - -commit c859d2b891a115c79d04db14463791dfb1c46a20 -Author: Carlos Garcia Campos -Date: Wed Apr 30 09:25:31 2014 +0200 - - glib: Fix multiple definition of PopplerTextSpan - - https://bugs.freedesktop.org/show_bug.cgi?id=78103 - - glib/poppler-structure-element.h | 3 --- - 1 file changed, 3 deletions(-) - -commit 9a68daee2b3c7f8a992ee47c0e9ac78b346d4348 -Author: Albert Astals Cid -Date: Fri Apr 25 01:01:08 2014 +0200 - - 0.26.0 - - CMakeLists.txt | 4 ++-- - NEWS | 13 +++++++++++++ - configure.ac | 4 ++-- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 20 insertions(+), 7 deletions(-) - -commit 8073852c84b71257d487aa8a46e441aa82f4b42c -Author: Fabio D'Urso -Date: Mon Apr 14 23:35:50 2014 +0200 - - qt: Fix missing ! in TextAnnotation::setInplaceIntent - - CID #16814 - - qt4/src/poppler-annotation.cc | 2 +- - qt5/src/poppler-annotation.cc | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 1fbf98664c0879ac035a63602242a910c0c1d316 -Author: Albert Astals Cid -Date: Mon Apr 14 11:53:59 2014 +0200 - - Initialize tmpBufLen - - CID #16957 - - It isn't really needed since locateFont always returns a fontLoc - with a non null - path if fontLoc itself is not null, but it doesn't hurt either - - qt4/src/ArthurOutputDev.cc | 4 ++-- - qt5/src/ArthurOutputDev.cc | 4 ++-- - 2 files changed, 4 insertions(+), 4 deletions(-) - -commit b3e5c582a279b1b8d8309322ac3f4d0e51831f77 -Author: Albert Astals Cid -Date: Thu Apr 10 23:38:09 2014 +0200 - - Remove unused member - - cpp/poppler-font.cpp | 2 -- - 1 file changed, 2 deletions(-) - -commit b86f471c43e387cf873358cf3cbcd27470646713 -Author: Albert Astals Cid -Date: Thu Apr 10 22:50:56 2014 +0200 - - 0.25.3 - - CMakeLists.txt | 2 +- - NEWS | 19 +++++++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - poppler/CairoOutputDev.cc | 2 +- - poppler/GfxFont.cc | 2 +- - qt4/src/Doxyfile | 2 +- - qt4/src/poppler-optcontent.cc | 2 +- - qt5/src/Doxyfile | 2 +- - qt5/src/poppler-optcontent.cc | 2 +- - qt5/src/poppler-private.cc | 2 +- - qt5/src/poppler-private.h | 2 +- - 12 files changed, 30 insertions(+), 11 deletions(-) - -commit 80107c72ac03bf4d00b2d71d6f947c139ea84ab5 -Author: Pino Toscano -Date: Sun Apr 6 20:17:31 2014 +0200 - - qt5: remove m_fontInfoIterator from Document - - it was used by the deprecated scanForFonts API, which was not provided - in poppler-qt5 - - qt5/src/poppler-private.cc | 2 -- - qt5/src/poppler-private.h | 2 -- - 2 files changed, 4 deletions(-) - -commit b8325316e41fb03eb5fac5c80d6a550fe9ce9695 -Author: Albert Astals Cid -Date: Sun Apr 6 16:05:51 2014 +0200 - - Fix memory leak - - CID #16943 - - utils/pdfseparate.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit ca9713118d6ce3fdd245f9ca4f595229a5be19c3 -Author: Albert Astals Cid -Date: Sun Apr 6 15:59:43 2014 +0200 - - Don't check twice for the same variable ^_^ - - CID #16804 - - splash/Splash.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 0ef290a7c5a8fa54d3fe0f646abdf098443a7a67 -Author: Albert Astals Cid -Date: Sun Apr 6 15:57:38 2014 +0200 - - Fix memory leak - - CID #16852 - - splash/Splash.cc | 2 ++ - 1 file changed, 2 insertions(+) - -commit 8810b8917fded340b784873a91ca025b0bb49f3d -Author: Albert Astals Cid -Date: Sun Apr 6 15:49:18 2014 +0200 - - Fix Out-of-bounds read - - CID #16844 - - poppler/PageLabelInfo_p.h | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -commit 9309907673e8557a25021dce79d9b4354640e2d0 -Author: Albert Astals Cid -Date: Sun Apr 6 15:35:00 2014 +0200 - - Fix memory leak - - Don't pass new'ed GooStrings as parameters to error() - - CID #16915 - - poppler/GfxFont.cc | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -commit a511005584a38217fed582ced6ce2c937526cf96 -Author: Albert Astals Cid -Date: Sun Apr 6 15:28:50 2014 +0200 - - Fix Uninitialized pointer read when nFucnsA is 0 - - CID #16965 - - poppler/GfxState.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 26b961a64030d91c5db2769dcd0ab8dff7b9b6a6 -Author: Albert Astals Cid -Date: Sun Apr 6 15:23:35 2014 +0200 - - gfree -> delete since it was new'ed - - CID #16786 - - poppler/JBIG2Stream.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 814ac2230b594cce3b871588804dd92f4a187e7e -Author: Albert Astals Cid -Date: Sun Apr 6 15:22:13 2014 +0200 - - delete -> gfree since it was gmaloced - - CID #16785 - - poppler/JBIG2Stream.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit b496b6665803247b10b018ae939a2a452fa4a48f -Author: Albert Astals Cid -Date: Sun Apr 6 15:17:50 2014 +0200 - - Fix memory leak - - CID #16864 - - poppler/SplashOutputDev.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 1b612f355e9f29fa93c15a9de1188049a8e086b6 -Author: Albert Astals Cid -Date: Sun Apr 6 15:14:50 2014 +0200 - - Fix memory leak - - CID #16853 - - poppler/XRef.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 07621ebbda8ab85cf4cd76a6092efc67aa14454d -Merge: 8d3a2c9 9fcd46a -Author: Pino Toscano -Date: Sat Apr 5 15:49:31 2014 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 9fcd46ac4a94f138981ec5afaab3875918c6a175 -Author: Pino Toscano -Date: Sat Apr 5 15:48:27 2014 +0200 - - qt4/qt5: remove extra qDebug - - qt4/src/poppler-optcontent.cc | 1 - - qt5/src/poppler-optcontent.cc | 1 - - 2 files changed, 2 deletions(-) - -commit 37286ee2923de060ae463ac6b178ffd0e6096b90 -Author: Pino Toscano -Date: Sat Apr 5 15:46:44 2014 +0200 - - qt4/qt5: fix some kinds of OCG models - - properly pass parent and child when building the tree - - qt4/src/poppler-optcontent.cc | 2 +- - qt5/src/poppler-optcontent.cc | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 8d3a2c9d007052bcb8719200760a1abb6314f804 -Author: Peter Breitenlohner -Date: Sun Mar 30 23:34:23 2014 +0200 - - Avoid MinGW/Cygwin warnings due to redefinition of NOMINMAX - - goo/GooMutex.h | 3 +++ - goo/GooTimer.h | 5 ++++- - goo/gfile.h | 5 ++++- - poppler/XpdfPluginAPI.h | 3 +++ - 4 files changed, 14 insertions(+), 2 deletions(-) - -commit 38dcaf96f308265ff6958e4683bcec2be0c254b9 -Author: Adrian Johnson -Date: Fri Mar 28 20:49:17 2014 +1030 - - cairo: fix segv cause by bad image stream - - bug 76445 - - poppler/CairoOutputDev.cc | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - -commit 07b0a038b194eb0392a1e9a4236064d37247d687 -Author: Jakub Wilk -Date: Sun Mar 30 16:12:28 2014 +0200 - - pdftohtml: Fix typo in manpage - - utils/pdftohtml.1 | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit ac3c8303396a0b8de5e4ad32f480b8da5f3b396e -Author: Thomas Liebetraut -Date: Sun Mar 30 12:25:26 2014 +0200 - - glib: Fix the first coord of the qudrilateral in - create_poppler_quads_from_annot_quads() - - https://bugs.freedesktop.org/show_bug.cgi?id=76504 - - glib/poppler-annot.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 82d69da7c2f67e774c51fb7b146fdf639a6b9616 -Author: Albert Astals Cid -Date: Fri Mar 28 15:53:22 2014 +0100 - - Fix error reported by ASAN in 3628.asan.0.3910.pdf - - ==20743== ERROR: AddressSanitizer: heap-buffer-overflow on - address 0x60040005c6ef at pc 0x7f8912ca0c90 bp 0x7fff8509ee20 sp - 0x7fff8509ee18 - READ of size 1 at 0x60040005c6ef thread T0 - #0 0x7f8912ca0c8f in expandRow(unsigned char*, unsigned char*, - int, int, int) /home/tsdgeos/devel/poppler/splash/Splash.cc:4855 - #1 0x7f8912ca1097 in Splash::scaleImageYuXuBilinear(bool - (*)(void*, unsigned char*, unsigned char*), void*, - SplashColorMode, int, bool, int, int, int, int, SplashBitmap*) - /home/tsdgeos/devel/poppler/splash/Splash.cc:4897 - #2 0x7f8912c9d2b7 in Splash::scaleImage(bool - (*)(void*, unsigned char*, unsigned char*), void*, - SplashColorMode, int, bool, int, int, int, int, bool, bool) - /home/tsdgeos/devel/poppler/splash/Splash.cc:4127 - #3 0x7f8912c98101 in Splash::drawImage(bool - (*)(void*, unsigned char*, unsigned char*), void*, - SplashColorMode, bool, int, int, double*, bool, bool) - /home/tsdgeos/devel/poppler/splash/Splash.cc:3726 - #4 0x7f8912c7056a in - SplashOutputDev::drawSoftMaskedImage(GfxState*, - Object*, Stream*, int, int, GfxImageColorMap*, - bool, Stream*, int, int, GfxImageColorMap*, bool) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:3630 - #5 0x7f8912ac7aa7 in Gfx::doImage(Object*, Stream*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4646 - #6 0x7f8912ac4de0 in Gfx::opXObject(Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 - #7 0x7f8912a9f33a in Gfx::execOp(Object*, Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 - #8 0x7f8912a9e50f in Gfx::go(bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 - #9 0x7f8912a9e163 in Gfx::display(Object*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 - #10 0x7f8912b80e13 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:585 - #11 0x7f8912b8833f in PDFDoc::displayPageSlice(OutputDev*, - int, double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #12 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #13 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #14 0x7f89121a8ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #15 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - splash/Splash.cc | 3 +++ - 1 file changed, 3 insertions(+) - -commit 38ec8cbeeaf69d96b9d7bcd662187c8916cf7903 -Author: Albert Astals Cid -Date: Fri Mar 28 11:18:02 2014 +0100 - - Fix error reported by ASAN in 5782.asan.0.7113.pdf - - ==32161== ERROR: AddressSanitizer: heap-buffer-overflow on - address 0x6008000e3bcf at pc 0x7f66bae0e117 bp 0x7fffcb54ea70 sp - 0x7fffcb54ea68 - READ of size 1 at 0x6008000e3bcf thread T0 - #0 0x7f66bae0e116 in GooString::getChar(int) - /home/tsdgeos/devel/poppler/goo/GooString.h:119 - #1 0x7f66bafb5dca in LinkURI::LinkURI(Object*, GooString*) - /home/tsdgeos/devel/poppler/poppler/Link.cc:562 - #2 0x7f66bafb2a05 in LinkAction::parseAction(Object*, GooString*) - /home/tsdgeos/devel/poppler/poppler/Link.cc:98 - #3 0x7f66bae69c0e in AnnotLink::initialize(PDFDoc*, Dict*) - /home/tsdgeos/devel/poppler/poppler/Annot.cc:2621 - #4 0x7f66bae698d9 in AnnotLink::AnnotLink(PDFDoc*, Dict*, Object*) - /home/tsdgeos/devel/poppler/poppler/Annot.cc:2596 - #5 0x7f66bae8d998 in Annots::createAnnot(Dict*, Object*) - /home/tsdgeos/devel/poppler/poppler/Annot.cc:6737 - #6 0x7f66bae8d269 in Annots::Annots(PDFDoc*, int, Object*) - /home/tsdgeos/devel/poppler/poppler/Annot.cc:6683 - #7 0x7f66bafc750d in Page::getAnnots(XRef*) - /home/tsdgeos/devel/poppler/poppler/Page.cc:402 - #8 0x7f66bafc8e66 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:595 - #9 0x7f66bafd02fd in PDFDoc::displayPageSlice(OutputDev*, int, - double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #10 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #11 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #12 0x7f66ba5f0ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #13 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - poppler/Link.cc | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - -commit 49b4eb68ee646aefe49b70f9e2831ebf93576053 -Author: Albert Astals Cid -Date: Fri Mar 28 11:08:18 2014 +0100 - - Fix error reported by ASAN in 590.asan.0.7288.pdf - - ==31898== ERROR: AddressSanitizer: heap-use-after-free on - address 0x60ae0007432c at pc 0x7f03483026aa bp 0x7fff6ec0c820 sp - 0x7fff6ec0c818 - READ of size 4 at 0x60ae0007432c thread T0 - #0 0x7f03483026a9 in SplashFTFont::getGlyphPath(int) - /home/tsdgeos/devel/poppler/splash/SplashFTFont.cc:414 - #1 0x7f034829f681 in SplashOutputDev::drawChar(GfxState*, - double, double, double, double, double, - double, unsigned int, int, unsigned int*, int) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:2239 - #2 0x7f0348100599 in Gfx::doShowText(GooString*) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4054 - #3 0x7f03480fddb0 in Gfx::opShowSpaceText(Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:3886 - #4 0x7f03480dc33a in Gfx::execOp(Object*, Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 - #5 0x7f03480db50f in Gfx::go(bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 - #6 0x7f03480db163 in Gfx::display(Object*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 - #7 0x7f03481bddd1 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:585 - #8 0x7f03481c52fd in PDFDoc::displayPageSlice(OutputDev*, int, - double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #9 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #10 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #11 0x7f03477e5ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #12 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - splash/SplashFTFont.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 89a64b508e5f8445798c95fcec6c87180f6c9b73 -Author: Albert Astals Cid -Date: Fri Mar 28 00:35:17 2014 +0100 - - Fix error reported by ASAN in 2279.asan.0.1904.pdf - - ==20507== ERROR: AddressSanitizer: heap-buffer-overflow on - address 0x60420000ff04 at pc 0x7fa1492e8012 bp 0x7fff8406d900 sp - 0x7fff8406d8f8 - READ of size 4 at 0x60420000ff04 thread T0 - #0 0x7fa1492e8011 in SplashFTFont::makeGlyph(int, int, int, - SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) - /home/tsdgeos/devel/poppler/splash/SplashFTFont.cc:284 - #1 0x7fa1492eda32 in SplashFont::getGlyph(int, int, int, - SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) - /home/tsdgeos/devel/poppler/splash/SplashFont.cc:168 - #2 0x7fa1492e7c69 in SplashFTFont::getGlyph(int, int, int, - SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) - /home/tsdgeos/devel/poppler/splash/SplashFTFont.cc:233 - #3 0x7fa1492b3368 in Splash::fillChar(double, double, int, - SplashFont*) /home/tsdgeos/devel/poppler/splash/Splash.cc:2714 - #4 0x7fa149286a20 in SplashOutputDev::drawChar(GfxState*, - double, double, double, double, double, - double, unsigned int, int, unsigned int*, int) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:2270 - #5 0x7fa1490e7599 in Gfx::doShowText(GooString*) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4054 - #6 0x7fa1490e4db0 in Gfx::opShowSpaceText(Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:3886 - #7 0x7fa1490c333a in Gfx::execOp(Object*, Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 - #8 0x7fa1490c250f in Gfx::go(bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 - #9 0x7fa1490c2163 in Gfx::display(Object*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 - #10 0x7fa1491a4dd1 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:585 - #11 0x7fa1491ac2fd in PDFDoc::displayPageSlice(OutputDev*, - int, double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #12 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #13 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #14 0x7fa1487ccec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #15 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - splash/SplashFTFont.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 5055479634dc8d0cd5afb3373de600fb121357fe -Author: Albert Astals Cid -Date: Thu Mar 27 23:54:20 2014 +0100 - - Fix error reported by ASAN in 2010.asan.0.1506.pdf - - ==18859== ERROR: AddressSanitizer: unknown-crash on address - 0x7f1e4a6beb50 at pc 0x7f1e5557444d bp 0x7fff6af3c340 sp - 0x7fff6af3bb00 - WRITE of size 442216446 at 0x7f1e4a6beb50 thread T0 - #0 0x7f1e5557444c (/usr/lib/x86_64-linux-gnu/libasan.so.0+0xe44c) - #1 0x7f1e550e04ff in SplashFont::getGlyph(int, int, int, - SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) - /home/tsdgeos/devel/poppler/splash/SplashFont.cc:206 - #2 0x7f1e550d9c69 in SplashFTFont::getGlyph(int, int, int, - SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) - /home/tsdgeos/devel/poppler/splash/SplashFTFont.cc:233 - #3 0x7f1e550a5368 in Splash::fillChar(double, double, int, - SplashFont*) /home/tsdgeos/devel/poppler/splash/Splash.cc:2714 - #4 0x7f1e55078a20 in SplashOutputDev::drawChar(GfxState*, - double, double, double, double, double, - double, unsigned int, int, unsigned int*, int) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:2270 - #5 0x7f1e54ed9599 in Gfx::doShowText(GooString*) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4054 - #6 0x7f1e54ed6db0 in Gfx::opShowSpaceText(Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:3886 - #7 0x7f1e54eb533a in Gfx::execOp(Object*, Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 - #8 0x7f1e54eb450f in Gfx::go(bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 - #9 0x7f1e54eb4163 in Gfx::display(Object*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 - #10 0x7f1e54f96dd1 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:585 - #11 0x7f1e54f9e2fd in PDFDoc::displayPageSlice(OutputDev*, - int, double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #12 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #13 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #14 0x7f1e545beec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #15 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - splash/SplashFont.cc | 13 +++++++++---- - 1 file changed, 9 insertions(+), 4 deletions(-) - -commit 3e7779935ec2610410bc4a42e9b0174e41ca9672 -Author: Albert Astals Cid -Date: Thu Mar 27 16:49:57 2014 +0100 - - Fix error reported by ASAN in 139.asan.0.581.pdf - - ==15244== ERROR: AddressSanitizer: SEGV on unknown address - 0x605df000f3ee (pc 0x7f1087b3a22e sp 0x7fffec30ff20 bp 0x7fffec30ff80 - T0) - AddressSanitizer can not provide additional info. - #0 0x7f1087b3a22d - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x48f22d) - #1 0x7f1087b19d92 - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x46ed92) - #2 0x7f1087ae570b - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x43a70b) - #3 0x7f1087ae4061 - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x439061) - #4 0x7f1087ab9b38 - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x40eb38) - #5 0x7f1087900989 - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x255989) - #6 0x7f10878f733a - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x24c33a) - #7 0x7f10878f650f - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x24b50f) - #8 0x7f10878f6163 - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x24b163) - #9 0x7f10879d8dd1 - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x32ddd1) - #10 0x7f10879e02fd - (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x3352fd) - #11 0x40311e - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x40311e) - #12 0x404416 - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x404416) - #13 0x7f1087000ec4 (/lib/x86_64-linux-gnu/libc-2.19.so+0x21ec4) - #14 0x401d58 - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - splash/SplashXPathScanner.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 23ad7fa5253a4fec6543d1435827aa1b59b62ced -Author: Albert Astals Cid -Date: Thu Mar 27 01:14:05 2014 +0100 - - 0.25.2 - - CMakeLists.txt | 4 ++-- - NEWS | 48 - +++++++++++++++++++++++++++++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - gtk-doc.make | 33 +++++++++++++++++++--------- - m4/gtk-doc.m4 | 47 - +++++++++++++++++++++++++++------------- - poppler/CairoOutputDev.h | 2 +- - poppler/Hints.cc | 2 +- - poppler/Makefile.am | 2 +- - poppler/PSOutputDev.cc | 3 ++- - poppler/PSOutputDev.h | 2 +- - poppler/StructElement.cc | 2 +- - poppler/StructElement.h | 2 +- - poppler/StructTreeRoot.cc | 2 +- - poppler/StructTreeRoot.h | 2 +- - qt4/src/CMakeLists.txt | 2 +- - qt4/src/Doxyfile | 2 +- - qt4/src/Makefile.am | 2 +- - qt4/src/poppler-ps-converter.cc | 1 + - qt5/src/CMakeLists.txt | 2 +- - qt5/src/Doxyfile | 2 +- - qt5/src/Makefile.am | 2 +- - qt5/src/poppler-ps-converter.cc | 1 + - utils/pdftocairo.cc | 2 +- - utils/pdftops.cc | 1 + - 25 files changed, 127 insertions(+), 45 deletions(-) - -commit ec2f8bca9f48935d3180dab65ef2ca455a893afd -Author: Albert Astals Cid -Date: Wed Mar 26 18:38:13 2014 +0100 - - Fix overflow malloc - - poppler/Stream.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 322e416451b7b33cba8fb3d4702207693c3c7921 -Author: Albert Astals Cid -Date: Wed Mar 26 17:58:48 2014 +0100 - - Fix error reported by ASAN in 1195.asan.0.293.pdf - - ==31060== ERROR: AddressSanitizer: heap-buffer-overflow on - address 0x60040002a215 at pc 0x7f5614cd96c4 bp 0x7fff54a44050 sp - 0x7fff54a44048 - READ of size 1 at 0x60040002a215 thread T0 - #0 0x7f5614cd96c3 in JBIG2Stream::readGenericBitmap(bool, - int, int, int, bool, bool, JBIG2Bitmap*, int*, int*, int) - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:3389 - #1 0x7f5614cce0e7 in JBIG2Stream::readSymbolDictSeg(unsigned - int, unsigned int, unsigned int*, unsigned int) - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1867 - #2 0x7f5614ccb8fe in JBIG2Stream::readSegments() - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1408 - #3 0x7f5614cca72e in JBIG2Stream::reset() - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1248 - #4 0x7f5614d1648b in ImageStream::reset() - /home/tsdgeos/devel/poppler/poppler/Stream.cc:484 - #5 0x7f5614de6578 in SplashOutputDev::drawImage(GfxState*, - Object*, Stream*, int, int, GfxImageColorMap*, bool, int*, bool) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:3158 - #6 0x7f5614c41d64 in Gfx::doImage(Object*, Stream*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4653 - #7 0x7f5614c3ede0 in Gfx::opXObject(Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 - #8 0x7f5614c1933a in Gfx::execOp(Object*, Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 - #9 0x7f5614c1850f in Gfx::go(bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 - #10 0x7f5614c18163 in Gfx::display(Object*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 - #11 0x7f5614cfae27 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:585 - #12 0x7f5614d02353 in PDFDoc::displayPageSlice(OutputDev*, - int, double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #13 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #14 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #15 0x7f5614322ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #16 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - poppler/JBIG2Stream.cc | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -commit 225232f6f070d17d8570108ffe39ffd4350fc6e8 -Author: Albert Astals Cid -Date: Wed Mar 26 15:00:09 2014 +0100 - - Fix error reported by ASAN in 6609.asan.0.8343.pdf - - ==8470== ERROR: AddressSanitizer: heap-buffer-overflow on - address 0x7f3b12f7b5e1 at pc 0x7f3b0f915f5e bp 0x7fff47842de0 sp - 0x7fff47842dd8 - READ of size 1 at 0x7f3b12f7b5e1 thread T0 - #0 0x7f3b0f915f5d in JBIG2Stream::readGenericBitmap(bool, - int, int, int, bool, bool, JBIG2Bitmap*, int*, int*, int) - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:3628 - #1 0x7f3b0f910558 in JBIG2Stream::readGenericRegionSeg(unsigned - int, bool, bool, unsigned int) - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:2849 - #2 0x7f3b0f906b33 in JBIG2Stream::readSegments() - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1443 - #3 0x7f3b0f90572e in JBIG2Stream::reset() - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1248 - #4 0x7f3b0f951459 in ImageStream::reset() - /home/tsdgeos/devel/poppler/poppler/Stream.cc:484 - #5 0x7f3b0fa21546 in SplashOutputDev::drawImage(GfxState*, - Object*, Stream*, int, int, GfxImageColorMap*, bool, int*, bool) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:3158 - #6 0x7f3b0f87cd64 in Gfx::doImage(Object*, Stream*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4653 - #7 0x7f3b0f879de0 in Gfx::opXObject(Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 - #8 0x7f3b0f85433a in Gfx::execOp(Object*, Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 - #9 0x7f3b0f85350f in Gfx::go(bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 - #10 0x7f3b0f853163 in Gfx::display(Object*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 - #11 0x7f3b0f935df5 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:585 - #12 0x7f3b0f93d321 in PDFDoc::displayPageSlice(OutputDev*, - int, double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #13 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #14 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #15 0x7f3b0ef5dec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #16 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - poppler/JBIG2Stream.cc | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -commit 216890f1f147b25643e0d6e18e361d4d34b6c332 -Author: Albert Astals Cid -Date: Wed Mar 26 12:19:42 2014 +0100 - - Fix error reported by ASAN in 6760.asan.0.8568.pdf - - ==26566== ERROR: AddressSanitizer: SEGV on unknown address - 0x7fffbc3e5ea8 (pc 0x7fe1fa858db1 sp 0x7fffc788eb30 bp 0x7fffc788eb40 - T0) - AddressSanitizer can not provide additional info. - #0 0x7fe1fa858db0 in PSStack::index(int) - /home/tsdgeos/devel/poppler/poppler/Function.cc:1067 - #1 0x7fe1fa856fd6 in PostScriptFunction::exec(PSStack*, int) - /home/tsdgeos/devel/poppler/poppler/Function.cc:1621 - #2 0x7fe1fa854c10 in PostScriptFunction::transform(double*, - double*) /home/tsdgeos/devel/poppler/poppler/Function.cc:1266 - #3 0x7fe1fa854097 in - PostScriptFunction::PostScriptFunction(Object*, Dict*) - /home/tsdgeos/devel/poppler/poppler/Function.cc:1216 - #4 0x7fe1fa84a0c2 in Function::parse(Object*, - std::set, std::allocator >*) - /home/tsdgeos/devel/poppler/poppler/Function.cc:98 - #5 0x7fe1fa849e3c in Function::parse(Object*) - /home/tsdgeos/devel/poppler/poppler/Function.cc:63 - #6 0x7fe1fa8c1d8c in GfxDeviceNColorSpace::parse(Array*, - OutputDev*, GfxState*, int) - /home/tsdgeos/devel/poppler/poppler/GfxState.cc:2978 - #7 0x7fe1fa8a6fb7 in GfxColorSpace::parse(Object*, - OutputDev*, GfxState*, int) - /home/tsdgeos/devel/poppler/poppler/GfxState.cc:328 - #8 0x7fe1fa88440f in Gfx::doImage(Object*, Stream*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4403 - #9 0x7fe1fa882d6c in Gfx::opXObject(Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 - #10 0x7fe1fa85d2c6 in Gfx::execOp(Object*, Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 - #11 0x7fe1fa85c49b in Gfx::go(bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 - #12 0x7fe1fa85c0ef in Gfx::display(Object*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 - #13 0x7fe1fa93ed81 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:585 - #14 0x7fe1fa9462ad in PDFDoc::displayPageSlice(OutputDev*, - int, double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #15 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #16 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #17 0x7fe1f9f66ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #18 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - poppler/Function.cc | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -commit fb7d91435c71603697b652c70cfa76dd595ee200 -Author: Albert Astals Cid -Date: Wed Mar 26 12:08:52 2014 +0100 - - Fix ASAN in 750.asan.0.9621.pdf - - ==25876== ERROR: AddressSanitizer: heap-buffer-overflow on - address 0x60040002a10f at pc 0x7fc396c3c23e bp 0x7ffff1123d20 sp - 0x7ffff1123d18 - READ of size 1 at 0x60040002a10f thread T0 - #0 0x7fc396c3c23d in JBIG2Stream::readGenericBitmap(bool, - int, int, int, bool, bool, JBIG2Bitmap*, int*, int*, int) - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:3504 - #1 0x7fc396c30073 in JBIG2Stream::readSymbolDictSeg(unsigned - int, unsigned int, unsigned int*, unsigned int) - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1867 - #2 0x7fc396c2d88a in JBIG2Stream::readSegments() - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1408 - #3 0x7fc396c2c6ba in JBIG2Stream::reset() - /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1248 - #4 0x7fc396c783f7 in ImageStream::reset() - /home/tsdgeos/devel/poppler/poppler/Stream.cc:484 - #5 0x7fc396d484e4 in SplashOutputDev::drawImage(GfxState*, - Object*, Stream*, int, int, GfxImageColorMap*, bool, int*, bool) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:3158 - #6 0x7fc396ba3cf0 in Gfx::doImage(Object*, Stream*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4653 - #7 0x7fc396ba0d6c in Gfx::opXObject(Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 - #8 0x7fc396b7b2c6 in Gfx::execOp(Object*, Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 - #9 0x7fc396b7a49b in Gfx::go(bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 - #10 0x7fc396b7a0ef in Gfx::display(Object*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 - #11 0x7fc396c5cd93 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:585 - #12 0x7fc396c642bf in PDFDoc::displayPageSlice(OutputDev*, - int, double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #13 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #14 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #15 0x7fc396284ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #16 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - - poppler/JBIG2Stream.cc | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -commit 9002b3b7cbbbc5802abfa8383ded2093a29d1746 -Author: Albert Astals Cid -Date: Wed Mar 26 00:48:15 2014 +0100 - - Fix ASAN in 784.asan.0.9671.pdf - - ================================================================= - ==24856== ERROR: AddressSanitizer: SEGV on unknown address - 0x603bfffe5804 (pc 0x7f7aa3310c6b sp 0x7fff0e656bd0 bp 0x7fff0e656e90 - T0) - AddressSanitizer can not provide additional info. - #0 0x7f7aa3310c6a in - GfxIndexedColorSpace::mapColorToBase(GfxColor*, GfxColor*) - /home/tsdgeos/devel/poppler/poppler/GfxState.cc:2509 - #1 0x7f7aa33110d2 in GfxIndexedColorSpace::getRGB(GfxColor*, - GfxRGB*) /home/tsdgeos/devel/poppler/poppler/GfxState.cc:2529 - #2 0x7f7aa3466712 in convertGfxColor(unsigned - char*, SplashColorMode, GfxColorSpace*, GfxColor*) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:117 - #3 0x7f7aa34675a9 in SplashUnivariatePattern::getColor(int, - int, unsigned char*) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:215 - #4 0x7f7aa348d2a2 in Splash::pipeRun(SplashPipe*) - /home/tsdgeos/devel/poppler/splash/Splash.cc:363 - #5 0x7f7aa34c9c29 in Splash::drawAALine(SplashPipe*, - int, int, int, bool, unsigned char) - /home/tsdgeos/devel/poppler/splash/Splash.cc:1537 - #6 0x7f7aa34c4787 in Splash::shadedFill(SplashPath*, bool, - SplashPattern*) /home/tsdgeos/devel/poppler/splash/Splash.cc:6388 - #7 0x7f7aa348b65c in - SplashOutputDev::univariateShadedFill(GfxState*, - SplashUnivariatePattern*, double, double) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:4408 - #8 0x7f7aa348b93d in SplashOutputDev::radialShadedFill(GfxState*, - GfxRadialShading*, double, double) - /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:4427 - #9 0x7f7aa32c7574 in Gfx::doRadialShFill(GfxRadialShading*) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:3058 - #10 0x7f7aa32c188f in Gfx::opShFill(Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:2476 - #11 0x7f7aa32b12c6 in Gfx::execOp(Object*, Object*, int) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 - #12 0x7f7aa32b049b in Gfx::go(bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 - #13 0x7f7aa32b00ef in Gfx::display(Object*, bool) - /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 - #14 0x7f7aa3392dc9 in Page::displaySlice(OutputDev*, double, - double, int, bool, bool, int, int, int, int, bool, bool - (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/Page.cc:585 - #15 0x7f7aa339a2f5 in PDFDoc::displayPageSlice(OutputDev*, - int, double, double, int, bool, bool, bool, int, int, int, int, - bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) - /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 - #16 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, - int, int, int, int, int, double, double, char*) - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 - #17 0x404416 in main - /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 - #18 0x7f7aa29baec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) - #19 0x401d58 in _start - (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) - SUMMARY: AddressSanitizer: SEGV - /home/tsdgeos/devel/poppler/poppler/GfxState.cc:2509 - GfxIndexedColorSpace::mapColorToBase(GfxColor*, GfxColor*) - - poppler/GfxState.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 8947c6bc1dcb768b9d9c03a7a5db1573abdc2e87 -Author: Albert Astals Cid -Date: Wed Mar 26 00:47:59 2014 +0100 - - Forgot my (C) in the last commit - - poppler/TextOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 1d7095ab7bdf0f14c3bfe99d6d5985bce98abe16 -Author: Albert Astals Cid -Date: Tue Mar 25 22:29:07 2014 +0100 - - Fix Heap-buffer-overflow in TextPage::updateFont - - Bug #76442 - - poppler/TextOutputDev.cc | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -commit 37ad83d69bd1d10da6ea1eb559c4bd320917ae25 -Author: Albert Astals Cid -Date: Sat Mar 22 17:33:55 2014 +0100 - - Reorder the if check condition - - I think the previous condition was correct anyway because of the - extra -1 in the i check - but it really makes more sense to have the i check first - - Bug #76478 - - goo/gfile.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 3535d658095ffa49ef8615d69843afa9c5ada061 -Author: Albert Astals Cid -Date: Sat Mar 22 17:29:46 2014 +0100 - - Make the test rect go to xMax, yMax not xMax-1,yMax-1 - - I don't understand why the -1 is there and removing - it actually fixes bug #76387 - - splash/Splash.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 1e93c3f2d1c86edd40ca283ed422089f64886d04 -Author: William Bader -Date: Sat Mar 15 17:14:21 2014 +0100 - - Fix regression when creating level1 PS - - Bug #75241 - - poppler/PreScanOutputDev.cc | 16 ++++++++++++++-- - poppler/PreScanOutputDev.h | 3 ++- - 2 files changed, 16 insertions(+), 3 deletions(-) - -commit 1ea2eb412d12d97eaf49d1e51d7fda7abd8fbf9d -Author: Jason Crain -Date: Wed Mar 12 00:34:13 2014 +0100 - - Limit numeric parsing of character names - - Bug #38456 - - poppler/GfxFont.cc | 139 - ++++++++++++++++++++++++++++++++++-------------- - poppler/GlobalParams.cc | 4 +- - 2 files changed, 102 insertions(+), 41 deletions(-) - -commit e24cbeae22d6c8630e292897bd982a87e6290ca6 -Author: Steven Lee -Date: Tue Mar 11 21:24:59 2014 +0100 - - Fix TIFF writting in Windows - - Bug #75969 - - goo/TiffWriter.cc | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -commit b984a3b5946ebcd736e0583a10eb614cede3388a -Author: Adrian Perez de Castro -Date: Wed Mar 5 11:19:48 2014 +0200 - - glib: Use flags argument in poppler_structure_element_get_text() - - Instead of accepting a boolean argument to enable recursive text - extraction, - use a flags value. Text extraction may add features in the future (for - example, allowing using alternate text as replacement for inline - figures), - and this will allow to extend the method without introducing ABI - or API - breakage. - - https://bugs.freedesktop.org/show_bug.cgi?id=75796 - - glib/poppler-structure-element.cc | 12 +++++++----- - glib/poppler-structure-element.h | 14 +++++++++++++- - glib/reference/poppler-sections.txt | 3 +++ - 3 files changed, 23 insertions(+), 6 deletions(-) - -commit 94df09de1e07d442895ec1fb5cc23cacd9826552 -Author: Adrian Perez de Castro -Date: Thu Mar 6 10:44:51 2014 +0200 - - glib: Add missing underscore in method name - - The correct name is poppler_structure_element_get_form_state(). - - https://bugs.freedesktop.org/show_bug.cgi?id=75827 - - glib/poppler-structure-element.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 7ddd03f9a00dcf505921821c55bebe6817aa3605 -Author: Carlos Garcia Campos -Date: Wed Mar 5 17:48:39 2014 +0100 - - Rename getNumElements, getElement and appendElement as getNumChildren, - getChild and appendChild - - It's more consistent with other internal API and less confusing. - - glib/poppler-structure-element.cc | 16 ++++++++-------- - poppler/StructElement.cc | 6 +++--- - poppler/StructElement.h | 8 ++++---- - poppler/StructTreeRoot.cc | 4 ++-- - poppler/StructTreeRoot.h | 8 ++++---- - 5 files changed, 21 insertions(+), 21 deletions(-) - -commit 7d6a5b65f8497537248d405177ae141f3765a419 -Author: Carlos Garcia Campos -Date: Wed Mar 5 17:40:14 2014 +0100 - - glib: Update the documentation symbols after the PopplerStructureScope - rename - - glib/reference/poppler-sections.txt | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 9282b5a26e9ce81d81d42c0cbe449543c8366b7c -Author: Carlos Garcia Campos -Date: Wed Mar 5 17:37:38 2014 +0100 - - glib: Rename PopplerStructureScope as PopplerStructureTableScope - - It's a table specific attribute - - glib/poppler-structure-element.cc | 14 +++++++------- - glib/poppler-structure-element.h | 12 ++++++------ - 2 files changed, 13 insertions(+), 13 deletions(-) - -commit 9888eb65c6fad0eabcf525a7e88941dec2a27e92 -Author: Adrian Perez de Castro -Date: Thu Sep 26 19:36:12 2013 +0300 - - glib: Implement accessors for element attributes - - Implement inspecting the standard attributes of - PopplerStructureElement - objects. - - https://bugs.freedesktop.org/show_bug.cgi?id=64821 - - glib/poppler-structure-element.cc | 1279 - ++++++++++++++++++++++++++++++++++- - glib/poppler-structure-element.h | 252 ++++++- - glib/reference/poppler-sections.txt | 84 +++ - 3 files changed, 1597 insertions(+), 18 deletions(-) - -commit b346df59ef0775f5bd74a9f7379b5f430ccd7b79 -Author: Adam Reichold -Date: Tue Mar 4 23:40:59 2014 +0100 - - Qt: Expose document-supplied text direction - - qt4/src/poppler-document.cc | 17 +++++++++++++++++ - qt4/src/poppler-qt4.h | 10 +++++++++- - qt5/src/poppler-document.cc | 17 +++++++++++++++++ - qt5/src/poppler-qt5.h | 10 +++++++++- - 4 files changed, 52 insertions(+), 2 deletions(-) - -commit 2fc38c1866243598e22be07f0177e7d9385542d5 -Author: Adrian Perez de Castro -Date: Fri Feb 28 19:14:36 2014 +0200 - - glib: Fixes in the API reference documentation - - - Remove the references to non-existent methods for - PopplerStructureElement, - and point to PopplerStructureElementIter instead to point out how to - obtain the structure tree. - - Remove a non-existent include in poppler-docs.sgml - - Add POPPLER_TYPE_TEXT_SPAN to the list of private symbols. - - https://bugs.freedesktop.org/show_bug.cgi?id=75615 - - glib/poppler-structure-element.cc | 6 +++--- - glib/reference/poppler-docs.sgml | 1 - - glib/reference/poppler-sections.txt | 1 + - 3 files changed, 4 insertions(+), 4 deletions(-) - -commit cfe47a655ec5e280168e000da85bbf13f5f5f8b8 -Author: Adrian Perez de Castro -Date: Fri Feb 28 19:17:45 2014 +0200 - - glib: Remove poppler_text_span_is_link() in header - - The method poppler_text_span_is_link() does not exist, and must - be removed from the API header. - - https://bugs.freedesktop.org/show_bug.cgi?id=75613 - - glib/poppler-structure-element.h | 1 - - 1 file changed, 1 deletion(-) - -commit 7a2db63b5f7cae4bc215baa0859c4d4f8a660951 -Author: Adrian Perez de Castro -Date: Wed Feb 26 20:16:29 2014 +0200 - - glib: Remove unneeded POPPLER_STRUCTURE_ELEMENT_UNKNOWN - - The enum value POPPLER_STRUCTURE_ELEMENT_UNKNOWN because Poppler does - not add invalid StructElements ("invalid" being nodes of type - StructElement::Unknown) to the Tagged-PDF structure tree. That means - that poppler-glib does not need to expose it in the API. An assertion - is left to aid in finding issues when using debug builds. - - https://bugs.freedesktop.org/show_bug.cgi?id=75541 - - glib/poppler-structure-element.cc | 12 +++++++----- - glib/poppler-structure-element.h | 1 - - 2 files changed, 7 insertions(+), 6 deletions(-) - -commit db909c2a14f962234a813ba9853535b9692cfd5a -Author: Albert Astals Cid -Date: Wed Feb 26 22:09:44 2014 +0100 - - Try harder to open broken files - - Bug #75232 - - poppler/PDFDoc.cc | 33 ++++++++++++++++++++++----------- - poppler/PDFDoc.h | 8 ++++---- - 2 files changed, 26 insertions(+), 15 deletions(-) - -commit b2394eee5384edf4128d598030989e66d64714ef -Author: Adrian Perez de Castro -Date: Mon Feb 10 20:29:35 2014 +0200 - - Tagged-PDF: Fix parsing of attached element attributes - - The wrong object was used as attribute dictionary, which caused - a segmentation fault when parsing PDF files in which the structure - elements included attributes attached to them. This patch fixes the - issue. - - Thanks to Joanmarie Diggs for helping in - debugging the problem. - - https://bugs.freedesktop.org/show_bug.cgi?id=74805 - - poppler/StructElement.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit c549b5e9ce2dcc8beb2511ee315bfff2fdfdf6e8 -Author: Adrian Perez de Castro -Date: Sun Feb 9 18:31:22 2014 +0200 - - glib: Add poppler_structure_element_is_grouping() - - Implement a method to check whether a structure element is a grouping - element, wrapping the StructElement::isGrouping() method. - - https://bugs.freedesktop.org/show_bug.cgi?id=74753 - - glib/poppler-structure-element.cc | 20 ++++++++++++++++++++ - glib/poppler-structure-element.h | 1 + - glib/reference/poppler-sections.txt | 1 + - 3 files changed, 22 insertions(+) - -commit 6fbd6cb85bdd32dc5a3d4c3c719556269a4488ac -Author: Adrian Perez de Castro -Date: Fri Feb 21 15:02:44 2014 +0200 - - glib: Handle missing structure element types - - Element Art (article); RB, RP, RB (Ruby text inner elements); and - WT, WP (Warichu inner elements) were not being handled. This adds - the corresponding handling in poppler-glib. Also, the "default" case - in the switch in poppler_structure_element_get_type() is removed, so - the compiler can emit warnings when enum values are not handled. - - https://bugs.freedesktop.org/show_bug.cgi?id=75323 - - glib/poppler-structure-element.cc | 25 +++++++++++++++++++------ - glib/poppler-structure-element.h | 9 +++++++-- - 2 files changed, 26 insertions(+), 8 deletions(-) - -commit 63e9c0b67fa2e64ca20258d873a849386c7eb295 -Author: Fabio D'Urso -Date: Mon Feb 17 23:58:09 2014 +0100 - - Some error() usage fixes - - poppler/Hints.cc | 3 ++- - poppler/JBIG2Stream.cc | 4 ++-- - poppler/PSOutputDev.cc | 4 ++-- - poppler/SecurityHandler.cc | 3 ++- - poppler/StructTreeRoot.cc | 3 ++- - qt4/src/poppler-annotation.cc | 6 +++--- - qt5/src/poppler-annotation.cc | 6 +++--- - utils/HtmlOutputDev.cc | 11 ++++++----- - 8 files changed, 22 insertions(+), 18 deletions(-) - -commit 8f2d847f1d0224a297e642944f8da9c1409732b6 -Author: Fabio D'Urso -Date: Mon Feb 17 23:56:49 2014 +0100 - - Clang++ plugin that checks for usage errors in GooString::format-style - calls - - goo/GooString.h | 12 +- - poppler/Error.h | 4 +- - test/goostring-format-checker/README | 16 + - .../goostring-format-checker.cc | 369 - +++++++++++++++++++++ - 4 files changed, 397 insertions(+), 4 deletions(-) - -commit d7d61dcda91910f7eb2548b19e8380d7c3232dd3 -Author: Thomas Freitag -Date: Wed Feb 12 21:50:38 2014 +0100 - - blend usage in PDF with spot colors casue random output - - The reason for the random colors is the uninitialized local variable - cBlend. The blend functions only fills offset 0 to 3, so offset 4 - up to 4 + SPOT_NCOMPS are left uninitialized, but all offsets are - stored in the bitmap. - So we need to initialize these offsets with 0! - - Bug #74883 - - splash/Splash.cc | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -commit b2905a0d299cc09fcd219afe49cb370f6db61c5a -Author: Albert Astals Cid -Date: Mon Feb 10 20:19:07 2014 +0100 - - increase gtk3 dependency - - gtk_tree_view_set_activate_on_single_click was introduced in 3.8 - - cmake/modules/FindGTK.cmake | 2 +- - configure.ac | 4 ++-- - 2 files changed, 3 insertions(+), 3 deletions(-) - -commit 71d4041b061c109a965e72230640cf8ee616dac3 -Author: Albert Astals Cid -Date: Mon Feb 10 20:16:46 2014 +0100 - - Make sure number of least objects in hints table is valid - - Bug #74741 - - poppler/Hints.cc | 5 +++++ - 1 file changed, 5 insertions(+) - -commit a865f13def88153fdbe8a0a054d2005e3e2bb737 -Author: Albert Astals Cid -Date: Sun Feb 9 23:22:07 2014 +0100 - - Fix cmake build - - glib/CMakeLists.txt | 2 ++ - glib/demo/CMakeLists.txt | 1 + - 2 files changed, 3 insertions(+) - -commit d6fde0fac0120b1622942d8344d5153d9abf3e1e -Author: Adrian Perez de Castro -Date: Wed May 29 23:44:03 2013 +0300 - - glib-demo: Pane showing the document structure - - Adds a new pane in poppler-glib-demo showing the structure for - Tagged-PDF - documents. It also serves as an example on how to to use the API for - PopplerStructure and PopplerStructureElement. - - glib/demo/Makefile.am | 2 + - glib/demo/main.c | 2 + - glib/demo/taggedstruct.c | 232 - +++++++++++++++++++++++++++++++++++++++++++++++ - glib/demo/taggedstruct.h | 31 +++++++ - 4 files changed, 267 insertions(+) - -commit 0f9fa775c469c03d1613b955ee7b06b823e6e080 -Author: Adrian Perez de Castro -Date: Thu Sep 26 17:50:51 2013 +0300 - - glib: Expose inline attributes of structure elements - - Allows obtaining inline text attributes from structure elements. The - text - is divived into "spans", which are groups of consecutive glyphs - that share - their attributes. Each one of those is represented by a - PopplerTextSpan, - which gives information about the text font and color, and the - link target - for links. The list of PopplerTextSpans is created lazily when - first used. - - https://bugs.freedesktop.org/show_bug.cgi?id=64821 - - glib/poppler-structure-element.cc | 269 - ++++++++++++++++++++++++++++++++++++ - glib/poppler-structure-element.h | 16 ++- - glib/poppler.h | 1 + - glib/reference/poppler-sections.txt | 12 ++ - 4 files changed, 297 insertions(+), 1 deletion(-) - -commit 8072d4b0e3ea10b4308f8172891f769f30466133 -Author: Adrian Perez de Castro -Date: Thu May 9 12:01:59 2013 +0300 - - glib: Expose the document structure tree - - Implements a new PopplerStructureElement classe, which builds upon - StructTreeRoot and StructElement to expose the document structure of - tagged PDFs in the GLib binding. - - Navigation of the structure tree is done by an iterator-based - interface, - using PopplerStructureElementIter. - - https://bugs.freedesktop.org/show_bug.cgi?id=64821 - - glib/Makefile.am | 2 + - glib/poppler-private.h | 10 + - glib/poppler-structure-element.cc | 663 - ++++++++++++++++++++++++++++++++++++ - glib/poppler-structure-element.h | 112 ++++++ - glib/poppler.h | 3 + - glib/reference/poppler-docs.sgml | 2 + - glib/reference/poppler-sections.txt | 37 ++ - glib/reference/poppler.types | 2 + - 8 files changed, 831 insertions(+) - -commit 46b7470ae9846d7e6dbb72bbb3ff831acd954168 -Author: Germán Poo-Caamaño -Date: Thu Jan 30 14:42:51 2014 -0800 - - glib-demo: Fix performance in text markup annotations - - Fix https://bugs.freedesktop.org/show_bug.cgi?id=51487#c45 - - glib/demo/annots.c | 19 +++++++++++++------ - 1 file changed, 13 insertions(+), 6 deletions(-) - -commit 8a84b45674aed8c27a1d172b07eb0531c0ec14f1 -Author: Carlos Garcia Campos -Date: Sat Feb 8 09:17:02 2014 +0100 - - glib: Fix gobject-introspection warnings - - glib/poppler-page.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 899799df78c00fc2ca6d2d0e612536b87a871817 -Author: Adrian Perez de Castro -Date: Tue Feb 4 19:26:53 2014 +0200 - - Allow properly identifying grouping elements - - Grouping elements in the Tagged-PDF structure should be identifiable - as - such (see section 14.8.4.2 "Grouping Elements" of the PDF - standard). Those - were previously reported as inline elements, which is quite not - correct. - This patch introduces a new StructElement::isGrouping() method which - correctly reports grouping elements as such. - - https://bugs.freedesktop.org/show_bug.cgi?id=74520 - - poppler/StructElement.cc | 31 +++++++++++++++++++------------ - poppler/StructElement.h | 1 + - 2 files changed, 20 insertions(+), 12 deletions(-) - -commit 27cd9a00bfebf0602e7ed29a8ee8e16ffff67bde -Author: Adrian Perez de Castro -Date: Tue Feb 4 19:35:58 2014 +0200 - - Report LBody elements in Tagged-PDF structure as block elements - - According to section 14.8.4.3 "Block-Level Structure Elements" - (in particular subsection 14.8.4.3.3 "List Elements"), structure - elements of type LBody must be reported as block elements. This - patch changes the reported type from elementTypeUndefined to - elementTypeBlock accordingly. - - https://bugs.freedesktop.org/show_bug.cgi?id=74522 - - poppler/StructElement.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 4cda839cb489fe5cd4726109cb9ab8b0ba2fa563 -Author: Adrian Johnson -Date: Tue Jan 28 06:06:09 2014 +1030 - - pdftops: ensure there is always a page size in the output - - even if the PDF file as badly broken. - - poppler/PSOutputDev.cc | 7 +++++++ - 1 file changed, 7 insertions(+) - -commit 45a87afdf1372911aa1ba840557e61627cdc7b4f -Author: Adrian Johnson -Date: Sun Dec 29 15:16:37 2013 +1030 - - cairo: clip to crop box - - when printing the cairo surface may larger than the crop box - - fixes https://bugzilla.gnome.org/show_bug.cgi?id=649886 - - poppler/CairoOutputDev.h | 4 ++++ - 1 file changed, 4 insertions(+) - -commit 6d39a1d7b348329dd057a8e7c77bfd47921fc495 -Author: Adrian Johnson -Date: Mon Dec 30 17:59:09 2013 +1030 - - pdftocairo: ensure page size and crop box works the same as pdftops - - Bug 72312 - - utils/pdftocairo.1 | 26 +++++++++----------------- - utils/pdftocairo.cc | 20 +++++++++++++++----- - 2 files changed, 24 insertions(+), 22 deletions(-) - -commit b1da7e20dcef78ef6036418b37a47ba3f8818453 -Author: Adrian Johnson -Date: Thu Dec 19 22:18:26 2013 +1030 - - pdftops: Only change paper size when different to previous size - - Previously this check was done in the code (removed in previous - commit). - Moving this check into the pdfSetupPaper macro preserves page - independence. - - Bug 72312 - - poppler/PSOutputDev.cc | 30 +++++++++++++++++++++++++----- - 1 file changed, 25 insertions(+), 5 deletions(-) - -commit 7ac7d3bad4b868950ee96fd9c5ece88632f8827c -Author: Adrian Johnson -Date: Fri Dec 20 07:19:21 2013 +1030 - - pdftops: Remove origpagesizes mode and make -origpagesizes an alias - for -paper match - - Bug 72312 - - poppler/PSOutputDev.cc | 9 ++------- - poppler/PSOutputDev.h | 4 ++-- - utils/pdftops.1 | 30 ++++++++++-------------------- - utils/pdftops.cc | 23 ++++++++++++++--------- - 4 files changed, 28 insertions(+), 38 deletions(-) - -commit 31fc5181bc491ff2e4aee0ae05c0f611a36e585c -Author: Adrian Johnson -Date: Fri Dec 20 07:16:37 2013 +1030 - - pdftops: Use crop box as page size - - unless -nocrop is used. The fontends use the crop box as the page - size and - acroread uses the cropbox as the page size for display and printing. - - Bug 72312 - - poppler/PSOutputDev.cc | 28 +++++++--------------------- - 1 file changed, 7 insertions(+), 21 deletions(-) - -commit bf2049b17ac4706f472c59e50266f4eaf0ffaa32 -Author: Adrian Johnson -Date: Sun Dec 15 18:00:41 2013 +1030 - - pdftps: fix DocumentMedia/Page/Media/PageBBox DSC comments - - Bug 72312 - - poppler/PSOutputDev.cc | 167 - ++++++++++++++++++++++++++-------------- - poppler/PSOutputDev.h | 6 +- - qt4/src/poppler-ps-converter.cc | 1 + - qt5/src/poppler-ps-converter.cc | 1 + - utils/pdftops.cc | 1 + - 5 files changed, 119 insertions(+), 57 deletions(-) - -commit fe49033c9bd2103c13d4eb59983e06fdcdd33a8d -Author: Till Kamppeter -Date: Sat Dec 14 16:05:09 2013 +1030 - - pdftops: ensure paper size takes into account rotation - - Bug 72312 - - poppler/PSOutputDev.cc | 48 - ++++++++++++++++++++---------------------------- - 1 file changed, 20 insertions(+), 28 deletions(-) - -commit 31edf585e62f4e91b7b64295cc8b978ac466ce58 -Author: Bogdan Cristea -Date: Mon Jan 27 20:06:11 2014 +0100 - - [qt] Improve compilation under Win 8 with Visual Studio 2012 - - Bug #73111 - - goo/GooMutex.h | 3 ++- - goo/GooTimer.h | 2 ++ - goo/gfile.h | 2 ++ - poppler/PDFDoc.cc | 4 +--- - poppler/XpdfPluginAPI.h | 2 ++ - poppler/poppler-config.h.cmake | 18 ++++++++++++++++-- - poppler/poppler-config.h.in | 18 ++++++++++++++++-- - qt4/tests/stress-threads-qt4.cpp | 5 +++++ - qt5/src/poppler-private.h | 6 ++++-- - qt5/tests/stress-threads-qt5.cpp | 5 +++++ - test/perf-test.cc | 1 - - 11 files changed, 55 insertions(+), 11 deletions(-) - -commit 834cd18e3ddfda44a11316290f7eee98cd871305 -Author: Albert Astals Cid -Date: Sun Jan 26 16:10:20 2014 +0100 - - Use c99 for the c compiler - - cmake/modules/PopplerMacros.cmake | 1 + - 1 file changed, 1 insertion(+) - -commit 03674a141a96806e5e1a134dc3dec2ee61b68713 -Author: Pino Toscano -Date: Sun Jan 26 12:43:13 2014 +0100 - - qt4/qt5: add GCC visibility export attributes - - this does no actual changes to the exported symbols, but can help in - hiding symbols if the right GCC flags for symbols visibility are - specified - - qt4/src/poppler-export.h | 3 +++ - qt5/src/poppler-export.h | 3 +++ - 2 files changed, 6 insertions(+) - -commit 52b46d05219cf9898ee4adae7c8c2702adb1ba23 -Author: Pino Toscano -Date: Sun Jan 26 12:38:03 2014 +0100 - - qt4/qt5: improve naming of internal export/import macros - - use something less generic than LIB_EXPORT/LIB_IMPORT - - qt4/src/poppler-export.h | 12 ++++++------ - qt5/src/poppler-export.h | 12 ++++++------ - 2 files changed, 12 insertions(+), 12 deletions(-) - -commit 7a8bcea11ad71fccbbba2787fc442f6ba4bf7100 -Author: Pino Toscano -Date: Thu Jan 23 22:34:07 2014 +0100 - - cmake: install JpegWriter.h depending on libjpeg - - ... and not libopenjpeg - - CMakeLists.txt | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -commit 57f34f525fa2c2e62ebc7383ceba48ebc80ebba6 -Author: Andres Gomez -Date: Wed Jan 8 12:26:14 2014 +0200 - - glib-demo: Fix conding style issue in render.c - - glib/demo/render.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 3fac919eeb1ca1abfdbb4f9923a454e532256f5c -Author: Andres Gomez -Date: Wed Jan 8 12:25:52 2014 +0200 - - glib-demo: Fix trailing whitespaces in render.c - - glib/demo/render.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 92ea15642a6d3fe65d66d5c59fb6bed54e060e5d -Author: Christian Persch -Date: Fri Jan 3 23:31:56 2014 +0100 - - glib: Install error callback - - Install an error callback so that poppler error messages can be - redirected - to the GLib logging API. - - https://bugs.freedesktop.org/show_bug.cgi?id=73269 - - glib/poppler.cc | 47 +++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 47 insertions(+) - -commit f99128e38bbff43623d5cd1c1bc27fd789d0bc0c -Author: Carlos Garcia Campos -Date: Sun Jan 19 16:03:35 2014 +0100 - - glib: Make vertices a constructor parameter of line annotations - - It's a required field in the line annotation. - - glib/demo/annots.c | 4 +--- - glib/poppler-annot.cc | 12 ++++++++++-- - glib/poppler-annot.h | 4 +++- - 3 files changed, 14 insertions(+), 6 deletions(-) - -commit 587a40f90e4ac5a1b6ab9044495a1ae403bc8c58 -Author: Carlos Garcia Campos -Date: Sun Jan 19 15:58:43 2014 +0100 - - annots: Fix memory leak when setting AnnotTextMarkup quads twice - - poppler/Annot.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 69e73da1fbab9bf3365b40dced1008b0283ac931 -Author: Germán Poo-Caamaño -Date: Wed Nov 20 11:53:30 2013 -0800 - - glib-demo: Add support for PopplerTextAnnotMarkup - - * The subtypes are: Highlihght, Squiggly, StrikeOut and Underline. - * Use ScrolledWindow for annotation properties to make room to - show the Quadrilaterals of TextMarkup annotations. - - https://bugs.freedesktop.org/show_bug.cgi?id=51487 - - glib/demo/annots.c | 232 - +++++++++++++++++++++++++++++++++++++++++++++++------ - 1 file changed, 206 insertions(+), 26 deletions(-) - -commit 9a7699ebe3e644ba845ef75d9295c88d321cb934 -Author: Germán Poo-Caamaño -Date: Mon Nov 18 16:42:08 2013 -0800 - - glib: Add PopplerAnnotTextMarkup class and subtypes - - The subtypes are: Highlihght, Squiggly, StrikeOut and Underline. - It adds convenient methods to set/get/free quadrilaterals - necessaries for TextMarkup annotations. - - https://bugs.freedesktop.org/show_bug.cgi?id=51487 - - glib/poppler-annot.cc | 264 - ++++++++++++++++++++++++++++++++++++ - glib/poppler-annot.h | 23 ++++ - glib/poppler-page.cc | 6 + - glib/poppler-private.h | 1 + - glib/poppler.h | 1 + - glib/reference/poppler-sections.txt | 11 ++ - 6 files changed, 306 insertions(+) - -commit 40040b41216a3dcc833fc224f1c6f15517a88aed -Author: Germán Poo-Caamaño -Date: Mon Nov 18 16:26:27 2013 -0800 - - glib: Add PopplerQuadrilateral boxed type - - https://bugs.freedesktop.org/show_bug.cgi?id=51487 - - glib/poppler-page.cc | 53 - +++++++++++++++++++++++++++++++++++++ - glib/poppler-page.h | 33 +++++++++++++++++++++++ - glib/poppler.h | 1 + - glib/reference/poppler-sections.txt | 6 +++++ - 4 files changed, 93 insertions(+) - -commit c8a845cf7c7752d3b7dad06013d3154812c66c92 -Author: Albert Astals Cid -Date: Tue Jan 14 20:26:59 2014 +0100 - - Do not define -ansi - - We are using long long that is not defined in ansi, so forcing ansi - strictness does - not make any sense. Bug #72499 - - cmake/modules/PopplerMacros.cmake | 5 ----- - configure.ac | 15 --------------- - 2 files changed, 20 deletions(-) - -commit f0c13ee72e8a7df17bdf847f5e922c01acee1f0d -Author: Albert Astals Cid -Date: Mon Jan 6 21:55:07 2014 +0100 - - C for last commit - - poppler/Parser.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 1e1b9991a911fb610e74119979b20b179f3f2a67 -Author: Albert Astals Cid -Date: Mon Jan 6 21:51:25 2014 +0100 - - Fix rendering of pdf file from KDE bug 329600 - - It used to work and regressed with large file support (used to work - because stuff just overflowed) - - lexer->getPos needs lexer to be a stream, if it is not, just resort - to the +5000 kludge - - poppler/Parser.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 4cd5c349cfbc745688c0c38fc50d364092bc3718 -Author: Albert Astals Cid -Date: Mon Jan 6 21:48:25 2014 +0100 - - Update popplers (C) - - poppler/poppler-config.h.cmake | 2 +- - poppler/poppler-config.h.in | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 7ca2f42b06757587dfd9521fb1c6c7d657545553 -Author: Albert Astals Cid -Date: Mon Jan 6 15:48:22 2014 +0100 - - Learn about automake 1.14 - - autogen.sh | 19 ++++++++++--------- - 1 file changed, 10 insertions(+), 9 deletions(-) - -commit de9643b6f76774ebe131c4787df82dd213181c71 -Author: Albert Astals Cid -Date: Fri Jan 3 00:53:37 2014 +0100 - - 0.25.1 - - CMakeLists.txt | 2 +- - NEWS | 19 +++++++++++++++++++ - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 5 files changed, 23 insertions(+), 4 deletions(-) - -commit e238c1f83fd5f667336bfbb0e9a59569ff638ecc -Author: Albert Astals Cid -Date: Fri Jan 3 00:29:28 2014 +0100 - - Fix qt5 moc detection fix - - configure.ac | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -commit 381ae2877acace4e8908b07ee5fb442bc19bf814 -Merge: 64100e7 a2f0e4b -Author: Albert Astals Cid -Date: Fri Jan 3 00:04:29 2014 +0100 - - Merge remote-tracking branch 'origin/poppler-0.24' - - Conflicts: - CMakeLists.txt - NEWS - configure.ac - cpp/Doxyfile - qt4/src/Doxyfile - qt5/src/Doxyfile - -commit a2f0e4b1fd8b3d9675cc00a561094bd78a63d048 -Author: Albert Astals Cid -Date: Thu Jan 2 23:48:29 2014 +0100 - - 0.24.5 - - CMakeLists.txt | 2 +- - NEWS | 4 ++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 9 insertions(+), 5 deletions(-) - -commit 523b2731e0489bab58e66b21016bd6f010e616ea -Author: Albert Astals Cid -Date: Thu Jan 2 22:54:42 2014 +0100 - - Update copyrights - - poppler/JBIG2Stream.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 64100e7f1f6b550e952838fce38615ec3788e17c -Author: Fabio D'Urso -Date: Sat Dec 28 12:11:47 2013 +0100 - - Simplify some calls to GooString::format-family functions - - poppler/Object.h | 4 ++-- - utils/pdftocairo.cc | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -commit 0abde34d0f7ba0fc04a30dbfd78373ec9d9d0695 -Author: Fabio D'Urso -Date: Sat Dec 28 12:11:05 2013 +0100 - - Fixed some GooString format markers - - poppler/CMap.cc | 3 ++- - poppler/Function.cc | 3 ++- - poppler/StructElement.cc | 2 +- - 3 files changed, 5 insertions(+), 3 deletions(-) - -commit a7da4c6ac2b13308803806009c3437332b140586 -Author: Fabio D'Urso -Date: Fri Dec 27 17:09:39 2013 +0100 - - GooString format: fixed bug with printing LLONG_MIN - - ( -LLONG_MIN doesn't fit in a signed long long ) - - goo/GooString.cc | 19 +++++++++++++------ - 1 file changed, 13 insertions(+), 6 deletions(-) - -commit fe88f20cc565b4cf4765fed56c821989148ef454 -Author: Fabio D'Urso -Date: Fri Dec 27 17:08:50 2013 +0100 - - GooString format: Added some tests + improved documentation - - goo/GooString.h | 10 +++++-- - qt4/tests/check_goostring.cpp | 66 - +++++++++++++++++++++++++++++++++++++++++++ - qt5/tests/check_goostring.cpp | 66 - +++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 139 insertions(+), 3 deletions(-) - -commit 5234a349adb678d267a3d8ca13176ac8abb7afd2 -Author: Thomas Freitag -Date: Fri Dec 20 20:25:26 2013 +0100 - - pdfunite: do not lose fonts when merging some files - - utils/pdfunite.cc | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -commit 8e24fcc0d296e07327e9cbe297f627bfc6471ee3 -Merge: 85efba3 b02f873 -Author: Albert Astals Cid -Date: Wed Dec 18 21:51:57 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.24' - - Conflicts: - poppler/GfxState.cc - -commit b02f873174865837fed3a9544b70b8b21747a3dd -Author: Fabio D'Urso -Date: Wed Dec 18 21:46:12 2013 +0100 - - Fixed some GooString format markers - - poppler/GfxState.cc | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - -commit 85efba38c02b5daf7d3fc46bc85850e6842a085d -Author: Thomas Freitag -Date: Wed Dec 18 00:46:00 2013 +0100 - - Make pdfunite work even if there's a single file given - - Bug #72720 - - utils/pdfunite.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit a766c55f68db38feed91cf003a0d5710e2f925a8 -Author: Tuomas Jormola -Date: Mon Dec 16 20:43:28 2013 +0100 - - Fix detection of moc for Qt5 - - Bug #72744 - - On my Mac OS X 10.9 Mavericks system with Qt 5.2.0 installed using - Homebrew, the output of the moc command doesn't include the string - "Qt 5" which is expected by the moc version detection logic in - configure.ac of poppler 0.24.4. This patch updates the grep pattern so - that the current expected moc version output and the version output of - this installation of Qt5 are both detected as a valid moc for - Qt5. With - this patch applied, I was able to build and test poppler with Qt5 - support successfully. - - (09:26:05)(tj@gauri)(~)$ uname -a - Darwin gauri.ad.local.domain 13.0.0 Darwin Kernel Version 13.0.0: - Thu Sep 19 22:22:27 PDT 2013; root:xnu-2422.1.72~6/RELEASE_X86_64 - x86_64 i386 MacBookPro3,1 Darwin - (09:26:08)(tj@gauri)(~)$ /usr/local/opt/qt5/bin/moc -v - moc 5.2.0 - (09:26:24)(tj@gauri)(~)$ - - configure.ac | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -commit a43b4bf84fe4bde6649049685bf4ed6a682e8286 -Author: Carlos Garcia Campos -Date: Sun Dec 15 11:59:57 2013 +0100 - - regtest: Add a command line option to create-report command to not - launch the browser - - regtest/HTMLReport.py | 5 +++-- - regtest/commands/create-report.py | 5 ++++- - 2 files changed, 7 insertions(+), 3 deletions(-) - -commit 113958276b96d7f1aab7042e1807a9970425d234 -Author: Carlos Garcia Campos -Date: Sun Dec 15 11:48:51 2013 +0100 - - regtest: Return an exist status code depending on whether the - command succeeded - - regtest/TestRun.py | 2 ++ - regtest/commands/__init__.py | 4 ++-- - regtest/commands/create-refs.py | 2 ++ - regtest/commands/create-report.py | 2 ++ - regtest/commands/find-regression.py | 4 +++- - regtest/commands/run-tests.py | 6 ++++-- - regtest/main.py | 8 ++++---- - regtest/poppler-regtest | 2 +- - 8 files changed, 20 insertions(+), 10 deletions(-) - -commit 44cf2de0df351d5948893f6a4e2bca1168d16b70 -Author: Dominik Haumann -Date: Thu Dec 12 23:12:35 2013 +0100 - - Arthur font rendering improvements - - The patch does does the following: - - use NoPen to fill the glyphs - - since SplashPath seems to bitwise OR stop and start of path, - closing a subpath needs to happen before starting a path. - - Arthur needs serious work but this is a definite improvement in all - the files i've tried it on - - qt4/src/ArthurOutputDev.cc | 18 +++++++++--------- - qt5/src/ArthurOutputDev.cc | 18 +++++++++--------- - 2 files changed, 18 insertions(+), 18 deletions(-) - -commit 02863f683be4543a2af6c26d53be93785d2b836a -Author: Albert Astals Cid -Date: Thu Dec 12 23:09:43 2013 +0100 - - qt: Simple silly test program to save to file - - Allows us to do some quick arthur testing - - qt4/tests/CMakeLists.txt | 1 + - qt4/tests/Makefile.am | 8 ++++- - qt4/tests/test-render-to-file.cpp | 69 - +++++++++++++++++++++++++++++++++++++++ - qt5/tests/CMakeLists.txt | 1 + - qt5/tests/Makefile.am | 8 ++++- - qt5/tests/test-render-to-file.cpp | 69 - +++++++++++++++++++++++++++++++++++++++ - 6 files changed, 154 insertions(+), 2 deletions(-) - -commit 018892d4ceccd5e2994cdb74cd2d401293fc929d -Author: Albert Astals Cid -Date: Wed Dec 11 23:05:53 2013 +0100 - - 0.25.0 - - CMakeLists.txt | 6 +++--- - configure.ac | 4 ++-- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 9 insertions(+), 9 deletions(-) - -commit a1b99b26da9124fa55f773af55ae7382bd911d47 -Author: Albert Astals Cid -Date: Wed Dec 11 23:00:00 2013 +0100 - - NEWS - - NEWS | 23 +++++++++++++++++++++++ - 1 file changed, 23 insertions(+) - -commit 10a0c45676ef56bee5924e889a7e7c21244b4339 -Author: Albert Astals Cid -Date: Tue Dec 10 20:48:36 2013 +0100 - - Update copyrights - - cpp/poppler-image.cpp | 1 + - goo/PNGWriter.cc | 2 +- - poppler/MarkedContentOutputDev.cc | 2 ++ - poppler/MarkedContentOutputDev.h | 2 ++ - poppler/Object.h | 1 + - poppler/PDFDoc.h | 1 + - utils/ImageOutputDev.h | 2 +- - 7 files changed, 9 insertions(+), 2 deletions(-) - -commit 6c0e7d35f273583acc2aa818860e3120b0cab64f -Author: Thomas Freitag -Date: Tue Dec 10 20:14:39 2013 +0100 - - correction for knockout transparency groups - - Fixes test "G" in eci_altona-test-suite-v2_technical2_x4.pdf - - poppler/SplashOutputDev.cc | 18 ++++++++++--- - splash/Splash.cc | 63 - +++++++++++++++++++++++++++++++++------------ - splash/SplashFTFontEngine.h | 3 +++ - splash/SplashFontEngine.cc | 13 ++++++++++ - splash/SplashFontEngine.h | 5 ++++ - 5 files changed, 82 insertions(+), 20 deletions(-) - -commit f77bc21813ae7234ec4ce94ce4e92230fe5c174a -Merge: 06e9dc9 58e04a0 -Author: Albert Astals Cid -Date: Sat Dec 7 16:56:11 2013 +0000 - - Merge remote-tracking branch 'origin/poppler-0.24' - - Conflicts: - utils/pdfimages.cc - utils/pdfinfo.cc - utils/pdfseparate.cc - -commit 06e9dc917650f562cd6f6666190a8c25756514a3 -Author: Albert Astals Cid -Date: Sat Dec 7 16:39:02 2013 +0000 - - Compile++ - - CMakeLists.txt | 2 ++ - 1 file changed, 2 insertions(+) - -commit 58e04a08afee39370283c494ee2e4e392fd3b684 -Author: Fabio D'Urso -Date: Sat Dec 7 16:33:09 2013 +0000 - - segExtraBytes is a goffset not an int so use lld - - Fixes KDE bug #328511 - - poppler/JBIG2Stream.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 3335d5e52fd7527bba7368ad6e87f1188808582f -Author: Carlos Garcia Campos -Date: Fri Dec 6 17:28:13 2013 +0100 - - regtest: Limit the stderr files to ~1MB - - Some tests send a lot of information to stderr, usually due to parsing - errors in buggy documents. More than 1MB of stderr output is - diffcult to - hanlde and in most cases it's redundant with a lot of duplicated - messages. - This patch reduced the size of the refs dir for the complete test - suite - by 1GB. - - regtest/backends/__init__.py | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -commit 24107ac47625438837d7c29053bff795f986a6bb -Author: Carlos Garcia Campos -Date: Fri Dec 6 13:24:47 2013 +0100 - - regtest: Save checksum results sorted in md5 files - - We are using os.listdir() to get the list of test results that returns - files in arbitrary order. - - regtest/backends/__init__.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit f1c9993d58fb9d191a7b3e26bfcaf7b5eec5323d -Author: Carlos Garcia Campos -Date: Fri Dec 6 13:03:24 2013 +0100 - - regtest: Show also the tests expected to crash/fail to run but - don't fail - - regtest/TestRun.py | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -commit 64d1e79c863d12b12b87ed0e3139d364f503e026 -Author: Carlos Garcia Campos -Date: Fri Dec 6 12:51:48 2013 +0100 - - regtest: Improve readability of test results - - Show a summary of tests failed per backend with the percentages and - use a - new line for every test in the result instead of using a comma - separated - line. - - regtest/TestRun.py | 67 - ++++++++++++++++++++++++++++++++++++++---------------- - 1 file changed, 47 insertions(+), 20 deletions(-) - -commit c35bc1da9402896c88999f9cffed6962a265f32e -Author: Carlos Garcia Campos -Date: Fri Dec 6 10:04:48 2013 +0100 - - glib-demo: Increase the default size of the main window - - Some demos like annots that show a document view use more space than - they used to, requiring to manually resize the window everytime. - - glib/demo/main.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit ab7da0bf62bb5032c4683d9cd841075d26045aae -Author: Germán Poo-Caamaño -Date: Mon Oct 28 22:52:22 2013 -0700 - - glib-demo: Add Square and Circle annotations demo - - https://bugs.freedesktop.org/show_bug.cgi?id=70983 - - glib/demo/annots.c | 19 +++++++++++++++++++ - 1 file changed, 19 insertions(+) - -commit 2ec450567f27bba3ee4a08b5e69b7c9605bea4bb -Author: Germán Poo-Caamaño -Date: Mon Oct 28 22:48:39 2013 -0700 - - glib: Add implementation of Square and Circle annotations - - Square and Circle only differ in the constructor which defines - the subtype. Therefore, it uses the same name than Poppler's - Geometry class. - - https://bugs.freedesktop.org/show_bug.cgi?id=70983 - - glib/poppler-annot.cc | 263 - ++++++++++++++++++++++++++++++++---- - glib/poppler-annot.h | 23 ++++ - glib/poppler-page.cc | 6 + - glib/poppler-private.h | 2 + - glib/poppler.h | 2 + - glib/reference/poppler-sections.txt | 16 +++ - 6 files changed, 286 insertions(+), 26 deletions(-) - -commit e109cf2461d5be93d004593123d875a28fd79b61 -Author: Carlos Garcia Campos -Date: Tue Nov 26 20:12:22 2013 +0100 - - annots: Make Annot::setBorder receive an AnnotBorder object - - Instead of receiving AnnotBorderArray. Also implement writeToObject in - both AnnotBorderArray and AnnotBorderBS to make sure that - Annot::setBorder will work for both cases. - - poppler/Annot.cc | 51 +++++++++++++++++++++++++++++++++++++++++++++------ - poppler/Annot.h | 10 +++++++--- - 2 files changed, 52 insertions(+), 9 deletions(-) - -commit 3979b82982e84107d93fbbe95350bf25ce47398d -Author: Carlos Garcia Campos -Date: Tue Nov 26 14:44:57 2013 +0100 - - annots: Use a default border for annots that can have a BS entry - - According to the spec if neither the Border nor the BS entry is - present, - the border shall be drawn as a solid line with a width of 1 point. - However, acroread seems to ignore the Border entry for annots - that can't - have a BS entry. - - poppler/Annot.cc | 223 - ++++++++++++++++++++++++++++++++----------------------- - 1 file changed, 132 insertions(+), 91 deletions(-) - -commit 36c07c82bdff010695c5d615b67506922522d0e8 -Author: Carlos Garcia Campos -Date: Tue Nov 26 14:07:21 2013 +0100 - - annots: Add helper function Annot::setLineStyleForBorder - - It sets the line dash and width based on the given AnnotBorder. Use it - only when the border width is greater than 0 for FreeText annotations - and always for annotations that use the border to set the line - width and - dash, but don't draw a border. - - poppler/Annot.cc | 110 - ++++++++++++++++--------------------------------------- - poppler/Annot.h | 1 + - 2 files changed, 32 insertions(+), 79 deletions(-) - -commit e7b1ff97318fd6c3a8fed3a33d45f1cb55208b28 -Author: Carlos Garcia Campos -Date: Tue Nov 26 11:40:57 2013 +0100 - - annots: Remove unused typeUnknown AnnotBorderType from AnnotBorder - - Also make the AnnotBorder constructor protected to make sure it's not - possible to create AnnotBorder instances. - - poppler/Annot.cc | 3 --- - poppler/Annot.h | 12 ++++++++---- - 2 files changed, 8 insertions(+), 7 deletions(-) - -commit 17b2623360ed8917e94a8e5b880e92e6db70335e -Author: Adrian Perez de Castro -Date: Tue Jun 18 00:35:51 2013 +0300 - - Tagged-PDF: Text content extraction from structure elements - - Implement StructElement::getText(), by using MCOutputDev. This - output device - captures pieces of text (aka "spans") which have the same attributes - into - a list of TextSpan objects. - - https://bugs.freedesktop.org/show_bug.cgi?id=64815 - - poppler/Makefile.am | 2 + - poppler/MarkedContentOutputDev.cc | 210 - ++++++++++++++++++++++++++++++++++++++ - poppler/MarkedContentOutputDev.h | 128 +++++++++++++++++++++++ - poppler/StructElement.cc | 50 +++++++++ - poppler/StructElement.h | 28 +++++ - 5 files changed, 418 insertions(+) - -commit 2c4320c26744ea28be10eac7cc54980c9eb4fc27 -Author: Carlos Garcia Campos -Date: Tue Dec 3 19:07:09 2013 +0100 - - glib-demo: Show number of charcters and text layout units in text demo - - It helps to easily detect the cases where these values mismatch. - - glib/demo/text.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 98d75dcdb9b73feb6f35d8ad76f5d0c428289f91 -Author: Jason Crain -Date: Sat Nov 30 17:29:50 2013 +0100 - - Limit use of ZapfDingbats character names - - Some PDFs use names from ZapfDingbats (a1-a206) without intending for - them to be used for text extraction. Only use these character names - to locate glyphs or for text extraction with ZapfDingbats fonts. - - Bug #60243 - - goo/GooString.cc | 10 ++ - goo/GooString.h | 4 + - poppler/GfxFont.cc | 15 +- - poppler/GlobalParams.cc | 33 +++- - poppler/GlobalParams.h | 16 +- - poppler/NameToUnicodeTable.h | 415 - ++++++++++++++++++++++--------------------- - 6 files changed, 274 insertions(+), 219 deletions(-) - -commit 817cc333ca8009998f2099583fd0a2fc703f3db3 -Author: Carlos Garcia Campos -Date: Fri Nov 29 10:07:16 2013 +0100 - - regtest: Do not buffer stderr output - - Some buggy documents can produce a huge stderr output because - of parsing - errors or whatever. We could give a file directly to Popen to - write the - stderr file, but we only want to create the file when there's output, - because it's what we use to know whether the command produced - output or - not. So, instead of buffering the whole output and then write it - to the - file, now we read from the pipe while the command is running, writing - the output in chunks to the file. This improves a lot the memory - consumption when running some tests. - - regtest/backends/__init__.py | 40 - ++++++++++++++++++++++++++++++---------- - 1 file changed, 30 insertions(+), 10 deletions(-) - -commit f8f82f1cc3a948239a05d7762210a3f244299db6 -Author: Carlos Garcia Campos -Date: Fri Nov 29 10:03:24 2013 +0100 - - regtest: Read test results in chunks to get the md5 digest - - Some backends can generate huge results, like huge postscript - files that - we don't want to load in memory to get the md5. So, instead of - creating - thr md5 object with the entire file, we feed it with chunks of data - using the update method. This improves a lot the memory consumption - and - performance as well. - - regtest/backends/__init__.py | 19 ++++++++++++------- - 1 file changed, 12 insertions(+), 7 deletions(-) - -commit 3444a44397a890dbeb1bd10357dbc8246fd21ad0 -Author: Carlos Garcia Campos -Date: Fri Nov 29 10:01:20 2013 +0100 - - regtest: Remove unused method _check_exit_status2 - - It was used when the backends ran in parallel odd and even pages, but - it's no longer used since threads support was added. - - regtest/backends/__init__.py | 20 -------------------- - 1 file changed, 20 deletions(-) - -commit 5f825df417947c51943f1db327e1aa6c3faa15b0 -Author: Carlos Garcia Campos -Date: Fri Nov 29 09:57:57 2013 +0100 - - regtest: Do not store the current line in Printer but only its length - - We are not using the line text anymore, but only the length. - - regtest/Printer.py | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -commit 1486d93f0f6418b37ccc57568717d9349a79935b -Author: Carlos Garcia Campos -Date: Wed Nov 27 18:29:36 2013 +0100 - - regtest: Do not consider docs with no refs as skipped - - Handle them differently as new docs, and show them in the summary - suggesting to use create-refs command to include them in the test - suite. - - regtest/TestRun.py | 40 +++++++++++++++++++++++----------------- - 1 file changed, 23 insertions(+), 17 deletions(-) - -commit 5241c0cc730c380dc44c3a081e1de675e1915861 -Author: Carlos Garcia Campos -Date: Wed Nov 27 17:18:37 2013 +0100 - - regtest: Use number of tests run to show the progress - - Instead of using the number of document tested. We don't really - need to - set a number to a particular document, we only want to know the - progress - of the whole process. This ensures that the progress is shown in the - correct order. It also simplifies the code a bit. - Also improved the output formatting to make it easier to read. - - regtest/Printer.py | 44 ++++----------- - regtest/TestReferences.py | 50 +++++++++++------ - regtest/TestRun.py | 136 - +++++++++++++++++++++++++--------------------- - 3 files changed, 118 insertions(+), 112 deletions(-) - -commit 0af3e009a702d0c6ca716565ab87b386baa0a1ed -Author: Albert Astals Cid -Date: Wed Nov 27 00:53:16 2013 +0100 - - 0.24.4 - - CMakeLists.txt | 4 ++-- - NEWS | 18 ++++++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 7 files changed, 25 insertions(+), 7 deletions(-) - -commit a42a13be0a0cda71dc230a73f7b16eb4eb066251 -Author: suzuki toshiya -Date: Wed Nov 27 00:05:57 2013 +0100 - - Warn the user if he provides a wrong range - - utils/pdffonts.cc | 7 +++++++ - utils/pdfimages.cc | 7 +++++++ - utils/pdfinfo.cc | 7 +++++++ - utils/pdfseparate.cc | 7 +++++++ - utils/pdftocairo.cc | 7 +++++++ - utils/pdftohtml.cc | 8 +++++++- - utils/pdftoppm.cc | 7 +++++++ - utils/pdftops.cc | 7 +++++++ - utils/pdftotext.cc | 6 ++++++ - 9 files changed, 62 insertions(+), 1 deletion(-) - -commit 45552cafaeef6b883078db269437586add1dc32c -Author: Albert Astals Cid -Date: Tue Nov 26 23:36:12 2013 +0100 - - Update copyrights - - utils/pdftotext.cc | 1 + - 1 file changed, 1 insertion(+) - -commit f20fe89d4f5a8f768e2019f25cecf40cd0e4f5f8 -Author: Carlos Garcia Campos -Date: Mon Nov 25 09:05:41 2013 +0100 - - glib-demo: Add an area selector to text demo - - And use the for_area variants of the API to get the text, text layout - and text attributes. - - glib/demo/text.c | 114 - +++++++++++++++++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 110 insertions(+), 4 deletions(-) - -commit bb2b7fb491fb72f0ea024d80df89680ede3457b4 -Author: Carlos Garcia Campos -Date: Mon Nov 25 09:04:30 2013 +0100 - - glib: Add API to get text, text layout and text attributes for a - given area - - glib/poppler-page.cc | 107 - ++++++++++++++++++++++++++++++++++-- - glib/poppler-page.h | 8 +++ - glib/reference/poppler-sections.txt | 3 + - 3 files changed, 113 insertions(+), 5 deletions(-) - -commit f662973b0da52da84acc3668a0e037ee72498193 -Author: Carlos Garcia Campos -Date: Sat Nov 2 14:07:07 2013 +0100 - - TextOutputDev: Honor the selection rectangle passed to - TextPage::getSelectionWords() - - Make TextPage::getSelectionWords() return a list of TextWordSelection - instead of a list of TextWord so that it's possible to know which - characters of the word are inside the given selection rectangle. - Adapt the glib frontend to the new API and use the selection bounds - instead of the whole word to build the list of characters in - poppler_page_get_text_layout() and poppler_page_get_text_attributes(), - which ensures the number of glyphs returned is in sync with the number - of characters returned by poppler_page_get_text(). - - https://bugs.freedesktop.org/show_bug.cgi?id=71160 - - glib/poppler-page.cc | 22 ++++++++++++++-------- - poppler/TextOutputDev.cc | 40 ++++++++-------------------------------- - poppler/TextOutputDev.h | 20 ++++++++++++++++++++ - 3 files changed, 42 insertions(+), 40 deletions(-) - -commit 18fab454c59b1c77c691617aaef99245eacd83b5 -Author: Germán Poo-Caamaño -Date: Mon Oct 28 22:41:41 2013 -0700 - - glib-demo: Simplify annotations list and its properties - - * Move the annotation's rectangle to properties to make the - list view of annotations cleaner. - * Remove duplicated information: flags and page are already - present in the UI. - - https://bugs.freedesktop.org/show_bug.cgi?id=70982 - - glib/demo/annots.c | 70 - ++++++++++++------------------------------------------ - 1 file changed, 15 insertions(+), 55 deletions(-) - -commit 770a7ac9833a3c4f4f0399093272d4d0bdc7923b -Merge: e7a0f2b 9ae29c7 -Author: Albert Astals Cid -Date: Thu Nov 21 23:58:29 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 9ae29c7a07d0f372dbfc4aca17bbb646126aedb5 -Author: Thomas Freitag -Date: Thu Nov 21 23:53:53 2013 +0100 - - Don't end loop if reading from GooFile fails - - Bug #71835 - - poppler/Stream.cc | 3 +++ - 1 file changed, 3 insertions(+) - -commit e7a0f2b942fe621304275175324f7809d1c83d80 -Author: Hib Eris -Date: Wed Nov 20 00:43:27 2013 +0100 - - Fix warning on signed/unsigned comparison in GfxState.cc - - Bug #71641 - - poppler/GfxState.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit c784c4c3a582aaa4e10c223665cb876e12b7c16f -Author: Germán Poo-Caamaño -Date: Mon Nov 18 00:57:53 2013 -0800 - - glib-demo: Add support for simple line annotations - - https://bugs.freedesktop.org/show_bug.cgi?id=70981 - - glib/demo/annots.c | 99 - +++++++++++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 91 insertions(+), 8 deletions(-) - -commit 2d164e06b8a84ade6689d85bba2d606c66bf62a9 -Author: Germán Poo-Caamaño -Date: Mon Nov 18 00:48:13 2013 -0800 - - glib-demo: add color selection for new annotations - - https://bugs.freedesktop.org/show_bug.cgi?id=71727 - - glib/demo/annots.c | 34 ++++++++++++++++++++++++++++++++++ - 1 file changed, 34 insertions(+) - -commit 7127a2c705787f6f44b0852efeabe9fdeae7e2c0 -Author: Germán Poo-Caamaño -Date: Sun Nov 17 23:38:32 2013 -0800 - - glib: Add support for simple line annotations - - https://bugs.freedesktop.org/show_bug.cgi?id=70981 - - glib/poppler-annot.cc | 79 - +++++++++++++++++++++++++++++++++++++ - glib/poppler-annot.h | 12 ++++++ - glib/poppler-page.cc | 3 ++ - glib/poppler-private.h | 1 + - glib/poppler.h | 1 + - glib/reference/poppler-sections.txt | 7 ++++ - 6 files changed, 103 insertions(+) - -commit 451bac9f05bab18f3aa0392ddf6eb6b569004cb8 -Author: Germán Poo-Caamaño -Date: Sun Nov 17 23:30:14 2013 -0800 - - glib: Add PopplerPoint boxed type - - https://bugs.freedesktop.org/show_bug.cgi?id=70981 - - glib/poppler-page.cc | 54 - +++++++++++++++++++++++++++++++++++++ - glib/poppler-page.h | 20 ++++++++++++++ - glib/poppler.h | 1 + - glib/reference/poppler-sections.txt | 5 ++++ - 4 files changed, 80 insertions(+) - -commit c01cee165392ba8297e4168111a66d2acb272a99 -Merge: 07c2554 47605a8 -Author: Albert Astals Cid -Date: Mon Nov 18 22:58:28 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.24' - - Conflicts: - poppler/Catalog.cc - poppler/Catalog.h - -commit 47605a8aaf85bee21601219b04c0c8e6cf982507 -Author: José Aliste -Date: Mon Nov 18 22:52:08 2013 +0100 - - Catalog: sort entries of NameTrees to make sure lookup works - - Bug #26049 - - poppler/Catalog.cc | 12 ++++++++++++ - poppler/Catalog.h | 2 ++ - 2 files changed, 14 insertions(+) - -commit 07c255482f7ec8a8cfd4eaeaf7b07de317bbcc7a -Author: Germán Poo-Caamaño -Date: Sun Oct 27 13:30:22 2013 -0700 - - glib-demo: Add annotations interactively - - * Prepare UI to add multiple annotations type. - * Remove dialog and button add annotations. - - https://bugs.freedesktop.org/show_bug.cgi?id=69978 - - glib/demo/annots.c | 348 - ++++++++++++++++++++++++++++++++--------------------- - 1 file changed, 213 insertions(+), 135 deletions(-) - -commit 4b7c91ea697359751f9abe9ec5e63021c90a60ed -Author: Germán Poo-Caamaño -Date: Sat Sep 28 23:18:07 2013 -0700 - - glib: Add getter and setter for annotation's rectangle - - Annotation objects contain at least two keys, Rect and Subtype. - The former has the coordinates where the annotation is placed. - The getter and setter allows to obtain and modify the position - of a given annotation. - - https://bugs.freedesktop.org/show_bug.cgi?id=70901 - - glib/poppler-annot.cc | 48 - +++++++++++++++++++++++++++++++++++++ - glib/poppler-annot.h | 4 ++++ - glib/reference/poppler-sections.txt | 2 ++ - 3 files changed, 54 insertions(+) - -commit 491f0a170c72271a7a9ce049fbcfe81f08cff162 -Author: suzuki toshiya -Date: Fri Nov 15 20:35:12 2013 +0100 - - pdftotext: Escape the text of the xml headers - - utils/pdftotext.cc | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -commit 4da94680d4d2d6b1bd3351d476a20f9c7ae565bc -Merge: 3ea3d7c 78c407a -Author: Albert Astals Cid -Date: Fri Nov 15 20:27:00 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 3ea3d7c6c7a0ede76428204ec11aec3a844117fc -Author: Hib Eris -Date: Fri Nov 15 19:59:52 2013 +0100 - - pdftotext: Silence warning for may be used uninitialized variable - - Bug #71640 - - utils/pdftotext.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 97910b9eb92df49757915bde02e0d54de04552d4 -Author: Hib Eris -Date: Fri Nov 15 19:55:19 2013 +0100 - - Do not close stdout in pdftotext - - Bug #71639 - - utils/pdftotext.cc | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -commit 78c407ac7e8f48ae2d2c75ad0f5960390190d2e3 -Author: Albert Astals Cid -Date: Fri Nov 15 20:25:52 2013 +0100 - - destionation -> destination - - And this is why the xml based api has to die - - Bug #71643 - Found by Hib - - qt4/src/poppler-annotation.cc | 5 +++-- - qt5/src/poppler-annotation.cc | 3 ++- - 2 files changed, 5 insertions(+), 3 deletions(-) - -commit a23c9ad4c0536d680bedc563444ce3adf6e1ee9e -Author: Hib Eris -Date: Fri Nov 15 11:38:45 2013 +0100 - - Silence warning for may be used uninitialized variable in - ImageOutputDec.cc - - Fixes warning: - - CXX ImageOutputDev.lo - ImageOutputDev.cc: In member function 'void - ImageOutputDev::writeImageFile(ImgWriter*, - ImageOutputDev::ImageFormat, const char*, Stream*, int, int, - GfxImageColorMap*)': - ImageOutputDev.cc:409:28: warning: 'imgStr' may be used uninitialized - in this function [-Wmaybe-uninitialized] - - Bug #71642 - - utils/ImageOutputDev.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit c43a80e65fc570a8017892ba111a8c48ac33d9ad -Author: Hib Eris -Date: Fri Nov 15 19:59:52 2013 +0100 - - pdftotext: Silence warning for may be used uninitialized variable - - Bug #71640 - - utils/pdftotext.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit f905d804c0d1c715d8423938f41b5a002c0ef15d -Author: Hib Eris -Date: Fri Nov 15 19:55:19 2013 +0100 - - Do not close stdout in pdftotext - - Bug #71639 - - utils/pdftotext.cc | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -commit 33e703ac9bb6cf69664d6c6fddd3bebd56336074 -Merge: 8294d18 7c74bcc -Author: Albert Astals Cid -Date: Fri Nov 15 19:50:10 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 7c74bccdf514cce05987dde7fb1cce4ac65ff025 -Author: Albert Astals Cid -Date: Fri Nov 15 19:48:07 2013 +0100 - - Forgot to update the copyrights - - poppler/Lexer.cc | 2 +- - poppler/Lexer.h | 2 +- - poppler/Parser.cc | 2 +- - poppler/Parser.h | 2 +- - 4 files changed, 4 insertions(+), 4 deletions(-) - -commit ebe49d597a62aa94601c2e4595dbad1895ea7ef0 -Author: Albert Astals Cid -Date: Fri Nov 15 19:33:00 2013 +0100 - - Fix regression in broken endstream detection - - Rregression was caused by e1ffa9100cf6b4a444be7ed76b11698a5c5bb441 - Fixes bug #70854 - - poppler/Lexer.cc | 4 ++-- - poppler/Lexer.h | 2 +- - poppler/Parser.cc | 11 ++++------- - poppler/Parser.h | 2 +- - 4 files changed, 8 insertions(+), 11 deletions(-) - -commit 8294d18ea96bd18be076bccbdbdaa015fc48aa12 -Author: Adrian Perez de Castro -Date: Thu Sep 26 20:46:34 2013 +0300 - - Tagged-PDF: Parsing of StructElem standard types and attributes - - Parse attributes and standard types of StructElem nodes of the - document structure tree. Type name aliases are resolved via the - RoleMap (and cycles detected). Both standard attributes and user - properties are mapped to instances of the Attribute class. - Attributes are parsed both via ClassMap references and directly - referenced from the StructElem objects. - - https://bugs.freedesktop.org/show_bug.cgi?id=64815 - - poppler/StructElement.cc | 1018 - +++++++++++++++++++++++++++++++++++++++++++++- - poppler/StructElement.h | 113 ++++- - 2 files changed, 1126 insertions(+), 5 deletions(-) - -commit 4e0cbd37b964107c0fb531d48876a33ae843bf27 -Author: suzuki toshiya -Date: Mon Nov 11 22:46:07 2013 +0100 - - pdftohtml: Add -? and --help - - utils/pdftohtml.cc | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -commit 4dbd36f5b35dd0964e59d942242aecdc6b474c89 -Author: Andres Gomez -Date: Tue Nov 5 09:52:23 2013 +0200 - - glib-demo: Fix conding style issue in main.c - - https://bugs.freedesktop.org/show_bug.cgi?id=71245 - - glib/demo/main.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 02f3c235eaf60350c98e88dbe266378fccef59d7 -Author: Andres Gomez -Date: Tue Nov 5 09:52:23 2013 +0200 - - glib-demo: Fix a typo in function name - - https://bugs.freedesktop.org/show_bug.cgi?id=71245 - - glib/demo/main.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -commit 5620b82e69335b7f12d877a24f1a463604f0e515 -Author: Andres Gomez -Date: Tue Nov 5 09:52:23 2013 +0200 - - glib-demo: Fix trailing whitespaces in main.c - - https://bugs.freedesktop.org/show_bug.cgi?id=71245 - - glib/demo/main.c | 14 +++++++------- - 1 file changed, 7 insertions(+), 7 deletions(-) - -commit 43309d92d327b4ae8e89edb15482247045d726a4 -Author: Germán Poo-Caamaño -Date: Sat Sep 28 20:45:32 2013 -0700 - - glib-demo: Make the Remove annotation button prominent in demo - - Move out from Annotation properties to the top. This make better - use of the space. - Make the remove button active only if there is an annotation - selected. - - https://bugs.freedesktop.org/show_bug.cgi?id=69978 - - glib/demo/annots.c | 22 +++++++++++++--------- - 1 file changed, 13 insertions(+), 9 deletions(-) - -commit f4a72fd3c61091d6b455af9a881c2390da19b506 -Author: Albert Astals Cid -Date: Sat Oct 26 19:06:34 2013 +0200 - - 0.24.3 - - CMakeLists.txt | 2 +- - NEWS | 14 ++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 19 insertions(+), 5 deletions(-) - -commit 33a5af32cd5769cf1b6c6344077ac4a3f407ba21 -Author: Albert Astals Cid -Date: Sat Oct 26 18:48:50 2013 +0200 - - Update copyrights - - qt4/src/poppler-document.cc | 2 +- - utils/pdfseparate.cc | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 9f09b9596f1fc52481914019d68c8f9b85b5c438 -Merge: bd893d4 61f79b8 -Author: Albert Astals Cid -Date: Thu Oct 24 01:03:02 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 61f79b8447c3ac8ab5a26e79e0c28053ffdccf75 -Author: Albert Astals Cid -Date: Thu Oct 24 00:54:56 2013 +0200 - - Allow only one %d in the filename - - Fixes crashes if you had %s and similar in the filename - - Inspired from patch by Pedro Ribeiro - - Bug #69434 - - utils/pdfseparate.cc | 31 ++++++++++++++++++++++++++++++- - 1 file changed, 30 insertions(+), 1 deletion(-) - -commit bd893d4a543a6cc3a525655f37def38440944f28 -Merge: 93e8b05 daa0990 -Author: Albert Astals Cid -Date: Thu Oct 10 02:19:34 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit daa0990a7baf17d00d12574a4de815e070727a86 -Author: Albert Astals Cid -Date: Thu Oct 10 02:16:25 2013 +0200 - - Return empty if getXRef()->copy() fails - - Seems this can happen by looking at the backtrace in - https://bugs.kde.org/show_bug.cgi?id=325810 - - qt4/src/poppler-document.cc | 6 ++++++ - qt5/src/poppler-document.cc | 6 ++++++ - 2 files changed, 12 insertions(+) - -commit f4bfa940aa40a82a1080cdaf765da1d1615ccfb1 -Author: Carlos Garcia Campos -Date: Sat Oct 5 11:20:04 2013 +0200 - - cairo: Do not set an invalid matrix in drawImage() - - https://bugs.freedesktop.org/show_bug.cgi?id=70085 - - poppler/CairoOutputDev.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 93e8b05fb2a6d225f048db6a3a735717433a5a13 -Author: Carlos Garcia Campos -Date: Sat Oct 5 11:20:04 2013 +0200 - - cairo: Do not set an invalid matrix in drawImage() - - https://bugs.freedesktop.org/show_bug.cgi?id=70085 - - poppler/CairoOutputDev.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 3084f8f4a5ad55937094b14e30169dccf1fa4ec9 -Author: Germán Poo-Caamaño -Date: Sat Sep 21 11:59:32 2013 -0700 - - glib-demo: Expand short names for annotations used in demo - - https://bugs.freedesktop.org/show_bug.cgi?id=69978 - - glib/demo/annots.c | 10 +++++----- - glib/demo/main.c | 2 +- - 2 files changed, 6 insertions(+), 6 deletions(-) - -commit ff674f57a3587142165fd56aec089d9840ceda36 -Author: Germán Poo-Caamaño -Date: Fri Sep 27 22:33:42 2013 -0700 - - glib-demo: Merge columns Type and Color in annotations demo - - Reduce the space used by both columns, makes the color - pixbuf smaller enough to give a clue of the annotation - color. - - https://bugs.freedesktop.org/show_bug.cgi?id=69978 - - glib/demo/annots.c | 28 ++++++++++++++++------------ - 1 file changed, 16 insertions(+), 12 deletions(-) - -commit 76d6e2d385e2cbad7f44bc8aee05147efd3970a4 -Author: Germán Poo-Caamaño -Date: Fri Sep 20 23:27:20 2013 -0700 - - glib-demo: Rearrange layout for annotations in demo - - Add render area to visualize the annotations per page. - - https://bugs.freedesktop.org/show_bug.cgi?id=69978 - - glib/demo/annots.c | 130 - ++++++++++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 118 insertions(+), 12 deletions(-) - -commit a6b1fc1a2ca83b3e4c52bcaa95b99d0289354f4b -Author: Germán Poo-Caamaño -Date: Sun Sep 29 22:50:42 2013 -0700 - - glib-demo: Fix rectangle calculation for new annotations in demo - - https://bugs.freedesktop.org/show_bug.cgi?id=69978 - - glib/demo/annots.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit bd49b3c0c6f2adccc5bda561edbaf9f00ed2917a -Author: Thomas Freitag -Date: Wed Oct 2 23:32:09 2013 +0200 - - Use icc profile in OutputIntents - - Bug #34053 - - poppler/Gfx.cc | 114 +++++++++++--- - poppler/Gfx.h | 8 +- - poppler/GfxState.cc | 429 - +++++++++++++++++++++++++++++++++++++++++----------- - poppler/GfxState.h | 72 ++++++--- - poppler/Page.cc | 2 +- - 5 files changed, 490 insertions(+), 135 deletions(-) - -commit df947a0641082f530200880d46e20cd3e1fd962f -Author: Albert Astals Cid -Date: Wed Oct 2 20:53:32 2013 +0200 - - Compile++ - - CMakeLists.txt | 4 ++++ - 1 file changed, 4 insertions(+) - -commit fa83d7e4f36cfc11c7b4f81f5f5e8ed69eb6dbbe -Author: Daniel Kahn Gillmor -Date: Wed Oct 2 20:35:58 2013 +0200 - - pdfseparate: allow zero-padded pagespecs - - Bug #50914 - - utils/pdfseparate.cc | 22 +++++++++++++++++++--- - 1 file changed, 19 insertions(+), 3 deletions(-) - -commit e04cabd878a0fd84faa5178f423fd828d010b664 -Author: Adrian Perez de Castro -Date: Mon Jun 17 17:00:27 2013 +0300 - - Tagged-PDF: Implement parsing of StructTreeRoot - - Implement parsing of the StructTreeRoot entry of the Catalog. Also, - the - Catalog::getStructTreeRoot() and PDFDoc::getStructTreeRoot() - methods are - modified to return an instance of StructTreeRoot instead of an Object. - - All elements from the StructTreeRoot are parsed except for: - - - IDTree: it is a lookup tree to locate items by their ID, which would - be barely useful because the whole structure tree is to be kept in - memory, which should be fast enough to traverse. - - ParentTreeNextKey: This is needed only when the ParentTree object is - to be modified. For the moment the implementation deals only with - reading, so this has been deliberately left out. - - StructElem tree nodes from the document structure tree are parsed as a - StructElement instance. Attributes and extraction of content out from - elements are not yet handled. - - https://bugs.freedesktop.org/show_bug.cgi?id=64815 - - poppler/Catalog.cc | 36 +++--- - poppler/Catalog.h | 5 +- - poppler/Makefile.am | 4 + - poppler/PDFDoc.h | 3 +- - poppler/StructElement.cc | 322 - ++++++++++++++++++++++++++++++++++++++++++++++ - poppler/StructElement.h | 167 ++++++++++++++++++++++++ - poppler/StructTreeRoot.cc | 174 +++++++++++++++++++++++++ - poppler/StructTreeRoot.h | 83 ++++++++++++ - 8 files changed, 776 insertions(+), 18 deletions(-) - -commit 45e0fe56985f34e695c99a2f6ec1ffe14e239b9e -Author: Adrian Perez de Castro -Date: Thu Sep 26 20:56:52 2013 +0300 - - Implement Object::takeString() method - - Object::takeString() behaves like Object::getString(), but transfers - ownership of the returned string to the caller. Also, it makes - sure that - calling Object::free() afterwards won't free the string that the - Object - is holding. - - poppler/Object.h | 4 ++++ - 1 file changed, 4 insertions(+) - -commit d80eb4a34c218de34633ee2f1b9dfd65504a0ad9 -Author: Thomas Freitag -Date: Tue Oct 1 22:57:55 2013 +0200 - - cache cms values in getGray(), getRGB() and getCMYK() - - Bug #68420 - - poppler/GfxState.cc | 111 - ++++++++++++++++++++++++++++++++++++++++++++++++++++ - poppler/GfxState.h | 2 + - 2 files changed, 113 insertions(+) - -commit 9bc8f3240698d5a8ae4c0129e768840664d28c22 -Merge: a2742c8 e2fe851 -Author: Albert Astals Cid -Date: Tue Oct 1 19:19:32 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit e2fe85137ecb59eb0d177682c552febc64cda643 -Author: Adrian Johnson -Date: Tue Oct 1 19:15:08 2013 +0200 - - Fix PFB font embedding - - Bug #69717 - - poppler/PSOutputDev.cc | 52 - ++++++++++++++++++++++++++++++++++++++++++++------ - 1 file changed, 46 insertions(+), 6 deletions(-) - -commit a2742c8fce0594ccbdb036dd0c29c6e15d2229f3 -Merge: 6b30a52 06dabe1 -Author: Albert Astals Cid -Date: Mon Sep 30 19:32:41 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 06dabe1eed912e5f5c96fe9f371ab459516e5a99 -Author: Albert Astals Cid -Date: Fri Sep 27 12:41:23 2013 +0200 - - 0.24.2 - - CMakeLists.txt | 2 +- - NEWS | 8 ++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 13 insertions(+), 5 deletions(-) - -commit 78141da189c42a04b6a303767284de755a4a2d4d -Author: Albert Astals Cid -Date: Fri Sep 27 12:39:00 2013 +0200 - - Update copyrights - - utils/pdfseparate.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 6b30a5214e39993025cf2fb9f221e1360de7fa9c -Merge: 4966b6f dc344b4 -Author: Albert Astals Cid -Date: Sat Sep 21 10:38:45 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit dc344b410f49410174ee902b7649ebd8c2cb0fa2 -Author: Lu Wang -Date: Sat Sep 21 10:37:30 2013 +0200 - - pdftocairo: check file opening failure in beginDocument() - - utils/pdftocairo.cc | 7 +++++++ - 1 file changed, 7 insertions(+) - -commit 4966b6f4193cc9d13f63e92bdc2aac0c8b78298d -Merge: 0f074b1 1e612d3 -Author: Albert Astals Cid -Date: Sat Sep 21 10:15:28 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 1e612d331b79dabec66ad241d7ffe66674a10bc4 -Author: Thomas Freitag -Date: Sat Sep 21 10:10:16 2013 +0200 - - Windows: Fix CreateFile fails with ERROR_SHARING_VIOLATION - - Bug #69597 - - goo/gfile.cc | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -commit 0f074b16317d874fe58d7042f8434282786ca757 -Merge: d277432 b8682d8 -Author: Pino Toscano -Date: Mon Sep 16 19:53:10 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - - Conflicts: - utils/pdfimages.1 - -commit b8682d868ddf7f741e93b791588af0932893f95c -Author: Pino Toscano -Date: Mon Sep 16 19:46:55 2013 +0200 - - pdfseparate: improve the path building - - Make use of snprintf to limit the output to the pathName buffer; - while I'm there, expand its size to 4096 (might help longer paths), - although a better fix would be dynamically allocate its length - (and/or using GooString, maybe). - - utils/pdfseparate.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit d2774325f5248018977d3ab8f8dd7155ed972668 -Author: Adrian Johnson -Date: Sat Sep 14 14:08:11 2013 +0930 - - pdfimages.1: fix typo - - utils/pdfimages.1 | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 9b5957278c7f249fa1010e61a0ed79f0eb20e26d -Author: Adrian Johnson -Date: Sat Aug 31 17:33:25 2013 +0930 - - pdfimages: ensure dump* variables are intialized - - utils/ImageOutputDev.cc | 3 +++ - 1 file changed, 3 insertions(+) - -commit e116ef32504b589001814f0f579309ecf7ec89d9 -Author: Adrian Johnson -Date: Wed Aug 28 08:05:23 2013 +0930 - - Make cpp/poppler-image.cc use goo/NetPBMWriter - - cpp/CMakeLists.txt | 1 - - cpp/Makefile.am | 2 - - cpp/PNMWriter.cc | 119 - -------------------------------------------------- - cpp/PNMWriter.h | 43 ------------------ - cpp/poppler-image.cpp | 14 +++--- - 5 files changed, 6 insertions(+), 173 deletions(-) - -commit a87a11ee6bbd0f5707a3ac34ac2b9cc79f4e92d0 -Author: Adrian Johnson -Date: Thu Aug 29 22:42:34 2013 +0930 - - pdfimages: support cmyk tiff output - - If -tiff is specified, CMYK images will be written as CMYK TIFF files - instead of converting to RGB. If both -png and -tiff are specified (as - is the case with the -all option), CMYK images are written as TIFF and - all other types as PNG. - - utils/ImageOutputDev.cc | 32 +++++++++++++++++++++++++++++++- - utils/ImageOutputDev.h | 3 ++- - utils/pdfimages.1 | 13 ++++++++----- - utils/pdfimages.cc | 3 ++- - 4 files changed, 43 insertions(+), 8 deletions(-) - -commit 63da26f8fb0b2b5ffaa127762d4e36d995c482ee -Author: Thomas Freitag -Date: Tue Aug 27 20:40:29 2013 +0200 - - resolve copy&paste error - - poppler/GfxState.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 563da2d375c003478d398897796ecbf45ce03482 -Author: Albert Astals Cid -Date: Mon Aug 26 22:33:10 2013 +0200 - - 0.24.1 - - CMakeLists.txt | 2 +- - NEWS | 23 +++++++++++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 6 files changed, 28 insertions(+), 5 deletions(-) - -commit 2c73f1ea9116172692d8350cb7adf1b5376f795c -Author: Albert Astals Cid -Date: Mon Aug 26 21:50:51 2013 +0200 - - Fix typo - - qt5/src/poppler-qt5.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit f58e9b64d5cf62906876c5c0f8da0f3c2c6c2bac -Author: Albert Astals Cid -Date: Mon Aug 26 00:27:59 2013 +0200 - - Some more files Adrian has changed - - goo/PNGWriter.h | 2 +- - utils/HtmlOutputDev.cc | 2 +- - utils/pdftocairo.cc | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -commit 16da389c61c495111a5a49f62539a423a0655c28 -Author: Adrian Johnson -Date: Mon Aug 26 07:50:51 2013 +0930 - - fix typo in pdfimages.1 - - utils/pdfimages.1 | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 56c0d4f3a231dca141c06493b50ab25959b5b15c -Author: Adrian Johnson -Date: Mon Aug 26 07:47:46 2013 +0930 - - fix typo in pdfimages.1 - - utils/pdfimages.1 | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit af4f2b775946815b572622bf4c4d42ad3aea1141 -Author: Adrian Johnson -Date: Sat Aug 24 21:25:51 2013 +0930 - - pdfimages: Add -all option to write all image in their native format - - utils/pdfimages.1 | 4 ++++ - utils/pdfimages.cc | 23 +++++++++++++++++------ - 2 files changed, 21 insertions(+), 6 deletions(-) - -commit 25e96b6ddbbe54a75ddb97d2e235c1bd6033fe79 -Author: Adrian Johnson -Date: Wed Aug 21 22:22:28 2013 +0930 - - pdfimages: support ccitt output - - poppler/Stream.h | 5 +++++ - utils/ImageOutputDev.cc | 35 +++++++++++++++++++++++++++++++++++ - utils/ImageOutputDev.h | 4 ++++ - utils/pdfimages.1 | 39 ++++++++++++++++++++++++++++++++++++++- - utils/pdfimages.cc | 4 ++++ - 5 files changed, 86 insertions(+), 1 deletion(-) - -commit 086413263cb63a24d9492fbe534fdcc34b45951a -Author: Adrian Johnson -Date: Sun Aug 18 20:37:01 2013 +0930 - - pdfimages: support JBIG2 output - - poppler/JBIG2Stream.h | 1 + - utils/ImageOutputDev.cc | 25 +++++++++++++++++++++++++ - utils/ImageOutputDev.h | 4 ++++ - utils/pdfimages.1 | 13 ++++++++----- - utils/pdfimages.cc | 4 ++++ - 5 files changed, 42 insertions(+), 5 deletions(-) - -commit 2845ebabd00a2755549b8db436e78a3e0e0c0713 -Author: Adrian Johnson -Date: Sun Aug 18 20:07:31 2013 +0930 - - pdfimages: add support for writing JPEG2000 files - - utils/ImageOutputDev.cc | 4 ++++ - utils/ImageOutputDev.h | 4 ++++ - utils/pdfimages.1 | 12 ++++++++---- - utils/pdfimages.cc | 4 ++++ - 4 files changed, 20 insertions(+), 4 deletions(-) - -commit 2021c8ffcb36432049c4305e85ced2ae139086f3 -Author: Adrian Johnson -Date: Sun Aug 18 17:29:00 2013 +0930 - - pdfimages: add support for png and tiff output - - utils/ImageOutputDev.cc | 67 - ++++++++++++++++++++++++++++++++++++++++++++++--- - utils/ImageOutputDev.h | 17 +++++++++++-- - utils/pdfimages.1 | 22 ++++++++++------ - utils/pdfimages.cc | 19 +++++++++++--- - 4 files changed, 110 insertions(+), 15 deletions(-) - -commit 8f466775c77b09a7114c688004317e6db05bcd3f -Author: Adrian Johnson -Date: Sun Aug 18 16:08:02 2013 +0930 - - Change PNGWriter monochrome format to be 8 pixels/byte - - to be consistent with TiffWriter and NetPBMWriter - - goo/PNGWriter.cc | 4 ---- - goo/PNGWriter.h | 2 +- - utils/HtmlOutputDev.cc | 31 +++++++++++++++++++------------ - utils/ImageOutputDev.cc | 9 ++++++--- - utils/pdftocairo.cc | 2 +- - 5 files changed, 27 insertions(+), 21 deletions(-) - -commit e53aec2c61ba42cf0635dc05f8e27e3503c1eaac -Author: Adrian Johnson -Date: Sun Aug 18 15:50:39 2013 +0930 - - Refactor ImageOutputDev to facilitate adding more output formats - - - Move PPM/PBM code into a NetPBMWriter class so PNGWriter and - TiffWritersupport be added. - - - Create generic WriteRawIMage function for writing jpeg files so - support for jpeg2000/jbig2 can be added. - - CMakeLists.txt | 1 + - goo/Makefile.am | 2 + - goo/NetPBMWriter.cc | 84 ++++++++++++++++ - goo/NetPBMWriter.h | 52 ++++++++++ - utils/ImageOutputDev.cc | 261 - +++++++++++++++++++++--------------------------- - utils/ImageOutputDev.h | 15 +-- - 6 files changed, 262 insertions(+), 153 deletions(-) - -commit 0ca0fcc9f536a57365048914cd8a8cc3eb5ed4fd -Author: Adrian Johnson -Date: Sat Aug 17 15:24:43 2013 +0930 - - pdfimages: fix bug in -list output - - Images of type /ImageMask should have type 'stencil'. - - utils/ImageOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit f8ee5a931c795013d17f73f083b6e6f9a683d061 -Author: Adrian Johnson -Date: Sat Aug 17 15:17:11 2013 +0930 - - pdfimages: print size, ratio, and ppi - - utils/ImageOutputDev.cc | 100 - ++++++++++++++++++++++++++++++++++++++++++++---- - utils/pdfimages.1 | 12 ++++++ - utils/pdfimages.cc | 2 +- - 3 files changed, 106 insertions(+), 8 deletions(-) - -commit b5321c4f40fb56b10f75c14c5c955c5775cf2ef9 -Author: Thomas Freitag -Date: Sun Aug 25 20:13:12 2013 +0200 - - use getCMYK/DeviceNLine in CMYK mode if available - - Second part of bug 66928 - - poppler/GfxState.cc | 310 - ++++++++++++++++++++++++++++++++++++++++++++- - poppler/GfxState.h | 32 ++++- - poppler/SplashOutputDev.cc | 28 ++-- - splash/SplashTypes.h | 2 - - 4 files changed, 355 insertions(+), 17 deletions(-) - -commit d006ac567e59e82c4c6cb42c5e429a4aa516ac0b -Merge: d391af7 ed3585e -Author: Albert Astals Cid -Date: Sun Aug 25 19:36:33 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit ed3585efc8b259cb065eac361a6a499f9f26851f -Author: William Bader -Date: Sun Aug 25 19:31:11 2013 +0200 - - Fix pdftops -eps -level1sep rendering of a file - - Since 8fb243bf11a979af8bfa36427436940706c9f71d we have - case splashModeXBGR8: - + cSrcNonIso[3] = 255; - and that means splashModeDeviceN8 and splashModeCMYK8 can't - skip their breaks anymore otherwise the cSrcNonIso[3] gets - overwritten - - Bug #68321 - - splash/Splash.cc | 11 +++++++---- - 1 file changed, 7 insertions(+), 4 deletions(-) - -commit d391af7ea63c4bc884bb81895aea0cdd8f8b282a -Author: Albert Astals Cid -Date: Sat Aug 24 14:03:49 2013 +0200 - - Update copyrights - - poppler/Annot.cc | 1 + - poppler/Annot.h | 1 + - poppler/Catalog.cc | 2 ++ - poppler/Catalog.h | 2 ++ - poppler/Form.cc | 2 +- - poppler/Form.h | 1 + - poppler/Page.cc | 1 + - poppler/Page.h | 1 + - utils/pdfinfo.cc | 1 + - 9 files changed, 11 insertions(+), 1 deletion(-) - -commit a47b7f853174d6101f2b882a2db1a7dc95b33293 -Author: Adrian Johnson -Date: Sat Aug 3 10:28:20 2013 +0930 - - Add pdfinfo option to print out javascript - - poppler/Catalog.h | 1 + - utils/JSInfo.cc | 164 - +++++++++++++++++++++++++++++++++++++++++------------- - utils/JSInfo.h | 12 +++- - utils/pdfinfo.1 | 3 + - utils/pdfinfo.cc | 10 ++++ - 5 files changed, 151 insertions(+), 39 deletions(-) - -commit 8f7155e7e3180bb1966a5e7df6af6acdd479939b -Author: Adrian Johnson -Date: Sat Aug 3 09:05:21 2013 +0930 - - pdfinfo: indicate if pdf contains javascript - - poppler/Annot.cc | 27 ++++++++++ - poppler/Annot.h | 8 +++ - poppler/Catalog.cc | 26 +++++++++ - poppler/Catalog.h | 12 +++++ - poppler/Form.cc | 4 ++ - poppler/Form.h | 2 + - poppler/Page.cc | 20 +++++++ - poppler/Page.h | 10 +++- - utils/CMakeLists.txt | 4 ++ - utils/JSInfo.cc | 145 - +++++++++++++++++++++++++++++++++++++++++++++++++++ - utils/JSInfo.h | 50 ++++++++++++++++++ - utils/Makefile.am | 4 ++ - utils/pdfinfo.1 | 3 ++ - utils/pdfinfo.cc | 8 +++ - 14 files changed, 322 insertions(+), 1 deletion(-) - -commit c2453fc1307ebb222747f976e1311ecc5e99abfa -Merge: 3bb8c2e 70298a0 -Author: Albert Astals Cid -Date: Tue Aug 20 19:53:17 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 70298a021657a72ae80389687a86247144e6d6b6 -Author: Thomas Freitag -Date: Tue Aug 20 19:46:01 2013 +0200 - - Don't copy not needed bitmap - - Speeds up rendering of fixes from bug 67105 - As example one file is down from 130s to 6.5s - - poppler/SplashOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 3bb8c2e34039cf473bf72ed9dab55664deab3ab7 -Merge: 71c1d16 fc78330 -Author: Albert Astals Cid -Date: Tue Aug 20 00:41:13 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit fc78330072b9771fa39d21896703adb4836e5398 -Author: Albert Astals Cid -Date: Tue Aug 20 00:37:56 2013 +0200 - - use getRGBLine images if available - - Speeds up greatly files from bug #66928 - - E.g. some file went from 21s to 2s in my computer - - poppler/SplashOutputDev.cc | 30 +++++++++++++++++++----------- - 1 file changed, 19 insertions(+), 11 deletions(-) - -commit 71c1d162477a243db07b62ef3c056a2946f8986e -Merge: 7d1de78 678c767 -Author: Albert Astals Cid -Date: Sun Aug 18 16:41:20 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 7d1de78ad79162217ee0ca6c2e99ce51017a327d -Merge: 7e0d969 fbea224 -Author: Albert Astals Cid -Date: Sun Aug 18 16:40:34 2013 +0200 - - Merge commit 'origin/poppler-0.24~1' - - This is merging the revert commits with the "ours" strategy, so - it's virtually - doing nothing other than making the stable branch mergeable again - to master - -commit 678c767584fa80620cc58a1d8a913cb3473209d4 -Author: Albert Astals Cid -Date: Sun Aug 18 16:19:27 2013 +0200 - - Fix crash in 1026.asan.0.42.pdf - - We were not checking that bitmapOff was in bounds - - splash/Splash.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit fbea2241cccdde0106d2c34592b6ddda28a8d848 -Author: Albert Astals Cid -Date: Sat Aug 17 01:32:51 2013 +0200 - - Revert "Tagged-PDF: Accessors in Catalog for the MarkInfo dictionary" - - This reverts commit 402ee8b4e31630a42a0a38db1d39164cc5789f3c. - - No clue how this ended up in the stable branch - - poppler/Catalog.cc | 45 --------------------------------------------- - poppler/Catalog.h | 10 ---------- - 2 files changed, 55 deletions(-) - -commit 6d2771b8a8c0cb0f2288d0900fea3c9edc3dd172 -Author: Albert Astals Cid -Date: Sat Aug 17 01:32:38 2013 +0200 - - Revert "pdfinfo: Use Catalog::getMarkInfo() to show mark info - properties" - - This reverts commit 73cca518c479594e26605196d54b429fbf42dcdc. - - No clue how this ended up in the stable branch - - utils/pdfinfo.cc | 8 ++------ - 1 file changed, 2 insertions(+), 6 deletions(-) - -commit 7e0d969dc2439637ab16e609df8223504316f87d -Merge: 6efc0c7 ef64206 -Author: Albert Astals Cid -Date: Sat Aug 17 01:13:30 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit ef6420656c7b88eb22a63ec2cb3e504e0bda0384 -Author: Albert Astals Cid -Date: Sat Aug 17 01:11:37 2013 +0200 - - Fix jpeg image export - - Use same logic than the one used in ImageOutputDev - Bug #48270 - - utils/HtmlOutputDev.cc | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -commit 681f52a572b08c068cb376e5b2dc8a31676aad07 -Author: Albert Astals Cid -Date: Fri Aug 16 23:58:44 2013 +0200 - - Fix exit(1) in 1026.asan.0.42.pdf - - The main crash in discussion with Thomas - - splash/Splash.cc | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -commit 9f4d7796589e4c9c1645fbbcf0cfabd79a71bde9 -Author: Thomas Freitag -Date: Thu Aug 8 20:33:54 2013 +0200 - - use copyString where memory is freed with gfree - - Bug #67666 - - poppler/Annot.cc | 2 +- - poppler/Dict.cc | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 73cca518c479594e26605196d54b429fbf42dcdc -Author: Adrian Perez de Castro -Date: Thu Apr 25 09:52:56 2013 +0300 - - pdfinfo: Use Catalog::getMarkInfo() to show mark info properties - - utils/pdfinfo.cc | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -commit 402ee8b4e31630a42a0a38db1d39164cc5789f3c -Author: Adrian Perez de Castro -Date: Thu Apr 25 09:52:56 2013 +0300 - - Tagged-PDF: Accessors in Catalog for the MarkInfo dictionary - - poppler/Catalog.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ - poppler/Catalog.h | 10 ++++++++++ - 2 files changed, 55 insertions(+) - -commit 6efc0c7ad97a82064a1e2c47e0b063b606e56bb7 -Author: Albert Astals Cid -Date: Fri Aug 16 23:31:54 2013 +0200 - - Remove unused xref member - - poppler/OptionalContent.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit cb5160aa74f64b78a20aaed4b89fead850b42e9b -Author: Albert Astals Cid -Date: Fri Aug 16 23:31:17 2013 +0200 - - Remove usnused objectNumberFirst member - - poppler/Hints.h | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -commit a642aad68733c25f4055c268d691eedcf4e14a22 -Author: Albert Astals Cid -Date: Fri Aug 16 23:30:50 2013 +0200 - - PNGWriterPrivate is actually a struct not a class - - goo/PNGWriter.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 31947d413eae115acc147c33fc55b8ab4adccd91 -Author: Thomas Freitag -Date: Tue Aug 13 19:39:30 2013 +0200 - - pdftoppm: Add thinlinemode option setting - - utils/pdftoppm.1 | 12 ++++++++++++ - utils/pdftoppm.cc | 17 +++++++++++++++-- - 2 files changed, 27 insertions(+), 2 deletions(-) - -commit 8a1740b0b6ee4b217ecbe9d0046e4afa491e9f17 -Merge: b27588c c3f953d -Author: Albert Astals Cid -Date: Mon Aug 12 22:47:44 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit c3f953dc87f83ac726f99cb8f1f959c486098391 -Author: Yury G. Kudryashov -Date: Sat Aug 10 21:43:57 2013 +0300 - - Fix a typo - - qt4/src/poppler-qt4.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit b27588c4c946ef4f9a62248fbead4dffcb60b4d1 -Author: Yury G. Kudryashov -Date: Mon Aug 12 22:42:13 2013 +0200 - - Fix indentation - - utils/pdftotext.cc | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -commit b8b5773386ee4f57e72c2b867421cdff8a2eab5a -Merge: 5f9d385 62d079b -Author: Albert Astals Cid -Date: Thu Aug 8 20:47:05 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 62d079b40a2f816f59cc533b1624ea57458331f3 -Author: Yury G. Kudryashov -Date: Thu Aug 8 20:45:08 2013 +0200 - - Fix `pdftotext -bbox in.pdf -` - - Print body text to stdout if invoked as above. - - Bug #45163 - - utils/pdftotext.cc | 15 ++++++--------- - 1 file changed, 6 insertions(+), 9 deletions(-) - -commit 5f9d385dbec3148614b84ae24cae47177e18dbfc -Merge: af450a8 86dbc5f -Author: Albert Astals Cid -Date: Thu Aug 8 20:41:25 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.24' - -commit 86dbc5f6f850ba3919bed9979386e5a4d0e7dba3 -Author: Yury G. Kudryashov -Date: Thu Aug 8 20:39:30 2013 +0200 - - pdfdetach: don't mention xpdfrc - - - drop -cfg command line argument; the old code passed its value to - GlobalParams constructor which is the data dir, not a cfg file - - remove corresponding lines from pdfdetach.1 - - fix '-enc' documentation in pdfdetach.1 - - utils/pdfdetach.1 | 23 +++-------------------- - utils/pdfdetach.cc | 6 ++---- - 2 files changed, 5 insertions(+), 24 deletions(-) - -commit af450a885ede5a3eac1a12734310722963764d83 -Author: Thomas Freitag -Date: Thu Aug 8 20:33:54 2013 +0200 - - use copyString where memory is freed with gfree - - Bug #67666 - - poppler/Annot.cc | 2 +- - poppler/Dict.cc | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 030ee12875a562f5976c5569d5c76783aadf89bd -Author: Adrian Perez de Castro -Date: Thu Apr 25 09:52:56 2013 +0300 - - pdfinfo: Use Catalog::getMarkInfo() to show mark info properties - - utils/pdfinfo.cc | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -commit 9a232273988c0d2fd752dc2016e5111227ae6646 -Author: Adrian Perez de Castro -Date: Thu Apr 25 09:52:56 2013 +0300 - - Tagged-PDF: Accessors in Catalog for the MarkInfo dictionary - - poppler/Catalog.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ - poppler/Catalog.h | 10 ++++++++++ - 2 files changed, 55 insertions(+) - -commit 2724a7b9f723789491b4991ce7fe0cfa3e5488c3 -Author: Carlos Garcia Campos -Date: Tue Jul 30 09:36:44 2013 +0200 - - glib-demo: Remove GTK_DISABLE_DEPRECATED compilation flag - - Deprecations are now compile warnings, there's no reason to make them - fatal. - - glib/demo/Makefile.am | 1 - - 1 file changed, 1 deletion(-) - -commit ef9d861486d54fb3dcf7b8bca01bd44c3b3361a9 -Author: Carlos Garcia Campos -Date: Tue Jul 30 09:36:44 2013 +0200 - - glib-demo: Remove GTK_DISABLE_DEPRECATED compilation flag - - Deprecations are now compile warnings, there's no reason to make them - fatal. - - glib/demo/Makefile.am | 1 - - 1 file changed, 1 deletion(-) - -commit eac752dc25942439de3e1c7a4ff815500a41dd2a -Author: Albert Astals Cid -Date: Mon Jul 29 19:11:55 2013 +0200 - - 0.24.0 - - CMakeLists.txt | 6 +++--- - NEWS | 7 +++++++ - configure.ac | 4 ++-- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 7 files changed, 16 insertions(+), 9 deletions(-) - -commit 892433a068a8a11c09a7c4f57c5fc941747c4453 -Author: Albert Astals Cid -Date: Mon Jul 29 19:08:10 2013 +0200 - - Update Ed's copyright - - poppler/TextOutputDev.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 4637b1581286381c3d1c6963828d9cd8afc5b9e0 -Author: Albert Astals Cid -Date: Mon Jul 29 01:08:06 2013 +0200 - - Make some pdftops conversions *much* faster - - For example: http://ev.kde.org/resources/expense_report.pdf - - Without this patch it seems "infinite", which this patch it's a - few seconds - - The change: Instead of just remembering in xobjStack the set of - XObjects (and Patterns, - the variable name was 'wrong') we are currently setting up (i.e. the - current chain), we - remember all of them. - - This has passed the pdf->ps regression test without a single issue - - poppler/PSOutputDev.cc | 42 ++++++++++-------------------------------- - poppler/PSOutputDev.h | 6 +++--- - 2 files changed, 13 insertions(+), 35 deletions(-) - -commit e04287f2682e46831c04e0ef8d60411f521a2572 -Author: Albert Astals Cid -Date: Mon Jul 29 00:55:43 2013 +0200 - - Fallback to 1x1 bitmap If we fail to create the corrent one - - poppler/SplashOutputDev.cc | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -commit fe5ff20cb93a70fa1650ef5e00b67e35de20f0ca -Author: Albert Astals Cid -Date: Mon Jul 29 00:54:07 2013 +0200 - - Initialize t3FillColorOnly - - poppler/PSOutputDev.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 19930d9f104b63070dcd7636758eb8b90a86fc0d -Author: Ed Catmur -Date: Sun Jul 21 11:07:00 2013 +0200 - - TextOutputDev: Do not draw ligatures more than once when selected - - When the selection covers a ligature presentation form where a single - character code corresponds to multiple Unicode codepoints, the - glyph for - the ligature is drawn multiple times, once for each Unicode character. - - https://bugs.freedesktop.org/show_bug.cgi?id=9001 - - poppler/TextOutputDev.cc | 3 +++ - 1 file changed, 3 insertions(+) - -commit 6b451b2d3f785c28d98907ae338d58380db518d2 -Author: Albert Astals Cid -Date: Fri Jul 19 02:55:29 2013 +0200 - - 0.23.4 - - CMakeLists.txt | 4 +-- - NEWS | 8 ++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - gtk-doc.make | 70 - +++++++++++++++++++++++++++++++----------------- - m4/gtk-doc.m4 | 6 ++++- - poppler/CairoOutputDev.h | 2 +- - poppler/Makefile.am | 2 +- - poppler/TextOutputDev.cc | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 11 files changed, 67 insertions(+), 35 deletions(-) - -commit 6cf43442e38c501b49293a28f38e06ab143852c6 -Author: Ed Catmur -Date: Thu Jul 18 10:34:29 2013 +0200 - - TextOutputDev: clip the selected text rendering to the selection box - - Sometimes with italic text or text containing ligatures, part of the - glyph falls outside the selection box. By clipping to the selection - box - we avoid drawing the whole glyph with the selection color. - - https://bugs.freedesktop.org/show_bug.cgi?id=66983 - - poppler/TextOutputDev.cc | 5 +++++ - 1 file changed, 5 insertions(+) - -commit 269b3f3d572a15f1007f8cc84f758b1a293ef8af -Author: Carlos Garcia Campos -Date: Mon Jul 8 20:19:30 2013 +0200 - - build: Make -lpthread take preference over -pthread - - This makes libpoppler link to pthreads and fixes runtime error due to - unresolved pthread symbols when running some of the utils and tests. - - m4/ax_pthread.m4 | 2 +- - test/Makefile.am | 6 ++++-- - utils/Makefile.am | 4 +++- - 3 files changed, 8 insertions(+), 4 deletions(-) - -commit 40f857d27930aa002a99c96f3892c5e240e7ecb5 -Author: Carlos Garcia Campos -Date: Mon Jul 8 19:55:10 2013 +0200 - - m4: Replace old acx_pthread.m4 with new one ax_pthread.m4 - - configure.ac | 2 +- - m4/acx_pthread.m4 | 280 ----------------------------------------------- - m4/ax_pthread.m4 | 317 - ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 318 insertions(+), 281 deletions(-) - -commit 44b7070aa713b2e20eb97b868000d432e2f8504e -Author: Pino Toscano -Date: Mon Jul 8 19:42:15 2013 +0200 - - cmake: improve linking with pthreads - - Use the CMake-provided variable instead of hardcoding -lpthread. - - CMakeLists.txt | 6 +++--- - utils/CMakeLists.txt | 2 +- - 2 files changed, 4 insertions(+), 4 deletions(-) - -commit 69c281fdcf23520151c0eb5471a4259c73fa1273 -Author: Carlos Garcia Campos -Date: Sun Jul 7 11:51:27 2013 +0200 - - cairo: Fix the bounding box of images saved in CairoImageOutputDev - - We were using the size of the original image instead of the rendered - size and asuming the scales were always positive. - - poppler/CairoOutputDev.cc | 145 - ++++++++++++++++++---------------------------- - poppler/CairoOutputDev.h | 5 +- - 2 files changed, 59 insertions(+), 91 deletions(-) - -commit 759e0266b36c4ea9f66912f1e53ed6392dbfd6da -Author: Albert Astals Cid -Date: Tue Jul 2 00:47:13 2013 +0200 - - News for 0.23.3 - - forgot to add them to the tarball, oh well - - NEWS | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -commit df1fe9dc7ade5228e37c16c6f0c9a2d4890fdc90 -Author: Albert Astals Cid -Date: Tue Jul 2 00:33:04 2013 +0200 - - 0.23.3 - - CMakeLists.txt | 4 ++-- - Makefile.am | 2 +- - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - qt5/src/Doxyfile | 2 +- - 7 files changed, 8 insertions(+), 8 deletions(-) - -commit df9d4fee17adfe003c822175b6921a3cd93675f6 -Author: Albert Astals Cid -Date: Mon Jul 1 21:04:10 2013 +0200 - - Update copyrights - - poppler/Annot.cc | 2 +- - poppler/Annot.h | 2 +- - poppler/Page.cc | 2 +- - poppler/TextOutputDev.cc | 2 +- - poppler/TextOutputDev.h | 2 +- - qt5/src/poppler-annotation.cc | 2 +- - qt5/src/poppler-annotation.h | 2 +- - qt5/src/poppler-document.cc | 2 +- - qt5/src/poppler-link.cc | 2 +- - qt5/src/poppler-qt5.h | 2 +- - 10 files changed, 10 insertions(+), 10 deletions(-) - -commit 67129e9db88e8332907407f14d3e09ee5c49e274 -Author: Jason Crain -Date: Mon Jul 1 02:24:47 2013 -0500 - - Check for NULL in Page::getResourceDictCopy - - poppler/Page.cc | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -commit c376559bc412e90204162bb4b2d20cd586db70c1 -Author: Carlos Garcia Campos -Date: Sun Jun 30 13:14:07 2013 +0200 - - annots: Invalidate the appearance stream when annot properties change - - Make invalidateAppearance() protected and only call it when properties - that affect the appearance stream are updated. Remove all calls to - invalidateAppearance() from qt frontend, this is now handled by - the core - and fixes the appearance stream regeneration in the glib frontend too. - - poppler/Annot.cc | 36 ++++++++++++++++++++++++++++++++++++ - poppler/Annot.h | 10 ++++++---- - qt4/src/poppler-annotation.cc | 34 ---------------------------------- - qt5/src/poppler-annotation.cc | 34 ---------------------------------- - 4 files changed, 42 insertions(+), 72 deletions(-) - -commit c746e8b38e821d1ebeaf52c4c816515bc3ddaaf6 -Author: Carlos Garcia Campos -Date: Sun Jun 30 11:44:59 2013 +0200 - - annots: Remove unused variable - - poppler/Annot.cc | 1 - - 1 file changed, 1 deletion(-) - -commit 7d9d5d2518f7760e6a4317a358040ddd9164fdef -Author: Carlos Garcia Campos -Date: Sun Jun 30 11:40:15 2013 +0200 - - annots: Do not update AP and AS entries if they are not present when - invaliding the appaearance stream - - poppler/Annot.cc | 17 ++++++++++++++--- - 1 file changed, 14 insertions(+), 3 deletions(-) - -commit 347b53f7fca644564724c230fe6c0dcbffa0d6f9 -Author: Carlos Garcia Campos -Date: Sun Jun 30 11:23:54 2013 +0200 - - annots: do not set the default appearance state when invalidating - appearances - - We are setting the default appareance state to Off and then we are - updating AS dictionary to NULL in the XRef. The appearance state - is only - required when there's more than once appearance stream, but when - invalidating the apperance we remove all streams. - - poppler/Annot.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit b5e9941c145fc99e03a28d92a50840638895908d -Author: Albert Astals Cid -Date: Mon Jul 1 00:32:51 2013 +0200 - - Fix crash on malformed doc - - Where the Colorants dictionary values are not arrays - Document can be found on KDE bug #319925 - - poppler/GfxState.cc | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -commit 19f8a88bba6022b8172477e6f52dfd36b2fc5e92 -Author: Fabio D'Urso -Date: Thu Mar 7 00:20:15 2013 +0100 - - qt5: Free some temporary memory in - TextAnnotationPrivate::createNativeAnnot - - There's no need to keep this buffer around after it has been flushed - - qt5/src/poppler-annotation.cc | 2 ++ - 1 file changed, 2 insertions(+) - -commit 8bac4d1e43ce9a4c66fddc8430d7bed2d9aabba1 -Author: Fabio D'Urso -Date: Tue Jun 25 20:09:00 2013 +0200 - - qt5: Some documentation about annotations - - * Removed incorrect hint "Use uniqueName to test for Annotation - equality": uniqueNames are optional and we don't actually guarantee - uniqueness - * Added "How to add annotations" and "FixedRotation flag specifics" - sections in the Annotation class page - * Added links from enum Annotation::SubType items to actual subclasses - * Added documentation for annotation flags that are known to work - * Added "see also" links between annotation flag and boundary - setters/getters - * Added warning on Annotation::setPopup to tell that it's currently - not - implemented - - qt5/src/poppler-annotation.h | 143 - ++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 135 insertions(+), 8 deletions(-) - -commit 1d5fe3f20189fd3928121e954bcc8fa7278b39fb -Author: Fabio D'Urso -Date: Sat Mar 2 19:06:49 2013 +0100 - - qt5: FixedRotation annotations' coordinate conversion - - FixedRotation(=flagNoRotate) annotations use a different coordinate - system than regular annotations. This patch implements transparent - conversion so that qt5 clients don't notice the difference. - - Important! When dealing with FixedRotation annotations, poppler-qt5 - clients will need to set geometry-related annotation properties in - the following order: - 1) flags (because we need to know if this is a FixedRotation - annotation or not) - 2) boundary (because we need to know what the topleft corner is, - so that we can construct the conversion matrix) - 3) anything else - - This requirement will be documented in the next patch - - qt5/src/poppler-annotation-private.h | 7 ++- - qt5/src/poppler-annotation.cc | 111 - +++++++++++++++++++++++++++-------- - 2 files changed, 92 insertions(+), 26 deletions(-) - -commit ab130c91492765f8be29ed112dd2e2e6f665641b -Author: Fabio D'Urso -Date: Sat Mar 2 00:55:58 2013 +0100 - - core: Remove geometry-related arguments from annotation constructors - - Removed arguments from annotation constructors related to the geometry - of the annotation. This change will make it easier to support creating - annotations with flag NoRotate in the next patch (because no special - cases will be needed: coordinate conversion code will be able - to always - assume that the underlying annotation object already exists). - - Data that used to be taken from these arguments is now replaced - by dummy - values, which can be modified using appropriate setter methods after - the annotation object is created. - - Affected annotation types: - - AnnotLine - - AnnotTextMarkup - - AnnotPolygon - - AnnotInk - - qt5/src/poppler-annotation.cc | 34 ++++++++++++++++++---------------- - 1 file changed, 18 insertions(+), 16 deletions(-) - -commit 35cfb6914e1be4c5eda2f355900b1a0a1fa69d19 -Author: Fabio D'Urso -Date: Fri Feb 15 12:24:18 2013 +0100 - - poppler_qt5viewer: Add combobox to select rotation - - qt5/demos/navigationtoolbar.cpp | 15 +++++++++++++++ - qt5/demos/navigationtoolbar.h | 4 ++++ - qt5/demos/pageview.cpp | 24 +++++++++++++++++++++++- - qt5/demos/pageview.h | 3 +++ - qt5/demos/viewer.cpp | 2 ++ - 5 files changed, 47 insertions(+), 1 deletion(-) - -commit de2a93c0bc6e92a95c687796f59780c998b90ca4 -Author: Fabio D'Urso -Date: Thu Mar 7 00:20:15 2013 +0100 - - qt4: Free some temporary memory in - TextAnnotationPrivate::createNativeAnnot - - There's no need to keep this buffer around after it has been flushed - - qt4/src/poppler-annotation.cc | 2 ++ - 1 file changed, 2 insertions(+) - -commit 738b0b4fedaa2b2b28ea1c11622dfd880180d1c9 -Author: Fabio D'Urso -Date: Thu Mar 7 20:50:52 2013 +0100 - - qt4: Some documentation about annotations - - * Removed incorrect hint "Use uniqueName to test for Annotation - equality": uniqueNames are optional and we don't actually guarantee - uniqueness - * Added "How to add annotations" and "FixedRotation flag specifics" - sections in the Annotation class page - * Added links from enum Annotation::SubType items to actual subclasses - * Added documentation for annotation flags that are known to work - * Added "see also" links between annotation flag and boundary - setters/getters - * Added warning on Annotation::setPopup to tell that it's currently - not - implemented - - qt4/src/poppler-annotation.h | 143 - ++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 135 insertions(+), 8 deletions(-) - -commit cf950a2b7e8278e70719c67b441b0d324ffd0399 -Author: Fabio D'Urso -Date: Sat Mar 2 19:06:49 2013 +0100 - - qt4: FixedRotation annotations' coordinate conversion - - FixedRotation(=flagNoRotate) annotations use a different coordinate - system than regular annotations. This patch implements transparent - conversion so that qt4 clients don't notice the difference. - - Important! When dealing with FixedRotation annotations, poppler-qt4 - clients will need to set geometry-related annotation properties in - the following order: - 1) flags (because we need to know if this is a FixedRotation - annotation or not) - 2) boundary (because we need to know what the topleft corner is, - so that we can construct the conversion matrix) - 3) anything else - - This requirement will be documented in the next patch - - poppler/Annot.cc | 8 +++ - poppler/Annot.h | 2 + - qt4/src/poppler-annotation-private.h | 7 ++- - qt4/src/poppler-annotation.cc | 111 - +++++++++++++++++++++++++++-------- - 4 files changed, 102 insertions(+), 26 deletions(-) - -commit 4b13085568df09d8b75099f6a5438f025a028fd5 -Author: Fabio D'Urso -Date: Sat Mar 2 00:55:58 2013 +0100 - - core: Remove geometry-related arguments from annotation constructors - - Removed arguments from annotation constructors related to the geometry - of the annotation. This change will make it easier to support creating - annotations with flag NoRotate in the next patch (because no special - cases will be needed: coordinate conversion code will be able - to always - assume that the underlying annotation object already exists). - - Data that used to be taken from these arguments is now replaced - by dummy - values, which can be modified using appropriate setter methods after - the annotation object is created. - - Affected annotation types: - - AnnotLine - - AnnotTextMarkup - - AnnotPolygon - - AnnotInk - - poppler/Annot.cc | 56 - +++++++++++++------------------------------ - poppler/Annot.h | 9 ++++--- - qt4/src/poppler-annotation.cc | 34 +++++++++++++------------- - 3 files changed, 39 insertions(+), 60 deletions(-) - -commit 5923cfb5f7e3a0703de17e21f4952f92a44f3c14 -Author: Fabio D'Urso -Date: Fri Feb 15 12:24:18 2013 +0100 - - poppler_qt4viewer: Add combobox to select rotation - - qt4/demos/navigationtoolbar.cpp | 15 +++++++++++++++ - qt4/demos/navigationtoolbar.h | 4 ++++ - qt4/demos/pageview.cpp | 24 +++++++++++++++++++++++- - qt4/demos/pageview.h | 3 +++ - qt4/demos/viewer.cpp | 2 ++ - 5 files changed, 47 insertions(+), 1 deletion(-) - -commit 74ea15cc454f31b772e71b3525b71045dbfa5527 -Author: Fabio D'Urso -Date: Tue Jun 25 19:56:20 2013 +0200 - - core: Support for rendering annotations with flagNoRotate - - Gfx::drawAnnot now makes a counter-rotation if flagNoRotate is set - - poppler/Annot.cc | 55 - ++++++++++++++++++++++++++++++++++++------------------- - poppler/Annot.h | 3 ++- - poppler/Gfx.cc | 41 +++++++++++++++++++++++++++++++++++++---- - poppler/Gfx.h | 3 ++- - 4 files changed, 77 insertions(+), 25 deletions(-) - -commit 2639957ba78defd2ab6282679375fb7969bad21f -Author: Fabio D'Urso -Date: Wed Jun 26 23:12:40 2013 +0200 - - Do not crash in page::removeAnnot if there are non-Ref entries - in /Annots - - poppler/Page.cc | 10 ++++++---- - 1 file changed, 6 insertions(+), 4 deletions(-) - -commit ae016aa263c218fbfbd607cc92feac1013348c7e -Author: Albert Astals Cid -Date: Wed Jun 26 11:33:55 2013 +0200 - - Fix qt5 found/not found logic - - CMakeLists.txt | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -commit e27c1057caf4d878a0dc43c92c9e0b565db8fe40 -Merge: c55b577 ee8cfbc -Author: Albert Astals Cid -Date: Tue Jun 25 19:17:13 2013 +0200 - - Merge remote-tracking branch 'origin/qt5' - -commit c55b577ce69ad4bb69f5261b3e120e92c9fdb3d0 -Author: Carlos Garcia Campos -Date: Tue Jun 25 10:01:38 2013 +0200 - - glib: Use TextPage::getSelectionWords to build text layout and - attributes - - This way we can make sure that the list of words used in - poppler_page_get_text_layout and poppler_page_get_text_attributes - is the - same that the one used in poppler_page_get_text. This fixes the - mismatch - between the number of characters in the text returned by - poppler_page_get_text and the number of characters returned by - poppler_page_get_text_layout in some documents. - - glib/poppler-page.cc | 168 - +++++++++++++++++++++++++++------------------------ - 1 file changed, 90 insertions(+), 78 deletions(-) - -commit fc534f571315c064005515c19d7d70ad3af1563e -Author: Carlos Garcia Campos -Date: Tue Jun 25 10:05:01 2013 +0200 - - TextOutputDev: add a method to TextPage to get the selection as a - list of words - - Returns a list of lines of words. - - poppler/TextOutputDev.cc | 36 ++++++++++++++++++++++++++++++++++++ - poppler/TextOutputDev.h | 4 ++++ - 2 files changed, 40 insertions(+) - -commit a924246b7534e86165f8e9ab6c60d56b73a17b94 -Author: Carlos Garcia Campos -Date: Tue Jun 25 09:57:48 2013 +0200 - - TextOutputDev: simplify the text selection dumper - - Build a list of lines of words and don't try to format the text when - detecting tables, simply add the words and lines in the right order. - - poppler/TextOutputDev.cc | 200 - ++++++++++++++++++++++------------------------- - 1 file changed, 92 insertions(+), 108 deletions(-) - -commit c849094a2daf896d085937adff1f7659a09da062 -Author: Carlos Garcia Campos -Date: Mon Jun 24 18:29:11 2013 +0200 - - TextOutputDev: Move TextSelection class from TextSelectionPainter - to TextSelectionVisitor - - So that it can be used by other TextSelectionVisitor implementations. - Also renamed it as TextWordSelection since it contains a word - selection. - - poppler/TextOutputDev.cc | 35 ++++++++++++++++++----------------- - 1 file changed, 18 insertions(+), 17 deletions(-) - -commit b3ff3f2c3e131556d2b27cbe52f0ddbbb4820c19 -Author: Jason Crain -Date: Thu Jun 20 21:47:13 2013 -0500 - - Draw glyphs after selection background - - When multiple lines of text are selected, TextSelectionPainter will - draw selections over each other, hiding the previous line with the - selection background of the current line. This patch changes - TextSelectionPainter so that glyphs are drawn only after the entire - background is drawn. - - https://bugs.freedesktop.org/show_bug.cgi?id=65989 - - poppler/TextOutputDev.cc | 109 - ++++++++++++++++++++++++++++++----------------- - 1 file changed, 69 insertions(+), 40 deletions(-) - -commit ee8cfbc78fe9de109abbe0727a738870f6027a73 -Author: Albert Astals Cid -Date: Tue Jun 18 23:20:01 2013 +0200 - - Fix indent - - qt5/src/poppler-optcontent.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 9d0a5b6afb25a1273504383e108bdb95ca82f099 -Author: Albert Astals Cid -Date: Tue Jun 18 23:19:30 2013 +0200 - - Bring changes from the qt4 dir - - qt5/src/Doxyfile | 2 +- - qt5/src/poppler-private.h | 2 +- - qt5/tests/CMakeLists.txt | 1 + - qt5/tests/Makefile.am | 13 +- - qt5/tests/stress-threads-qt5.cpp | 304 - +++++++++++++++++++++++++++++++++++++++ - qt5/tests/test-poppler-qt5.cpp | 2 +- - 6 files changed, 320 insertions(+), 4 deletions(-) - -commit 1adb1ab7aee026e227d25716a4b7be22b19b5b84 -Author: Albert Astals Cid -Date: Tue Jun 18 20:50:49 2013 +0200 - - Make it build with autotools - - poppler/ArthurOutputDev.cc | 816 - ------------------------------------------ - poppler/ArthurOutputDev.h | 170 --------- - poppler/Makefile.am | 23 +- - qt4/src/ArthurOutputDev.cc | 816 - ++++++++++++++++++++++++++++++++++++++++++ - qt4/src/ArthurOutputDev.h | 170 +++++++++ - qt4/src/CMakeLists.txt | 2 +- - qt4/src/Makefile.am | 5 +- - qt5/src/ArthurOutputDev.cc | 816 - ++++++++++++++++++++++++++++++++++++++++++ - qt5/src/ArthurOutputDev.h | 170 +++++++++ - qt5/src/CMakeLists.txt | 2 +- - qt5/src/Makefile.am | 5 +- - qt5/src/poppler-optcontent.cc | 2 + - 12 files changed, 1983 insertions(+), 1014 deletions(-) - -commit 93a1c2b768cc419c5bf9b3033bf85fb21326a65a -Author: Albert Astals Cid -Date: Tue Jun 18 00:33:38 2013 +0200 - - If qmake gives us a Qt5 qmake try with qmake4 and qmake-qt4 - - cmake/modules/FindQt4.cmake | 62 - ++++++++++++++++++++++++++++----------------- - 1 file changed, 39 insertions(+), 23 deletions(-) - -commit 7cc33a752ef864b595748ce7724ba553a8e3ba8e -Author: Albert Astals Cid -Date: Mon Jun 17 22:57:56 2013 +0200 - - We are not compiling an executable - - qt5/src/CMakeLists.txt | 1 - - 1 file changed, 1 deletion(-) - -commit 87cfcd41e8e970186c6ce753aa660ef86aca8878 -Author: Granger Anthony -Date: Mon Jun 17 09:17:51 2013 +0200 - - Allow to enable Qt5 support only with CMake >= 2.8.8 - - CMakeLists.txt | 26 ++++++++++++++++---------- - qt5/tests/CMakeLists.txt | 1 - - 2 files changed, 16 insertions(+), 11 deletions(-) - -commit b44c70f04758000cf0e049b06cc7864287570f7b -Author: Albert Astals Cid -Date: Mon Jun 17 22:10:05 2013 +0200 - - Bring PIC back to the toplevel, still have linking errors tohugh :-/ - - configure.ac | 1 + - 1 file changed, 1 insertion(+) - -commit be49073f5ce79f56b38197758a5cf1253b972306 -Author: Albert Astals Cid -Date: Mon Jun 17 21:50:31 2013 +0200 - - Use qtchooser if available - - configure.ac | 15 ++++++++++++--- - 1 file changed, 12 insertions(+), 3 deletions(-) - -commit b1958228d4bc6793a3606b5e31c61a57b9fac9f5 -Author: Albert Astals Cid -Date: Mon Jun 17 20:21:08 2013 +0200 - - No distro ships moc-qt5 but make it work in case someone would - - configure.ac | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -commit 06f45c7177afc67e02985be1a97cd976c530c4ae -Author: Albert Astals Cid -Date: Mon Jun 17 20:04:49 2013 +0200 - - Build fixes - - Fix moc when moc-qt4 is qt4 moc but moc is qt5 one - Do not add -fPIE everywhere, just -fPIC to qt5 - - configure.ac | 10 ++++++---- - qt5/src/Makefile.am | 2 +- - 2 files changed, 7 insertions(+), 5 deletions(-) - -commit cb617c21fba727781f46278f5475b91d528a488b -Author: Albert Astals Cid -Date: Mon Jun 17 18:12:18 2013 +0200 - - Files i forgot - - poppler-qt5-uninstalled.pc.in | 7 +++++++ - poppler-qt5.pc.cmake | 13 +++++++++++++ - poppler-qt5.pc.in | 13 +++++++++++++ - 3 files changed, 33 insertions(+) - -commit 5c521bba427eb163e4b77d936865fbdd0e07faf3 -Author: Albert Astals Cid -Date: Mon Jun 17 18:12:07 2013 +0200 - - soversion 1 - - qt5/src/CMakeLists.txt | 2 +- - qt5/src/Makefile.am | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 43786964946b4f4c005a0526e16fead3ffa6ba4a -Author: Albert Astals Cid -Date: Mon Jun 17 00:23:31 2013 +0200 - - harmonize spaces - - CMakeLists.txt | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - -commit 2e2ea27fe3dc688c87003d170b82451a6a872b0d -Author: Albert Astals Cid -Date: Mon Jun 17 00:22:18 2013 +0200 - - Remove qt4 mentions - - qt5/src/poppler-converter-private.h | 6 +++--- - qt5/src/poppler-embeddedfile-private.h | 2 +- - qt5/src/poppler-form.cc | 2 +- - qt5/src/poppler-form.h | 6 +++--- - qt5/src/poppler-pdf-converter.cc | 2 +- - qt5/src/poppler-private.cc | 4 ++-- - qt5/src/poppler-private.h | 2 +- - qt5/src/poppler-qt5.h | 2 +- - 8 files changed, 13 insertions(+), 13 deletions(-) - -commit e2264ce82af3e971e34930f5307b7c9b43a1e346 -Author: Albert Astals Cid -Date: Mon Jun 17 00:19:27 2013 +0200 - - remove deprecated stuff - - qt5/src/poppler-annotation.cc | 19 ++------ - qt5/src/poppler-annotation.h | 18 ------- - qt5/src/poppler-document.cc | 19 -------- - qt5/src/poppler-link.cc | 5 -- - qt5/src/poppler-link.h | 10 ---- - qt5/src/poppler-page.cc | 18 ------- - qt5/src/poppler-qt5.h | 41 ---------------- - qt5/tests/check_fonts.cpp | 21 ++------- - qt5/tests/check_metadata.cpp | 1 - - qt5/tests/check_search.cpp | 107 - ++++++++++++++++++++++-------------------- - 10 files changed, 65 insertions(+), 194 deletions(-) - -commit 21808e203eed46e379954b58b7014998b3836573 -Author: Albert Astals Cid -Date: Mon Jun 17 00:03:45 2013 +0200 - - remove commented stuff - - qt5/src/CMakeLists.txt | 1 - - 1 file changed, 1 deletion(-) - -commit 16e7033f18a8da8e27aaed6f63cce156abf8837a -Author: Albert Astals Cid -Date: Mon Jun 17 00:01:27 2013 +0200 - - Initial Qt5 port - - CMakeLists.txt | 20 + - Makefile.am | 18 +- - configure.ac | 66 +- - qt5/.gitignore | 4 + - qt5/CMakeLists.txt | 3 + - qt5/Makefile.am | 1 + - qt5/demos/.gitignore | 4 + - qt5/demos/CMakeLists.txt | 38 + - qt5/demos/Makefile.am | 67 + - qt5/demos/abstractinfodock.cpp | 57 + - qt5/demos/abstractinfodock.h | 48 + - qt5/demos/documentobserver.cpp | 50 + - qt5/demos/documentobserver.h | 50 + - qt5/demos/embeddedfiles.cpp | 82 + - qt5/demos/embeddedfiles.h | 44 + - qt5/demos/fonts.cpp | 72 + - qt5/demos/fonts.h | 43 + - qt5/demos/info.cpp | 72 + - qt5/demos/info.h | 43 + - qt5/demos/main_viewer.cpp | 33 + - qt5/demos/metadata.cpp | 50 + - qt5/demos/metadata.h | 43 + - qt5/demos/navigationtoolbar.cpp | 129 + - qt5/demos/navigationtoolbar.h | 61 + - qt5/demos/optcontent.cpp | 69 + - qt5/demos/optcontent.h | 47 + - qt5/demos/pageview.cpp | 79 + - qt5/demos/pageview.h | 50 + - qt5/demos/permissions.cpp | 66 + - qt5/demos/permissions.h | 43 + - qt5/demos/thumbnails.cpp | 84 + - qt5/demos/thumbnails.h | 48 + - qt5/demos/toc.cpp | 88 + - qt5/demos/toc.h | 43 + - qt5/demos/viewer.cpp | 317 ++ - qt5/demos/viewer.h | 73 + - qt5/src/.gitignore | 9 + - qt5/src/CMakeLists.txt | 54 + - qt5/src/Doxyfile | 1637 ++++++++++ - qt5/src/Mainpage.dox | 85 + - qt5/src/Makefile.am | 73 + - qt5/src/poppler-annotation-helper.h | 198 ++ - qt5/src/poppler-annotation-private.h | 111 + - qt5/src/poppler-annotation.cc | 4394 - ++++++++++++++++++++++++++ - qt5/src/poppler-annotation.h | 921 ++++++ - qt5/src/poppler-base-converter.cc | 105 + - qt5/src/poppler-converter-private.h | 49 + - qt5/src/poppler-document.cc | 679 ++++ - qt5/src/poppler-embeddedfile-private.h | 42 + - qt5/src/poppler-embeddedfile.cc | 135 + - qt5/src/poppler-export.h | 17 + - qt5/src/poppler-fontinfo.cc | 149 + - qt5/src/poppler-form.cc | 416 +++ - qt5/src/poppler-form.h | 343 ++ - qt5/src/poppler-link-extractor-private.h | 57 + - qt5/src/poppler-link-extractor.cc | 84 + - qt5/src/poppler-link.cc | 711 +++++ - qt5/src/poppler-link.h | 612 ++++ - qt5/src/poppler-media.cc | 168 + - qt5/src/poppler-media.h | 100 + - qt5/src/poppler-movie.cc | 110 + - qt5/src/poppler-optcontent-private.h | 121 + - qt5/src/poppler-optcontent.cc | 427 +++ - qt5/src/poppler-optcontent.h | 77 + - qt5/src/poppler-page-private.h | 54 + - qt5/src/poppler-page-transition-private.h | 28 + - qt5/src/poppler-page-transition.cc | 95 + - qt5/src/poppler-page-transition.h | 148 + - qt5/src/poppler-page.cc | 744 +++++ - qt5/src/poppler-pdf-converter.cc | 115 + - qt5/src/poppler-private.cc | 292 ++ - qt5/src/poppler-private.h | 240 ++ - qt5/src/poppler-ps-converter.cc | 273 ++ - qt5/src/poppler-qiodeviceoutstream-private.h | 47 + - qt5/src/poppler-qiodeviceoutstream.cc | 64 + - qt5/src/poppler-qt5.h | 1812 +++++++++++ - qt5/src/poppler-sound.cc | 132 + - qt5/src/poppler-textbox.cc | 63 + - qt5/tests/.gitignore | 30 + - qt5/tests/CMakeLists.txt | 75 + - qt5/tests/Makefile.am | 152 + - qt5/tests/README.unittest | 23 + - qt5/tests/check_actualtext.cpp | 33 + - qt5/tests/check_attachments.cpp | 157 + - qt5/tests/check_dateConversion.cpp | 142 + - qt5/tests/check_fonts.cpp | 248 ++ - qt5/tests/check_goostring.cpp | 61 + - qt5/tests/check_lexer.cpp | 128 + - qt5/tests/check_links.cpp | 96 + - qt5/tests/check_metadata.cpp | 275 ++ - qt5/tests/check_optcontent.cpp | 484 +++ - qt5/tests/check_pagelabelinfo.cpp | 43 + - qt5/tests/check_pagelayout.cpp | 49 + - qt5/tests/check_pagemode.cpp | 73 + - qt5/tests/check_password.cpp | 88 + - qt5/tests/check_permissions.cpp | 44 + - qt5/tests/check_search.cpp | 91 + - qt5/tests/check_strings.cpp | 250 ++ - qt5/tests/poppler-attachments.cpp | 39 + - qt5/tests/poppler-fonts.cpp | 89 + - qt5/tests/poppler-forms.cpp | 166 + - qt5/tests/poppler-texts.cpp | 40 + - qt5/tests/stress-poppler-dir.cpp | 67 + - qt5/tests/stress-poppler-qt5.cpp | 74 + - qt5/tests/test-password-qt5.cpp | 136 + - qt5/tests/test-poppler-qt5.cpp | 235 ++ - 106 files changed, 21480 insertions(+), 4 deletions(-) - -commit 714ee1e61d853394818dca7155b1b882408ffc6a -Author: Albert Astals Cid -Date: Sun Jun 16 19:00:01 2013 +0200 - - Pass down the recursion param - - Fixes heap smashing in 168.pdf.SIGSEGV.598.462 - - poppler/Stream.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 1f3e3828b9a57e044b86640b9bf9ad2437cc5656 -Author: Albert Astals Cid -Date: Sat Jun 15 17:21:36 2013 +0200 - - Add quotes since use_cairo can have spaces - - BUG #65709 - - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit fe3ffab19d54326052fd0ff8ee3ee1feb9fa928c -Author: Adam Reichold -Date: Tue Jun 11 23:08:07 2013 +0200 - - Windows compile fixes - - qt4/tests/stress-threads-qt4.cpp | 13 +++++++++---- - 1 file changed, 9 insertions(+), 4 deletions(-) - -commit 99908cb0c8a784791ffa0682c8f105acdef0d5ab -Author: Peter Breitenlohner -Date: Tue Jun 11 10:02:01 2013 +0200 - - MinGW32 may or may not define __MINGW_PRINTF_FORMAT - - Moreover __USE_MINGW_ANSI_STDIO might be defined as 0 - - poppler/poppler-config.h.cmake | 2 +- - poppler/poppler-config.h.in | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 0673f3d8024554c414f578e0770086f475e6a605 -Author: Albert Astals Cid -Date: Tue Jun 11 00:19:19 2013 +0200 - - 0.23.2 - - 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 7f1bf8d94302c15a2ff68debfb6fba49df526d16 -Author: Christoph Duelli -Date: Thu May 16 16:16:32 2013 +0200 - - Do not pollute global namespace with internal classes - - Bug #64680 - - fofi/FoFiIdentifier.cc | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -commit 07992075a6d1d29db57f997f67d5a4a6deacbbb4 -Merge: 4a0bd6f 25f453e -Author: Albert Astals Cid -Date: Sun Jun 9 12:17:53 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - - Conflicts: - poppler/Catalog.cc - qt4/src/poppler-private.h - utils/HtmlOutputDev.cc - -commit 25f453ef49004452ac4c201d59d9ce2ef52ffeee -Author: Julien Nabet -Date: Sun Jun 9 12:12:06 2013 +0200 - - Prefer prefix ++/-- operators for non-primitive types - - Part of bug #80537 - - poppler/CachedFile.cc | 3 ++- - poppler/Catalog.cc | 5 +++-- - utils/HtmlFonts.cc | 3 ++- - utils/HtmlLinks.cc | 3 ++- - 4 files changed, 9 insertions(+), 5 deletions(-) - -commit ed01688a899c5e7560a93ca2424ca302ff3452f1 -Author: Julien Nabet -Date: Sun Jun 9 12:10:01 2013 +0200 - - Fix mismatched allocation and deallocation - - Part of bug #65551 - - qt4/src/poppler-private.h | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit a27890ac441fbd613ddfe6fcf404b92be371e554 -Author: Julien Nabet -Date: Sun Jun 9 12:08:06 2013 +0200 - - Fix memory leak - - utils/HtmlOutputDev.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 4a0bd6fdb2e9e3c589e1bdb282e7c2bfca8567b1 -Merge: bbd27c9 17a16a2 -Author: Albert Astals Cid -Date: Sun Jun 9 12:06:10 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 17a16a2731b1110a12c7163c139d85bccee04492 -Author: Albert Astals Cid -Date: Sun Jun 9 12:04:40 2013 +0200 - - Fix mismatched free/delete - - Bug #65553 - - poppler/UTF.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit bbd27c92b5e5034dc2899ea26b47fcb983209f82 -Author: Thomas Freitag -Date: Thu Jun 6 23:52:36 2013 +0200 - - Speed-up some tiling on a 10x factor - - Bug #64892 - - poppler/SplashOutputDev.cc | 15 ++++++++++++++- - splash/Splash.cc | 15 +++++++++++---- - splash/Splash.h | 3 ++- - 3 files changed, 27 insertions(+), 6 deletions(-) - -commit 7847769a24bd3ccf863f653bc2215e84157ccfb6 -Author: Peter Breitenlohner -Date: Tue Jun 4 15:31:06 2013 +0200 - - Use fseeko64/ftello64 for MinGW32 - - goo/gfile.cc | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -commit 0c3548087b379dd6ffa2291d03f0ea1c7e6a69d1 -Author: Peter Breitenlohner -Date: Tue Jun 4 15:31:05 2013 +0200 - - Allow to build without multithreading - - poppler/Annot.cc | 7 +++++++ - poppler/XRef.cc | 4 ++++ - 2 files changed, 11 insertions(+) - -commit 1e74ac4589daf80dcac54b094145d32c90069738 -Author: Adam Reichold -Date: Thu Jun 6 01:03:48 2013 +0200 - - [qt4] fix autotools - - qt4/tests/Makefile.am | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 342cc0d8a101e99199d447d632a1cd5ba7beb5b2 -Author: Li Junling -Date: Tue Jun 4 22:39:35 2013 +0200 - - Fix memory leak - - poppler/SplashOutputDev.cc | 2 ++ - 1 file changed, 2 insertions(+) - -commit 52945a072b6f864e80485cc4321a27530a76c452 -Author: Albert Astals Cid -Date: Tue Jun 4 22:35:32 2013 +0200 - - Move the iccColorSpaceCache from Gfx to OutputDev - - This way it's shared when doing tiling. Page 35 of - bug-poppler64963.pdf - goes down from 150 to 133 seconds - - poppler/Gfx.cc | 61 ++++++++++++++-------------------- - poppler/Gfx.h | 12 ++----- - poppler/GfxState.cc | 93 - ++++++++++++++++++++++++++-------------------------- - poppler/GfxState.h | 33 ++++++++++--------- - poppler/OutputDev.cc | 8 ++++- - poppler/OutputDev.h | 19 +++++++++-- - 6 files changed, 114 insertions(+), 112 deletions(-) - -commit 7d4bda198b8ac767bdf4e0a4fdcaae5541113f92 -Author: Albert Astals Cid -Date: Mon Jun 3 23:34:11 2013 +0200 - - Compile - - qt4/tests/stress-threads-qt4.cpp | 1 + - 1 file changed, 1 insertion(+) - -commit 395b3fa021850225e1fea66736f3a3f00571571f -Author: Albert Astals Cid -Date: Mon Jun 3 23:31:52 2013 +0200 - - Fix #end -> #endif - - poppler/poppler-config.h.cmake | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 425d1b4835389e2031631ce54cee157af39f1cb6 -Author: Adam Reichold -Date: Mon Jun 3 20:04:21 2013 +0200 - - Check for the correct number of arguments - - qt4/tests/stress-threads-qt4.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 9d3eb07a1ea01b98aabe4f32481dd4a83bc8f2a5 -Author: Hib Eris -Date: Mon Jun 3 08:49:37 2013 +0200 - - Fix cmake build to use ansi stdio extensions when using a mingw - compiler - - https://bugs.freedesktop.org/show_bug.cgi?id=65238 - - poppler/poppler-config.h.cmake | 5 +++++ - 1 file changed, 5 insertions(+) - -commit 287afe2290d64ca63cdb75fef8f3fbdc20997970 -Author: Adam Reichold -Date: Sun Jun 2 23:29:00 2013 +0200 - - Add a thread stresser in qt4 - - qt4/tests/CMakeLists.txt | 1 + - qt4/tests/Makefile.am | 9 +- - qt4/tests/stress-threads-qt4.cpp | 298 - +++++++++++++++++++++++++++++++++++++++ - 3 files changed, 307 insertions(+), 1 deletion(-) - -commit 77ecb3823c2db4a6cca5af5889c07c73f90de7f0 -Author: Adam Reichold -Date: Sat Jun 1 19:04:10 2013 +0200 - - Add a pthread option to pdftoppm - - It's mostly a developer tool only to test thread support - Not end user oriented (hence no buildsystem) - - Parts also by Thomas - - utils/pdftoppm.cc | 130 - ++++++++++++++++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 126 insertions(+), 4 deletions(-) - -commit caa19f4961146915f51be6c72f60c3aa43037235 -Author: Albert Astals Cid -Date: Sat Jun 1 17:22:54 2013 +0200 - - qt4: Fix test binary name in help - - qt4/tests/test-poppler-qt4.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit a0b48b1d05f08605bca5e1a2e2518e16578f6055 -Author: Hib Eris -Date: Sat Jun 1 14:42:42 2013 +0200 - - Fix printf format warning for size_t - - Fixes: - - CXX pdfunite.o - pdfunite.cc: In function ‘int main(int, char**)’: - pdfunite.cc:142:59: warning: format ‘%d’ expects argument of type - ‘int’, but argument 3 has type ‘std::vector::size_type - {aka long unsigned int}’ [-Wformat] - - https://bugs.freedesktop.org/show_bug.cgi?id=65242 - - utils/pdfunite.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 860737c2a19c734a0c5b65ad506ba229ba439985 -Author: Hib Eris -Date: Sat Jun 1 12:05:17 2013 +0200 - - Use ansi stdio extensions when using a mingw compiler - - In the C runtime used by mingw compilers (msvcrt.dll) the printf - function does not support the C99 format-width specifier "%ll". - - Defining __USE_MINGW_ANSI_STDIO enables mingw's ansi stdio extensions - that implement a C99 compliant printf function. - - https://bugs.freedesktop.org/show_bug.cgi?id=65238 - - CMakeLists.txt | 4 ++++ - configure.ac | 3 +++ - poppler/poppler-config.h.in | 5 +++++ - 3 files changed, 12 insertions(+) - -commit dd30ce39252a3820254b43f90699849ab5a1ca58 -Author: Hib Eris -Date: Fri May 31 12:24:55 2013 +0200 - - Fix warning on narrowing conversion from int to DWORD - - Fixes warning when compiling for Windows: - - gfile.cc: In member function 'Goffset GooFile::size() const': - gfile.cc:609:30: warning: narrowing conversion of '-1' from 'int' - to 'DWORD {aka long unsigned int}' inside { } is ill-formed in C++11 - [-Wnarrowing] - LARGE_INTEGER size = {-1,-1}; - - https://bugs.freedesktop.org/show_bug.cgi?id=65239 - - goo/gfile.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 01a825f3f9f5dcf686fc123d2cf80b9c525d0d89 -Merge: a57f937 b4b1310 -Author: Albert Astals Cid -Date: Sat Jun 1 13:47:29 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit b4b13102716cd33636a94fd99c49487924761670 -Author: Albert Astals Cid -Date: Sat Jun 1 13:45:53 2013 +0200 - - Fix crash on malformed file - - Also remove outdated comment - - Bug #65221 - - poppler/Stream.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit a57f93780de12732875e0195127a92bff835ff61 -Author: Albert Astals Cid -Date: Tue May 28 00:11:10 2013 +0200 - - 0.23.1 - - CMakeLists.txt | 4 ++-- - NEWS | 11 +++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - 6 files changed, 17 insertions(+), 6 deletions(-) - -commit 299a1447e3d9a845b5e964f29e698046abdb63f2 -Author: Albert Astals Cid -Date: Tue May 28 00:10:43 2013 +0200 - - Build poppler-forms in the autotools buildsystem - - qt4/tests/Makefile.am | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -commit dcfaf20503868d0956ee81208265a975b480fb52 -Author: Albert Astals Cid -Date: Mon May 27 23:40:49 2013 +0200 - - Dist these two files too - - Makefile.am | 2 ++ - 1 file changed, 2 insertions(+) - -commit de7a3fb715811be6be9ed51b1c5ab1a63c523403 -Author: Albert Astals Cid -Date: Mon May 27 23:40:07 2013 +0200 - - Add missing copyright - - poppler/Hints.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 30282d3fdbbb3029d9a0f838b2cd979bb962235c -Merge: 61f6658 56044ef -Author: Albert Astals Cid -Date: Mon May 27 00:20:12 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 56044ef482c26f10a8a1371dace049c144659dc7 -Author: Albert Astals Cid -Date: Mon May 27 00:18:22 2013 +0200 - - Fix infinite loop while feeding wrong data in stdin - - Take into account that CachedFile::read might not always return - the number of elems we asked it to read - - Bug #64967 - - poppler/Stream.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 61f665885daeb0009ecac2cc85188f23d6addb60 -Author: Albert Astals Cid -Date: Mon May 27 00:01:24 2013 +0200 - - Fix big file support in cmake - - Tested by Fabio - - CMakeLists.txt | 2 ++ - cmake/modules/CheckFileOffsetBits.c | 14 +++++++++++ - cmake/modules/CheckFileOffsetBits.cmake | 44 - +++++++++++++++++++++++++++++++++ - config.h.cmake | 6 ++--- - 4 files changed, 63 insertions(+), 3 deletions(-) - -commit f536a4ec37246e10f03fe4de309bd31deb6a4727 -Author: Hib Eris -Date: Thu May 16 21:06:56 2013 +0200 - - Do not use deprecated gtk_scrolled_window_add_with_viewport() - - https://bugs.freedesktop.org/show_bug.cgi?id=64683 - - glib/demo/find.c | 4 ++++ - glib/demo/images.c | 4 ++++ - glib/demo/layers.c | 4 ++++ - glib/demo/render.c | 4 ++++ - glib/demo/selections.c | 4 ++++ - test/gtk-test.cc | 4 ++++ - 6 files changed, 24 insertions(+) - -commit c10f2f8777927d8cfe547941ea2f70fcce14da7a -Author: Pino Toscano -Date: Mon May 20 00:09:45 2013 +0200 - - fix typo in error message - - poppler/Hints.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 71d327194293cb3d1a0e274eaf4451c7afe81e8a -Merge: 7b2df1f 6a98b56 -Author: Albert Astals Cid -Date: Fri May 17 23:04:12 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 6a98b56f6ded957477ddcccd4ff849a870020395 -Author: Albert Astals Cid -Date: Fri May 17 23:01:20 2013 +0200 - - Make an invalid nSharedGroupsFirst a real error - - Instead trying to recover - Fixes bug #46703 - - poppler/Hints.cc | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -commit 7b2df1f935192c89eacddd98c4bf92f38013c8e0 -Author: Albert Astals Cid -Date: Fri May 17 20:56:51 2013 +0200 - - A simple form dumper - - qt4/tests/CMakeLists.txt | 1 + - qt4/tests/poppler-forms.cpp | 166 - ++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 167 insertions(+) - -commit 54f539b4436a1a3e0eab2ef0904c302865082982 -Merge: b3d8f51 3a6e2de -Author: Albert Astals Cid -Date: Thu May 16 21:27:47 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 3a6e2de1d35e3ee4fd86f71713c49bec8e09e41d -Author: Albert Astals Cid -Date: Thu May 16 21:27:02 2013 +0200 - - Make sure that Title: doesn't contain \n or \n - - Bug #63862 - - poppler/PSOutputDev.cc | 11 +++++++++-- - 1 file changed, 9 insertions(+), 2 deletions(-) - -commit b3d8f510e30fb4d8da9069390d5e9bd8a283fbd6 -Author: Thomas Freitag -Date: Thu May 16 20:52:09 2013 +0200 - - Fix splashModeBGR8 rendering - - Also make SplashBitmap able to write splashModeBGR8 images - - Bug #64381 - - splash/Splash.cc | 4 ++-- - splash/SplashBitmap.cc | 24 ++++++++++++++++++++++-- - 2 files changed, 24 insertions(+), 4 deletions(-) - -commit 8640933a3aa7dbafa21765d029e97b4bba76716c -Author: Fabio D'Urso -Date: Thu Apr 25 19:18:30 2013 +0200 - - Fix printf format specifiers (Goffset is a long long, not a int) - - poppler/PDFDoc.cc | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -commit f8e8805bbce3e94b16b77fece0072645c66f6a31 -Author: Fabio D'Urso -Date: Thu Apr 25 19:06:09 2013 +0200 - - Re-enable commented-out printf-format attribute on OutStream::printf - - The answer to the question "2,3 because the first arg is class - instance ?" is yes. It's documented behavior: - Since non-static C++ methods have an implicit this argument, the - arguments of such methods should be counted from two, not one. - from - http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Function-Attributes.html - - poppler/Stream.h | 6 ++---- - 1 file changed, 2 insertions(+), 4 deletions(-) - -commit 013b2b247268f9b8dcd8e0461580e0bbcf7554c1 -Author: Fabio D'Urso -Date: Thu Apr 25 17:58:25 2013 +0200 - - XRef stream writing: Write 32-bit offsets when possible - - For compatibility reasons: some pdf readers don't support 64-bit - offsets - yet (for example, poppler 0.22 doesn't) - - poppler/XRef.cc | 38 ++++++++++++++++++++++++++++---------- - poppler/XRef.h | 17 +++++++++++++++-- - 2 files changed, 43 insertions(+), 12 deletions(-) - -commit ea61a9dc012fbffd9bc9fe8a09264ba8744635fc -Author: Albert Astals Cid -Date: Mon May 13 23:15:55 2013 +0200 - - 0.23.0 - - Includes news, soversions, updated copyrights, etc - - CMakeLists.txt | 6 +++--- - NEWS | 12 ++++++++++++ - configure.ac | 4 ++-- - cpp/Doxyfile | 2 +- - goo/gfile.cc | 1 + - goo/gfile.h | 1 + - poppler/CairoOutputDev.h | 2 +- - poppler/Makefile.am | 2 +- - poppler/Stream.cc | 1 + - poppler/Stream.h | 1 + - poppler/XRef.cc | 1 + - qt4/src/CMakeLists.txt | 2 +- - qt4/src/Doxyfile | 2 +- - qt4/src/Makefile.am | 2 +- - 14 files changed, 28 insertions(+), 11 deletions(-) - -commit 7a5eee1cbebe241b8bd44027fc07682944686910 -Author: Albert Astals Cid -Date: Mon May 13 23:00:40 2013 +0200 - - Add check_pagelabelinfo test - - qt4/tests/Makefile.am | 1 + - 1 file changed, 1 insertion(+) - -commit 30a519f21dd5df8d41a43a58b2cbd95fe657df73 -Merge: 998a9e7 0c0aef2 -Author: Albert Astals Cid -Date: Mon May 13 20:40:04 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 0c0aef20d9cecaee1de0badc6cd56dd6e5b5bf12 -Author: Albert Astals Cid -Date: Mon May 13 19:57:02 2013 +0200 - - 0.22.4 version - - Also increase soversion since Gfx.h got a new member - - 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 4d6662d05f6b652af97ac6e0eb1f1c1dca8e9550 -Author: Albert Astals Cid -Date: Mon May 13 19:55:21 2013 +0200 - - 0.22.4 NEWS - - NEWS | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) - -commit 93e08d96867d636a70ab04ee4ad22c2214ae4b6a -Author: Albert Astals Cid -Date: Mon May 13 19:51:52 2013 +0200 - - Update copyright years - - poppler/CairoOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 998a9e7c982a72b0e931304b719de40f30094d12 -Merge: 5e73cb0 73d09cd -Author: Albert Astals Cid -Date: Mon May 13 19:30:26 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - - Conflicts: - splash/Splash.cc - -commit 73d09cd55f3bd307450c2dd095e039ea39c69cea -Author: Albert Astals Cid -Date: Mon May 13 19:28:40 2013 +0200 - - Fix compilation with fixed point mode enabled - - Thanks to Andreas Müller for the tip - - splash/Splash.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 5e73cb059e27f68b329513de609d52e84d73f8af -Merge: 5e9654a b3e44fc -Author: Albert Astals Cid -Date: Tue May 7 22:00:02 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit b3e44fc59a9258ad701bc67132dea0646fd8b61a -Author: Albert Astals Cid -Date: Tue May 7 21:53:31 2013 +0200 - - We need UnicodeParsedString here too - - Fixes KDE bug #307786 - - qt4/src/poppler-embeddedfile.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 5e9654a3eb28b2c8b0985545778dd0e45829f8e1 -Merge: eeecd97 a107428 -Author: Albert Astals Cid -Date: Thu Apr 25 20:45:34 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - - Conflicts: - poppler/Gfx.h - -commit a107428e7db0c420b60418a33b9f815909ac9a33 -Author: Albert Astals Cid -Date: Thu Apr 25 20:44:36 2013 +0200 - - Update my C of the last two previous commits - - poppler/Gfx.cc | 2 +- - poppler/Gfx.h | 2 +- - utils/HtmlOutputDev.cc | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -commit eeecd9718f201dc795b2cb8469c43860aec6e07d -Author: Albert Astals Cid -Date: Thu Apr 25 20:29:24 2013 +0200 - - Do not start drawing a form we are already drawing - - Bug #63190 - - poppler/Gfx.cc | 23 +++++++++++++++++++---- - poppler/Gfx.h | 2 ++ - 2 files changed, 21 insertions(+), 4 deletions(-) - -commit 43d66e11aa9e692c1c6b3a237e7e972d317e5c4d -Author: Albert Astals Cid -Date: Thu Apr 25 20:27:43 2013 +0200 - - Make sure getKids returns != 0 before using it - - Fixes crash in bug #63909 - - utils/HtmlOutputDev.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit ec298b3b780f885464aa00880150eaa2b9b50b08 -Author: Albert Astals Cid -Date: Thu Apr 25 20:29:24 2013 +0200 - - Do not start drawing a form we are already drawing - - Bug #63190 - - poppler/Gfx.cc | 23 +++++++++++++++++++---- - poppler/Gfx.h | 2 ++ - 2 files changed, 21 insertions(+), 4 deletions(-) - -commit 11ab42e7e90099d0cebf8f02197413fd5dee044b -Author: Albert Astals Cid -Date: Thu Apr 25 20:27:43 2013 +0200 - - Make sure getKids returns != 0 before using it - - Fixes crash in bug #63909 - - utils/HtmlOutputDev.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 4ee78e77f7d6cadc8e150ceff96b546ddca329d4 -Author: Carlos Garcia Campos -Date: Sat Apr 20 16:41:56 2013 +0200 - - cairo: Always use the trasnfer function if present in setSoftMask - - "If the subtype is Alpha, the transparency group XObject G shall be - evaluated to compute a group alpha only. The colours of the - constituent - objects shall be ignored and the colour compositing computations shall - not be performed. The transfer function TR shall then be applied - to the - computed group alpha to produce the mask values." - - We were using the transfer function only for luminosity soft masks. - - https://bugs.freedesktop.org/show_bug.cgi?id=63587 - - poppler/CairoOutputDev.cc | 37 +++++++++++++++++++------------------ - 1 file changed, 19 insertions(+), 18 deletions(-) - -commit 3c2a92b06a6541071bd1e555606bb2096de17ef6 -Author: Carlos Garcia Campos -Date: Sat Apr 20 16:41:56 2013 +0200 - - cairo: Always use the trasnfer function if present in setSoftMask - - "If the subtype is Alpha, the transparency group XObject G shall be - evaluated to compute a group alpha only. The colours of the - constituent - objects shall be ignored and the colour compositing computations shall - not be performed. The transfer function TR shall then be applied - to the - computed group alpha to produce the mask values." - - We were using the transfer function only for luminosity soft masks. - - https://bugs.freedesktop.org/show_bug.cgi?id=63587 - - poppler/CairoOutputDev.cc | 37 +++++++++++++++++++------------------ - 1 file changed, 19 insertions(+), 18 deletions(-) - -commit fd648e83e60db7157b7273ffddc02308b0c5813b -Merge: 970e9f6 53b9cec -Author: Albert Astals Cid -Date: Sun Apr 21 23:30:16 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 53b9cec6c1334020f90b885cff6fc30293437e5f -Author: Thomas Freitag -Date: Sun Apr 21 23:28:40 2013 +0200 - - Splash: Always consider a softmask transfer function - - Fixes bug 63587 in splash - - poppler/SplashOutputDev.cc | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -commit 970e9f6304c3b59ac3e44495b90a5cfe7c7ceb8b -Author: Hib Eris -Date: Fri Apr 12 13:26:55 2013 +0200 - - Remove unused variables from Lexer::getObj() - - https://bugs.freedesktop.org/show_bug.cgi?id=63467 - - poppler/Lexer.cc | 8 +++----- - 1 file changed, 3 insertions(+), 5 deletions(-) - -commit f8bf602620b3c7570f483ac66fc4d6a76a81a882 -Merge: bbd27dc 62a5b4d -Author: Albert Astals Cid -Date: Sun Apr 14 16:40:51 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 62a5b4d5c6d5c368d190b86eab63ccb07d642c01 -Author: Hib Eris -Date: Sun Apr 14 16:37:14 2013 +0200 - - Check for strcpy_s() and strcat_s() at configure time - - It is better to test for functions than to hardcode exceptions for - specific compilers. - - This fixes compiling poppler with the latest mingw-w64 compiler which - has strcpy_s() and strcat_s() build in. - - Bug #63459 - - ConfigureChecks.cmake | 2 ++ - configure.ac | 1 + - test/perf-test.cc | 6 ++++-- - 3 files changed, 7 insertions(+), 2 deletions(-) - -commit bbd27dc4ce7b24af890d80f597f74e5d7ee0215a -Merge: ea3698c 5bc0080 -Author: Albert Astals Cid -Date: Fri Apr 12 00:10:27 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - - Conflicts: - poppler/TextOutputDev.h - -commit 5bc00809ebe560a180d5df93eb50bdf0ff0e97e6 -Author: Albert Astals Cid -Date: Thu Apr 11 23:29:00 2013 +0200 - - Increase poppler core soname - - CMakeLists.txt | 2 +- - poppler/Makefile.am | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 115d4c1465291adde86c3c905f265ac03374441f -Author: Albert Astals Cid -Date: Thu Apr 11 23:28:17 2013 +0200 - - Increase version number to 0.22.3 - - CMakeLists.txt | 2 +- - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - 4 files changed, 4 insertions(+), 4 deletions(-) - -commit ae1a3553b85e2616a339aacb6efecd15db373858 -Author: Albert Astals Cid -Date: Thu Apr 11 23:26:44 2013 +0200 - - News file - - NEWS | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) - -commit 1fefe98fc86cf8449346bdc230dff5758b1bb7a3 -Author: Albert Astals Cid -Date: Thu Apr 11 23:22:20 2013 +0200 - - Update copyrgihts - - poppler/CairoOutputDev.cc | 2 +- - poppler/PDFDoc.cc | 2 +- - poppler/TextOutputDev.cc | 2 +- - poppler/TextOutputDev.h | 2 +- - 4 files changed, 4 insertions(+), 4 deletions(-) - -commit ea3698cfffc9c132081f5691287ef1fd17911b2a -Merge: fcc1468 aaaea5d -Author: Albert Astals Cid -Date: Wed Apr 10 20:42:01 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit aaaea5d0f2f427e82625a04f90c178e24892e539 -Author: Marek Kasik -Date: Wed Apr 10 16:41:48 2013 +0200 - - man pages: Fix typos - - Fix several typos in manual pages of pdftops and pdfseparate. - - utils/pdfseparate.1 | 2 +- - utils/pdftops.1 | 6 +++--- - 2 files changed, 4 insertions(+), 4 deletions(-) - -commit fcc14682899ff4981bfece74dbc8c290a625b05c -Merge: f11e216 e6559a0 -Author: Albert Astals Cid -Date: Sun Apr 7 17:44:12 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit e6559a0d836df127ed5061794dc737d435ef534c -Author: Albert Astals Cid -Date: Sun Apr 7 17:42:23 2013 +0200 - - Fix crash in KDE bug #317710 - - It is not guaranteed that the ::LinkAction passed to - PageData::convertLinkActionToLink - will be always around (e.g. Page::action deletes it) so make a copy - of the ::MediaRendition object - - qt4/src/poppler-link.h | 6 +++--- - qt4/src/poppler-media.cc | 6 ++++++ - qt4/src/poppler-media.h | 5 ++++- - qt4/src/poppler-page.cc | 4 ++-- - 4 files changed, 15 insertions(+), 6 deletions(-) - -commit f11e21627121c3ff81c0ec7f4d71936a2dd590c3 -Merge: e1ffa91 b9fdb0c -Author: Albert Astals Cid -Date: Sat Apr 6 23:26:54 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit e1ffa9100cf6b4a444be7ed76b11698a5c5bb441 -Author: Thomas Freitag -Date: Sat Apr 6 23:21:58 2013 +0200 - - Fix endstream detection - - Part 1 of bug #62985 - - the endstream search, and at least with bug-poppler16579.pdf this - doesn't work correctly: the shift(-1) with the used token mechanism - in Lexer isn't correct for a binary data stream. If there is i.e. a - "(" without corresponding ")" in the binary data, which of course can - happen and happens in that pdf, shift(-1) skips the searched endstream - and can therefore in worst case reach the end-of-file. Therefore I - implemented a shift("endstream") in Java, which I now port back to - C++, or in other words "There and Back Again" :-) - - You can test it with bug-poppler16579.pdf if You just change temporary - - if (longNumber <= INT_MAX && longNumber >= INT_MIN && - *end_ptr == '\0') { - - in XRef.cc to - - if (gFalse && longNumber <= INT_MAX && longNumber >= - INT_MIN && *end_ptr == '\0') { - - poppler/Lexer.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ - poppler/Lexer.h | 2 ++ - poppler/Parser.cc | 28 ++++++++++++++++++++++++++-- - poppler/Parser.h | 2 ++ - 4 files changed, 75 insertions(+), 2 deletions(-) - -commit b9fdb0cb767a228c56f3f0635a7f78e3e0a8c7b6 -Author: Albert Astals Cid -Date: Sat Apr 6 23:20:48 2013 +0200 - - Last commit was Thomas' forgot his (C) - - poppler/XRef.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 94bee4601cbbda0e7c6205a04650e0510f198aee -Merge: 42368fb b312210 -Author: Albert Astals Cid -Date: Sat Apr 6 23:19:25 2013 +0200 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit b312210b630f96baeb8b2f3b49b0b79779609d98 -Author: Albert Astals Cid -Date: Sat Apr 6 23:18:18 2013 +0200 - - Fix for complete rewrites in repaired files - - Part 2 of bug #62985 - if You save a PDF with defect xref offsets, the - - readXRefUntil(-1 /* read all xref sections */, &xrefStreamObjNums) - - in XRef::scanSpecialFlags() will destroy the already reconstructed - entries table, but this means that any modification which the user did - in the meantime get lost. This can be tested i.e. with bug168518.pdf. - - poppler/XRef.cc | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -commit 42368fb9452c3719a7bbd159f1c1421068f40653 -Author: Albert Astals Cid -Date: Sat Apr 6 18:28:35 2013 +0200 - - Add missing free() - - poppler/PDFDoc.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 2264e7a95e5dc252de1b5736a1edd6bf5de3ad1f -Author: Thomas Freitag -Date: Sat Apr 6 18:27:57 2013 +0200 - - implement Crypt filter - - Bug #62800 - - poppler/Decrypt.h | 3 ++- - poppler/PDFDoc.cc | 37 ++++++++++++++++++++++++++++++++++--- - poppler/Stream.cc | 6 ++++++ - poppler/Stream.h | 3 ++- - 4 files changed, 44 insertions(+), 5 deletions(-) - -commit a65a4e6f878ff033b780b2f1e3362f2918c93b6b -Author: Adam Reichold -Date: Sat Apr 6 18:25:21 2013 +0200 - - No need to keep the mutex attributes around all the time - - goo/GooMutex.h | 27 ++++++++++----------------- - 1 file changed, 10 insertions(+), 17 deletions(-) - -commit 73ff5ad58cfe7ec9415cc1459b6ca083fee608f4 -Author: Albert Astals Cid -Date: Sat Apr 6 18:19:28 2013 +0200 - - Pass the recursion flag - - poppler/DCTStream.cc | 6 +++--- - poppler/DCTStream.h | 2 +- - poppler/Stream.cc | 4 ++-- - poppler/Stream.h | 2 +- - 4 files changed, 7 insertions(+), 7 deletions(-) - -commit 837e3704e76ea857b3de45503840e9b855096fef -Author: Albert Astals Cid -Date: Sat Apr 6 17:01:08 2013 +0200 - - Make our mutexes recursive - - Fixes a deadlock problem found with a pdf i can't share - (411klaralv.pdf) - Reviewed by Thomas and Adam on the mailing list - - CMakeLists.txt | 3 +++ - glib/CMakeLists.txt | 3 +++ - goo/GooMutex.h | 36 ++++++++++++++++++++++-------------- - poppler/Annot.cc | 34 +++++++++++++++++----------------- - poppler/Annot.h | 4 ++-- - poppler/Catalog.cc | 24 +++++++++++------------- - poppler/Catalog.h | 8 ++++---- - poppler/XRef.cc | 2 +- - utils/CMakeLists.txt | 3 +++ - 9 files changed, 66 insertions(+), 51 deletions(-) - -commit 0a243c8c14d09a40f25338999c3ca06273277b45 -Author: Adam Reichold -Date: Fri Apr 5 00:00:07 2013 +0200 - - Add a GooFile class to encapsulate file read access using offsets - - Bug #62735 - - ConfigureChecks.cmake | 2 ++ - config.h.cmake | 6 ++++ - configure.ac | 1 + - goo/gfile.cc | 80 - ++++++++++++++++++++++++++++++++++++++++++++++ - goo/gfile.h | 30 +++++++++++++++++ - poppler/GlobalParamsWin.cc | 19 ++++------- - poppler/PDFDoc.cc | 37 ++++++--------------- - poppler/PDFDoc.h | 4 ++- - poppler/Stream.cc | 46 +++++++++----------------- - poppler/Stream.h | 17 +++------- - 10 files changed, 158 insertions(+), 84 deletions(-) - -commit 70e6af4739d2eea58e6f3200a8c9467597a12ae5 -Author: Rodrigo Rivas Costa -Date: Thu Apr 4 23:10:09 2013 +0200 - - Be pedantic about setjmp use - - Bug #63067 - - poppler/DCTStream.cc | 57 - +++++++++++++++++++++++++++------------------------- - 1 file changed, 30 insertions(+), 27 deletions(-) - -commit c7e28e3d672654f31f1a0f95245a1fba3bc9c28f -Author: Albert Astals Cid -Date: Mon Mar 25 22:55:58 2013 +0100 - - Only write the file once when saving - - Bug #62739 - - poppler/PDFDoc.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 09ddb34f202be2111c70901724d64d3b61483c7a -Author: Albert Astals Cid -Date: Mon Mar 25 22:55:58 2013 +0100 - - Only write the file once when saving - - Bug #62739 - - poppler/PDFDoc.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 75378557f409a5a2305ea0fb42c56184c74ba887 -Author: Carlos Garcia Campos -Date: Sun Mar 24 12:53:29 2013 +0100 - - glib: Always start from the beginning when starting a new search on - a page - - And start from previous match when searching the next one on the same - page. This allows to search for the same string multiple times on the - same page. - - https://bugs.freedesktop.org/show_bug.cgi?id=59972 - - glib/poppler-page.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit 4ee6757dd7de9211faf8601531342a199225a06d -Author: Carlos Garcia Campos -Date: Sun Mar 24 12:53:29 2013 +0100 - - glib: Always start from the beginning when starting a new search on - a page - - And start from previous match when searching the next one on the same - page. This allows to search for the same string multiple times on the - same page. - - https://bugs.freedesktop.org/show_bug.cgi?id=59972 - - glib/poppler-page.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit 83cf2d3d3ecce6340d858a2ee037cd5120ac1db5 -Author: Jason Crain -Date: Sat Mar 9 08:44:36 2013 -0600 - - TextOutputDev: Set text matrix when painting selection - - https://bugs.freedesktop.org/show_bug.cgi?id=61042 - - poppler/TextOutputDev.cc | 30 +++++++++++++++++++++++------- - poppler/TextOutputDev.h | 3 ++- - 2 files changed, 25 insertions(+), 8 deletions(-) - -commit a3bc584fdd7f74a7dab701c743df0bb0bf74a03e -Author: Jason Crain -Date: Sat Mar 9 08:44:36 2013 -0600 - - TextOutputDev: Set text matrix when painting selection - - https://bugs.freedesktop.org/show_bug.cgi?id=61042 - - poppler/TextOutputDev.cc | 30 +++++++++++++++++++++++------- - poppler/TextOutputDev.h | 3 ++- - 2 files changed, 25 insertions(+), 8 deletions(-) - -commit 8cbdbc64897a34beb226d4dc4c58095f10013f29 -Merge: 2bce2cf a01e2d4 -Author: Albert Astals Cid -Date: Wed Mar 20 22:37:06 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit a01e2d41fcb638fe340bd3d4d22bd13db245e0fd -Author: Thomas Freitag -Date: Wed Mar 20 22:35:08 2013 +0100 - - check order bounding box values in tiling pattern - - Bug #62369 - - poppler/Gfx.cc | 20 +++++++++++++++----- - 1 file changed, 15 insertions(+), 5 deletions(-) - -commit 2bce2cf2a523f9b8db7f5e255384044b8dfe1a24 -Author: Albert Astals Cid -Date: Tue Mar 19 22:53:47 2013 +0100 - - Avoid blackboxes on weird files using the thin line mode - - Bug #61719 - - splash/Splash.cc | 35 +++++++++++++++++++++++++++++++++++ - splash/Splash.h | 1 + - 2 files changed, 36 insertions(+) - -commit b2d07cbf0c2f94bd25e1422e366ff78031815867 -Merge: 80cf78f 3206950 -Author: Albert Astals Cid -Date: Mon Mar 18 21:06:59 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 3206950658521009b52f638cc5e712e0cef42706 -Author: Albert Astals Cid -Date: Mon Mar 18 21:06:09 2013 +0100 - - Spec says Zoom -> 0 means no zoom change - - poppler/Link.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 13ee9f8b7d42ed7d7bc0f9dbf190ff66e6ab5a81 -Author: Pino Toscano -Date: Mon Mar 18 18:15:57 2013 +0100 - - cmake: drop search of gthread-2.0 and gio-2.0 from GTK - - this matches what is done in the autoconf counterpart - - cmake/modules/FindGTK.cmake | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 47e869e60fb147caca825380eeaa2a0851d502b9 -Author: Michael Weiser -Date: Mon Mar 18 18:15:14 2013 +0100 - - cmake: search also for gio-2.0 as GLIB library - - cmake/modules/FindGLIB.cmake | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 80cf78f2020e2f4cf33ed49fe522c6861d710588 -Merge: b21780e 72c8312 -Author: Adrian Johnson -Date: Mon Mar 18 20:02:08 2013 +1030 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 72c8312d77704211f55c8de35b47bd811c792878 -Author: Adrian Johnson -Date: Sun Mar 17 19:39:14 2013 +1030 - - cairo: Don't change image interpolation when printing - - Bug 62418 - - poppler/CairoOutputDev.cc | 4 ++++ - 1 file changed, 4 insertions(+) - -commit b21780e69dd92f3f2bcb7851608d3e0557dc81f8 -Author: Thomas Freitag -Date: Sat Mar 16 23:20:35 2013 +0100 - - Fix typo - - poppler/XRef.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 75849a0d7c205c048714b90883695b6bebd2298c -Merge: ec7140b 5a51812 -Author: Albert Astals Cid -Date: Tue Mar 12 20:27:59 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - - Conflicts: - poppler/Stream.h - -commit 5a51812b7c1457feb8acaa106f43d7d5252b3980 -Author: Peter Breitenlohner -Date: Tue Mar 12 20:25:50 2013 +0100 - - Fix compile when not using libjpeg - - poppler/Stream.h | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 341e863d65fdd5619a071e4fd903fa82bf33c757 -Author: Albert Astals Cid -Date: Mon Mar 11 19:20:06 2013 +0100 - - 0.22.2 - - 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 ec7140b3f56b034fbbc53cb8066ba01fe9f60f47 -Merge: c86062f 5db6585 -Author: Albert Astals Cid -Date: Fri Mar 8 16:41:21 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - - Conflicts: - poppler/Stream.cc - poppler/Stream.h - -commit 5db6585c2b02dd4071f1adabd53509506333dcf8 -Author: Albert Astals Cid -Date: Fri Mar 8 16:38:49 2013 +0100 - - Make the non jpeglib based DCTStream compile - - poppler/Stream.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 6402e291e1f9374fbaf4de3b97b21f43d38d6ab8 -Author: Thomas Freitag -Date: Fri Mar 8 16:37:11 2013 +0100 - - Workaround broken jpeg stream definitions - - Bug #61994 - - poppler/DCTStream.cc | 22 +++++++++++++++++++--- - poppler/DCTStream.h | 6 +++++- - poppler/Stream.cc | 8 ++++---- - poppler/Stream.h | 4 ++-- - 4 files changed, 30 insertions(+), 10 deletions(-) - -commit c86062f982d6eb08cb27b654b6317c71ab77c692 -Merge: 677e5b2 4e142b6 -Author: Albert Astals Cid -Date: Mon Mar 4 20:13:36 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 4e142b60790638e4495b4fd6551702470cf4c38f -Author: Albert Astals Cid -Date: Mon Mar 4 20:12:01 2013 +0100 - - Make sure we don't try to paint in x < 0 - - Fixes crash in KDE bug #315432 - - splash/Splash.cc | 2 ++ - 1 file changed, 2 insertions(+) - -commit 677e5b265a0d39a988f65d642a4f964a279fad28 -Author: Albert Astals Cid -Date: Sun Mar 3 19:07:32 2013 +0100 - - Small improvements over locker class - - * Remove the namespace (we don't use much/any namespaces in - poppler core) - * Rename the class and defines from lock to locker since lock and be - either the action "to lock" or the "thing that locks", with locker - it is more clear (i think) that is "the thing" than "the action" - * Make Annot::decRefCnt use gLockMutex since we the object itself - is being deleted in the if and not sure the locker would be happy - with that - * change the getNumPages() param to be DoNotLockMutex since - previously it was a gFalse (i guess Thomas made a c&p typo here) - * Have only one constructor like Adam suggested. - - goo/GooMutex.h | 33 +++++++++-------- - poppler/Annot.cc | 92 - +++++++++++++++++++++++----------------------- - poppler/Annot.h | 6 +-- - poppler/Array.cc | 15 ++++---- - poppler/CairoFontEngine.cc | 8 ++-- - poppler/Catalog.cc | 52 +++++++++++++------------- - poppler/Catalog.h | 10 ++--- - poppler/Dict.cc | 20 +++++----- - poppler/PDFDoc.cc | 12 +++--- - poppler/Page.cc | 16 ++++---- - poppler/Stream.cc | 8 ++-- - poppler/XRef.cc | 18 ++++----- - 12 files changed, 147 insertions(+), 143 deletions(-) - -commit d5c929fc253c2748bb8fa3642d9b5383c5fe96f8 -Author: Thomas Freitag -Date: Sun Mar 3 18:00:11 2013 +0100 - - Add a locker helper and a bool -> enum changes - - Bug #59933 - - goo/GooMutex.h | 16 +++++++ - poppler/Annot.cc | 114 - +++++++++++++++++---------------------------- - poppler/Annot.h | 4 +- - poppler/Array.cc | 22 +++------ - poppler/CairoFontEngine.cc | 10 ++-- - poppler/Catalog.cc | 79 ++++++++++--------------------- - poppler/Catalog.h | 9 ++-- - poppler/Dict.cc | 29 ++++-------- - poppler/FontInfo.cc | 2 +- - poppler/PDFDoc.cc | 21 ++------- - poppler/Page.cc | 32 ++++++------- - poppler/Page.h | 3 +- - poppler/Stream.cc | 12 ++--- - poppler/XRef.cc | 29 ++++-------- - 14 files changed, 145 insertions(+), 237 deletions(-) - -commit 1f4a012f7570ffd2120e3e8c2236de5408f3dda3 -Merge: 15d4039 a766740 -Author: Albert Astals Cid -Date: Fri Mar 1 19:16:52 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit a766740cf5a5a7580935a026bf15fbd668aa0fdf -Author: Thomas Freitag -Date: Fri Mar 1 19:12:22 2013 +0100 - - Restore CTM on early exits - - Bug #61413 - - poppler/SplashOutputDev.cc | 14 ++++++++++---- - 1 file changed, 10 insertions(+), 4 deletions(-) - -commit 15d40392a29dded8a29c2dc9d7c15b402515e033 -Merge: be5d9af 39882df -Author: Albert Astals Cid -Date: Thu Feb 28 19:46:59 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 39882dfecdccc00db353946a31d395582ee37022 -Author: José Aliste -Date: Wed Feb 27 01:33:38 2013 +0100 - - Correct rendering of underline and strike out annotations - - Current code assumes that the text to underline or strike out is - horizontal. - Fixes bug #61518 - - poppler/Annot.cc | 27 ++++++++++++++++----------- - 1 file changed, 16 insertions(+), 11 deletions(-) - -commit be5d9af38655496a2eaa4eb12cea84461c5aeb3f -Author: Thomas Freitag -Date: Sat Feb 23 23:41:46 2013 +0100 - - expose thin line modes in qt frontend - - qt4/src/poppler-page.cc | 5 ++++- - qt4/src/poppler-qt4.h | 6 ++++-- - 2 files changed, 8 insertions(+), 3 deletions(-) - -commit f96cbacfdbc97ace35f843854992f06e9322f485 -Author: Thomas Freitag -Date: Sat Feb 23 23:39:52 2013 +0100 - - Refine splashThinLineShape support - - splash/Splash.cc | 14 +++++++++++--- - 1 file changed, 11 insertions(+), 3 deletions(-) - -commit 47453a78e52aa43edd148aef53b67306603161f5 -Author: Thomas Freitag -Date: Wed Feb 20 23:12:17 2013 +0100 - - More threading safety - - poppler/Annot.cc | 97 - +++++++++++++++++++++++++++++++++++------ - poppler/Annot.h | 8 +++- - poppler/FontInfo.cc | 29 ++++++------ - poppler/FontInfo.h | 5 ++- - poppler/Page.cc | 11 ++++- - poppler/Page.h | 6 +-- - poppler/SplashOutputDev.cc | 7 ++- - poppler/SplashOutputDev.h | 5 ++- - poppler/XRef.cc | 4 +- - qt4/src/poppler-page.cc | 9 ++-- - qt4/src/poppler-ps-converter.cc | 3 +- - 11 files changed, 139 insertions(+), 45 deletions(-) - -commit 60c5e072d4b930507469e6e8c234971725a4aa26 -Merge: 0d42a6d 8d62625 -Author: Albert Astals Cid -Date: Wed Feb 20 21:08:53 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 8d62625610746ad70ffb88d845791fa03f5e35cc -Author: Thomas Fischer -Date: Wed Feb 20 21:07:10 2013 +0100 - - height -> maskHeight - - Bug #61168 - - utils/ImageOutputDev.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 0d42a6dab479d27de1ecb2b47ad3f7568b1ee638 -Merge: 7eb7880 8fb243b -Author: Albert Astals Cid -Date: Wed Feb 20 00:00:09 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 8fb243bf11a979af8bfa36427436940706c9f71d -Author: Albert Astals Cid -Date: Tue Feb 19 23:59:17 2013 +0100 - - Initialize cSrcNonIso[3] in splashModeXBGR8 - - Fixes valgrind warning - - splash/Splash.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 8a0199a0247c1a03a4d64375ca8bc900570d1817 -Author: Albert Astals Cid -Date: Tue Feb 19 23:11:46 2013 +0100 - - Fix indent - - splash/Splash.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 7eb7880907cb7b6bd1032013d6ce4c49aa3525c4 -Merge: 2c84acb 1389aa4 -Author: Albert Astals Cid -Date: Tue Feb 19 22:26:37 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 1389aa41b2984de9da7bb66c11485f6c6aeaea41 -Author: Albert Astals Cid -Date: Tue Feb 19 22:25:56 2013 +0100 - - fix indent - - splash/Splash.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 2c84acbfd02eeeaf0d20542798e907cb011c1e57 -Merge: 401c35b ffd33e7 -Author: Albert Astals Cid -Date: Tue Feb 19 11:32:11 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit ffd33e7b5aea44bc54a74f433f6bfff859b913dd -Author: Albert Astals Cid -Date: Tue Feb 19 11:31:22 2013 +0100 - - Fix missing ) here too - - README.contributors | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 14466ecc320387c9b6568280614a96e6f56309b4 -Author: Albert Astals Cid -Date: Tue Feb 19 11:31:02 2013 +0100 - - Forgot my C here - - poppler/PageLabelInfo.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 401c35b797d3c25c734fbfb5b95be16a666a6012 -Author: Albert Astals Cid -Date: Mon Feb 18 22:33:07 2013 +0100 - - Fix closing ) as suggested by William Bader - - README.contributors | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 94364adade4dc27e5d80bc14511d4f2b7ea4ab0d -Merge: 164805b 47f30fa -Author: Albert Astals Cid -Date: Mon Feb 18 20:34:34 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 47f30fa96e62fc215c0e80f42517908760ef8065 -Author: Brad Hards -Date: Mon Feb 18 20:38:10 2013 +1100 - - Minor rewording of contributor README - - README.contributors | 13 +++++++------ - 1 file changed, 7 insertions(+), 6 deletions(-) - -commit 164805b4471256d3915c5e49fff28c9cdcbf89e6 -Author: Albert Astals Cid -Date: Mon Feb 18 20:05:12 2013 +0100 - - Move the commented test to a proper one - - poppler/Makefile.am | 3 +- - poppler/PageLabelInfo.cc | 160 - +------------------------------------- - poppler/PageLabelInfo_p.h | 147 - ++++++++++++++++++++++++++++++++++ - qt4/tests/CMakeLists.txt | 1 + - qt4/tests/Makefile.am | 4 + - qt4/tests/check_pagelabelinfo.cpp | 43 ++++++++++ - 6 files changed, 198 insertions(+), 160 deletions(-) - -commit 527b91a0ef97906041ffe57e88f0d26e1c407af0 -Merge: df35562 95609be -Author: Albert Astals Cid -Date: Mon Feb 18 19:49:14 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 95609be551fc4413874b8980010be70fbbab112a -Author: Albert Astals Cid -Date: Mon Feb 18 19:47:19 2013 +0100 - - Use the toLatin function in PageLabelInfo::indexToLabel - - Wonder why Kristian never enabled it? - Fixes bug #61034 - - poppler/PageLabelInfo.cc | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -commit df3556240d5e4b4546b3c42b29be6d2be83a2802 -Merge: 4dacd7c 5c7057c -Author: Albert Astals Cid -Date: Tue Feb 12 23:55:24 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 5c7057c61ed6e270e001c1f86632f265bebb6890 -Author: Nuno Araujo -Date: Tue Feb 12 23:54:47 2013 +0100 - - Fix the build with automake-1.13 - - autogen.sh | 17 +++++++++-------- - configure.ac | 3 +-- - 2 files changed, 10 insertions(+), 10 deletions(-) - -commit 4dacd7cdeb19d16fe7737c71e34904c7363c6b63 -Merge: 7f2c255 9fc4b9f -Author: Albert Astals Cid -Date: Tue Feb 12 22:59:56 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - -commit 9fc4b9f7a7e6105a6fd85aed9c21b78742e89ddd -Author: Peter Breitenlohner -Date: Tue Feb 12 22:58:17 2013 +0100 - - true->TRUE - - Fixes compilation with jpeglib9 - - goo/JpegWriter.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 7f2c255ff28386ba992717f729f25a979f240375 -Author: Thomas Freitag -Date: Tue Feb 12 22:48:40 2013 +0100 - - Introduce option SplashThinLineMode - - More info at bug #37347 - - poppler/SplashOutputDev.cc | 9 ++++++++- - poppler/SplashOutputDev.h | 3 ++- - splash/Splash.cc | 37 ++++++++++++++++++++++++++++++------- - splash/Splash.h | 9 +++++++-- - splash/SplashClip.cc | 7 ++++--- - splash/SplashClip.h | 4 +++- - splash/SplashTypes.h | 8 +++++++- - splash/SplashXPath.cc | 14 ++++++++++++-- - splash/SplashXPath.h | 17 ++++++++++++++++- - splash/SplashXPathScanner.cc | 9 +++++---- - splash/SplashXPathScanner.h | 17 ++++++++++++++++- - 11 files changed, 110 insertions(+), 24 deletions(-) - -commit c2ebcbea2267f861c491c0cd6c1fbf2dc2aff7d2 -Merge: 48ed05d dca21f8 -Author: Albert Astals Cid -Date: Sun Feb 10 12:01:13 2013 +0100 - - Merge remote-tracking branch 'origin/poppler-0.22' - - Conflicts: - poppler/Parser.cc - -commit dca21f86359b6b2a925f7b05a2f36ab854cefbce -Author: Albert Astals Cid -Date: Sun Feb 10 11:47:21 2013 +0100 - - 0.22.1 - - CMakeLists.txt | 2 +- - NEWS | 9 +++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - 5 files changed, 13 insertions(+), 4 deletions(-) - -commit e8e9245f6a4884da3940fc281b7ff1a42d7f5964 -Author: Albert Astals Cid -Date: Sun Feb 10 11:43:14 2013 +0100 - - Update C year here too - - poppler/poppler-config.h.cmake | 2 +- - poppler/poppler-config.h.in | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit ebbacd897e2b529d1c3637b6af438b8dcc1d7ce8 -Author: Albert Astals Cid -Date: Sun Feb 10 11:42:21 2013 +0100 - - Update C - - poppler/Parser.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 48ed05d95598b642a57456a843baf9f246502bb6 -Author: Adrian Johnson -Date: Wed Feb 6 21:56:01 2013 +1030 - - Make Goffset long long and factor out all fseek/ftell into gfile.cc - - This fixes build problems on 32-bit machines due to off_t being - defined differently depending on whether source files included - condig.h. - - Bug 60095 - - goo/gfile.cc | 38 ++++++++++++++++++++++++ - goo/gfile.h | 7 +++++ - goo/gtypes.h | 19 +----------- - poppler/Stream.cc | 67 - ++++++------------------------------------ - poppler/XRef.cc | 4 +-- - poppler/poppler-config.h.cmake | 6 ---- - poppler/poppler-config.h.in | 6 ---- - utils/pdfinfo.cc | 16 ++-------- - 8 files changed, 60 insertions(+), 103 deletions(-) - -commit fbcd64386c1b189db6e06234577261973bdc88cc -Author: Adrian Johnson -Date: Fri Jan 25 22:24:50 2013 +1030 - - cairo: support uncolored tiling patterns - - Bug 59179 - - poppler/CairoOutputDev.cc | 20 ++++++++++++++++++++ - poppler/CairoOutputDev.h | 1 + - 2 files changed, 21 insertions(+) - -commit c60ad119363c65d097dff56a68c1ab3fb2933f0b -Author: Adrian Johnson -Date: Sun Jan 27 15:50:26 2013 +1030 - - A few more missing Goffsets - - glib/poppler-input-stream.h | 2 +- - poppler/PDFDoc.cc | 16 ++++++++-------- - poppler/PDFDoc.h | 6 +++--- - poppler/Stream.cc | 4 ++-- - poppler/Stream.h | 4 ++-- - 5 files changed, 16 insertions(+), 16 deletions(-) - -commit 9b113dc86a27085693ac4bcad061780c881ea7f9 -Author: Adrian Johnson -Date: Sun Jan 27 11:32:34 2013 +1030 - - Use sys/types.h instead of stdio.h for the off_t type - - Bug 44085 - - goo/gtypes.h | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit f3aa5236361dca3db64f110520ebe721ba1c9464 -Author: Pino Toscano -Date: Sun Jan 27 18:50:10 2013 +0100 - - use Goffset also for length in MemStream ctor - - poppler/Stream.cc | 2 +- - poppler/Stream.h | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit eb5ce6990522bac91d8f5d0d3636c46178386d25 -Author: Pino Toscano -Date: Sun Jan 27 15:20:42 2013 +0100 - - avoid max() macro expansion - - protect against compilers defining max as macro - - poppler/XRef.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 6b716b1ab60b573b5770d8636992247387bc3513 -Author: Pino Toscano -Date: Sun Jan 27 15:18:04 2013 +0100 - - cmake: provide HAVE_FSEEK64 and HAVE_FSEEKO in poppler-config - - followup of a3cee0e7e9dd292c70fe1fa19a92e70bbc1e1b41 also for the - cmake-generated poppler-config.h - - poppler/poppler-config.h.cmake | 6 ++++++ - 1 file changed, 6 insertions(+) - -commit fe59ac914230b80aa82b314398a8a038ef083e06 -Author: Adrian Johnson -Date: Sat Jan 26 16:44:49 2013 +1030 - - Read 8 byte xref offsets when sizeof(Goffset) < 8 - - and print an error if the offset read is too large for Goffset. - - Bug 56318 - - poppler/XRef.cc | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - -commit 098d98dfc3846150098f5b20f3f5a07cb565c465 -Author: Lu Wang -Date: Sat Jan 26 19:31:20 2013 +0100 - - Rename function - - Makes it say more what it does - - poppler/GfxState.cc | 3 ++- - poppler/GfxState.h | 3 ++- - poppler/SplashOutputDev.cc | 5 +++-- - 3 files changed, 7 insertions(+), 4 deletions(-) - -commit 97e93d7583f2a6a5b1c8b51474744ca05277dc28 -Author: Lu Wang -Date: Sat Jan 26 16:56:00 2013 +0100 - - Remove unused deviceHasTextClip - - poppler/CairoOutputDev.h | 1 - - poppler/OutputDev.h | 1 - - poppler/PSOutputDev.h | 1 - - poppler/SplashOutputDev.h | 1 - - utils/pdftohtml.cc | 1 - - 5 files changed, 5 deletions(-) - -commit 1bb3ddc2264cb65dffd553a952ee4518344df0de -Author: Albert Astals Cid -Date: Fri Jan 25 19:37:24 2013 +0100 - - A few Goffsets we missed - - charactersRead is returned in BaseCryptStream::getPos thus should - be a Goffset - Gfx::getPos returns Parser::getPos and thus should be a Goffset too - - poppler/Decrypt.h | 3 ++- - poppler/Gfx.cc | 4 ++-- - poppler/Gfx.h | 4 ++-- - 3 files changed, 6 insertions(+), 5 deletions(-) - -commit 5f8b1275a19b2036c6e9323a744d8bc64af31c36 -Author: Albert Astals Cid -Date: Fri Jan 25 19:32:58 2013 +0100 - - New year! - - poppler/poppler-config.h.cmake | 2 +- - poppler/poppler-config.h.in | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -commit 574907e6a74e62a5ee6d7f17c43fdd9bcb07e069 -Author: Albert Astals Cid -Date: Fri Jan 25 19:31:59 2013 +0100 - - Adrian C for 2013 because of the big files support - - cpp/poppler-private.cpp | 1 + - cpp/poppler-private.h | 1 + - goo/gtypes.h | 1 + - poppler/Decrypt.cc | 1 + - poppler/Decrypt.h | 1 + - poppler/Error.cc | 1 + - poppler/Error.h | 1 + - poppler/Hints.cc | 1 + - poppler/Hints.h | 1 + - poppler/JBIG2Stream.cc | 1 + - poppler/JBIG2Stream.h | 1 + - poppler/JPEG2000Stream.cc | 1 + - poppler/JPEG2000Stream.h | 1 + - poppler/Lexer.cc | 2 +- - poppler/Lexer.h | 1 + - poppler/Object.cc | 1 + - poppler/Object.h | 1 + - poppler/PDFDoc.cc | 1 + - poppler/PDFDoc.h | 1 + - poppler/PageTransition.cc | 1 + - poppler/Parser.cc | 1 + - poppler/Parser.h | 1 + - poppler/SecurityHandler.cc | 1 + - poppler/Stream.cc | 1 + - poppler/Stream.h | 1 + - poppler/XRef.cc | 1 + - poppler/XRef.h | 1 + - qt4/src/poppler-private.cc | 1 + - qt4/src/poppler-qiodeviceoutstream-private.h | 1 + - qt4/src/poppler-qiodeviceoutstream.cc | 1 + - utils/pdfinfo.cc | 2 +- - utils/pdfunite.cc | 1 + - 32 files changed, 32 insertions(+), 2 deletions(-) - -commit 95b81ae9b5a345c9caa3d658b9b543d1937c6c02 -Author: Adrian Johnson -Date: Fri Jan 25 21:37:51 2013 +1030 - - gitignore - - qt4/tests/.gitignore | 2 ++ - 1 file changed, 2 insertions(+) - -commit 576dc53c857d99bb5d81fe7c9c52fe314a6e58ee -Author: Thomas Freitag -Date: Fri Jan 25 21:27:13 2013 +1030 - - splash: fix uninitialized memory - - Bug 44085 - - poppler/SplashOutputDev.cc | 13 +++++++------ - 1 file changed, 7 insertions(+), 6 deletions(-) - -commit a9768588cd6086f4ca4e6906db038cfdbfd551d5 -Author: Adrian Johnson -Date: Fri Jan 25 21:24:29 2013 +1030 - - win32 large file support - - Bug 44085 - - goo/gtypes.h | 2 ++ - poppler/Stream.cc | 13 +++++++++++++ - utils/pdfinfo.cc | 3 +++ - 3 files changed, 18 insertions(+) - -commit a3cee0e7e9dd292c70fe1fa19a92e70bbc1e1b41 -Author: Adrian Johnson -Date: Fri Jan 25 21:23:43 2013 +1030 - - Large file support - - Create a Goffset type and use this type for all file offsets and file - sizes. - - Bug 44085 - - cpp/poppler-private.cpp | 2 +- - cpp/poppler-private.h | 2 +- - glib/poppler-input-stream.cc | 10 +- - glib/poppler-input-stream.h | 16 +-- - goo/gtypes.h | 15 +++ - poppler/Decrypt.cc | 2 +- - poppler/Decrypt.h | 2 +- - poppler/Error.cc | 10 +- - poppler/Error.h | 5 +- - poppler/Hints.cc | 4 +- - poppler/Hints.h | 6 +- - poppler/JBIG2Stream.cc | 8 +- - poppler/JBIG2Stream.h | 2 +- - poppler/JPEG2000Stream.cc | 2 +- - poppler/JPEG2000Stream.h | 2 +- - poppler/Lexer.h | 8 +- - poppler/Object.h | 8 +- - poppler/PDFDoc.cc | 54 +++++----- - poppler/PDFDoc.h | 14 +-- - poppler/Parser.cc | 10 +- - poppler/Parser.h | 2 +- - poppler/Stream.cc | 88 ++++++++--------- - poppler/Stream.h | 102 +++++++++---------- - poppler/XRef.cc | 141 - +++++++++++++++++---------- - poppler/XRef.h | 34 +++---- - poppler/poppler-config.h.in | 6 ++ - qt4/src/poppler-private.cc | 2 +- - qt4/src/poppler-qiodeviceoutstream-private.h | 2 +- - qt4/src/poppler-qiodeviceoutstream.cc | 4 +- - test/perf-test.cc | 6 +- - utils/pdfinfo.cc | 6 +- - utils/pdfunite.cc | 2 +- - 32 files changed, 320 insertions(+), 257 deletions(-) - -commit 6eebbb9c015f98b713205e56ab2f1d4d430e9206 -Author: Adrian Johnson -Date: Fri Jan 25 21:22:51 2013 +1030 - - Add Int64 object type - - Bug 44085 - - poppler/Lexer.cc | 46 - ++++++++++++++++++++-------------------------- - poppler/Object.cc | 6 +++--- - poppler/Object.h | 26 +++++++++++++++----------- - poppler/PDFDoc.cc | 4 ++-- - poppler/SecurityHandler.cc | 4 ++-- - qt4/tests/check_lexer.cpp | 24 +++++++++++++++++------- - test/pdf-fullrewrite.cc | 9 +-------- - 7 files changed, 60 insertions(+), 59 deletions(-) - -commit be495d73ce7324963a979cffc149330f5512288b -Author: Adrian Johnson -Date: Fri Jan 25 21:14:21 2013 +1030 - - use getNum instead of getReal - - poppler/PageTransition.cc | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -commit a5adb6738e1e191c64457e0c07ee2e3422a042dd -Author: Albert Astals Cid -Date: Sat Jan 19 18:13:33 2013 +0100 - - Don't use config.h but poppler-config.h - - That was already included but i forgot to kill the other one - - poppler/XRef.h | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -commit 8eb489c355d734a72e140ce7e32470d048362499 -Author: Thomas Freitag -Date: Sat Jan 19 17:43:08 2013 +0100 - - Make rendering thread-safe - - Bug #50992 - - glib/poppler-input-stream.cc | 4 ++ - glib/poppler-input-stream.h | 1 + - poppler/Annot.cc | 52 +++++++++---------- - poppler/Array.cc | 48 +++++++++++++++++- - poppler/Array.h | 15 ++++-- - poppler/ArthurOutputDev.cc | 3 +- - poppler/ArthurOutputDev.h | 3 +- - poppler/CairoFontEngine.cc | 33 +++++++++--- - poppler/CairoFontEngine.h | 11 ++-- - poppler/CairoOutputDev.cc | 15 ++++-- - poppler/CairoOutputDev.h | 5 +- - poppler/Catalog.cc | 84 +++++++++++++++++++++++++++---- - poppler/Catalog.h | 15 ++++-- - poppler/Dict.cc | 67 ++++++++++++++++++++++++- - poppler/Dict.h | 11 +++- - poppler/Gfx.cc | 18 ++++--- - poppler/Gfx.h | 8 +-- - poppler/GlobalParamsWin.cc | 4 +- - poppler/Object.h | 7 +-- - poppler/OutputDev.h | 4 +- - poppler/PDFDoc.cc | 66 ++++++++++++++++++------ - poppler/PDFDoc.h | 11 ++-- - poppler/PSOutputDev.cc | 12 ++--- - poppler/PSOutputDev.h | 4 +- - poppler/Page.cc | 75 ++++++++++++++++++++++++--- - poppler/Page.h | 18 +++++-- - poppler/Parser.cc | 3 +- - poppler/PreScanOutputDev.cc | 4 +- - poppler/PreScanOutputDev.h | 4 +- - poppler/SplashOutputDev.cc | 16 +++--- - poppler/SplashOutputDev.h | 5 +- - poppler/Stream.cc | 117 - ++++++++++++++++++++++++++++++++----------- - poppler/Stream.h | 35 +++++++++---- - poppler/TextOutputDev.cc | 5 +- - poppler/TextOutputDev.h | 3 +- - poppler/XRef.cc | 99 +++++++++++++++++++++++++++++++++--- - poppler/XRef.h | 16 +++++- - qt4/src/poppler-document.cc | 23 ++++----- - qt4/src/poppler-page.cc | 64 ++++++++++++++++++++--- - qt4/src/poppler-private.cc | 3 +- - qt4/src/poppler-private.h | 74 +-------------------------- - test/gtk-test.cc | 2 +- - utils/HtmlOutputDev.cc | 3 +- - utils/HtmlOutputDev.h | 3 +- - utils/ImageOutputDev.h | 3 +- - 45 files changed, 793 insertions(+), 283 deletions(-) - -commit 3db9472e2b016f1b411174273f27848193ab18e5 -Author: José Aliste -Date: Fri Jan 18 15:22:03 2013 +0100 - - Add a null check for gfxFont - - Bug #59561 - - poppler/TextOutputDev.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 4b69217f72f3fd313f73df059eb1e6294878a95e -Author: Peter Dyballa -Date: Fri Jan 11 00:32:46 2013 +0100 - - Use CPPFLAGS for CPPFLAGS not CFLAGS - - Bug #59186 - - m4/libjpeg.m4 | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 8b6dc55e530b2f5ede6b9dfb64aafdd1d5836492 -Author: Albert Astals Cid -Date: Thu Jan 10 22:31:52 2013 +0100 - - Fix invalid memory access in 1150.pdf.asan.8.69 - - splash/Splash.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit e14b6e9c13d35c9bd1e0c50906ace8e707816888 -Author: Albert Astals Cid -Date: Thu Jan 10 20:52:02 2013 +0100 - - Fix invalid memory access in 2030.pdf.asan.69.463 - - poppler/Function.cc | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -commit 0388837f01bc467045164f9ddaff787000a8caaa -Author: Albert Astals Cid -Date: Thu Jan 10 20:29:06 2013 +0100 - - Fix another invalid memory access in 1091.pdf.asan.72.42 - - poppler/Stream.cc | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -commit 957aa252912cde85d76c41e9710b33425a82b696 -Author: Albert Astals Cid -Date: Thu Jan 10 19:16:19 2013 +0100 - - Fix invalid memory accesses in 1091.pdf.asan.72.42 - - splash/Splash.cc | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -commit bbc2d8918fe234b7ef2c480eb148943922cc0959 -Author: Albert Astals Cid -Date: Thu Jan 10 19:07:48 2013 +0100 - - Fix invalid memory accesses in 1036.pdf.asan.23.17 - - splash/Splash.cc | 14 ++++++++++++-- - 1 file changed, 12 insertions(+), 2 deletions(-) - -commit a9b8ab4657dec65b8b86c225d12c533ad7e984e2 -Author: Albert Astals Cid -Date: Wed Jan 9 22:56:45 2013 +0100 - - Fix crash in broken file 1031.pdf.asan.48.15 - - splash/Splash.cc | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - -commit 7266a634e01e20648cc877371edc95651d30d4fc -Author: Albert Astals Cid -Date: Wed Jan 9 22:52:45 2013 +0100 - - Forgot the C of the last commit - - splash/Splash.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit a205e71a2dbe0c8d4f4905a76a3f79ec522eacec -Author: Albert Astals Cid -Date: Wed Jan 9 22:47:28 2013 +0100 - - Do not crash in broken documents like 1007.pdf.asan.48.4 - - splash/Splash.cc | 12 +++++++++++- - 1 file changed, 11 insertions(+), 1 deletion(-) - -commit b1026b5978c385328f2a15a2185c599a563edf91 -Author: Albert Astals Cid -Date: Wed Jan 9 22:17:09 2013 +0100 - - Initialize refLine totally - - Fixes uninitialized memory read in 1004.pdf.asan.7.3 - - poppler/Stream.cc | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -commit bef2c42f381c74fdb8bbb43babe1a93a0e229fb0 -Author: Adrian Johnson -Date: Thu Jan 3 15:27:36 2013 +1030 - - Parser: return error if stream encountered when allowStreams = false - - Opening a PDF file where the first object is a stream prints a - "Command token too long" error message. This is caused by the - Linearization check in Linearization::Linearization reading objects - with allowStreams = false. The Parser ignores the "stream" token and - tries reading the next token which is usually binary data. Setting - allowStreams to true will not work since the stream length is often an - indirect object and at this point the XRef has not been created. - - Fix this by making Parser return an error object if the "stream" token - is encountered when allowStreams is false. - - Bug 58966 - - poppler/Parser.cc | 14 +++++++------- - 1 file changed, 7 insertions(+), 7 deletions(-) - -commit 801f7feea79e5bc3b5417566552e4df1e6b8a51c -Author: Albert Astals Cid -Date: Sat Dec 29 19:22:54 2012 +0100 - - 0.22.0 - - CMakeLists.txt | 6 +++--- - NEWS | 14 ++++++++++++++ - configure.ac | 4 ++-- - cpp/Doxyfile | 2 +- - poppler/Makefile.am | 2 +- - qt4/src/Doxyfile | 2 +- - 6 files changed, 22 insertions(+), 8 deletions(-) - -commit bf5ef68c89d4189b18458b764f807cfc6599bad7 -Author: Carlos Garcia Campos -Date: Sat Dec 29 19:43:11 2012 +0100 - - regtest: Print test results when the test has finished - - To make sure the result corresponds to the test now that we are using - multiple threads. - - regtest/Printer.py | 25 +++++++++++++++++++------ - regtest/TestRun.py | 18 +++++++++--------- - 2 files changed, 28 insertions(+), 15 deletions(-) - -commit 80c7f6aa3fa83175fafc71fa8c834350d513a48f -Author: Jason Crain -Date: Fri Nov 23 23:31:01 2012 -0600 - - TextOutputDev: Use page size for max value in TextPage::visitSelection - - https://bugs.freedesktop.org/show_bug.cgi?id=50138 - - poppler/TextOutputDev.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 0d31edfa5617f4fecb04d5476de54a63b6146686 -Author: Ross Lagerwall -Date: Fri Nov 30 09:23:55 2012 +0000 - - pdf-inspector Change from the deprecated GtkTable to GtkGrid - - This fixes the problem of the description_label height changing after - its text changes which was introduced since the port to Gtk3. - - https://bugs.freedesktop.org/show_bug.cgi?id=57727 - - test/pdf-inspector.ui | 39 +++++++++++++++------------------------ - 1 file changed, 15 insertions(+), 24 deletions(-) - -commit 9977a4f26b5698b0b85ca911e7392013941944e0 -Author: Ross Lagerwall -Date: Tue Nov 13 15:49:44 2012 +0000 - - pdf-inspector: Remove deprectated has-separator property - - https://bugs.freedesktop.org/show_bug.cgi?id=57727 - - test/pdf-inspector.ui | 1 - - 1 file changed, 1 deletion(-) - -commit 806d116a38c2a6552c9bcee2c6f753d7059c17aa -Author: Ross Lagerwall -Date: Tue Nov 13 15:44:15 2012 +0000 - - pdf-inspector: Add correct title and copyright - - https://bugs.freedesktop.org/show_bug.cgi?id=57727 - - test/pdf-inspector.cc | 5 ++--- - 1 file changed, 2 insertions(+), 3 deletions(-) - -commit 7d5bf74c19768fa3447819a4debff06d5d83900a -Author: Ross Lagerwall -Date: Tue Nov 13 15:23:36 2012 +0000 - - pdf-inspector: Fix crash by not freeing filename_g - - It is not necessary because PDFDoc takes over filename_g and destroys - it in its deconstructor. - - https://bugs.freedesktop.org/show_bug.cgi?id=57727 - - test/pdf-inspector.cc | 1 - - 1 file changed, 1 deletion(-) - -commit d61c6d4944d6f7c9e8b517dd28958124f4923d08 -Author: Thomas Freitag -Date: Fri Dec 28 01:18:48 2012 +0100 - - Repair pdfunite - - Sorry, when I implemented the support encrypted pdf files in - pdfseparate I - missed that writePageObjects of course is also used in pdfunite - for combining - pages, and even more that encrypted files are still not supported - by pdfunite, - I removed the numoffset from writing the objects itself. Therefore - there are - still all objects in the combined pdf file, but the references - missing the - numoffset and therefore were no more reachable. - The patch repairs it. - - Bug #58569 - - poppler/PDFDoc.cc | 6 ++++-- - poppler/PDFDoc.h | 4 ++-- - utils/pdfunite.cc | 4 ++-- - 3 files changed, 8 insertions(+), 6 deletions(-) - -commit be4804bff2b722ceac180da52ad436fee548f9ee -Author: Albert Astals Cid -Date: Fri Dec 28 01:17:14 2012 +0100 - - dos2unix - - poppler/PDFDoc.cc | 36 ++++++++++++++++++------------------ - 1 file changed, 18 insertions(+), 18 deletions(-) - -commit 703c77eb59aa22ab6372d56a20ee81dc7dfa6e4a -Author: Even Rouault -Date: Fri Dec 28 00:57:17 2012 +0100 - - Fix very long loop in JPXStream::getImageParams() - - poppler/JPXStream.cc | 14 ++++++++++---- - 1 file changed, 10 insertions(+), 4 deletions(-) - -commit 7e0be7854adc49e4e00c0badb0dc470fbdf6d612 -Author: Even Rouault -Date: Fri Dec 28 00:44:29 2012 +0100 - - Avoid DoS due to huge number of JPX tiles in a stream - - poppler/JPXStream.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 2017dbebd9afd4f172242ff8462fce739d911e64 -Author: Even Rouault -Date: Fri Dec 28 00:30:13 2012 +0100 - - Do not crash on 0 or negative nBits values - - poppler/Stream.cc | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -commit 858df0dc04e2f306e806fe0fc4fb5c8ec804e263 -Author: Albert Astals Cid -Date: Thu Dec 27 23:30:27 2012 +0100 - - Fix arg typo - - poppler/PDFDoc.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 1dd6280d79ad22461208702b3c929377887c99ff -Author: Albert Astals Cid -Date: Sat Dec 15 16:39:23 2012 +0100 - - 0.21.4 soversion increases - - CMakeLists.txt | 2 +- - glib/CMakeLists.txt | 2 +- - glib/Makefile.am | 2 +- - poppler/Makefile.am | 2 +- - 4 files changed, 4 insertions(+), 4 deletions(-) - -commit 99d0288bb0b6879ae5414d174939bbd9c1e90bd3 -Author: Albert Astals Cid -Date: Sat Dec 15 16:37:19 2012 +0100 - - 0.21.4 version increase - - CMakeLists.txt | 2 +- - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - 4 files changed, 4 insertions(+), 4 deletions(-) - -commit 2bc48d5369f1dbecfc4db2878f33bdeb80d8d90f -Author: Albert Astals Cid -Date: Sat Dec 15 16:36:38 2012 +0100 - - 0.21.4 NEWS - - NEWS | 18 ++++++++++++++++++ - 1 file changed, 18 insertions(+) - -commit b3423d54b1254597d7ca953872211fa3aa83e29c -Author: Albert Astals Cid -Date: Sat Dec 15 16:29:54 2012 +0100 - - Updated copyrights - - goo/JpegWriter.h | 2 +- - goo/PNGWriter.cc | 1 + - goo/PNGWriter.h | 1 + - goo/TiffWriter.cc | 1 + - goo/TiffWriter.h | 1 + - poppler/GlobalParams.cc | 2 +- - poppler/TextOutputDev.cc | 1 + - splash/Splash.cc | 1 + - utils/HtmlOutputDev.cc | 1 + - 9 files changed, 9 insertions(+), 2 deletions(-) - -commit 487f20d24830a97cad4773ae27f0c2cc58df2ed0 -Author: Albert Astals Cid -Date: Thu Dec 13 20:40:39 2012 +0100 - - Check obj1 is a dict before using it - - Fixes bug #58257 - - poppler/Gfx.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 03045469206adbd797e3a38fee3a16cdd1716812 -Author: Albert Astals Cid -Date: Thu Dec 13 19:24:54 2012 +0100 - - Fix crop on EPS conversion - - Bug #30692 - Patch is half William Bader's and half mine - - poppler/OutputDev.h | 5 +++++ - poppler/PSOutputDev.h | 4 +++- - poppler/Page.cc | 3 +++ - poppler/Page.h | 2 ++ - 4 files changed, 13 insertions(+), 1 deletion(-) - -commit 5d50b2765428e5a417967be2f41452ab05917db7 -Author: Peter Breitenlohner -Date: Tue Dec 11 18:54:30 2012 +0100 - - Correct bad semantics - - Negation has higher precedence than comparison - Confirmed by Marek Kasik that wrote the code originally - - poppler/TextOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit e306bad391a3ff49593f1f3bac0717d62599bd13 -Author: Pino Toscano -Date: Sun Dec 9 22:40:27 2012 +0100 - - pngwriter: move #include into .cc file - - Move all the private data (including the libpng types) to a private - class. - - This requires HtmlOutputDev.cc to include on its own (which - is correct, since it uses the libpng API directly). - - goo/PNGWriter.cc | 98 - +++++++++++++++++++++++++++++--------------------- - goo/PNGWriter.h | 12 ++----- - utils/HtmlOutputDev.cc | 4 +++ - 3 files changed, 64 insertions(+), 50 deletions(-) - -commit cf338551e9d031cc00d56cea0d258ec5fd96e79a -Author: Pino Toscano -Date: Sun Dec 9 22:22:03 2012 +0100 - - tiffwriter: move #include into .cc file - - Move all the private data (including the libtiff types) to a private - class. - - goo/TiffWriter.cc | 94 - ++++++++++++++++++++++++++++++++----------------------- - goo/TiffWriter.h | 12 ++----- - 2 files changed, 56 insertions(+), 50 deletions(-) - -commit 0dfa51f0bfa787ee9c865fd4f05e4bd964c260fc -Author: Albert Astals Cid -Date: Sun Dec 9 22:31:50 2012 +0100 - - Having a look at the log Marek has (C) in this file - - poppler/TextOutputDev.cc | 1 + - 1 file changed, 1 insertion(+) - -commit f1b2e29e1d5f420903085318f06c4dc83ebb24f3 -Author: Thomas Freitag -Date: Sun Dec 9 20:59:26 2012 +0100 - - Fix crash when rendering on mono1 - - poppler/SplashOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 71bad47ed6a36d825b0d08992c8db56845c71e40 -Author: Marek Kasik -Date: Sun Dec 9 20:20:00 2012 +0100 - - Filter stuff that might end up in the shell - - Since it seems shells don't know how to filter stuff and might - causing bad things to happen - - poppler/Error.cc | 21 +++++++++++++++++---- - 1 file changed, 17 insertions(+), 4 deletions(-) - -commit c35d030472e6cb140c3dff30b91541772c992eb0 -Author: Albert Astals Cid -Date: Sat Dec 8 23:51:59 2012 +0100 - - Add private copy constructor and operator= to make sure we don't - use the default ones - - Since using them would results in bad things happening - - goo/GooHash.h | 16 ++++++++++++++++ - goo/GooList.h | 16 ++++++++++++++++ - goo/PNGWriter.h | 5 ++++- - goo/TiffWriter.h | 5 ++++- - goo/gfile.h | 4 ++++ - 5 files changed, 44 insertions(+), 2 deletions(-) - -commit f6741d9242bf2d9c13c8d534c50c8e4d404afc7f -Author: Adrian Johnson -Date: Sun Dec 2 09:34:35 2012 +1030 - - jpegwriter: move #include "jpeglib.h" into .cc file - - On cygwin pdftocairo -v shows the wrong version due to - jpeglib.h defining PACKAGE_VERSION. - - Avoid polluting our header files by moving libjpeg.h and - libjpeg types into JpegWriter.cc - - Bug 57687 - - goo/JpegWriter.cc | 120 - ++++++++++++++++++++++++++++++++----------------- - goo/JpegWriter.h | 25 ++++++----- - splash/SplashBitmap.cc | 2 +- - utils/pdftocairo.cc | 4 +- - 4 files changed, 95 insertions(+), 56 deletions(-) - -commit e78dbb1b7dbd20c3ae547b02270ab0648c1bfc61 -Author: Adrian Johnson -Date: Sun Dec 2 09:10:32 2012 +1030 - - Reformat goo/*Writer files to poppler style - - goo/ImgWriter.h | 20 ++--- - goo/JpegWriter.cc | 184 ++++++++++++++++++++++---------------------- - goo/JpegWriter.h | 38 ++++----- - goo/PNGWriter.cc | 224 - +++++++++++++++++++++++++++--------------------------- - goo/PNGWriter.h | 62 +++++++-------- - goo/TiffWriter.cc | 40 +++++----- - goo/TiffWriter.h | 58 +++++++------- - 7 files changed, 313 insertions(+), 313 deletions(-) - -commit 1bfe4b22cf893dd498d6f306ee9cf942c72fe3ed -Author: Matthias Kramm -Date: Mon Nov 19 12:39:56 2012 -0800 - - Fix linewidths in monochrome mode. - - For zoom levels that scale the page below sqrt(2) of the original - resolution, monochrome line widths were wrong (snapped back to 1 pixel - wide.) This patch fixes that issue. - - splash/Splash.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit e5008bdb26df0135edfbd30a811df2332f4e036c -Author: José Aliste -Date: Sat Dec 8 10:33:21 2012 -0300 - - glib-demo: Update the demo to modify flags of annotations - - https://bugs.freedesktop.org/show_bug.cgi?id=58015 - - glib/demo/annots.c | 65 - ++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 65 insertions(+) - -commit 8cd5cae953de374276c11711dc106de15c8dcad0 -Author: Carlos Garcia Campos -Date: Sat Dec 8 18:57:07 2012 +0100 - - regtest: Use the number of cpus as default number of worker threads - - regtest/main.py | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -commit 605c363b04ba3853883010c0a413054fe246d9aa -Author: Carlos Garcia Campos -Date: Sat Dec 8 18:45:22 2012 +0100 - - regtest: Remove trailing whitespaces - - regtest/TestReferences.py | 10 +++++----- - regtest/TestRun.py | 10 +++++----- - regtest/main.py | 6 +++--- - 3 files changed, 13 insertions(+), 13 deletions(-) - -commit 787a8438708397f0a1bf26e93726f544c91533e6 -Author: Hib Eris -Date: Sun Dec 2 08:03:10 2012 +0100 - - Fix compile warning on deprecated conversion from string constant - - Fixes (for win32): - - CXX GlobalParams.lo - GlobalParams.cc: In function 'char* get_poppler_datadir()': - GlobalParams.cc:181:12: warning: deprecated conversion from string - constant to 'char*' [-Wwrite-strings] - - poppler/GlobalParams.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit cb3a10417ae659fdb7b77132c569c93ec00bc95e -Author: Fabio D'Urso -Date: Sun Dec 2 01:41:05 2012 +0100 - - Fixed check_lexer on 32-bit systems - - qt4/tests/check_lexer.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 8550576bdf74180b62f54f9fd59213fbcd0a1be1 -Author: José Aliste -Date: Sat Dec 8 10:33:04 2012 -0300 - - glib: Add poppler_annot_set_flags - - https://bugs.freedesktop.org/show_bug.cgi?id=58015 - - glib/poppler-annot.cc | 22 ++++++++++++++++++++++ - glib/poppler-annot.h | 2 ++ - 2 files changed, 24 insertions(+) - -commit 15dcc5426ce319429e1a2c518902effb2ddf06cf -Author: Adam Reichold -Date: Thu Dec 6 18:45:46 2012 +0100 - - implement parallel testing using Python's Queue class - - regtest/Printer.py | 36 +++++++++++++++++----------- - regtest/TestReferences.py | 23 +++++++++++++++++- - regtest/TestRun.py | 58 - ++++++++++++++++++++++++++++++++++++---------- - regtest/backends/cairo.py | 5 ++-- - regtest/backends/splash.py | 5 ++-- - regtest/main.py | 11 ++++++++- - 6 files changed, 104 insertions(+), 34 deletions(-) - -commit c46646020826136b403e9aae8e2ded24c7165522 -Author: Hib Eris -Date: Sun Dec 2 10:04:28 2012 +0100 - - glib-demo: Do not use deprecated gtk_color_button_{get,set}_rgba() - - Since Gtk 3.4, gtk_color_button_get_rgba() and - gtk_color_button_set_rgba() have been deprecated. - - https://bugs.freedesktop.org/show_bug.cgi?id=57798 - - glib/demo/selections.c | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -commit f8c1b55e764a6e79b0530fb1be9ee11917f4237e -Author: Albert Astals Cid -Date: Sat Dec 1 22:19:17 2012 +0100 - - 0.21.3 - - 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 e3716d9d735a1093399a3c5c33ea5471a6adc405 -Author: Albert Astals Cid -Date: Sat Dec 1 22:34:00 2012 +0100 - - Build on make check correctly - - qt4/tests/check_goostring.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit c7ae96b162e8a05269a54c31f8e7c411edc84553 -Merge: 1f279c3 b1dacd1 -Author: Albert Astals Cid -Date: Sat Dec 1 21:26:24 2012 +0100 - - Merge commit 'b1dacd1e6ab00eb1976491eb2b45c76671011b38' - -commit 1f279c32dcdc899b509fc00aaa57382bc8af90f3 -Author: Albert Astals Cid -Date: Sat Dec 1 20:37:52 2012 +0100 - - Update copyrights - - poppler/CairoOutputDev.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 5daa17c013be8ebe180ff48207e189bd9bd50a84 -Author: Albert Astals Cid -Date: Sat Dec 1 20:06:17 2012 +0100 - - Initialize to NULL, fixes crash - - Since the TextStringToUCS4 not always assigns to second param, - initialize uni to NULL - - poppler/TextOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit f673be852e6564e039b5ec24e5bf583149b1d5a4 -Author: Jason Crain -Date: Sat Dec 1 20:03:00 2012 +0100 - - Allow large chars in TextPage - - poppler/TextOutputDev.cc | 1 - - 1 file changed, 1 deletion(-) - -commit aca122432951c4c0a2a5dbaba046d848f2153b84 -Author: Hib Eris -Date: Sat Jun 23 18:27:55 2012 +0200 - - Fix compile warning on unused variable filename_g - - glib/poppler-document.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit c702066961b1cc2a9c0fb16546e9db93c312813b -Author: Hib Eris -Date: Sat Jun 23 18:23:59 2012 +0200 - - Do not use 'size' uninitialized - - poppler/PDFDoc.cc | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -commit 14bdeacb0eb8e4a1d3995f310a1b526e4dcc96dc -Author: Hib Eris -Date: Sat Jun 23 18:09:01 2012 +0200 - - Fix compile warnings on deprecated conversion from string constant to - 'char*' - - poppler/FileSpec.cc | 3 ++- - poppler/GlobalParamsWin.cc | 4 ++-- - 2 files changed, 4 insertions(+), 3 deletions(-) - -commit 72d4a1ba998218de876e2a0e939bbec4b7795299 -Author: Hib Eris -Date: Sat Jun 23 17:52:13 2012 +0200 - - Fix compile warning on signed/unsigned comparison - - goo/gfile.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 1262111e70ff161e495505bd6a262cc0357a943c -Author: Hib Eris -Date: Sat Jun 23 17:46:54 2012 +0200 - - Remove unused variable - - goo/gfile.cc | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -commit 85572b85950ed4e4421f1e61e704e5c250ca27d9 -Author: Albert Astals Cid -Date: Sat Dec 1 01:50:25 2012 +0100 - - Silence gcc warning - - Bug #57572 - - goo/TiffWriter.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit a97aead193a927b91a4e33d7b5d2ba7179e664df -Author: Adrian Johnson -Date: Fri Nov 30 21:30:19 2012 +0100 - - Splash: Implement bilinear image scaling - - Bug #22138 - - poppler/SplashOutputDev.cc | 10 +-- - splash/Splash.cc | 183 - ++++++++++++++++++++++++++++++++++++++++++--- - splash/Splash.h | 13 +++- - 3 files changed, 188 insertions(+), 18 deletions(-) - -commit e6806d893a9a104e3f23d69d0245ad0e4948a409 -Author: Pino Toscano -Date: Wed Nov 28 17:59:36 2012 +0100 - - cmake: Enable compiler warnings for C code - - Compilation of glib/demo uses a C compiler, thus compiler warnings - should be enabled in the CFLAGS variable. - - followup of 5c5945d163fe406960ccc2e3a71882722b9e69d1 - - CMakeLists.txt | 2 ++ - 1 file changed, 2 insertions(+) - -commit bdb17da35de49b9fd1a549c3afd5e36004552080 -Author: Hib Eris -Date: Mon Nov 26 20:38:03 2012 +0100 - - cairo: Fix uninitaliazed warning in CairoOutputDev - - Fix warning: - - CXX CairoOutputDev.lo - ../../poppler/poppler/CairoOutputDev.cc: In member function 'virtual - void RescaleDrawImage::getRow(int, uint32_t*)': - ../../poppler/poppler/CairoOutputDev.cc:2813:25: warning: 'pix' - may be used uninitialized in this function [-Wuninitialized] - - https://bugs.freedesktop.org/show_bug.cgi?id=57571 - - poppler/CairoOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit beff044e4fdf44e80ad7c75255cb71a83e70a293 -Author: Hib Eris -Date: Tue Nov 27 22:19:01 2012 +0100 - - glib-demo: Fix warning on signedness - - Fixes: - - CC attachments.o - ../../../poppler/glib/demo/attachments.c: In function - ‘attachment_save_callback’: - ../../../poppler/glib/demo/attachments.c:190:2: warning: pointer - targets in passing argument 2 of ‘g_checksum_update’ differ in - signedness [-Wpointer-sign] - /usr/include/glib-2.0/glib/gchecksum.h:69:23: note: expected ‘const - guchar *’ but argument is of type ‘const gchar *’ - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/attachments.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit b484749ffa58315e4b61738d652347d7a77da982 -Author: Hib Eris -Date: Tue Nov 27 19:38:59 2012 +0100 - - glib-demo: Fix set but unused warning - - Fixes: - - CC print.o - ../../../poppler/glib/demo/print.c: In function - ‘pgd_print_draw_page’: - ../../../poppler/glib/demo/print.c:68:27: warning: variable - ‘settings’ set but not used [-Wunused-but-set-variable] - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/print.c | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - -commit 8438daf7bf7ab1b96c6899baab7e47d9c634cb3d -Author: Hib Eris -Date: Sun Jun 24 14:54:31 2012 +0200 - - glib-demo: pgd_text_view_query_tooltip(): return a gboolean - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/text.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -commit ff9e211cfb60eb820b9b046da546352fa59d7df9 -Author: Hib Eris -Date: Sat Jun 23 22:56:02 2012 +0200 - - glib-demo: Remove set but unused variable textinfo - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/text.c | 2 -- - 1 file changed, 2 deletions(-) - -commit 8e5ae33bc63eca5297dea12fc281ba223f5be09a -Author: Hib Eris -Date: Sat Jun 23 22:44:22 2012 +0200 - - glib-demo: Fix warning "operation on 'page' may be undefined - [-Wsequence-point]" - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/text.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit c6f98d62b885e1d7f6ce1f265d4a87dca36494de -Author: Hib Eris -Date: Sat Jun 23 22:38:35 2012 +0200 - - glib-demo: Remove unused variable slice_selector - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/render.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit da56d280e2a51229c93117d8b537897ba63296cf -Author: Hib Eris -Date: Sat Jun 23 22:36:29 2012 +0200 - - glib-demo: Remove unused variable region - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/selections.c | 1 - - 1 file changed, 1 deletion(-) - -commit c792e59064018e0fd899f32080489419517f2bbe -Author: Hib Eris -Date: Sat Jun 23 22:34:44 2012 +0200 - - glib-demo: Do not use 'text' uninitialized - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/utils.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit c5a8f7eda14030436e6905dd826e72cabbcf0e5f -Author: Hib Eris -Date: Sat Jun 23 22:26:53 2012 +0200 - - glib-demo: Fix warning on unused variable selection - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/layers.c | 1 - - 1 file changed, 1 deletion(-) - -commit 4ceb3f4f4ca0092e79bb36723a7332b071491666 -Author: Hib Eris -Date: Sat Jun 23 18:36:12 2012 +0200 - - glib-demo: Fix warnings on unused variables - - https://bugs.freedesktop.org/show_bug.cgi?id=57620 - - glib/demo/annots.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -commit 5c5945d163fe406960ccc2e3a71882722b9e69d1 -Author: Hib Eris -Date: Tue Nov 27 19:21:34 2012 +0100 - - Enable compiler warnings for C code - - Compilation of glib/demo uses a C compiler, thus compiler warnings - should be enabled in the CFLAGS variable. - - configure.ac | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 55940e989701eb9118015e30f4f48eb654fa34c4 -Author: Pino Toscano -Date: Tue Nov 27 16:05:15 2012 +0100 - - fix my previous GooString::insert fix - - we need only to move the characters after the specified position, - not all of them - - extend qt4's check_goostring with few more checks covering this - (and the previous) fix - - goo/GooString.cc | 2 +- - qt4/tests/check_goostring.cpp | 39 - +++++++++++++++++++++++++++++++++++++++ - 2 files changed, 40 insertions(+), 1 deletion(-) - -commit dcbc9686d97f4f6596c43d1f701207278c25f8eb -Author: Pino Toscano -Date: Mon Nov 26 14:44:21 2012 +0100 - - glib/cmake: Include Gio-2.0 for introspection - - Fixes g-ir-scanner warnings: - poppler-document.cc:257: Warning: Poppler: - poppler_document_new_from_stream: argument stream: Unresolved type: - 'GInputStream*' - poppler-document.cc:257: Warning: Poppler: - poppler_document_new_from_stream: argument cancellable: Unresolved - type: 'GCancellable*' - poppler-document.cc:315: Warning: Poppler: - poppler_document_new_from_gfile: argument file: Unresolved type: - 'GFile*' - poppler-document.cc:315: Warning: Poppler: - poppler_document_new_from_gfile: argument cancellable: Unresolved - type: 'GCancellable*' - - https://bugs.freedesktop.org/show_bug.cgi?id=56218 - - folloup of c84753e12029fcc6113f80dedc9a943ce1deb214 - - glib/CMakeLists.txt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 169e4cb001fa235ca608d3d0b42ea4214161fc2d -Author: Pino Toscano -Date: Mon Nov 26 14:42:59 2012 +0100 - - glib/cmake: Show all suppressed introspection scanner warnings - - https://bugs.freedesktop.org/show_bug.cgi?id=56218 - - followup of 11a1f6f512a7d7b86defeb5963fa16bc08e3ba1c - - glib/CMakeLists.txt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 62c0dbbe9f1987c78eeb87f248d35e7fd73e968a -Author: Albert Astals Cid -Date: Mon Nov 26 00:40:57 2012 +0100 - - Check GooString::insert - - Checks we don't break what we just fixed with Pino's patch - - qt4/tests/CMakeLists.txt | 1 + - qt4/tests/Makefile.am | 7 ++++++- - qt4/tests/check_goostring.cpp | 22 ++++++++++++++++++++++ - 3 files changed, 29 insertions(+), 1 deletion(-) - -commit 01e438ca47776075c8171bda090e7d859fd9f620 -Author: Adam Reichold -Date: Mon Nov 26 00:39:05 2012 +0100 - - Don't use memcpy to copy classes - - poppler/Function.cc | 63 - +++++++++++++++++++++++++++++++++++++++++++---------- - poppler/Function.h | 11 ++++++---- - 2 files changed, 59 insertions(+), 15 deletions(-) - -commit 7ba15d11e56175601104d125d5e4a47619c224bf -Author: Pino Toscano -Date: Mon Nov 26 00:29:35 2012 +0100 - - fix GooString::insert() - - Hi, - - as reported in a Debian bug [1], it seems GooString::insert could lead - to using uninitialized memory. - The case is a simple: - GooString goo; - goo.insert(0, "."); - goo.insert(0, "This is a very long long test string"); - i.e. basically first insert a single character at position 0, and - then a - string longer than STR_STATIC_SIZE always at position 0. - - [1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=693817 - - goo/GooString.cc | 5 ++--- - 1 file changed, 2 insertions(+), 3 deletions(-) - -commit 703f85a10cf7ad61d2f2d3a5faf347fdddcb4738 -Author: Carlos Garcia Campos -Date: Sun Nov 25 12:36:33 2012 +0100 - - glib: Fix returns tag in PopplerAttachmentSaveFunc api doc - - glib/poppler-attachment.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 52896031783b28cee350ea92c8736e2c2e4e9d33 -Author: José Aliste -Date: Mon Nov 19 23:47:19 2012 +0100 - - glib: Add missing ":" at the end of some functions documentation - - New versions of gir-scanner emit a warning when the : at - the end of the function documentation is not found. - - https://bugs.freedesktop.org/show_bug.cgi?id=56218 - - glib/poppler-annot.cc | 2 +- - glib/poppler-form-field.cc | 10 +++++----- - glib/poppler-layer.cc | 12 ++++++------ - 3 files changed, 12 insertions(+), 12 deletions(-) - -commit 60dfc1a3471f824f40b0bef5b97a7b04bd78e72b -Author: Hib Eris -Date: Sat Oct 20 10:17:01 2012 +0200 - - glib: Exclude poppler-input-stream.h from introspection files - - Fixes warning: - - poppler-input-stream.h:28: Warning: Poppler: - symbol='inputStreamBufSize': Unknown namespace for symbol - 'inputStreamBufSize' - - https://bugs.freedesktop.org/show_bug.cgi?id=56218 - - glib/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit c84753e12029fcc6113f80dedc9a943ce1deb214 -Author: Hib Eris -Date: Sat Oct 20 09:40:09 2012 +0200 - - glib: Include Gio-2.0 for introspection - - Fixes g-ir-scanner warnings: - poppler-document.cc:257: Warning: Poppler: - poppler_document_new_from_stream: argument stream: Unresolved type: - 'GInputStream*' - poppler-document.cc:257: Warning: Poppler: - poppler_document_new_from_stream: argument cancellable: Unresolved - type: 'GCancellable*' - poppler-document.cc:315: Warning: Poppler: - poppler_document_new_from_gfile: argument file: Unresolved type: - 'GFile*' - poppler-document.cc:315: Warning: Poppler: - poppler_document_new_from_gfile: argument cancellable: Unresolved - type: 'GCancellable*' - - https://bugs.freedesktop.org/show_bug.cgi?id=56218 - - glib/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 11a1f6f512a7d7b86defeb5963fa16bc08e3ba1c -Author: Hib Eris -Date: Sat Oct 20 09:30:05 2012 +0200 - - glib: Show all suppressed introspection scanner warnings - - https://bugs.freedesktop.org/show_bug.cgi?id=56218 - - glib/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 16812829a7d4816717731318b1aa1bc3ab5e3935 -Author: Jason Crain -Date: Mon Aug 27 22:42:11 2012 -0500 - - Update fill and stroke color in CairoOutputDev::startPage - - Keep fill_color and stroke_color from falling out of sync with - fill_pattern and stroke_pattern. - - https://bugs.freedesktop.org/show_bug.cgi?id=54526 - - glib/poppler-page.cc | 2 +- - poppler/CairoOutputDev.cc | 2 ++ - 2 files changed, 3 insertions(+), 1 deletion(-) - -commit c93702bea0718d67660f2255344dcf9b0f502d57 -Author: José Aliste -Date: Tue Nov 20 11:25:41 2012 +0100 - - glib: Ensure text is only computed on first render - - Getting the text on a page could be quite slow on - complex pages without structured text. Before this patch, - poppler_page_render would reprocess the text each time - is called. - - glib/poppler-page.cc | 9 ++++----- - 1 file changed, 4 insertions(+), 5 deletions(-) - -commit b0297110c455eb18096268b59d6095d428380de5 -Author: Jason Crain -Date: Wed Nov 21 14:15:59 2012 -0600 - - glib: check if words end with spaces - - poppler_page_get_text_layout and poppler_page_get_text_attributes - assume that each word ends with a space or newline, causing them to - become mismatched from the text. This adds a check to - TextWord::getSpaceAfter. - - https://bugs.freedesktop.org/show_bug.cgi?id=54504 - - glib/poppler-page.cc | 62 - +++++++++++++++++++++++++++++----------------------- - 1 file changed, 35 insertions(+), 27 deletions(-) - -commit b1dacd1e6ab00eb1976491eb2b45c76671011b38 -Author: Albert Astals Cid -Date: Fri Nov 23 00:12:24 2012 +0100 - - 0.21.2 - - 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 2d2a3af7159945c3fd54f22878e2eb09e019bbc6 -Author: Albert Astals Cid -Date: Fri Nov 23 00:06:39 2012 +0100 - - Update copyrights - - goo/TiffWriter.cc | 1 + - goo/TiffWriter.h | 1 + - poppler/CairoRescaleBox.cc | 1 + - poppler/CairoRescaleBox.h | 38 ++++++++++++++++++++++++++++++++++++++ - splash/SplashBitmap.cc | 2 +- - 5 files changed, 42 insertions(+), 1 deletion(-) - -commit e0d0177562ff546b59b3bc8eb68a08dc740d6f6c -Author: Adrian Johnson -Date: Wed Nov 14 22:44:20 2012 +1030 - - cairo: Fix crash in CairoImageOutputDev with setSoftMaskFromImageMask - - Bug 57067 - - poppler/CairoOutputDev.cc | 46 - ++++++++++++++++++++++++++++++++++++++++++++++ - poppler/CairoOutputDev.h | 5 +++++ - 2 files changed, 51 insertions(+) - -commit f050717f986a6c2833876d14083363a540fa849a -Author: Adrian Johnson -Date: Wed Nov 14 23:50:10 2012 +1030 - - cairo: fix soft mask when image resolution != smask resolution - - Both image and mask are drawn the same size (unit square) regardless - of the size of the image data. - - Bug 57070 - - poppler/CairoOutputDev.cc | 12 +++--------- - 1 file changed, 3 insertions(+), 9 deletions(-) - -commit 87fd5275514b63f13622b79a8fcfe443ccc4f45d -Author: Adrian Johnson -Date: Sun Nov 11 18:53:12 2012 +1030 - - cairo: make drawImage work with images > 32767 in width/height - - Cairo images are limited to 32767 in width and height due to the - 16.16 format used by pixman. Make drawImage work with large images - by scaling down the image before a cairo image is created. - - CairoRescaleBox.cc has been turned into a class with a virtual - function to get the next row of the source image. This allows the - rescale code to access the source data one row at a time to avoid - needing to allocate an image the size of the source image. - - A RescaleDrawImage class derived from CairoRescaleBox has been - written to create the cairo source image to be used by drawImage. The - code from drawImage that created the cairo source image has been moved - into RescaleDrawImage::getSourceImage and RescaleDrawImage::getRow. - - Bug 56858 - - poppler/CairoOutputDev.cc | 278 - ++++++++++++++++++++++++--------------------- - poppler/CairoRescaleBox.cc | 177 +++++++++++++++-------------- - poppler/CairoRescaleBox.h | 21 +++- - 3 files changed, 258 insertions(+), 218 deletions(-) - -commit d1c509c48fc422649d0c2c2d70af5e13e3472874 -Author: Adrian Johnson -Date: Sat Nov 17 10:04:55 2012 +1030 - - pdftocairo: add tiff support - - Bug 57006 - - utils/pdftocairo.1 | 23 ++++++++------ - utils/pdftocairo.cc | 88 - +++++++++++++++++++++++++++++++++++++++++------------ - 2 files changed, 83 insertions(+), 28 deletions(-) - -commit 6d3fe48cf30b298b4436462904d781ea441c1f3d -Author: Adrian Johnson -Date: Sat Nov 17 10:03:22 2012 +1030 - - tiff: remove splash dependency and add RGBA support - - Bug 57006 - - goo/TiffWriter.cc | 47 - +++++++++++++++++++---------------------------- - goo/TiffWriter.h | 13 ++++++++++--- - splash/SplashBitmap.cc | 23 +++++++++++++++++++++-- - 3 files changed, 50 insertions(+), 33 deletions(-) - -commit 15f600a5702788f7e5b91cd67bc2438179921939 -Author: Albert Astals Cid -Date: Thu Nov 15 22:17:27 2012 +0100 - - Don't do a check for sanity that then we don't use - - Fixes bugs 56753 and 51684 - - fofi/FoFiTrueType.cc | 26 -------------------------- - 1 file changed, 26 deletions(-) - -commit c7e3c2d7087e4fc36564ba7bd55e27e100e0a5e5 -Author: Albert Astals Cid -Date: Wed Nov 14 14:58:45 2012 +0100 - - Remove unused code - - fofi/FoFiTrueType.cc | 658 - ------------------------------------------- - fofi/FoFiTrueType.h | 11 +- - splash/SplashFTFontEngine.cc | 42 +-- - 3 files changed, 2 insertions(+), 709 deletions(-) - -commit 06951f529e6514a0c26d6d821ab5fab0920a7cf3 -Author: Albert Astals Cid -Date: Tue Nov 13 23:37:22 2012 +0100 - - Simplify >= 0 ifs for unsigned - - cpp/poppler-global.cpp | 8 ++------ - 1 file changed, 2 insertions(+), 6 deletions(-) - -commit fa813adc3f7b7ee3cc819f1e0cb85e01f13c2c01 -Author: Albert Astals Cid -Date: Tue Nov 13 23:37:01 2012 +0100 - - Remove < 0 ifs for unsigned - - splash/SplashFTFont.cc | 8 -------- - 1 file changed, 8 deletions(-) - -commit 1969bcd693289eba1138fcaa74a684cb3ff2aefc -Author: Albert Astals Cid -Date: Tue Nov 13 23:36:40 2012 +0100 - - Remove unused members - - poppler/Gfx.cc | 3 --- - poppler/Gfx.h | 5 +---- - 2 files changed, 1 insertion(+), 7 deletions(-) - -commit 3a6e5ed5e28b6113696a7ae60b0b85d7097eb731 -Author: Albert Astals Cid -Date: Tue Nov 13 23:35:53 2012 +0100 - - Remove >= 0 checks for unsigned variables - - utils/HtmlFonts.cc | 6 +++--- - utils/HtmlFonts.h | 4 ++-- - 2 files changed, 5 insertions(+), 5 deletions(-) - -commit 0dcc2d711810dd64aa8d8721ce53a6b72e12c47c -Author: Albert Astals Cid -Date: Tue Nov 13 23:35:10 2012 +0100 - - Remove unused var - - utils/pdfinfo.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 1fc97862d30bf723135310bfc8701e6788bfd284 -Author: Albert Astals Cid -Date: Tue Nov 13 23:24:19 2012 +0100 - - size can't be smaller than 0 because it's a size_t - - goo/gmem.cc | 22 +--------------------- - 1 file changed, 1 insertion(+), 21 deletions(-) - -commit bb801a9b889bc0e62cf8b853c26cc6636b4af9a1 -Author: Albert Astals Cid -Date: Tue Nov 13 22:51:17 2012 +0100 - - Removed unused var - - utils/pdfinfo.cc | 1 - - 1 file changed, 1 deletion(-) - -commit fd651fb49653e89d96b032e010a7d8e891536bb0 -Author: Albert Astals Cid -Date: Mon Nov 12 00:42:49 2012 +0100 - - Parse the args (so that -v says vesion only) - - Fixes bug #56817 - - utils/pdfunite.cc | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -commit 7e2e9567f51d01be9a88848e1141c6d4f0f768a1 -Author: Albert Astals Cid -Date: Fri Nov 9 20:02:25 2012 +0100 - - 0.21.1 - - CMakeLists.txt | 4 ++-- - NEWS | 14 ++++++++++++++ - 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, 22 insertions(+), 8 deletions(-) - -commit 98b7cfd289abb53a745a88d6ec99e95df477fc8f -Merge: 40efa72 d254174 -Author: Albert Astals Cid -Date: Fri Nov 9 00:38:19 2012 +0100 - - Merge remote-tracking branch 'origin/poppler-0.20' - - Conflicts: - poppler/Form.cc - -commit 40efa72987ebf62cbf2c761c10a209e2e6be612e -Author: Fabio D'Urso -Date: Sun Nov 4 11:20:29 2012 +0100 - - Replaced forward declaration of enum CryptAlgorithm with a proper - #include - - Forward-declaring enums is illegal. It hasn't caused problems so far - because XRef.h includes Object.h, which in turn includes Stream.h, - where - the enum is defined. - Therefore, enum is alreadly defined when the compiler reaches - that line. - - To avoid future issues, I've replaced it with a proper #include - "Stream.h" - (which expands to nothing as Stream.h has already been included - at that - point). - - I've also added a #include in XRef.h because it references enum - CryptAlgorithm too. Also in this case, it expands to nothing. - - poppler/PDFDoc.h | 2 +- - poppler/XRef.h | 1 + - 2 files changed, 2 insertions(+), 1 deletion(-) - -commit 0f7c17d7f92d4cdfbd8816dba666aeed924d8bc2 -Author: Fabio D'Urso -Date: Fri Nov 2 10:54:17 2012 +0100 - - qt4: Export information about the document form type - - This patch also wraps the code that checks the form type and moves it - from pdfinfo to the Catalog class. - - poppler/Catalog.cc | 19 +++++++++++++++++++ - poppler/Catalog.h | 9 +++++++++ - qt4/src/poppler-document.cc | 16 ++++++++++++++++ - qt4/src/poppler-qt4.h | 18 ++++++++++++++++++ - utils/pdfinfo.cc | 19 ++++++++++--------- - 5 files changed, 72 insertions(+), 9 deletions(-) - -commit f3f5a166bcd16b6f2cb516cceb2b3f41b6faf0b4 -Author: Fabio D'Urso -Date: Fri Nov 2 01:53:24 2012 +0100 - - Editable FormFieldChoice: Clear editedChoice when one of the - predefined option is selected - - This patch clears the user-entered text when the user interacts with - predefined options. - - poppler/Form.cc | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -commit ddcd5dc0ceecc02f0d4f740cb6c9b557dfd33c74 -Author: Fabio D'Urso -Date: Thu Nov 1 00:58:51 2012 +0100 - - FormFieldChoice ctor: Added support to recognize user strings as - /V value - - Fixes - http://lists.freedesktop.org/archives/poppler/2012-October/009688.html - - poppler/Form.cc | 5 +++++ - 1 file changed, 5 insertions(+) - -commit 1302bf52bba7e6446f01358240a4b5b583e196a9 -Author: Fabio D'Urso -Date: Wed Oct 31 19:56:37 2012 +0100 - - FormFieldChoice ctor: Stop scanning if /V is a string and the - corresponding option has been identified - - poppler/Form.cc | 11 +++++++++-- - 1 file changed, 9 insertions(+), 2 deletions(-) - -commit d254174e08146115ad04ac1f1bf82bb26e56c684 -Author: Fabio D'Urso -Date: Wed Oct 31 16:57:56 2012 +0100 - - FormFieldChoice::updateSelection: Fixed wrong loop condition - - poppler/Form.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 401de95f5ab42ab0f5d8fd92d76b5def50f84a2b -Author: Fabio D'Urso -Date: Wed Oct 31 19:43:51 2012 +0100 - - FormFieldChoice ctor: Look for selected options in /I instead of /V - if /I is available - - Since /I stores the indices of the selected options, it can - distinguish - duplicate option (i.e. options with the same name/export value). - - poppler/Form.cc | 71 - ++++++++++++++++++++++++++++++++++----------------------- - 1 file changed, 42 insertions(+), 29 deletions(-) - -commit cfd3a46a857100cb634e18192b762e7342165348 -Author: Fabio D'Urso -Date: Wed Oct 31 15:44:32 2012 +0100 - - FormFieldChoice: Handle /V values containing the export value instead - of the option name - - According to the PDF spec, /V should always contain an "option - name" and - never an "export value" if /Opt is an array of couples. However, it - seems that acroread works the other way round: it is able to identify - selected options only if they are referred by their export value - instead of the option name. - With this patch, we mimic this behavior. - - poppler/Form.cc | 49 ++++++++++++++++++++++++++++++++++--------------- - 1 file changed, 34 insertions(+), 15 deletions(-) - -commit ce99940bcac0447f32ee2ad46efb09af93989c12 -Author: Fabio D'Urso -Date: Sat Oct 13 00:13:33 2012 +0200 - - FormFieldChoice::updateSelection: Write /I too - - This improves handling of choice fields containing two or more entries - with the same name, and also makes sure that the previous value of /I - gets updated (failing to update it results in acroread still showing - the old selection). - - poppler/Form.cc | 50 ++++++++++++++++++++++++++++++++++++-------------- - 1 file changed, 36 insertions(+), 14 deletions(-) - -commit 102553e2104a1b223c8ac924aa6702829adebbdb -Author: Fabio D'Urso -Date: Wed Oct 31 16:57:56 2012 +0100 - - FormFieldChoice::updateSelection: Fixed wrong loop condition - - poppler/Form.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit d7522ea1d2e66beef64f705e8986142f15fcf613 -Author: Fabio D'Urso -Date: Wed Oct 31 15:26:37 2012 +0100 - - FormFieldChoice ctor: Don't convert "human-readable" option names - to unicode - - Despite that comment, they're not meant to be read by humans only, - but they - are also used as option identifiers. - - This patch stops poppler from forcing them to be unicode. Instead, - they now stay the same encoding as their corresponding /Opt entry. - - This fixes poppler not being able to recognize selected entries - in documents produced by poppler itself: previously, the /V value was - always written in Unicode encoding, and therefore it was very - often not - binary-equal to the corresponding /Opt entry. - Now the /V value is always binary-equal to the corresponding /Opt - entry. - - poppler/Form.cc | 16 +--------------- - 1 file changed, 1 insertion(+), 15 deletions(-) - -commit da08ebeee241198907378c6461721fddb5106875 -Author: Adrian Johnson -Date: Sun Oct 28 12:13:22 2012 +1030 - - Don't allow invalid unicode to be passed to backends - - poppler/CharCodeToUnicode.cc | 11 +++++++++-- - poppler/UTF.cc | 11 +++++++++++ - poppler/UTF.h | 4 ++++ - 3 files changed, 24 insertions(+), 2 deletions(-) - -commit 9f92feda5eff9b2542c64349f33ae3cf250e7f4b -Author: Thomas Freitag -Date: Fri Nov 2 23:05:55 2012 +0100 - - Memory leak in CharCodeToUnicode - - Bug #54702 - - poppler/CharCodeToUnicode.cc | 2 ++ - 1 file changed, 2 insertions(+) - -commit ef11b4f0e642dff0be02bf3327eb56bf0b364847 -Author: Thomas Freitag -Date: Fri Nov 2 22:44:27 2012 +0100 - - Implement overprint in qt interface - - With minor api fixes by me (Albert Astals Cid) - - qt4/src/poppler-document.cc | 23 ++++++++++++--- - qt4/src/poppler-page.cc | 38 +++++++++++++----------- - qt4/src/poppler-private.h | 69 - ++++++++++++++++++++++++++++---------------- - qt4/src/poppler-qt4.h | 11 ++++++- - splash/SplashBitmap.cc | 70 - +++++++++++++++++++++++++++++++++++++++++++++ - splash/SplashBitmap.h | 5 +++- - 6 files changed, 169 insertions(+), 47 deletions(-) - -commit ae8fc0cbfc6123189e17b3cf1286e0540f181646 -Author: Adrian Johnson -Date: Tue Oct 30 21:22:04 2012 +1030 - - cairo: support parameterized Gouraud shading - - Bug 56463 - - poppler/CairoOutputDev.cc | 19 +++++++++++++++---- - 1 file changed, 15 insertions(+), 4 deletions(-) - -commit 3be4e835d765f2f060e2a2e07dd23905c3212cdd -Author: Pino Toscano -Date: Wed Oct 24 18:37:06 2012 +0200 - - dos2unix - - utils/pdftoppm.cc | 876 - +++++++++++++++++++++++++++--------------------------- - 1 file changed, 438 insertions(+), 438 deletions(-) - -commit 77a980472e76b568346a49057b0217111a14a4cd -Merge: 74d6217 46fb365 -Author: Albert Astals Cid -Date: Tue Oct 23 00:23:53 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit 46fb3653c7ae44c34d12d799df8f70d649eaa995 -Author: Albert Astals Cid -Date: Tue Oct 23 00:22:55 2012 +0200 - - Fix the or-ing of flags - - qt4/src/poppler-document.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 74d6217ba164fdfe263b4edac8047b60506e39a6 -Author: Carlos Garcia Campos -Date: Sun Oct 21 17:48:57 2012 +0200 - - regstest: Add print_test_result_ln() and use it for failed test - results - - To make sure they are always shown. - - regtest/Printer.py | 3 +++ - regtest/TestRun.py | 10 +++++----- - 2 files changed, 8 insertions(+), 5 deletions(-) - -commit 4e9b8d2cca44241a501bb8095b3980d17fcda6c5 -Author: Carlos Garcia Campos -Date: Sun Oct 21 17:48:22 2012 +0200 - - regtest: Do not rewrite lines in verbose mode - - regtest/Printer.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 2a25264afe3c59931f6a3638e2d6c6c2e0e5dfba -Author: Albert Astals Cid -Date: Fri Oct 19 17:22:56 2012 +0200 - - make static - - because i can - - qt4/tests/check_fonts.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit bc4a54c0a4430216c9aeaf2c3bddbaeef5a004e4 -Author: Albert Astals Cid -Date: Fri Oct 19 17:22:13 2012 +0200 - - Compile with clang - - qt4/tests/check_fonts.cpp | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -commit f38194cfae8f8690bc3767cbdcf140519564366c -Merge: 80cf434 5312984 -Author: Albert Astals Cid -Date: Fri Oct 19 00:02:02 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit 5312984b40355b067001704e9c688ea0a72b1159 -Author: Albert Astals Cid -Date: Fri Oct 19 00:00:53 2012 +0200 - - Define the numbers a bit better so gcc in i386 understands them better - - qt4/tests/check_lexer.cpp | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 80cf43472e5913f5f64bf73cb4a8ac5a53063f2e -Author: Adam Reichold -Date: Wed Oct 17 08:27:13 2012 +0200 - - added accessors for FormWidgetChoice::editChoice property to qt4 - frontend - - qt4/src/poppler-form.cc | 23 +++++++++++++++++++++++ - qt4/src/poppler-form.h | 15 +++++++++++++++ - 2 files changed, 38 insertions(+) - -commit 0b3ff2dc4e1ba37dd66f5913b10a9d69e31c40ce -Merge: fb5cb0f 528b64b -Author: Albert Astals Cid -Date: Wed Oct 17 00:28:40 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - - Conflicts: - CMakeLists.txt - NEWS - configure.ac - cpp/Doxyfile - poppler/Annot.cc - poppler/Form.h - qt4/src/Doxyfile - -commit 528b64bb077ed37c0d8fc7ae2ef3dc2c0dbb26ca -Author: Fabio D'Urso -Date: Tue Sep 4 23:10:17 2012 +0200 - - Free entries in the xref form a linked list: terminate it properly - when writing the XRef - - The last entry must point back to object 0. Previously it was left - unitialized and resulted in "-000000001 00000 f" being written in the - XRef table. - - poppler/XRef.cc | 1 + - 1 file changed, 1 insertion(+) - -commit fb5cb0fbdfcd06556661b38b0c598922fff2d759 -Author: Fabio D'Urso -Date: Thu Oct 4 11:20:42 2012 +0200 - - Create the 24x24 rectangle for text annotation icons from the top-left - corner instead of bottom-left - - poppler/Annot.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 35c07fe40d7b18e19f6ef0f5615f9f5ac8195cf7 -Author: Fabio D'Urso -Date: Tue Oct 9 15:24:02 2012 +0200 - - AnnotWidget: Avoid repeatedly deleting and creating xref entries - for appearance streams - - Previously updating the appearance stream always involved deleting - the old - stream's xref entry and creating a new one. - Since xref entry deletion causes the generation number to be - incremented, this - behavior caused the generation number to quickly rise during user - input. - - This patch stops it by reusing the same entry as the old appearance - stream in - case of repeated modifications. - - poppler/Annot.cc | 40 ++++++++++++++++++++++++++++------------ - poppler/Annot.h | 1 + - 2 files changed, 29 insertions(+), 12 deletions(-) - -commit 2127a977bbe9985aa58561116508ad4f08430a2c -Author: Fabio D'Urso -Date: Tue Oct 9 12:49:26 2012 +0200 - - Generate and write the appearance stream in - AnnotWidget::updateWidgetApperance() - - Note: At the moment the old appearance is deleted and a *new* xref - entry is - created every time AnnotWidget::updateWidgetApperance() is called. - - poppler/Annot.cc | 30 +++++++++++++++++++++++++----- - 1 file changed, 25 insertions(+), 5 deletions(-) - -commit 0446e2cc1073f4579a90284d28bc5872e46e0536 -Author: Fabio D'Urso -Date: Tue Oct 9 10:47:40 2012 +0200 - - Killed FormField::isModified() in favor of a new AnnotWidget callback - - Instead of having to ask FormField from AnnotWidget::draw if the - widget's appearance needs to be rebuilt, now AnnotWidget gets notified - of changes via the new AnnotWidget::updateAppearanceStream() callback. - - poppler/Annot.cc | 16 ++++++++++------ - poppler/Annot.h | 1 + - poppler/Form.cc | 52 - ++++++++++++++++++++++++++++++++++++++-------------- - poppler/Form.h | 12 +++++++++--- - 4 files changed, 58 insertions(+), 23 deletions(-) - -commit 68d732ab2d55ae15e194ececfffa753977fae84c -Author: Fabio D'Urso -Date: Tue Oct 9 15:24:02 2012 +0200 - - AnnotWidget: Avoid repeatedly deleting and creating xref entries - for appearance streams - - Previously updating the appearance stream always involved deleting - the old - stream's xref entry and creating a new one. - Since xref entry deletion causes the generation number to be - incremented, this - behavior caused the generation number to quickly rise during user - input. - - This patch stops it by reusing the same entry as the old appearance - stream in - case of repeated modifications. - - poppler/Annot.cc | 40 ++++++++++++++++++++++++++++------------ - poppler/Annot.h | 1 + - 2 files changed, 29 insertions(+), 12 deletions(-) - -commit e2993cc9551dc7521528904646f941c9747473f7 -Author: Fabio D'Urso -Date: Tue Oct 9 12:49:26 2012 +0200 - - Generate and write the appearance stream in - AnnotWidget::updateWidgetApperance() - - Note: At the moment the old appearance is deleted and a *new* xref - entry is - created every time AnnotWidget::updateWidgetApperance() is called. - - poppler/Annot.cc | 30 +++++++++++++++++++++++++----- - 1 file changed, 25 insertions(+), 5 deletions(-) - -commit df924493922e8c0f7b1e19c2847d33b28a098913 -Author: Fabio D'Urso -Date: Tue Oct 9 10:47:40 2012 +0200 - - Killed FormField::isModified() in favor of a new AnnotWidget callback - - Instead of having to ask FormField from AnnotWidget::draw if the - widget's appearance needs to be rebuilt, now AnnotWidget gets notified - of changes via the new AnnotWidget::updateAppearanceStream() callback. - - poppler/Annot.cc | 16 ++++++++++------ - poppler/Annot.h | 1 + - poppler/Form.cc | 52 - ++++++++++++++++++++++++++++++++++++++-------------- - poppler/Form.h | 12 +++++++++--- - 4 files changed, 58 insertions(+), 23 deletions(-) - -commit 0a5bda01ace9f8576d687c5a28feb5cf09b48a92 -Author: Albert Astals Cid -Date: Sun Oct 14 23:05:27 2012 +0200 - - New/old header for cmake buildsystem - - CMakeLists.txt | 1 + - 1 file changed, 1 insertion(+) - -commit 6d46f0b477143eb0df09f718e96dd2ff2a7dd61b -Author: Hib Eris -Date: Sat Sep 22 20:50:07 2012 +0200 - - Split our UTF.h into xpdf based UTF8.h and a poppler specific UTF.h - - poppler/GlobalParams.cc | 2 +- - poppler/Makefile.am | 1 + - poppler/UTF.h | 79 - +--------------------------------------------- - poppler/UTF8.h | 84 - +++++++++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 87 insertions(+), 79 deletions(-) - -commit 03cbba935c90ce9a6d9ad44f7cda4901c2f81f2e -Author: Hib Eris -Date: Sat Sep 22 19:58:40 2012 +0200 - - Do not use mapUTF8() directly in CairoOutputDev - - poppler/CairoOutputDev.cc | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -commit f219bdbcadcb0334d595bbd9afd01f00c37d1978 -Author: Hib Eris -Date: Sun Oct 14 22:59:55 2012 +0200 - - Make sure array index is >= 0 - - Fixes this warning on array subscript type: - UTF.cc: In function 'int TextStringToUCS4(GooString*, Unicode**)': - UTF.cc:99:33: warning: array subscript has type 'char' - [-Wchar-subscripts] - - poppler/UTF.cc | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 65a2555607e03c94d77ae9ebdb34ab6d4f8844b6 -Author: Fabio D'Urso -Date: Fri Oct 12 23:54:57 2012 +0200 - - FormFieldChoice ctor: Fixed wrong index variable - - It caused a crash if multiple items are initially selected. - - poppler/Form.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 710bb3383306a9aa6debbfe1364029ee12a15576 -Author: Fabio D'Urso -Date: Fri Oct 12 23:54:57 2012 +0200 - - FormFieldChoice ctor: Fixed wrong index variable - - It caused a crash if multiple items are initially selected. - - poppler/Form.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit ce18c9b3d5251305eb76d294fdf4b4de9382b3a4 -Author: Albert Astals Cid -Date: Wed Oct 10 19:54:57 2012 +0200 - - 0.20.5 - - CMakeLists.txt | 2 +- - NEWS | 15 +++++++++++++++ - configure.ac | 2 +- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - 5 files changed, 19 insertions(+), 4 deletions(-) - -commit b112602334a5de84ae30c2e90d9bc6d4609f7f96 -Author: Tobias Koening -Date: Mon Oct 8 22:32:34 2012 +0200 - - [qt4] make LinkRendition properties available - - Bug #55378 - - poppler/Link.cc | 34 +++++++++++++++++++----- - poppler/Link.h | 17 +++++++++--- - qt4/src/poppler-annotation.cc | 2 -- - qt4/src/poppler-annotation.h | 1 + - qt4/src/poppler-link.cc | 60 - ++++++++++++++++++++++++++++++++++++++++--- - qt4/src/poppler-link.h | 57 - +++++++++++++++++++++++++++++++++++++--- - qt4/src/poppler-page.cc | 8 +++++- - 7 files changed, 158 insertions(+), 21 deletions(-) - -commit 6d6bd660dbb652f2f3e87c81c55a87d1fc11ec70 -Author: Carlos Garcia Campos -Date: Sat Oct 6 10:26:55 2012 +0200 - - glib: chain up finalize to the parent class - - This was missing in some of the classes. - - https://bugs.freedesktop.org/show_bug.cgi?id=55521 - - glib/poppler-document.cc | 6 ++++++ - glib/poppler-page.cc | 2 ++ - 2 files changed, 8 insertions(+) - -commit ac3875a9e7f2f4f31881d3d1b3081f2adaef65a1 -Author: Carlos Garcia Campos -Date: Sat Oct 6 10:26:55 2012 +0200 - - glib: chain up finalize to the parent class - - This was missing in some of the classes. - - https://bugs.freedesktop.org/show_bug.cgi?id=55521 - - glib/poppler-document.cc | 6 ++++++ - glib/poppler-page.cc | 2 ++ - 2 files changed, 8 insertions(+) - -commit 042d332c1c9f628e3bfaabf3da9e04436a8677b5 -Merge: 7b9a9f8 e044814 -Author: Albert Astals Cid -Date: Thu Oct 4 00:53:01 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit e044814c0657a6c5b44939a01dcbdc8d83396d43 -Author: Thomas Freitag -Date: Thu Oct 4 00:51:04 2012 +0200 - - Do not render invalid outlines - - Bug #55573 - - splash/SplashFTFont.cc | 4 ++++ - 1 file changed, 4 insertions(+) - -commit 7b9a9f809d07303fe5adff9210731613df8b2adf -Merge: 3b0962c 9451b7a -Author: Albert Astals Cid -Date: Wed Oct 3 01:24:04 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit 9451b7a61b6dcaa6c4a76f3efda82f1ebd408654 -Author: Albert Astals Cid -Date: Wed Oct 3 01:21:45 2012 +0200 - - Fix crash when parsing some unknown colorspaces - - Can't do csObj->getName if csObj is a dict - - poppler/GfxState.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 3b0962cd14b15ce92c0916f58ed5ba00aebe80b0 -Merge: a9d7ea2 42908e6 -Author: Albert Astals Cid -Date: Tue Oct 2 19:51:48 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit 42908e6e72d95cec0f70b202c4b1c23f7e47c2a4 -Author: Lu Wang -Date: Tue Oct 2 19:31:04 2012 +0200 - - support automake-1.12 in autogen.sh - - Bug #55541 - - autogen.sh | 15 ++++++++------- - 1 file changed, 8 insertions(+), 7 deletions(-) - -commit a9d7ea2eb549acbf6ca7e2a299ffed46ff3d8758 -Merge: 397d7b4 9bb6845 -Author: Albert Astals Cid -Date: Wed Sep 26 15:31:29 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - - Conflicts: - poppler/XRef.cc - -commit 9bb68456de41d24db7acf61204bc3f4e36e98505 -Author: Albert Astals Cid -Date: Wed Sep 26 15:13:47 2012 +0200 - - Initilize rootNum - - Fixes valgrind warnings about uninitialized uses - - poppler/XRef.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 397d7b4597ad4bc8ab41fd7a99078473a3c93eb0 -Merge: 6013d49 2c0f70a -Author: Albert Astals Cid -Date: Wed Sep 26 15:00:04 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit 2c0f70afff03798165c2b609e115dc7e9c034c57 -Author: Thomas Freitag -Date: Wed Sep 26 14:58:05 2012 +0200 - - More crash fixes for broken documents - - poppler/JPXStream.cc | 97 - ++++++++++++++++++++++++++++++++++++++++++++-------- - 1 file changed, 82 insertions(+), 15 deletions(-) - -commit 78558d24692c68212da35a88deb68069c5a06d81 -Author: Thomas Freitag -Date: Wed Sep 26 14:32:05 2012 +0200 - - Fix more crashes in broken files - - solves 1258.pdf.SIGSEGV.dee.288 and 1255.pdf.asan.38.285, extends - 1043.pdf.asan.47.50 and 557.pdf.asan.47.894 - - poppler/GfxState.cc | 26 +++++++++++++++++++++++--- - 1 file changed, 23 insertions(+), 3 deletions(-) - -commit e8822c0f3a46195ec7c6e55c556dd0c5716be742 -Author: Albert Astals Cid -Date: Wed Sep 26 14:21:46 2012 +0200 - - Add unlikelys - - poppler/Stream.cc | 32 ++++++++++++++++---------------- - 1 file changed, 16 insertions(+), 16 deletions(-) - -commit 31874f2e065b0d68f726ef404de98f42489c80c7 -Author: Thomas Freitag -Date: Wed Sep 26 14:17:00 2012 +0200 - - Less crashes in broken files - - rebased patch for 1001.pdf.asan.2a.4, extends patch for - 100.pdf.asan.38.2 - - poppler/Stream.cc | 100 - ++++++++++++++++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 98 insertions(+), 2 deletions(-) - -commit 81b1d9207840ec1e66eef469b29a36a8556b7265 -Author: Albert Astals Cid -Date: Wed Sep 26 13:38:54 2012 +0200 - - Add some unlikelys - - poppler/JBIG2Stream.cc | 28 ++++++++++++++-------------- - 1 file changed, 14 insertions(+), 14 deletions(-) - -commit 9ae1184e3049cabc695c8645a10eaef748b6e641 -Author: Thomas Freitag -Date: Wed Sep 26 12:32:26 2012 +0200 - - More fixes against broken files - - solves 121.pdf.asan.6f.235, extends 682.pdf.SIGFPE.f3.1033 and - 569.pdf.SIGSEGV.c1.907, extends Patch for 829. and 839. asan and - sigsegv series - - poppler/JBIG2Stream.cc | 105 - +++++++++++++++++++++++++++++++++++++++++++------ - 1 file changed, 93 insertions(+), 12 deletions(-) - -commit 1d72c14b3877ae730ac0aa92f36923269e8a2004 -Author: Thomas Freitag -Date: Wed Sep 26 11:48:14 2012 +0200 - - Fix crash in 158.pdf.asan.d.451 - - poppler/SplashOutputDev.cc | 8 ++++++++ - 1 file changed, 8 insertions(+) - -commit 6013d49d852c58c4c23f787fd7dd64731c0918f1 -Merge: b97c28c 671df5d -Author: Albert Astals Cid -Date: Wed Sep 26 00:53:28 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit 671df5dad0732882ceb9e053c3f947dfe0597f3d -Author: Lu Wang -Date: Wed Sep 26 00:52:32 2012 +0200 - - Don't close the stream if it's not a stream - - poppler/PSOutputDev.cc | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -commit b97c28c42a18d1c2a8fabea52c092d948811d582 -Merge: 32bb874 f8c116f -Author: Albert Astals Cid -Date: Tue Sep 25 23:22:23 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - - Conflicts: - qt4/src/Makefile.am - -commit f8c116f1e0fbf3516ce228fbb34c33d6b618bed0 -Author: Albert Astals Cid -Date: Tue Sep 25 23:07:55 2012 +0200 - - Add LCMS_FLAGS - - Fixes compilation when lcms is on non standard locations - Bug #55326 - - qt4/src/Makefile.am | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit 32bb87419c360a3b14c717c0f385198b70a1b2e7 -Author: Carlos Garcia Campos -Date: Sun Sep 23 18:15:13 2012 +0200 - - regtest: Reduce the noise of the default output when running tests - - Show permanent information only about failed tests, without the - details - about the failing pages. Previous verbose output is available passing - --verbose command line output. - - regtest/Printer.py | 96 - +++++++++++++++++++++++++++++++++++++ - regtest/TestReferences.py | 8 ++-- - regtest/TestRun.py | 35 +++++++------- - regtest/backends/__init__.py | 13 +++-- - regtest/commands/create-refs.py | 3 +- - regtest/commands/find-regression.py | 5 +- - regtest/commands/run-tests.py | 3 +- - regtest/main.py | 3 ++ - 8 files changed, 137 insertions(+), 29 deletions(-) - -commit ca6afce24aac2ef9d88e215177b11760f7468a6d -Author: Lu Wang -Date: Fri Sep 21 21:33:05 2012 +0200 - - Do not call drawing routines if we don't need non text - - Bug #54617 - - poppler/Gfx.cc | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -commit 70030b91ce2280f23c3e5adf863f1d336c9c5faf -Author: Albert Astals Cid -Date: Fri Sep 21 08:18:29 2012 +0200 - - 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 2323e38f1a54cb58ec31b4cf15e6c2b1db742ca5 -Author: Albert Astals Cid -Date: Fri Sep 21 08:12:52 2012 +0200 - - Version increase - - CMakeLists.txt | 4 ++-- - configure.ac | 4 ++-- - cpp/Doxyfile | 2 +- - qt4/src/Doxyfile | 2 +- - 4 files changed, 6 insertions(+), 6 deletions(-) - -commit 11a9a620276d199701be5811eb63687ace85ace1 -Author: Albert Astals Cid -Date: Fri Sep 21 08:10:15 2012 +0200 - - Drop the s from AdditionalActionsType - - qt4/src/poppler-annotation-private.h | 5 +++-- - qt4/src/poppler-annotation.cc | 6 +++--- - qt4/src/poppler-annotation.h | 6 +++--- - 3 files changed, 9 insertions(+), 8 deletions(-) - -commit 028e0e7ddf8c30d311feb937385ef21acd34a52d -Author: Albert Astals Cid -Date: Thu Sep 20 18:13:08 2012 +0200 - - 0.21.0 news - - NEWS | 39 +++++++++++++++++++++++++++++++++++++++ - 1 file changed, 39 insertions(+) - -commit 2f2d053352e04e434d83dd93dfdbd08ab5b23f2e -Author: Albert Astals Cid -Date: Thu Sep 20 18:12:57 2012 +0200 - - Update copyrights - - poppler/Annot.cc | 3 ++- - poppler/Annot.h | 1 + - poppler/TextOutputDev.cc | 2 +- - poppler/UTF.h | 1 + - 4 files changed, 5 insertions(+), 2 deletions(-) - -commit 9fad83913791478b63fc76360f1a13e955cdcf4a -Author: Albert Astals Cid -Date: Mon Sep 17 23:15:10 2012 +0200 - - Move to init - - poppler/XRef.cc | 11 +++-------- - 1 file changed, 3 insertions(+), 8 deletions(-) - -commit c470a3929c0a02b8a543fcada22138ab1fc18176 -Author: Thomas Freitag -Date: Mon Sep 17 23:13:48 2012 +0200 - - Support encrypted pdf files in pdfseparate - - poppler/PDFDoc.cc | 35 ++++++++++++++++++++++++++++++++--- - poppler/XRef.cc | 15 +++++++++++++++ - poppler/XRef.h | 2 ++ - utils/pdfseparate.cc | 4 ---- - 4 files changed, 49 insertions(+), 7 deletions(-) - -commit 9b613dcf3c77bc2801d1125dc9bbc5a4dd04e16b -Author: Albert Astals Cid -Date: Mon Sep 17 23:12:43 2012 +0200 - - Compile - - goo/TiffWriter.cc | 5 +++++ - 1 file changed, 5 insertions(+) - -commit fb5c383bd5be7090fc78380b4bb3244c3316c0cd -Author: William Bader -Date: Mon Sep 17 00:03:49 2012 +0200 - - Make pdftoppm -tiff -overprint work - - Bug #54896 - - goo/TiffWriter.cc | 13 ++++++++++++- - goo/TiffWriter.h | 4 +++- - 2 files changed, 15 insertions(+), 2 deletions(-) - -commit 3794916572a0531b10ee57c9f189497489b90bc8 -Author: Albert Astals Cid -Date: Sun Sep 16 17:53:47 2012 +0200 - - Fix the siblings field correctly - - Fixes KDE bug #302334 - - poppler/Form.cc | 45 - +++++++++++++++++++++++++-------------------- - poppler/Form.h | 24 +++++++++++++----------- - qt4/src/poppler-form.cc | 13 ++++++++++--- - 3 files changed, 48 insertions(+), 34 deletions(-) - -commit e8b6d2ac3a874dd5de166b52625fa628004ea5fe -Merge: 7cb4072 9f51baa -Author: Albert Astals Cid -Date: Sun Sep 16 14:08:34 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit 9f51baaf7a86680f2195ecdb978f1eb59a8aa734 -Author: Albert Astals Cid -Date: Sun Sep 16 14:07:45 2012 +0200 - - Rework the #ifdef so that i don't get a gcc warning - - poppler/strtok_r.cpp | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -commit b63049f97629a93ec346033e0ec56fc11f34c4fe -Author: Albert Astals Cid -Date: Sun Sep 16 14:05:01 2012 +0200 - - Forgot to add the new test to autotools - - qt4/tests/Makefile.am | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -commit 7cb40726f9e80ee2b2f27ca6ce151b46c6ec091d -Merge: e980d11 c6d7084 -Author: Albert Astals Cid -Date: Sun Sep 16 13:50:19 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit c6d7084d316e94b5b042b086f5440f8543ff5947 -Author: Albert Astals Cid -Date: Sun Sep 16 13:48:51 2012 +0200 - - Fix parsing of numbers - - -2147483648 is an integer - -2147483649 is a real - - poppler/Lexer.cc | 14 +++++- - qt4/tests/CMakeLists.txt | 1 + - qt4/tests/check_lexer.cpp | 118 - ++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 131 insertions(+), 2 deletions(-) - -commit e980d11061c19f13c75f93506e07903b4d1c7f97 -Merge: b72c02d 3658088 -Author: Albert Astals Cid -Date: Sat Sep 15 20:41:50 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit 365808837080574080b4f8da079124c172fb2123 -Author: Alexey Pavlov -Date: Sat Sep 15 20:38:10 2012 +0200 - - Fix build using mingw64 with winpthread - - strtok_r in winpthread is declared as a macro, that is why - the error happens. Therefore, it is necessary to check whether - the macro - __WINPTHREADS_VERSION is declared. - - Bug #54851 - - poppler/poppler-config.h.cmake | 2 +- - poppler/poppler-config.h.in | 2 +- - poppler/strtok_r.cpp | 16 +++++++++++++++- - 3 files changed, 17 insertions(+), 3 deletions(-) - -commit b72c02d1a2ec8180b3ddfd2bb2b462c0189377d5 -Author: Albert Astals Cid -Date: Thu Sep 13 19:56:45 2012 +0200 - - Remove the fonts loop - - sometimes it's very slow and doesn't really add much - - qt4/tests/test-poppler-qt4.cpp | 4 ---- - 1 file changed, 4 deletions(-) - -commit cb93d51ccb6b1f6938946ae5d38fb9817005fd7a -Author: Albert Astals Cid -Date: Wed Sep 12 00:12:07 2012 +0200 - - Make gcc happy - - It is stupid and can't see that we only use them when we init them - and complains - they might be used un-initialized - - poppler/TextOutputDev.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 3349a8dd7e0469cc5b5aaa8dd929c6078183ef86 -Author: Thomas Freitag -Date: Wed Sep 12 00:04:45 2012 +0200 - - Splash: Avoid bogus memory error for tilingPattern - - just return gFalse if the resulting - tiling pattern bitmap reaches a memory limit and so the Gfx - implemention of - tiling patterns will be used. I think that this is an acceptable - approach also - concerning performance, because it would take also a while to paint - such a huge - bitmap and then draw it to splash. - - poppler/SplashOutputDev.cc | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -commit 2e77799a1668f949612f551425d0665c59ff1d93 -Author: Thomas Freitag -Date: Tue Sep 11 23:33:25 2012 +0200 - - Splash: Implement DeviceN support - - Bug #53140 - - Some copying from the bug tracker - - To explain - it a little bit more I copy a few lines from "Patch 8.01 — DeviceN - Support (6 - colors)" of the Ghent PDF workgroup: - "This patch tests the DeviceN capabilities of a workflow. If DeviceN - is not - handled correctly the colors are converted to CMYK. Instead of the - check marks - an X will appear in the lower left corner of each image and in - the gradient. - In addition you could inspect the color separations. The objects - should appear - only in the Black, Pantone 265C and GWG Green separations as indicated - in the - captions." - Without the patch all DeviceN colors are immediately converted to CMYK - (with - SPLASH_CMYK). This leads especially to problems, if overprint is - used: in - overprint mode a CMYK color will knockout the underlying CMYK - components, BUT - neither any spot colors. But if underlying spot colors are immediately - converted to CMYK colors, they will be kocked out then, too! - The patch now spends up to four (or up to SPOT_NCOMPS) additional - spot colors - in the splash bitmap, so the order in the bitmap will be - CMYKSTUVCMYKSTUVCMYKSTUV... where S, T, U, V are spot colors (I - would use - S1,S2, S3, S4 if it's possible to use indexes), and all painting - operations are - done now in this new device. Only at the end, when we want to store - the bitmap - in a CMYK or RGB color, the spot colors are converted and their - alternate CMYK - components are added to the normal CMYK components. - According to the PDF spec are PDF writer should use different spot - color names - if they have a different appearance in their alternate CMYK - colorspace. - "hasDifferntResultSet" (sorry for the typo) proofs that: if the same - spot color - name is reused BUT has a different appearance in the alternate - colorspace, it - will be converted immediately to its alternate colorspace. - "createMapping" is used so that getDeviceN (color) returns the - components in - the correct order according their appearance in the splash bitmap, - i.e. the - fourth detected spot color must be placed in index 7 of the color - array. - updateFill- and updateStrokeColorspace are needed to create this - mapping at the - appropriate place. And they are not called once but everytime the - colorspace - changed in the PDF (but of course only once in Gfx). - The GooList *getSeparationList() is used to store the functions - for converting - the spot colors to their alternate colorspace in order of their - appearance in - the splash bitmap. The functions are needed to compare if a spot - color with the - same name has really the same appearance and at the end when the - splash bitmap - has to be converted to a CMYK or RGB bitmap (s. ahead). - deviceNTransfer is needed simular to rgbTransferX or cmykTransferX - if a - transfer function is specified in the ExtGState and splash uses - the DeviceN8. - "Do we really need splashModeDeviceN8?": Do we really need - splashModeXBGR8? But - kidding aside: splashModeDeviceN8 needs four more components than - splashModeCMYK8, so the bitmap size in memory doubles the size of - a pure CMYK - bitmap, and it is only needed if the PDF uses spot colors. So I - think it's a - good idea to spend an additional mode and let it up to the calling - application - and the cirumstances if it wants to use this new mode or not. - - poppler/Function.cc | 14 + - poppler/Function.h | 4 + - poppler/GfxState.cc | 341 +++++++++++++++++- - poppler/GfxState.h | 41 ++- - poppler/SplashOutputDev.cc | 173 ++++++++- - poppler/SplashOutputDev.h | 3 + - splash/Splash.cc | 255 ++++++++++++- - splash/Splash.h | 7 +- - splash/SplashBitmap.cc | 115 +++++- - splash/SplashBitmap.h | 8 +- - splash/SplashState.cc | 30 +- - splash/SplashState.h | 3 + - splash/SplashTypes.h | 30 +- - utils/pdftoppm.cc | 878 - ++++++++++++++++++++++----------------------- - 14 files changed, 1415 insertions(+), 487 deletions(-) - -commit cb2ed646c4ef4161e443ee0a377d1111b3be28ff -Merge: f3a1b76 3ce4d21 -Author: Albert Astals Cid -Date: Tue Sep 11 19:29:19 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit f3a1b765bd6a58d327a80feedbe30e1c0792076e -Author: Jason Crain -Date: Tue Sep 11 19:28:28 2012 +0200 - - Allow multiple fonts in a TextWord - - Bug #6923 - - glib/poppler-page.cc | 49 ++++++----- - poppler/TextOutputDev.cc | 224 - ++++++++++++++++++++++------------------------- - poppler/TextOutputDev.h | 21 ++--- - 3 files changed, 145 insertions(+), 149 deletions(-) - -commit 3ce4d213480471dfd8e307c24c99bf3c6308cd6f -Author: Albert Astals Cid -Date: Tue Sep 11 19:24:58 2012 +0200 - - Do not use isnan as it is C99 - - poppler/TextOutputDev.cc | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -commit 4d7a64a23fd4b4b5ee0d47ead8677f374aaaf6c9 -Author: Jason Crain -Date: Tue Sep 11 19:24:11 2012 +0200 - - Check for NaN in TextPage::addChar - - poppler/TextOutputDev.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit e79b70ec13ab4d2cce8f245d150fa9329b436658 -Author: Tobias Koenig -Date: Tue Sep 11 16:39:55 2012 +0200 - - Make 'additional actions' available in Annotation API of Qt4 frontend - - Bug #53589 - - qt4/src/poppler-annotation-private.h | 3 ++ - qt4/src/poppler-annotation.cc | 99 - +++++++++++++++++++++++++++++++++++- - qt4/src/poppler-annotation.h | 68 ++++++++++++++++++++++++- - 3 files changed, 168 insertions(+), 2 deletions(-) - -commit 5f338ea7d01cabc0f8c50690d0bc262d85baa0ed -Author: Albert Astals Cid -Date: Mon Sep 10 19:47:20 2012 +0200 - - Fix typo - - NEWS | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 5fd691dc58aac817bca81c87c4820afcf53989d1 -Author: Albert Astals Cid -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 1b40cdd9f863cd3868db85b5ccfa77a8350c56d6 -Merge: 6c40a55 b3e86db -Author: Albert Astals Cid -Date: Mon Sep 10 18:49:52 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit b3e86dbdba82956f125e37f69176072e2d0127f2 -Author: Thomas Freitag -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 6c40a553a3c8825931c59797059392fd110531cc -Merge: 17fc1bf 558a7d9 -Author: Albert Astals Cid -Date: Sun Sep 9 23:27:40 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit 558a7d9b046bbbe185dea263b48a3cb2664378fc -Author: Thomas Freitag -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -Date: Sun Sep 9 21:15:06 2012 +0200 - - Fix memory leak - - poppler/Form.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 17fc1bfa8013cafe3b348f0cc07ef08bf9c7dd9a -Merge: e0118be a4f5911 -Author: Albert Astals Cid -Date: Sun Sep 9 12:52:49 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - -commit a4f59113574a8d7460c6ce5000cb09d20fe52b74 -Author: Albert Astals Cid -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 -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 e0118be3ba38bd00fa2a9c20c5b4cd82e820ba0b -Merge: 2c41430 ccd3db5 -Author: Albert Astals Cid -Date: Sat Sep 8 18:15:43 2012 +0200 - - Merge remote-tracking branch 'origin/poppler-0.20' - - Conflicts: - glib/poppler-document.cc - poppler/PDFDoc.cc - poppler/XRef.h - utils/HtmlFonts.cc - -commit ccd3db5a7723ddb692f6dc85ed9d0f5e3dde189f -Author: Albert Astals Cid -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 2c41430732f517d4d57e914a315ba315a2545541 -Author: Albert Astals Cid -Date: Thu Sep 6 22:12:38 2012 +0200 - - Add missing licenses - - goo/grandom.cc | 2 ++ - goo/grandom.h | 2 ++ - splash/SplashScreen.cc | 1 + - utils/pdfinfo.cc | 1 + - 4 files changed, 6 insertions(+) - -commit be88963a5955ac033e7a7d224bdcc4049085a9dc -Author: Fabio D'Urso -Date: Thu Aug 9 13:18:22 2012 +0200 - - pdf-fullrewrite: Added support for encrypted documents, checks on - output documents, incremental update mode - - test/CMakeLists.txt | 1 + - test/Makefile.am | 3 +- - test/pdf-fullrewrite.cc | 354 - ++++++++++++++++++++++++++++++++++++++++++++++-- - 3 files changed, 342 insertions(+), 16 deletions(-) - -commit 381be58e9e0d0e323acbd975a2334eca6d9018fd -Author: Fabio D'Urso -Date: Sat Aug 4 13:00:06 2012 +0200 - - pdfinfo: Show info about the encryption algorithm - - utils/pdfinfo.cc | 24 ++++++++++++++++++++++-- - 1 file changed, 22 insertions(+), 2 deletions(-) - -commit 273e8c896e95b548093159dc8bb14d48ce447053 -Author: Fabio D'Urso -Date: Wed Aug 15 18:09:02 2012 +0200 - - Mark object streams as DontRewrite - - So that they don't get copied in full rewrite mode, because they're - not referenced from the XRef table we build, and we already - individually write each object they contain. - - poppler/XRef.cc | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - -commit 59db8deaa7b1907831b526de3011dc22d0ffb333 -Author: Fabio D'Urso -Date: Thu Aug 9 20:08:44 2012 +0200 - - Mark XRef streams as Unencrypted and DontRewrite - - - Unencrypted because they are stored in unencrypted form - - DontRewrite because they must not be copied in full rewrite mode, - because we always build a new XRef table, and existing XRef streams - are not referenced any more (ie they become "leaked" objects). - Furthermore, since readers know that XRef streams' objects are - unencrypted from the fact that they are XRef streams, but these - leaked objects are no longer referred as XRef streams, readers would - think that they are regularly encrypted objects, resulting in - currupt objects. - - poppler/PDFDoc.cc | 5 +++ - poppler/XRef.cc | 126 - +++++++++++++++++++++++++++++++++++------------------- - poppler/XRef.h | 9 ++-- - 3 files changed, 94 insertions(+), 46 deletions(-) - -commit 116722cc74e267ac44dd5a70924557cdf6f25d02 -Author: Fabio D'Urso -Date: Sat Aug 4 12:47:22 2012 +0200 - - Encrypt strWeird streams before writing them in PDFDoc::writeObject - - poppler/Decrypt.cc | 9 ++++++++- - poppler/Decrypt.h | 2 ++ - poppler/PDFDoc.cc | 10 ++++++++++ - 3 files changed, 20 insertions(+), 1 deletion(-) - -commit 695889c1330ca5b37338b8363dbf233fce936bc6 -Author: Fabio D'Urso -Date: Sat Aug 4 12:24:25 2012 +0200 - - Encrypt strings before writing them in PDFDoc::writeString - - poppler/PDFDoc.cc | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) - -commit 4ab8e7be536db40db8a1a4af50dad3ba59c49f14 -Author: Fabio D'Urso -Date: Sat Aug 4 02:06:11 2012 +0200 - - Propagate encryption parameters to PDFDoc's write functions - - poppler/PDFDoc.cc | 54 - ++++++++++++++++++++++++++++++++++++------------------ - poppler/PDFDoc.h | 20 +++++++++++++------- - poppler/XRef.cc | 14 ++++++++++++++ - poppler/XRef.h | 2 ++ - utils/pdfunite.cc | 2 +- - 5 files changed, 66 insertions(+), 26 deletions(-) - -commit 9e43f9a8bcbee9060309b9679dbcc6b501a79cfb -Author: Fabio D'Urso -Date: Wed Aug 1 16:14:22 2012 +0200 - - Separated header and footer write commands from the rest of - PDFDoc::writeObject - - Because in next patch I'll need to pass the object's num and gen - always, - not only if the object's header and footer need to be written. - - poppler/PDFDoc.cc | 51 - +++++++++++++++++++++++++++++++++------------------ - poppler/PDFDoc.h | 11 +++++++---- - utils/pdfunite.cc | 2 +- - 3 files changed, 41 insertions(+), 23 deletions(-) - -commit 4d19a002801531b07f11382daaf9880e4691a10e -Author: Fabio D'Urso -Date: Sat Aug 4 01:36:06 2012 +0200 - - Do not change encrypted documents' ID, not even in case of full - rewrite - - Because we will raw-copy encrypted streams, and the ID is part of the - decryption key. - - poppler/PDFDoc.cc | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -commit 800b2e37d3c4c73147bf9e11d9f38afe2183ab9d -Author: Fabio D'Urso -Date: Wed Aug 1 14:07:10 2012 +0200 - - Initial support for saving encrypted documents - - - Do not refuse to save encrypted documents - - Copy the /Encrypt value in the new document's trailer dictionary - - Mark indirect objects referred from /Encrypt as not encrypted - in XRef::scanSpecialFlags - - poppler/PDFDoc.cc | 49 ++++++++++++++++++------------------------- - poppler/XRef.cc | 62 - ++++++++++++++++++++++++++++++++++++++++++++++++++++++- - poppler/XRef.h | 16 +++++++++++++- - 3 files changed, 96 insertions(+), 31 deletions(-) - -commit 6647153d47b1d67d2a4d6b90dce2184ab6c7dda6 -Author: Fabio D'Urso -Date: Thu Aug 9 12:26:53 2012 +0200 - - Added field XRefEntry::flags, and turned XRefEntry::updated into - a flag - - In next patches I'll add other flags - - poppler/PDFDoc.cc | 4 ++-- - poppler/XRef.cc | 18 +++++++++--------- - poppler/XRef.h | 20 +++++++++++++++++++- - 3 files changed, 30 insertions(+), 12 deletions(-) - -commit a284c6c6623587abb7da7e4c171c42e006ea477b -Author: Fabio D'Urso -Date: Sat Aug 4 01:57:41 2012 +0200 - - Be able to output overflown integers back - - Because Lexer.cc:241 can read them, and we must be able to write them - back (especially in full rewrite mode). - - poppler/PDFDoc.cc | 3 +++ - 1 file changed, 3 insertions(+) - -commit 53baea19658a27f15c7ed870a24be82b8219ddfe -Author: Fabio D'Urso -Date: Sat Aug 4 01:32:08 2012 +0200 - - FlateStream::unfilteredReset should call str->unfilteredReset() - - Just like any other FilterStream-derived class does - - poppler/Stream.cc | 14 +++++++++++--- - poppler/Stream.h | 2 ++ - 2 files changed, 13 insertions(+), 3 deletions(-) - -commit 4e5fee4e9156480173f05e7b3d0bdf604127d481 -Author: Fabio D'Urso -Date: Mon Aug 6 02:08:27 2012 +0200 - - Initialize AES encryption with random CBC IV data - - poppler/Decrypt.cc | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -commit 1b008f273359b8df6b64ffa94bb2828e42ffa63e -Author: Fabio D'Urso -Date: Mon Aug 6 02:08:40 2012 +0200 - - Replaced srand/rand calls in SplashScreen with grandom calls - - splash/SplashScreen.cc | 7 ++----- - 1 file changed, 2 insertions(+), 5 deletions(-) - -commit faff947d8106048b19ba74dd483b90b8cebb16c7 -Author: Fabio D'Urso -Date: Mon Aug 6 02:06:47 2012 +0200 - - Added goo/grandom.[cc|h] with POSIX implementation - - CMakeLists.txt | 2 ++ - ConfigureChecks.cmake | 1 + - config.h.cmake | 3 +++ - configure.ac | 1 + - goo/Makefile.am | 6 +++-- - goo/grandom.cc | 68 - +++++++++++++++++++++++++++++++++++++++++++++++++++ - goo/grandom.h | 32 ++++++++++++++++++++++++ - 7 files changed, 111 insertions(+), 2 deletions(-) - -commit af8d05d1ab89b74e307e90aaf19c750528f5f561 -Author: Fabio D'Urso -Date: Fri Aug 3 12:46:06 2012 +0200 - - Added encryption support in Decrypt.cc/.h - - poppler/Decrypt.cc | 222 - +++++++++++++++++++++++++++++++++++++++++++++++++++++ - poppler/Decrypt.h | 21 ++++- - 2 files changed, 242 insertions(+), 1 deletion(-) - -commit ba6ff179aa78a42a384166ace2df80101cfbe7b9 -Author: Fabio D'Urso -Date: Thu Aug 2 18:56:29 2012 +0200 - - Refactoring of Decrypt.cc/.h in preparation for encryption support - - poppler/Decrypt.cc | 219 - +++++++++++++++++++++++++++-------------------------- - poppler/Decrypt.h | 35 ++++++--- - 2 files changed, 133 insertions(+), 121 deletions(-) - -commit cd1ab1e34032d5620140bd0b6b6ec4b74f89ae19 -Author: Albert Astals Cid -Date: Thu Aug 30 22:36:14 2012 +0200 - - Update Adrian's copyrights - - goo/GooString.cc | 1 + - poppler/CharCodeToUnicode.cc | 1 + - poppler/TextOutputDev.cc | 2 +- - poppler/UTF.cc | 23 +++++++++++++++++++++++ - utils/HtmlOutputDev.cc | 2 +- - 5 files changed, 27 insertions(+), 2 deletions(-) - -commit ce8a579f339507da3fd7802e1531fbf6849c0c98 -Author: Adrian Johnson -Date: Tue Aug 28 22:16:34 2012 +0930 - - Move text to unicode conversion into a separate function - - This also ensures UTF-16 ActualText strings are converted to UCS-4 - before calling addChar. - - goo/GooString.cc | 2 +- - poppler/TextOutputDev.cc | 32 ++++---------------------------- - poppler/UTF.cc | 34 ++++++++++++++++++++++++++++++++++ - poppler/UTF.h | 8 ++++++++ - utils/pdfinfo.cc | 37 ++++++------------------------------- - 5 files changed, 53 insertions(+), 60 deletions(-) - -commit cac13e782cf4413703cfd1fa23e76133dfbe5ef9 -Author: Adrian Johnson -Date: Tue Aug 28 21:48:16 2012 +0930 - - text: increase the tolerance for overlapping glyphs - - TextOutputDev will start a new line when encountering consecutive - glyphs with overlapping bounding boxes. This can occur when drawing - diacritics with a separate glyph. In this case, due to the diacritic - having a different baseline, the lines may be output in the wrong - order. - - This patch increases the tolerance for overlapping bounding boxes to - prevent diacritics from splitting lines. - - poppler/TextOutputDev.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 6f6386219449e70c2c3bc3559fdde3df4a57a809 -Author: Adrian Johnson -Date: Thu Mar 8 20:52:28 2012 +1030 - - Convert UTF-16 to UCS-4 when reading toUnicode cmap - - to ensure only UCS-4 values are used with the "Unicode" type. - - CMakeLists.txt | 3 +- - poppler/CairoOutputDev.cc | 2 +- - poppler/CharCodeToUnicode.cc | 12 ++--- - poppler/GlobalParams.cc | 2 +- - poppler/Makefile.am | 3 +- - poppler/TextOutputDev.cc | 19 +------- - poppler/UTF.cc | 47 ++++++++++++++++++++ - poppler/UTF.h | 103 - +++++++++++++++++++++++++++++++++++++++++++ - poppler/UTF8.h | 84 ----------------------------------- - utils/HtmlOutputDev.cc | 14 +----- - 10 files changed, 165 insertions(+), 124 deletions(-) - -commit b3b0f5abe4fdcc39d884670e4a998d39324659f6 -Author: Albert Astals Cid -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 6356c0bbae47db291a3585d31c7727bc3f8d97a4 -Author: Albert Astals Cid -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 -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 -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 -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 9264b375eec19e639c524b677f770ad750b1cb43 -Author: Albert Astals Cid -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 01528eaedc77d5559f6dc4229b66f1a819678fb7 -Author: Albert Astals Cid -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 c1fba45be106dc30a5136efe41493b1cf6d2a1b5 -Author: Albert Astals Cid -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 1881486e9817304d0817ce24b177c1bc79587138 -Author: Tobias Koenig -Date: Fri Aug 24 19:12:20 2012 +0200 - - annots: Unify parsing of additional actions entries - - https://bugs.freedesktop.org/show_bug.cgi?id=53586 - - poppler/Annot.cc | 58 - ++++++++++++++++++++++++++++++++++++++++++++------------ - poppler/Annot.h | 24 +++++++++++++++++++---- - 2 files changed, 66 insertions(+), 16 deletions(-) - -commit 686ec0cc92e25f74eaa9e09a328724cbdf939bca -Author: Albert Astals Cid -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 0b3259c1d5679cb8d59d770e5fbe7e1bc141a025 -Author: Albert Astals Cid -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 5fd2a35227c22dbddedfb397eff0e0a09c3d1b03 -Author: Pino Toscano -Date: Wed Aug 15 19:51:43 2012 +0200 - - poppler-config.h: remove WITH_FONTCONFIGURATION_* macros - - no public header uses them anymore, so need to expose them - - poppler/poppler-config.h.cmake | 10 ---------- - poppler/poppler-config.h.in | 10 ---------- - 2 files changed, 20 deletions(-) - -commit edd0ea4847c143adb1d15a57b42b0ce2b2c80b0e -Author: Pino Toscano -Date: Wed Aug 15 19:31:50 2012 +0200 - - ignore more qt4 tests - - qt4/tests/.gitignore | 3 +++ - 1 file changed, 3 insertions(+) - -commit 2df57857000c5adbee6b029ff7a79acc707786a0 -Author: Pino Toscano -Date: Wed Aug 15 18:59:15 2012 +0200 - - build: remove extra fontconfig CFLAGS and LIBS - - fontconfig is used only in .cpp sources inside the 'poppler' - subdirectory, so there is no need to add the include paths for it - in other directories; - likewise, do not to link to it if not needed - - glib/Makefile.am | 4 +--- - qt4/demos/Makefile.am | 2 -- - qt4/src/Makefile.am | 2 -- - qt4/tests/Makefile.am | 2 -- - test/Makefile.am | 6 ++---- - utils/CMakeLists.txt | 3 --- - utils/Makefile.am | 4 +--- - 7 files changed, 4 insertions(+), 19 deletions(-) - -commit 3e802949264d9310df057daff891a3fccb2eb8d3 -Author: Albert Astals Cid -Date: Wed Aug 15 00:02:23 2012 +0200 - - PSOutputDev: Always write HiResBoundingBox - - Makes some people happier and it doesn't hurt us much - Bug #53159 - - poppler/PSOutputDev.cc | 7 ++----- - 1 file changed, 2 insertions(+), 5 deletions(-) - -commit e83568065f77ba722b147b3b10faed1ff66f22dc -Author: Pino Toscano -Date: Sat Aug 11 01:38:08 2012 +0200 - - remove extra execution permissions - - (cherry picked from commit 9a5a19ee2f9cd536c3527b30c0256ca9dce3638c) - - goo/GooTimer.h | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) - -commit 9a5a19ee2f9cd536c3527b30c0256ca9dce3638c -Author: Pino Toscano -Date: Sat Aug 11 01:38:08 2012 +0200 - - remove extra execution permissions - - goo/GooTimer.h | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) - -commit 1b2903c104012fdd3c982d57898910945dff9a15 -Author: Albert Astals Cid -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 -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 a53e0641365608f832b455404f1ee584d278e0c4 -Author: Albert Astals Cid -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 -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 31fe12c63f0133d124e2115aba607857aaff0978 -Author: Markus Trippelsdorf -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 d3c339017857cd762d8419260e33e1cc4e197743 -Author: Thomas Freitag -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 768cf5877f48f8cee80fe96e2ee52f42f230dfdf -Author: Thomas Freitag -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 d0e55aa49484263882345fa648e1e907d2b172f2 -Author: Thomas Freitag -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 315447843a368556a8536bc30e579c9bf338682e -Author: Thomas Freitag -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 78c6a5615013d26b8a2babb13b3c4f7d6a1d70a4 -Author: Albert Astals Cid -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 c0c88b3707fc7337e814ae4252d80002641a19ee -Author: Albert Astals Cid -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 -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 36481939e3064de920e49d9d1742a85473a50963 -Author: Thomas Freitag -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 -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 6b567565b7b9d591fbd7441592096960a303bd39 -Author: Thomas Freitag -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 -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 34327b2c201392f96e3449941411b7ad4b3e8bcb -Author: Torsten Kasch -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 8fe700217ab6ce786a8272f2c338e3dab434c56e -Author: Torsten Kasch -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 15c6ae699f083ea6c9716c1098ae9833a56eeb3e -Author: Torsten Kasch -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 -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 dc8833a36b514c13cfd6b1fd4665d2fddd71f357 -Author: Albert Astals Cid -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 -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 31ef967033407de91109ff46db9c60cb8748bc55 -Author: Thomas Freitag -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 f9f5238d32615f93d07afa3aa7384a8b30737203 -Author: Thomas Freitag -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 950d5f3dec4bff5d3c523d55689d7b70215dc110 -Author: Thomas Freitag -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 -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 -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 31837201cf5b3db735c89ef4969105b7a6ab465d -Author: Thomas Freitag -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 262203bd86403e43034fbfbbeef5a5894a62ecb2 -Author: Albert Astals Cid -Date: Sat Jun 30 14:36:28 2012 +0200 - - [qt4] Refactor part of ::search() functions - - qt4/src/poppler-page-private.h | 7 ++++- - qt4/src/poppler-page.cc | 61 - +++++++++++++++++++----------------------- - 2 files changed, 34 insertions(+), 34 deletions(-) - -commit bd71f80c409dbb47231088c3c6661946ccde6e67 -Author: Adam Reichold -Date: Thu Jun 28 17:42:17 2012 +0200 - - [qt4] add whole-page search method to Poppler::Page - - qt4/src/poppler-page.cc | 39 +++++++++++++++++++++++++++++++++++++++ - qt4/src/poppler-qt4.h | 14 ++++++++++++++ - 2 files changed, 53 insertions(+) - -commit 46ebe7dc84b14ce8dda7b3b1da516b9d99ac3344 -Author: Albert Astals Cid -Date: Fri Jun 29 01:56:55 2012 +0200 - - PSOutputDev: Correct %%DocumentCustomColors - - Bug 51479 - - poppler/PSOutputDev.cc | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) - -commit 02c4e6bf4cc0f5535946fe31815081a40b1de986 -Author: Albert Astals Cid -Date: Fri Jun 29 01:56:55 2012 +0200 - - PSOutputDev: Correct %%DocumentCustomColors - - Bug 51479 - - poppler/PSOutputDev.cc | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) - -commit 2b8d95aeede56c75699bb83ca3b23ea199b81c2c -Author: Albert Astals Cid -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 f7990386d268a444c297958e9c50ed27a0825a00 -Author: Albert Astals Cid -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 -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 f48eb669ae5c729c026554802e666e64399c0900 -Author: Albert Astals Cid -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 -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 ff48a5d67a130211fbbb98aa0011bca0c1185114 -Author: Thomas Freitag -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 -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 bd1dab39a857b852c09d21f64254ffc1f24c2df0 -Author: Fabio D'Urso -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 31db47d077825045edd1a2d229e873a6f8e09fb1 -Author: Carlos Garcia Campos -Date: Sun Jun 17 12:00:43 2012 +0200 - - Simplify AnnotAppearance::getAppearanceStream() - - - Use a switch instead of if to get the stream object - - Use the return value of dictLookupNF to check whether the object is - null - - Don't fetch the stream to check the reference is valid, this is - already done when used - - poppler/Annot.cc | 50 ++++++++++++++++++-------------------------------- - 1 file changed, 18 insertions(+), 32 deletions(-) - -commit b15d02b92aca1348564e70d0245064bc27eefce8 -Author: Maciej Mrozowski -Date: Fri May 18 01:47:55 2012 +0200 - - Add the possibility of using lcms1 even if lcms2 is installed - - CMakeLists.txt | 20 +++++++++++++------- - configure.ac | 31 +++++++++++++++---------------- - 2 files changed, 28 insertions(+), 23 deletions(-) - -commit 0cc2738737ed411159c8c8045eff5d1a4463ed16 -Author: Mark Brand -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 3575becd60585324bcefc0631b1bac47c1db3c5c -Author: Mark Brand -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 2e1410ea62fe99e52c94f878d02181f0b59f1cd5 -Author: Albert Astals Cid -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 06618065c8a97a5bec125560546b98edfc1210f3 -Author: Albert Astals Cid -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 6a76d21661add4f84ee0859c4e7a4c23e7a63bc4 -Author: Hib Eris -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 e3fe88df3646a80945210ba426eb4681a98b55e9 -Author: Hib Eris -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 -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 d483436517c5d9679fd6f4ec5544128ffcc2188e -Author: Albert Astals Cid -Date: Sun Jun 10 20:15:01 2012 +0200 - - Update copyrights - - poppler/GlobalParamsWin.cc | 1 + - 1 file changed, 1 insertion(+) - -commit c783037619e2b4c101e8ecd7e61c94ee077b4be2 -Author: Albert Astals Cid -Date: Sun Jun 10 20:15:01 2012 +0200 - - Update copyrights - - poppler/GlobalParamsWin.cc | 1 + - 1 file changed, 1 insertion(+) - -commit d791101fbdebf7a3b3f333939f9bbff6bbecf45f -Author: Albert Astals Cid -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 f3f9d8f28a97338da92c842d5668b0ef3495ef13 -Author: Albert Astals Cid -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 8b3fa65f293804dab7ae2fd069132d0d6f44bbb2 -Author: Tobias Koenig -Date: Sun Jun 10 17:48:08 2012 +0200 - - [qt4] Add accessor methods for poster information - - qt4/src/poppler-movie.cc | 15 +++++++++++++++ - qt4/src/poppler-qt4.h | 15 +++++++++++++++ - 2 files changed, 30 insertions(+) - -commit e8aa8266254bfd2189d5b5105e3d76caa4cc6713 -Author: Thomas Freitag -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 92ef16e3699da949c80716c3fd4b438fe79c134d -Author: Thomas Freitag -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 6e3503b5591b105fa92e6cc6568b8819f6acd625 -Author: Fabio D'Urso -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 99aa734ae2d3ba51f840d4c8ef450488fb702a31 -Author: Fabio D'Urso -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 4f2ac544f36aa11747c3e13ff69fc19bdd0136dc -Author: Fabio D'Urso -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 bde31ce7b223abc86d25e06f3d73668b792c70df -Author: Fabio D'Urso -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 0df0aa439eed1d9838a80942e00af08e9acabb8d -Author: Carlos Garcia Campos -Date: Sat Jun 2 17:33:23 2012 +0200 - - glib-demo: Add find options to find demo - - glib/demo/find.c | 61 - +++++++++++++++++++++++++++++++++++++++++++++++++++++++- - 1 file changed, 60 insertions(+), 1 deletion(-) - -commit 52b3ede4bfd1e2288a0efca34da5d6239d3563e9 -Author: Carlos Garcia Campos -Date: Sat Jun 2 16:25:06 2012 +0200 - - glib-demo: Show search matches in a document view - - glib/demo/find.c | 253 - +++++++++++++++++++++++++++++++++++++++++++++++-------- - 1 file changed, 218 insertions(+), 35 deletions(-) - -commit ed0c761c2190a3c1959a60ae9b7961f58a43c939 -Author: Thomas Schenker -Date: Sat Jun 2 11:54:21 2012 +0200 - - glib: Add poppler_page_find_text_with_options - - To be able to search text with options like case sensitive, search - backwards and whole words only. - - https://bugs.freedesktop.org/show_bug.cgi?id=2951 - - glib/poppler-page.cc | 52 - +++++++++++++++++++++++++++---------- - glib/poppler-page.h | 3 +++ - glib/poppler.h | 18 +++++++++++++ - glib/reference/poppler-sections.txt | 2 ++ - 4 files changed, 62 insertions(+), 13 deletions(-) - -commit 126b55c9a44ccb0dba55e758843e9ee4aa43ee2b -Author: Carlos Garcia Campos -Date: Sat Jun 2 17:19:30 2012 +0200 - - Implement whole words only option to search text - - It seems we missed it in the xpdf303 merge. - - poppler/TextOutputDev.cc | 144 - ++++++++++++++++++++++++----------------------- - 1 file changed, 74 insertions(+), 70 deletions(-) - -commit 20210fbb6117649b20f6930031f24b8fc97b773d -Author: Luis Parravicini -Date: Mon May 28 23:44:17 2012 +0200 - - pdftohtml: Add -fontfullname - - Outputs the font name without any substitutions. Bug #49872 - - utils/HtmlFonts.cc | 4 +++- - utils/pdftohtml.1 | 3 +++ - utils/pdftohtml.cc | 4 ++++ - 3 files changed, 10 insertions(+), 1 deletion(-) - -commit 03f979a7e59c4eb5ecb8acc324c7faf700144589 -Author: Gerald Schmidt -Date: Sat May 26 17:46:59 2012 +0200 - - Make the output more xhtml compliant - - utils/HtmlOutputDev.cc | 105 - +++++++++++++++++++++++++------------------------ - 1 file changed, 53 insertions(+), 52 deletions(-) - -commit ba6406222f828e354323223fc4bdb01c1726fb49 -Author: Fabio D'Urso -Date: Mon May 21 18:16:06 2012 +0200 - - Added Annot::removeReferencedObjects + Always set annotations' - page field - - - Now Page::removeAnnot calls Annot::removeReferencedObjects, which - takes care of - removing referenced objects (such as the annot popup and the - appearance streams). - - Previously, Annot's page field was set only if the annotation - dictionary - contained /P - - poppler/Annot.cc | 40 - ++++++++++++++++++++++++++++++++++------ - poppler/Annot.h | 13 +++++++++---- - poppler/Page.cc | 7 ++++--- - poppler/Page.h | 2 +- - qt4/src/poppler-annotation.cc | 8 -------- - 5 files changed, 48 insertions(+), 22 deletions(-) - -commit 9904b8f10abf068a7816bd90976ccbb320387645 -Author: Adrian Johnson -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 -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 -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 b47d38e2ccd8563394df89765e277bde95730052 -Author: Adrian Johnson -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 14a29dbff585cbe55247431a346c2ac3e12473fe -Author: Adrian Johnson -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 7436b2c8a853f5121eb7dd13168ab997f1cf7d80 -Author: Adrian Johnson -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 -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 fe28614e7aab6e029f4b420353b67a7eea24de36 -Author: Fabio D'Urso -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ä -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 918456372548810c9efbf0533fa155034dd081f2 -Author: Ville Skyttä -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 892e486addcbcad619613c7be1ca692a0d36d6e5 -Author: Albert Astals Cid -Date: Mon May 21 20:28:42 2012 +0200 - - Compile++ - - cmake/modules/FindGTK.cmake | 8 ++++---- - glib/demo/CMakeLists.txt | 6 +++--- - test/CMakeLists.txt | 6 +++--- - 3 files changed, 10 insertions(+), 10 deletions(-) - -commit 794e89ed41d03997778fc4c59b7f1ba557b5e6b7 -Author: Albert Astals Cid -Date: Mon May 21 20:18:42 2012 +0200 - - Compile - - glib/CMakeLists.txt | 2 ++ - 1 file changed, 2 insertions(+) - -commit 78e6c9905a52c0cd4bfc1e56874f50689f04a1c6 -Author: Carlos Garcia Campos -Date: Sun May 20 12:11:27 2012 +0200 - - glib-demo: Make text characters list fill and expand in text demo - - glib/demo/text.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 610eb24426d9b36ac7da40a2fceb3dbeeec19a5c -Author: Carlos Garcia Campos -Date: Sun May 20 12:08:09 2012 +0200 - - glib-demo: Add a button to remove annots from the annot view - - glib/demo/annots.c | 48 +++++++++++++++++++++++++++++++++++++++++------- - 1 file changed, 41 insertions(+), 7 deletions(-) - -commit 11a3093e093319e88f14af0ab6c15009104d17ee -Author: Carlos Garcia Campos -Date: Sun May 20 11:22:49 2012 +0200 - - glib: Add poppler_page_remove_annot() - - https://bugs.freedesktop.org/show_bug.cgi?id=40473 - - glib/poppler-page.cc | 19 +++++++++++++++++++ - glib/poppler-page.h | 2 ++ - glib/reference/poppler-sections.txt | 1 + - 3 files changed, 22 insertions(+) - -commit 0dd157ae7f19cd91ea425a607b968f08addc3a40 -Author: Carlos Garcia Campos -Date: Sun May 20 10:37:47 2012 +0200 - - glib: Take a reference of the core annotation when creating a - PopplerAnnot - - This way if the annotation is removed from the page, the core - annotation - object is not destroyed. Also, a new PopplerAnnot that is never - added to - a page doesn't leak the core annotation anymore. - - glib/poppler-annot.cc | 53 - +++++++++++++++++++++------------------------------ - 1 file changed, 22 insertions(+), 31 deletions(-) - -commit f818b842f54d6860920b39778228e8b247b4e761 -Author: Carlos Garcia Campos -Date: Sat May 19 12:32:33 2012 +0200 - - glib-demo: Fix runtime warning - - glib/demo/selections.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit a24e326425e198eeb70c4d9205bb7a0a3a9db297 -Author: Carlos Garcia Campos -Date: Sat May 19 12:09:45 2012 +0200 - - gtk-tests: Port to GTK+ 3.0 - - configure.ac | 4 +- - glib/demo/annots.c | 74 +++++++------- - glib/demo/attachments.c | 4 +- - glib/demo/find.c | 4 +- - glib/demo/fonts.c | 4 +- - glib/demo/forms.c | 64 ++++++------ - glib/demo/images.c | 21 ++-- - glib/demo/info.cc | 67 ++++++------ - glib/demo/layers.c | 22 ++-- - glib/demo/links.c | 6 +- - glib/demo/main.c | 31 ++---- - glib/demo/outline.c | 2 +- - glib/demo/page.c | 23 ++--- - glib/demo/print.c | 14 +-- - glib/demo/render.c | 263 - ++++++++++++++---------------------------------- - glib/demo/selections.c | 77 ++++++-------- - glib/demo/text.c | 22 ++-- - glib/demo/transitions.c | 4 +- - glib/demo/utils.c | 101 +++++++++---------- - glib/demo/utils.h | 6 +- - test/gtk-test.cc | 48 +++++---- - 21 files changed, 350 insertions(+), 511 deletions(-) - -commit 9f7d919e68a26bb7dd809986d8394fe20b750bd0 -Author: Anthony Wesley -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 87093d1250807f660042295747a012032f84c034 -Author: Anthony Wesley -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 -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 3a249aa8ad5e9f7511bcafd0416ce51c7efe5f4d -Author: Igor Slepchin -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 ff2c251dbaef9b964af48f51ebb517626ac3145c -Author: Carlos Garcia Campos -Date: Sun May 13 20:13:32 2012 +0200 - - glib-demo: Use poppler_document_new_from_gfile to load the given uri - - glib/demo/main.c | 9 ++------- - 1 file changed, 2 insertions(+), 7 deletions(-) - -commit a7629331ab4ba5b256213af1f1b2954a49953c34 -Author: Carlos Garcia Campos -Date: Sun May 13 20:13:03 2012 +0200 - - glib: Add poppler_document_new_from_gfile - - glib/poppler-document.cc | 46 - +++++++++++++++++++++++++++++++++++++ - glib/poppler-document.h | 4 ++++ - glib/reference/poppler-sections.txt | 1 + - 3 files changed, 51 insertions(+) - -commit 95277b1f481e274ab0ce22ffb44b40437bffa3c8 -Author: Carlos Garcia Campos -Date: Sun May 13 20:11:12 2012 +0200 - - glib Add missing cancellable param in poppler_document_new_from_stream - doc - - glib/poppler-document.cc | 1 + - 1 file changed, 1 insertion(+) - -commit 329bb1e2b4f4b58832847bcf805d19ac0fd5ef02 -Author: Carlos Garcia Campos -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 c4bf7b162028a2f9ffcd2baba2759bdb14fae51f -Author: Carlos Garcia Campos -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 | 43 ++++++++++++++++++++----------------------- - 1 file changed, 20 insertions(+), 23 deletions(-) - -commit 7714b4e319c48ee915061a172208245ae7c4141b -Author: Carlos Garcia Campos -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 4d0786a97e061a752686968bd7976bdda01b1f84 -Author: Carlos Garcia Campos -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 1d1c8175c57ebe6518f4252ab92a20286b7d4c6f -Author: Carlos Garcia Campos -Date: Sun May 13 18:41:25 2012 +0200 - - glib: Add poppler_document_new_from_stream - - A PopplerInputStream has been added to handle GMemoryInputStream and - GLocalFileInputStream, since we don't want to cache the contents in - those cases. A PopplerCachedFileLoader has been added to handle all - other cases. - - configure.ac | 10 +-- - glib/Makefile.am | 4 + - glib/poppler-cached-file-loader.cc | 108 +++++++++++++++++++++++++++ - glib/poppler-cached-file-loader.h | 44 +++++++++++ - glib/poppler-document.cc | 69 ++++++++++++++++++ - glib/poppler-document.h | 6 ++ - glib/poppler-input-stream.cc | 141 - ++++++++++++++++++++++++++++++++++++ - glib/poppler-input-stream.h | 74 +++++++++++++++++++ - glib/reference/poppler-docs.sgml | 4 + - glib/reference/poppler-sections.txt | 1 + - poppler-glib-uninstalled.pc.in | 2 +- - poppler-glib.pc.in | 2 +- - 12 files changed, 458 insertions(+), 7 deletions(-) - -commit 13d2aa303eb1fd900f1045efec14af8002477b02 -Author: Thomas Freitag -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 b477443e8a4c52500529aaf3be76f01a61e85f28 -Author: Thomas Freitag -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 -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 8f040dec2ce2eae24dd1eb15900d4d284e4b3848 -Author: Albert Astals Cid -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 7f47630a7fc19214cd48dbd164ecf577ba35cc46 -Author: Albert Astals Cid -Date: Thu May 10 23:12:04 2012 +0200 - - Compile with the unsupported ENABLE_PLUGINS defined - - poppler/GlobalParams.cc | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 22264cb230fc5902aea14ab43fa013a8ebdbf812 -Author: Albert Astals Cid -Date: Thu May 10 23:04:33 2012 +0200 - - Make it compile - - Sorry :-/ - - goo/gfile.cc | 82 - -------------------------------------------------- - goo/gfile.h | 4 --- - poppler/GlobalParams.h | 2 +- - 3 files changed, 1 insertion(+), 87 deletions(-) - -commit 44bf99a7b8683a077f2a5db50541099c109aa069 -Author: Albert Astals Cid -Date: Thu May 10 22:59:18 2012 +0200 - - Kill the concept of "base dir" - - We are a library so having a "common configuration folder" does - not really - make much sense at a library level, and even less if it's called - .xpdf :D - - Fixes bug 49448 - - goo/gfile.cc | 46 - ---------------------------------------------- - goo/gfile.h | 3 --- - poppler/GfxState.cc | 16 ++-------------- - poppler/GlobalParams.cc | 21 --------------------- - poppler/GlobalParams.h | 3 --- - test/perf-test.cc | 1 - - 6 files changed, 2 insertions(+), 88 deletions(-) - -commit bb091e38a1c0248ba24b0711b4afc0b0524cce10 -Author: Albert Astals Cid -Date: Thu May 10 22:38:41 2012 +0200 - - Make it be something closer to real english - - utils/pdftohtml.1 | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 67f3c3e0d03ec63df7c6028cbd626e384d231c2b -Author: Fabio D'Urso -Date: Wed May 9 16:48:15 2012 +0200 - - GooString formatting: add support for uppercase hexadecimal + Use - it in Annot::layoutText - - goo/GooString.cc | 61 - ++++++++++++++++++++++++++++++++++++++++++++++---------- - goo/GooString.h | 17 ++++++++-------- - poppler/Annot.cc | 2 +- - 3 files changed, 61 insertions(+), 19 deletions(-) - -commit 1f7f8a78409e6bcc90bd32ea2aaa75ed3a7b6218 -Author: Fabio D'Urso -Date: Wed May 9 16:18:05 2012 +0200 - - Use error() instead of fprintf(stderr, ...) in Annot::layoutText - - poppler/Annot.cc | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -commit a7a2e72f9ba43816a81278e0565d31807ac5ceb5 -Author: Albert Astals Cid -Date: Thu May 10 22:31:24 2012 +0200 - - More gs cleanup and forgot the (C) on modification - - goo/gfile.cc | 2 +- - goo/gfile.h | 2 +- - utils/pdftohtml.cc | 4 ---- - 3 files changed, 2 insertions(+), 6 deletions(-) - -commit ad36d22d1f11339be90403534b921cce120fdbad -Author: Albert Astals Cid -Date: Thu May 10 22:24:40 2012 +0200 - - pdftohtml: Remove the option to invoke gs - - goo/gfile.cc | 8 --- - goo/gfile.h | 3 -- - utils/pdftohtml.1 | 8 +-- - utils/pdftohtml.cc | 149 - ++++++++++++----------------------------------------- - 4 files changed, 36 insertions(+), 132 deletions(-) - -commit 4114c928fa2560937e02319f57937f1c267a9817 -Author: Albert Astals Cid -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -Date: Mon Mar 26 11:13:34 2012 +0200 - - define POPPLER_VERSION as C string - - Signed-off-by: Peter Breitenlohner - - configure.ac | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -commit 4a38d933d06d189317b1b9028c3fa4ae2a1551af -Author: Suzuki Toshiya -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 -Date: Thu Mar 29 07:52:30 2012 +0200 - - Fix help message - - Partial credit goes to suzuki toshiya - - configure.ac | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -commit 631224dc0c721119c91984f1940c9e51edf17eca -Author: Fabio D'Urso -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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= - -sCIDFMAP=/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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -Date: Sun Feb 19 15:45:31 2012 +1030 - - update .gitignore - - utils/.gitignore | 1 + - 1 file changed, 1 insertion(+) - -commit 1cc3e152d6e879eb13fbdf2964ede3e01d13d097 -Author: Adrian Johnson -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -Date: Thu Nov 3 15:30:45 2011 +0100 - - qt4: include - - qt4/src/poppler-private.h | 1 + - 1 file changed, 1 insertion(+) - -commit 955cd0c7bd3a72340deba098f4242a4904adc60f -Author: Albert Astals Cid -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -Date: Mon Oct 17 20:33:03 2011 +1030 - - utils: Add GooString arg to parseargs and use for paths in pdftocairo - - 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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -Date: Sat Sep 24 09:38:52 2011 +0200 - - Merge branch 'master' into xpdf303merge - -commit 69707f0a9b5a94c80817039db943fb4f26e743e3 -Author: Adrian Johnson -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 -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 -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 -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 -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 -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 -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 -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 -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 -Date: Sun Sep 18 16:31:10 2011 +0200 - - Merge branch 'master' into xpdf303merge - - Conflicts: - poppler/Gfx.cc - -commit e23f6b9cade804136bd4bb58182f4fe0b072fbf2 -Author: Carlos Garcia Campos -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -Date: Sun Sep 18 11:12:38 2011 +0200 - - Merge branch 'master' into xpdf303merge - -commit 12c6239ca4f1f6a5de72aebd755f9d1354ea5837 -Author: Carlos Garcia Campos -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -Date: Tue Aug 30 16:21:58 2011 +0200 - - Merge branch 'master' into xpdf303merge - -commit 0ca5453fea9e5342188f772acd6f31af1778f236 -Author: Albert Astals Cid -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 -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 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   - - 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. - - poppler/CairoFontEngine.cc | 0 - poppler/CairoOutputDev.cc | 0 - 2 files changed, 0 insertions(+), 0 deletions(-) - -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 - - msvc/poppler/poppler-config.h | 0 - poppler/Annot.cc | 0 - poppler/CairoFontEngine.cc | 0 - poppler/CairoOutputDev.cc | 0 - poppler/Catalog.cc | 0 - poppler/Form.cc | 0 - poppler/GfxFont.cc | 0 - poppler/GfxState.cc | 0 - poppler/Page.cc | 0 - poppler/SplashOutputDev.cc | 0 - poppler/TextOutputDev.cc | 0 - splash/Splash.cc | 0 - splash/SplashFTFontEngine.cc | 0 - test/perf-test-preview-dummy.cc | 0 - test/perf-test-preview-win.cc | 0 - test/perf-test.cc | 0 - 16 files changed, 0 insertions(+), 0 deletions(-) - -commit 6c69473f2f4a49757614ddd249e65bb7a13c63c1 -Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> -Date: Fri Sep 21 08:09:53 2007 -0700 - - undo accidental mode change - - makefile.vc | 0 - 1 file changed, 0 insertions(+), 0 deletions(-) - -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-overrides.txt | 0 - 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-unused.sgml | 0 - glib/reference/tmpl/poppler.sgml | 216 ++++++++++++++++ - glib/reference/tmpl/stamp-poppler-enums.sgml | 19 ++ - 16 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/Build/source/libs/poppler/poppler-0.35.0/ConfigureChecks.cmake b/Build/source/libs/poppler/poppler-0.35.0/ConfigureChecks.cmake deleted file mode 100644 index d3f57325720..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/ConfigureChecks.cmake +++ /dev/null @@ -1,61 +0,0 @@ -# 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(pread64 HAVE_PREAD64) -check_function_exists(lseek64 HAVE_LSEEK64) -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) -check_function_exists(rand_r HAVE_RAND_R) -check_function_exists(strcpy_s HAVE_STRCPY_S) -check_function_exists(strcat_s HAVE_STRCAT_S) - -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/Build/source/libs/poppler/poppler-0.35.0/INSTALL b/Build/source/libs/poppler/poppler-0.35.0/INSTALL deleted file mode 100644 index 56b077d6a0b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/INSTALL +++ /dev/null @@ -1,236 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/Makefile.am b/Build/source/libs/poppler/poppler-0.35.0/Makefile.am deleted file mode 100644 index 691512f4e3a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/Makefile.am +++ /dev/null @@ -1,131 +0,0 @@ -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_QT5 -qt5_subdir = qt5 -qt5_pc_file = poppler-qt5.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 - -SUBDIRS = goo fofi $(splash_subdir) poppler utils $(glib_subdir) test $(qt4_subdir) $(qt5_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-qt5.pc.in \ - poppler-qt5-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) \ - $(qt5_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 \ - qt5/src/CMakeLists.txt \ - qt5/tests/CMakeLists.txt \ - qt5/CMakeLists.txt \ - qt5/demos/CMakeLists.txt \ - test/CMakeLists.txt \ - utils/CMakeLists.txt \ - CMakeLists.txt \ - ConfigureChecks.cmake \ - cmake/modules/CheckFileOffsetBits.c \ - cmake/modules/CheckFileOffsetBits.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-qt5.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/Build/source/libs/poppler/poppler-0.35.0/NEWS b/Build/source/libs/poppler/poppler-0.35.0/NEWS deleted file mode 100644 index 1354d3b1a71..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/NEWS +++ /dev/null @@ -1,2363 +0,0 @@ -Release 0.35.0 - core: - * Fix assert in broken file. Bug #91344 - * Adjust memory layout computation of GooString - * Make SplashBitmap XBGR transfer alpha channel - * Splash: Fix wrong writes on non rgb outputs. Bug #90570 - * Splash: remove ifndef in Windows code - * GlobalParamsWin bugfixes. Bug #91053 - - qt4: - * Switch default image format - * Add IgnorePaperColor render flag - - qt5: - * Improve efficiency of Poppler::Page::renderToImage - * Switch default image format - * Add IgnorePaperColor render flag - - build system: - * Allow configuring SPLASH_CMYK support - * Add configure --enable-build-type. Bug #90796 - - glib: - * Explicitly link against pthread - * Deprecation fixes - - utils: - * pdftocairo: Fix cast to pointer from integer of different size on win64 - -Release 0.34.0 - core: - * Splash: Fix crash in PDF with nested softmasks. Bug #91240 - * Splash: Speed up of rendering icc based images. Bug #90171 - * PSOutputDev: Embed Type1 fonts to PostScript files correctly. Bug #19747 - * Fix pedantic memory leak - - glib: - * update new symbols section - - build system: - * cmake: Make sure ENABLE_LIBOPENJPEG is either 0 or 1 - -Release 0.33.0 - core: - * Fix regression in pdftops parameter passing. Bug #89827 - * Combine base characters and diacritical marks. Bug #87215 - * Use width from W array for WMode positioning. Bug #89621 - * Fixed adding annotation of Subtype Popup to pdf page. Bug #89136 - * CairoOutputDev: Fix memory leak in CairoFreeTypeFont::create - * SplashOutputDev: memset on error to have reproducible outputs - - qt4: - * Fix PDF Text String -> QString conversion. KDE Bug #344849 - - qt5: - * Fix PDF Text String -> QString conversion. KDE Bug #344849 - - glib: - * Add poppler_annot_markup_set_popup_rectangle() - * Fix segfault when creating PopplerAction. Bug #90093 - - utils: - * pdftohtml: Set exit status adecuately. Bug #83609 - - build system: - * configure: Fix invalid shell comparaison in libtiff test - -Release 0.32.0 - core: - * Annotations: Fix rendering of empty BG/BC arrays - * Splash: Fix wrong colour shown when GouraudTriangleShFill uses a DeviceN colorspace. Bug #89182 - * Splash: Fix use of uninitialized variable in Splash::pipeRun - * Remove unnecesary check for font validity. Bug #88939 - * Small optimization in GooString::appendfv(). Bug #89096 - * Fix crashes in malformed files - - utils: - * pdftops: Make colorpsace optimization an option instead of default - * pdfseparate: use always an unique instance for PDFDoc for savePageAs - - build system: - * cmake: If extra-cmake-modules is around include the Sanitizers module - -Release 0.31.0 - core: - * CairoOutputDev: support embedding JBIG2 image data - * Accept malformed documents whose root is a Page instead of a Pages. Bug #88172 - * Fix crash on broken documents - * JPEG2000Stream: Inline doGetChar and doLookChar - * GlobalParams cleaning - - utils: - * pdftops: Add rasterization option. Bug #85934 - - qt4: - * Expose whole-words search option - - qt5: - * Expose whole-words search option - -Release 0.30.0 - core: - * Openjpeg2 support (openjpeg 1 is preferred). Bug #58906 - * Fix potential memory corruption on TextSelectionDumper. Bug #84555 - * Check for invalid matrix in annotation. Bug #84990 - * Open some not conforming files. Bug #85919 - * PSOutputDev: Accept a list of pages indeces instead of first, last. Bug #84833 - * Fix memory leak on error condition - - cpp: - * New API to set debug output function - - build system: - * configure: Improve support with older clang versions. Bug #76963 - - utils: - * pdfunite: Support output intents, optional content and acroform - -Release 0.29.0 - core: - * Use correct LAB byte array for lcms input. Bug #86388 - * Write correct size in trailer dict. Bug #86063 - * Use Default colorspaces if present instead of Device colorspaces - * Solve blend mode problem in CYMK and DeviceN for separable blend modes - * Compilation/warning fixes on SunOS - * Regression test improvements - - glib: - * demo: Compilation fixlets - - build system: - * cofigure: print "no" instead of "auto" if lcms not found - -Release 0.28.0 - core: - * Fix rendering of file with a wrong embedded font. Bug #84270 - * Use alt colorspace to get CMYK values for an ICC based CMYK colorspace. Bug #79019 - * Map Standard/Expert encoding ligatures to AGLFN names. Bug #80093 - * Make Attribute::getName() work when UTF-16BE is used. Bug #84722 - * Fix memory leak in Dict::remove. Bug #84607 - * Fix crashes in broken files - * SplashOutputDev: Improve Overprintmode and shadings. Bug #80998 - * CairoOutputDev: fix crash when no group color space. Bug #85137 - * CairoOutputDev: Don't render text when text matrix is not invertable. Bug #78042 - * CairoOutputDev: Only embed mime data for gray/rgb/cmyk colorspaces. Bug #80719 - * CairoOutputDev: Only embed mime data if image decode map is identity - * cairo: Use matrix to determine pattern size. Bug #33364 - * Fix compile warnings - * regression test improvements - - glib: - * Fix use of uninitialized members in PopplerInputStream. Bug #82630 - * Documentation improvements - * Do not dist gir_DATA - * Remove use of GTK deprecated functions. Bug #82384. Bug #82385 - * Build introspection linking to the uninstalled libraries. Big #84526 - - qt4: - * Add a new Page::annotations() that let's you specify subtypes - - qt5: - * Add a new Page::annotations() that let's you specify subtypes - - utils: - * pdfseparate: additonal handling for annotations. Bug #77549 - * pdfdetach: fix crash when getPage() returns null. Bug #85145 - * pdftocairo: Add support for printing to a Windows printer. Bug #79936 - - build system: - * Move automake version check from autogen.sh to configure.ac. Bug #79797 - * Makefile.am cleanups. Bug #79411 - * Use poppler-data pkg-config - * Make autogen.sh work with variables with spaces - * Don't use -fPIC on mingw - * Fix build with --disable-utils. Bug #84448 - -Release 0.26.4 - core: - * CairoOutputDev: Make sure we always push a transparency group in setSoftMaskFromImageMask(). Bug #81624 - * Fix a crash when adding Annotation without contents - * Improve non-latin characters in inline notes. Bug #65956 - * Don't check for inlineImg twice. Bug #82059 - * printf() -> error() - - glib: - * Return NULL in poppler_annot_get_contents also for empty strings - * Fix a memory leak when getting text layout and attributes - -Release 0.26.3 - qt5: - * autoconf: Improve moc-qt5 detection - * Fix compilation with MinGW - - glib: - * Fix typo in api docs - * use C90-style comments in public headers - - core: - * Error out instead of exiting if allInter grows too much. Bug #78714 - - qt4: - * Update required version to Qt 4.7.0 - - build system: - * Include stdio.h from poppler-config.h - - misc: - * Update .gitignore files - -Release 0.26.2 - core: - * Make sure we have an xref before using. KDE Bug #335413 - - build system: - * autoconf: Fix typo in configure.ac - - utils: - * pdftohtml: exit with 0 with -v and -h - -Release 0.26.1 - core: - * Use field value V for radio buttons. Bug #75979 - * Fix extraction of text in some files. Bug #78145 - * Only add annotations of the current page when splitting. Bug #77549 - - build system: - * autoconf: Fix libopenjpeg 1.5 detection on some systems. Bug #78389 - - glib: - * Fix multiple definition of PopplerTextSpan - -Release 0.26.0 - qt4: - * Fix mismatched boolean logic in TextAnnotation::setInplaceIntent - - qt5: - * Fix mismatched boolean logic in TextAnnotation::setInplaceIntent - - core: - * Very small code cleanup - - cpp: - * Very small code cleanup - -Release 0.25.3 - core: - * Fix crashes on broken files - * Avoid MinGW/Cygwin warnings due to redefinition of NOMINMAX - * Fix some small memory leaks - - qt5: - * Fix some kinds of OCG models - * Cleanup some deprecated methods - - glib: - * Fix the first coord of the quadrilateral in create_poppler_quads_from_annot_quads(). Bug #76504 - - utils: - * pdftohtml: Fix typo in manpage - - qt4: - * Fix some kinds of OCG models - -Release 0.25.2 - core: - * Tagged-PDF support - * Open some broken files. Bug #75232 - * Fix crashes on broken files - * Fix regression parsing some broken files. KDE Bug #329600 - * Improve compilation under Win 8 with Visual Studio 2012. Bug #73111 - * PSOutputDev: Ensure paper size takes into account rotation. Bug #72312 - * PSOutputDev: Fix DocumentMedia/Page/Media/PageBBox DSC comments - * PSOutputDev: Use crop box as page size - * PSOutputDev: Remove origpagesizes mode and make -origpagesizes an alias for -paper match - * PSOutputDev: Only change paper size when different to previous size - * PSOutputDev: Ensure there is always a page size in the output - * PSOutputDev: Fix regression when creating level1 PS. Bug #75241 - * CairoOutputDev: Clip to crop box. Gnome Bug #649886 - * Splash: Blend usage in PDF with spot colors casue random output. Bug #74883 - * Splash: Fix off by one that caused crash in a file. Bug #76387 - * Make sure number of least objects in hints table is valid. Bug #74741 - * Limit numeric parsing of character names. Bug #38456 - - glib: - * Tagged-PDF support - * Annotation improvements - * Install error callback. Bug #73269 - * Fix gobject-introspection warnings - * demo: Fix performance in text markup annotations - * Increase gtk3 dependency - - qt4: - * Improve naming of internal export/import macros - * Add GCC visibility export attributes - * Expose document-supplied text direction - - qt5: - * Improve naming of internal export/import macros - * Add GCC visibility export attributes - * Expose document-supplied text direction - - utils: - * pdftocairo: Ensure page size and crop box works the same as pdftops - * Fix TIFF writting in Windows. Bug #75969 - - buildsystem: - * Learn about automake 1.14 - * Do not define -ansi. Bug #72499 - * cmake: Install JpegWriter.h depending on libjpeg - * cmake: Use c99 for the c compiler - -Release 0.25.1 - core: - * GooString format: Added some tests + improved documentation - * GooString format: fixed bug with printing LLONG_MIN - * regression test improvements - - qt4: - * Arthur backend font rendering improvements - * test program to save to file - - qt5: - * Arthur backend font rendering improvements - * Improve detection of Qt5 moc. Bug #72744 - * test program to save to file - - utils: - * pdfunite: Work even if there's a single file given - * pdfunite: do not lose fonts when merging some files - -Release 0.25.0 - core: - * Annotation improvements - * Tagged PDF work - * Improve speed on some files using ICC color space - * Use ICC profile in OutputIntents. Bug #34053 - * Limit use of ZapfDingbats character names. Bug #60243 - * Splash: correction for knockout transparency groups - * regression test improvements - - utils: - * pdftoppm: Added thinlinemode option setting - * pdfinfo: Indicate if pdf contains javascript - * pdfinfo: Add option to print out javascript - * pdfimages: Print size, ratio, and ppi - * pdfimages: More image output format support - * pdfseparate: allow zero-padded pagespecs - - glib: - * Annotation improvements - * Add API to get text, text layout and text attributes for a given area - * demo improvements - -Release 0.24.5 - core: - * Fix crash due to wrong formatting of error message. KDE Bug #328511 - -Release 0.24.4 - core: - * Fix regression in broken endstream detection. Bug #70854 - * Catalog: sort entries of NameTrees to make sure lookup works. Bug #26049 - * Don't infinite loop if reading from GooFile::read fails. Bug #71835 - - utils: - * pdftotext: Do not close stdout. Bug #71639 - * pdftotext: Silence warning for may be used uninitialized variable. Bug #71640 - * pdftotext: Escape the text of the xml headers - * Warn the user if he provides a wrong range - - qt4: - * Fix typo in xml API. Bug #71643 - - qt5: - * Fix typo in xml API. Bug #71643 - -Release 0.24.3 - core: - * PSOutputDev: Fix PFB font embedding. Bug #69717 - * CairoOutputDev: Do not set an invalid matrix in drawImage(). Bug #70085 - - qt4: - * Don't crash if getXRef()->copy() fails - - qt5: - * Don't crash if getXRef()->copy() fails - - utils: - * pdfseparate: Allow only one %d in the filename. Bug #69434 - -Release 0.24.2 - core: - * Windows: Fix CreateFile fails with ERROR_SHARING_VIOLATION. Bug #69597 - - utils: - * pdfseparate: improve the path building - * pdftocairo: check file opening failure in beginDocument() - -Release 0.24.1 - core: - * SplashOutputDev: use getRGBLine images if available. Bug #66928 - * SplashOutputDev: Don't copy bitmap if we don't need to. - * PSOutputDev: Fix regression in -eps -level1sep rendering. Bug #68321 - * Fix crash in malformed file 1026.asan.0.42.pdf - * use copyString instead of strdup where memory is freed with gfree. Bug #67666 - - utils: - * pdfdetach: don't mention xpdfrc - * pdftotext: Fix -bbox with stdin as input. Bug #45163 - * pdftohtml: Fix jpeg image export. Bug #48270 - * pdfimages: Fix typos in man page - - glib: - * demo: Remove GTK_DISABLE_DEPRECATED compilation flag - - qt4: - * Fix small typo in documentation - - qt5: - * Fix small typo in documentation - -Release 0.24.0 - core: - * TextOutputDev: Do not draw ligatures more than once when selected. Bug #9001 - * PSOutputDev: Make some pdftops conversions much faster - * PSOutputDev: Initialize t3FillColorOnly - * SplashOutputDev: Fallback to 1x1 bitmap if we fail to create the real size - -Release 0.23.4 - core: - * TextOutputDev: clip the selected text rendering to the selection box. Bug #66983 - * CairoImageOutputDev: Fix the bounding box of saved images - - build system: - * Improve linking against pthreads - -Release 0.23.3 - core: - * Annotation improvements - * Fix crashes on malformed files - * TextSelectionPainter: Draw glyphs after selection background - * TextOutputDev: add a method to TextPage to get the selection as a list of words - - qt5: - * Initial Qt5 port - - qt4: - * Windows compile fixes - * Demo: Allow the choose the page rotation - - build system: - * Fix mingw build - * Minor autotools fixes - -Release 0.23.2 - core: - * SplashOutputDev: Speed-up some tiling on a 10x factor - * Improve caching of lcms2 ICC color profiles - * Put some private classes in an anonymous namespace - - qt4: - * Add a thread stresser tool - - build system: - * Fix mingw build - -Release 0.23.1 - core: - * XRef stream writing: Write 32-bit offsets when possible - * Fix splashModeBGR8 rendering (Bug #64381) - - glib: - * Do not use deprecated gtk_scrolled_window_add_with_viewport() (Bug #64683) - - build system: - * Fix Large file support when using cmake - -Release 0.23.0 - core: - * Make rendering thread safe - * Large file support - * Implement Crypt filter (Bug #62800) - * Fix endstream detection (Bug #62985) - * CairoOutputDev: support uncolored tiling patterns (Bug #59179) - * SplashOutputDev: Introduce Thin Line mode support (Bug #37347) - - qt4: - * Expose Thin Line mode support - -Release 0.22.4 - core: - * Always consider a softmask transfer function (Bug #63587) - * Fix crash on malformed files (Bug #63190) - * Splash: Fix compilation with fixed point mode enabled - - utils: - * Fix crash on some files (Bug #63909) - - qt4: - * Fix name decoding of some attachments (KDE Bug #307786) - - build system: - * Fix compilation with mingw-w64 compiler - -Release 0.22.3 - core: - * Check order bounding box values in tiling pattern (Bug #62369) - * CairoImageOutputDev: Don't change image interpolation when printing (Bug #62418) - * TextOutputDev: Set text matrix when painting selection (Bug #61042) - * Only write the file once when saving (Bug #62739) - * Fix for complete rewrites in repaired files - * Fixlet regarding spec interpretation for Link Zoom value - * Fix typos in man pages - * Fix compile when not using libjpeg - - glib: - * Always start from the beginning when starting a new search on a page (Bug #59972) - - qt4: - * Fix crash in files with LinkRendition (KDE Bug #317710) - - build system: - * Small cmake improvements - -Release 0.22.2 - core: - * Correct rendering of underline and strike out annotations (Bug #61518) - * Workaround broken jpeg stream definitions (Bug #61994) - * SplashOutputDev: Restore CTM on early exits (Bug #61413) - * SplashOutputDev: Make sure we don't try to paint in x < 0 (KDE Bug #315432) - * Fix latin page labels. (Bug #61034) - * Fix compilation with jpeglib9 - * Fix minor valgrind warning - - utils: - * pdfimages: Fix extraction of some images (Bug #61168) - - build system: - * Fix the build with automake-1.13 - -Release 0.22.1 - core: - * Fix crash in some pdf files when extracting text (Bug #59561) - * Fix crashes in wrongly formed files - * Fix wrong warning when opening some files (Bug #58966) - - build system: - * Improve autoconf jpeglib.h detection (Bug #59186) - -Release 0.22.0 - core: - * Fix crash in invalid files that define a <= 0 bits per image value - * Fix a few issues in JPX decoding when not using OpenJPEG - * TextOutputDev: Use page size for max value in TextPage::visitSelection - * Fix typo in error message - - utils: - * Fix pdfunite regression (Bug #58569) - * Demo fixes and improvements - - misc: - * pdf-inspector improvements - -Release 0.21.4 - core: - * SplashOutputDev: Fix crash when rendering in monochrome mode - * SplashOutputDev: Fix line widths in monochrome mode (Bug #57294) - * PSOutputDev: Fix crop on EPS conversion (Bug #30692) - * TextOutputDev: Fix minor logic mistake - * Fix assert on some malformed files (Bug #58257) - * Move #include "jpeglib.h" into .cc file (Bug #57687) - * Filter text that may end up being written to the shell - * Fix windows compile warnings - - glib: - * Add poppler_annot_set_flags (Bug #58015) - * Demo fixes and improvements - - qt4: - * Fix check_lexer on 32-bit systems - -Release 0.21.3 - core: - * Splash: Implement bilinear image scaling (Bug #22138) - * CairoOutputDev: Update fill and stroke color in startPage (Bug #54526) - * Fix GooString::insert() - * Allow large chars in TextPage - * Fix crash on ActualText::end - * Don't use memcpy to copy classes - * Fix warnings - - glib: - * Check if words end with spaces (Bug #54504) - * Ensure text is only computed on first render - * Fix warnings while generating introspection file - * Fix returns tag in PopplerAttachmentSaveFunc api doc - * Minor demo fixes - -Release 0.21.2 - core: - * CairoOutputDev: make drawImage work with images > 32767 in width/height (Bug #56858) - * CairoOutputDev: Fix soft mask when image resolution != smask resolution (Bug #57070) - * CairoOutputDev: Fix crash in CairoImageOutputDev with setSoftMaskFromImageMask (Bug #57067) - * Remove a check on fonts that we don't need (Bug #56753) - * Misc code cleanups - - utils: - * pdftocairo: Add tiff output support (Bug #57006) - * pdfunite: Fix -v (Bug #56817) - * Misc code cleanups - -Release 0.21.1 - core: - * Annotation improvements - * Form improvements - * CairoImageOutputDev: Support parameterized Gouraud shading (Bug #56463) - * UTF validation fixes - * Do not call drawing routines if we don't need non text (Bug #54617) - * Fix Memory leak in CharCodeToUnicode (Bug #54702) - - qt4: - * Make LinkRendition properties available (Bug #55378) - * Accessors for FormWidgetChoice::editChoice - * Implement overprint - -Release 0.21.0 - core: - * Support the modification of files with Encrypt - * Annotation improvements - * Form improvements - * Splash: Implement DeviceN support - * Splash: Avoid bogus memory error for tilingPattern - * TextOutputDev: Allow multiple fonts in a TextWord - * Kill the concept of base dir - * PSOutputDev: Always write HiResBoundingBox (Bug #53159) - * Convert UTF-16 to UCS-4 when reading toUnicode cmap - * GooString formatting: add support for uppercase hexadecimal - * Use error() instead of fprintf(stderr, ...) in Annot::layoutText - * poppler-config.h: remove WITH_FONTCONFIGURATION_* macros - - glib: - * Annotation improvements - * Add poppler_page_remove_annot() - * Add poppler_document_new_from_stream - * Add poppler_document_new_from_gfile - * Add poppler_page_find_text_with_options (Bug #2951) - * Demo improvements - * Port tests and demo to GTK+3 - - qt4: - * Add accessor methods for movie poster information - * Make 'additional actions' available in Annotation API (Bug #53589) - * Add whole-page search method to Poppler::Page - * Small changes in tests - - utils: - * pdftohtml: Make the output more xhtml compliant - * pdftohtml: Add -fontfullname. (Bug #49872) - * pdftohtml: Do not invoke gs anymore - - build system: - * Add the possibility of using lcms1 even if lcms2 is installed - * Remove extra fontconfig CFLAGS and LIBS - -Release 0.20.5 - core: - * Fix crashes in malformed documents - * Fix parsing of very big numbers - * Splash: Do not render invalid font outlines (Bug #55573) - * Check for NaN in TextPage::addChar - - build system: - * Fix build using mingw64 with winpthread - * autotools: Fix compilation when lcms is on non standard locations (Bug #55326) - * Support automake-1.12 (Bug #55541) - - glib: - * Chain up finalize to the parent class (Bug #55521) - -Release 0.20.4 - core: - * Improvements regarding embedded 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 embedded 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   - * 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/Build/source/libs/poppler/poppler-0.35.0/README b/Build/source/libs/poppler/poppler-0.35.0/README deleted file mode 100644 index fa223900fbf..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/README +++ /dev/null @@ -1,37 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/README-XPDF b/Build/source/libs/poppler/poppler-0.35.0/README-XPDF deleted file mode 100644 index e97791ce5b2..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/README-XPDF +++ /dev/null @@ -1,423 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/TODO b/Build/source/libs/poppler/poppler-0.35.0/TODO deleted file mode 100644 index e067c2a3156..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/TODO +++ /dev/null @@ -1,40 +0,0 @@ -* 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/Build/source/libs/poppler/poppler-0.35.0/config.h.cmake b/Build/source/libs/poppler/poppler-0.35.0/config.h.cmake deleted file mode 100644 index 400b16b1590..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/config.h.cmake +++ /dev/null @@ -1,234 +0,0 @@ -/* 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 - -/* Define to 1 if you have the `pread64' function. */ -#cmakedefine HAVE_PREAD64 1 - -/* Define to 1 if you have the `lseek64' function. */ -#cmakedefine HAVE_LSEEK64 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 `rand_r' function. */ -#cmakedefine HAVE_RAND_R 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 "${POPPLER_DATADIR}" - -/* Support for curl based doc builder is compiled in. */ -#cmakedefine POPPLER_HAS_CURL_SUPPORT 1 - -/* Include support for CMYK rasterization */ -#cmakedefine SPLASH_CMYK 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. */ -#cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@ - -/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ -/* TODO This is wrong, port if needed #undef _LARGEFILE_SOURCE */ - -/* Define for large files, on AIX-style hosts. */ -/* TODO This is wrong, port if needed #undef _LARGE_FILES */ diff --git a/Build/source/libs/poppler/poppler-0.35.0/config.h.in b/Build/source/libs/poppler/poppler-0.35.0/config.h.in deleted file mode 100644 index 786143b27d4..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/config.h.in +++ /dev/null @@ -1,276 +0,0 @@ -/* 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 `lseek64' function. */ -#undef HAVE_LSEEK64 - -/* 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 to 1 if you have the `pread64' function. */ -#undef HAVE_PREAD64 - -/* Define if you have POSIX threads libraries and header files. */ -#undef HAVE_PTHREAD - -/* Have PTHREAD_PRIO_INHERIT. */ -#undef HAVE_PTHREAD_PRIO_INHERIT - -/* Defines if rand_r is available on your system */ -#undef HAVE_RAND_R - -/* 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 `strcat_s' function. */ -#undef HAVE_STRCAT_S - -/* Define to 1 if you have the `strcpy_s' function. */ -#undef HAVE_STRCPY_S - -/* 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 - -/* Include support for CMYK rasterization */ -#undef SPLASH_CMYK - -/* 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 - -/* Defined if using openjpeg1 */ -#undef USE_OPENJPEG1 - -/* Defined if using openjpeg2 */ -#undef USE_OPENJPEG2 - -/* 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/Build/source/libs/poppler/poppler-0.35.0/configure.ac b/Build/source/libs/poppler/poppler-0.35.0/configure.ac deleted file mode 100644 index bd0fcc2a14f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/configure.ac +++ /dev/null @@ -1,1050 +0,0 @@ -m4_define([poppler_version_major],[0]) -m4_define([poppler_version_minor],[35]) -m4_define([poppler_version_micro],[0]) -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([1.7 foreign]) -m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) -AC_CONFIG_HEADERS([config.h 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 -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 -lwinspool -lcomdlg32" - create_shared_lib="-no-undefined" - auto_import_flags="-Wl,--enable-auto-import" - - # Use mingw's ansi stdio extensions - CXXFLAGS="$CXXFLAGS -D__USE_MINGW_ANSI_STDIO=1" - ;; -esac - -AC_SUBST(win32_libs) -AC_SUBST(create_shared_lib) -AC_SUBST(auto_import_flags) - -AX_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) - -dnl ##### Emulate cmake -DCMAKE_BUILD_TYPE=Release using options from cmake/modules/PopplerMacros.cmake - -AC_ARG_ENABLE(build-type, - AC_HELP_STRING([--enable-build-type=@<:@relwithdebinfo/release/debug/debugfull/profile@:>@], - [Build with options similar to 'cmake -DCMAKE_BUILD_TYPE=' values.]), - [enable_build_type=no; - case "$enableval" in - relwithdebinfo|release|debug|debugfull|profile) enable_build_type="$enableval" ;; - *) AC_MSG_ERROR([bad value $enableval for --enable-build-type option. - Options are relwithdebinfo, release, debug, debugfull, and profile.]) ;; - esac], - enable_build_type=no) - -if test "x$GCC" = "xyes"; then - case "$enable_build_type" in - relwithdebinfo) - CFLAGS="-O2 -g $CFLAGS" - CXXFLAGS="-O2 -g $CXXFLAGS" - ;; - release) - CFLAGS="-O2 $CFLAGS -g0 -DNDEBUG" - CXXFLAGS="-O2 $CXXFLAGS -g0 -DNDEBUG" - ;; - debug) - CFLAGS="-O2 -g $CFLAGS -fno-reorder-blocks -fno-schedule-insns -fno-inline" - CXXFLAGS="-O2 -g $CXXFLAGS -fno-reorder-blocks -fno-schedule-insns -fno-inline" - ;; - debugfull) - CFLAGS="$CFLAGS -g3 -fno-inline" - CXXFLAGS="$CXXFLAGS -g3 -fno-inline" - ;; - profile) - CFLAGS="$CFLAGS -g3 -fno-inline -ftest-coverage -fprofile-arcs" - CXXFLAGS="$CXXFLAGS -g3 -fno-inline -ftest-coverage -fprofile-arcs" - LDFLAGS="$LDFLAGS -fprofile-arcs -ftest-coverage -lgcov" - ;; - *) - enable_build_type=no - ;; - esac -else - case "$enable_build_type" in - relwithdebinfo|release|debug|debugfull|profile) - echo " Warning: --enable-build-type ignored for non-gcc compiler." - ;; - esac - enable_build_type=no -fi - -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])) - -AC_ARG_ENABLE(cmyk, -[ --enable-cmyk Include support for CMYK rasterization], -AC_DEFINE(SPLASH_CMYK, [1], [Include support for CMYK rasterization])) - -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 - -dnl ##### Check for installed poppler-data. Use the same datarootdir as default otherwise. -PKG_CHECK_EXISTS(poppler-data, - [POPPLER_DATADIR=`$PKG_CONFIG --variable=poppler_datadir poppler-data` - AC_DEFINE_DIR(POPPLER_DATADIR, "{POPPLER_DATADIR}", [Poppler data dir])], - [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])) -AC_CHECK_FUNC(rand_r, AC_DEFINE(HAVE_RAND_R, 1, [Defines if rand_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. -openjpeg1="no" -openjpeg2="no" -AC_ARG_ENABLE(libopenjpeg, - AC_HELP_STRING([--enable-libopenjpeg=@<:@auto/openjpeg1/openjpeg2/none@:>@], - [Use openjpeg for JPEG2000 images. 'auto' prefers openjpeg1 over openjpeg2 if both are available due to regressions in openjpeg2 [[default=auto]]]), - [enable_libopenjpeg=$enableval], - [enable_libopenjpeg="auto"]) - -openjpeg_header=yes - -dnl test for libopenjpeg1 -if test x$enable_libopenjpeg = xopenjpeg1 || test x$enable_libopenjpeg = xauto; then - PKG_CHECK_MODULES(LIBOPENJPEG, libopenjpeg, - [openjpeg1="yes"], - [AC_CHECK_LIB([openjpeg], [opj_cio_open], - [openjpeg1="yes" - LIBOPENJPEG_LIBS="-lopenjpeg"],[openjpeg_header=no]) - AC_CHECK_HEADERS([openjpeg.h],, - [openjpeg="no"])]) -fi - -dnl test for libopenjpeg2 -if test x$openjpeg1 = xno; then - if test x$enable_libopenjpeg = xopenjpeg2 || test x$enable_libopenjpeg = xauto; then - PKG_CHECK_MODULES(LIBOPENJPEG, libopenjp2, - [openjpeg2=yes],[]) - fi -fi - -if test x$enable_libopenjpeg = xopenjpeg1 && test x$openjpeg1 = xno; then - if test x$openjpeg_header = xno; then - AC_MSG_ERROR("*** libopenjpeg headers not found ***") - else - AC_MSG_ERROR("*** libopenjpeg library not found ***") - fi -fi - -if test x$enable_libopenjpeg = xopenjpeg2 && test x$openjpeg2 = xno; then - AC_MSG_ERROR("*** libopenjp2 library not found ***") -fi - -if test x$openjpeg1 = xyes || test x$openjpeg2 = xyes; then - enable_libopenjpeg=yes - if test x$openjpeg1 = xyes; then - AC_DEFINE(USE_OPENJPEG1, 1, [Defined if using openjpeg1]) - fi - if test x$openjpeg2 = xyes; then - AC_DEFINE(USE_OPENJPEG2, 1, [Defined if using openjpeg2]) - fi - - 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.])], - [PKG_CHECK_EXISTS(libopenjpeg1 >= 1.5, - [AC_DEFINE(WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG, 1, [OpenJPEG with the OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG flag.])], - []) - ]) -else - enable_libopenjpeg=no -fi - -AM_CONDITIONAL(BUILD_LIBOPENJPEG, test x$openjpeg1 = xyes || test x$openjpeg2 = 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" != x; 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_CFLAGS) - 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) -AC_CHECK_FUNCS(strcpy_s strcat_s) - -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 -AC_CHECK_FUNCS(pread64 lseek64) - -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) -CAIRO_DEPS="cairo >= $CAIRO_VERSION cairo-ft >= $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_DEPS) -elif test x$enable_cairo_output = xtry; then - PKG_CHECK_MODULES(CAIRO, $CAIRO_DEPS, - [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 gio-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 gio-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 gio-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.7.0 QtGui >= 4.7.0 QtXml >= 4.7.0) - PKG_CHECK_MODULES(POPPLER_QT4_TEST, - QtTest >= 4.7.0) -elif test x$enable_poppler_qt4 = xtry; then - PKG_CHECK_MODULES(POPPLER_QT4, - QtCore >= 4.7.0 QtGui >= 4.7.0 QtXml >= 4.7.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.7.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(MOCQT42, moc-qt4) - AC_MSG_CHECKING([for Qt4 moc-qt4]) - mocversion=`$MOCQT42 -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" - else - MOCQT4=$MOCQT42 - fi - fi - AC_SUBST(MOCQT4) - AC_MSG_RESULT([$MOCQT4]) -fi - -AM_CONDITIONAL(BUILD_POPPLER_QT4, test "x$enable_poppler_qt4" = "xyes") - -dnl -dnl Try Qt5 -dnl - -AC_ARG_ENABLE(poppler-qt5, - AC_HELP_STRING([--disable-poppler-qt5], - [Don't compile poppler Qt5 wrapper.]), - enable_poppler_qt5=$enableval, - enable_poppler_qt5="try") -if test x$enable_poppler_qt5 = xyes; then - PKG_CHECK_MODULES(POPPLER_QT5, - Qt5Core >= 5.0.0 Qt5Gui >= 5.0.0 Qt5Xml >= 5.0.0 Qt5Widgets >= 5.0.0) - PKG_CHECK_MODULES(POPPLER_QT5_TEST, - Qt5Test >= 5.0.0 ) -elif test x$enable_poppler_qt5 = xtry; then - PKG_CHECK_MODULES(POPPLER_QT5, - Qt5Core >= 5.0.0 Qt5Gui >= 5.0.0 Qt5Xml >= 5.0.0 Qt5Widgets >= 5.0.0, - [enable_poppler_qt5="yes"], - [enable_poppler_qt5="no"]) - if test x$enable_poppler_qt5 = xyes; then - PKG_CHECK_MODULES(POPPLER_QT5_TEST, - Qt5Test >= 5.0.0, - [enable_poppler_qt5="yes"], - [enable_poppler_qt5="no"]) - fi -fi - -AC_SUBST(POPPLER_QT5_CXXFLAGS) -AC_SUBST(POPPLER_QT5_LIBS) -AC_SUBST(POPPLER_QT5_TEST_LIBS) - -if test x$enable_poppler_qt5 = xyes; then - AC_CHECK_TOOL(MOCQT5, moc) - AC_MSG_CHECKING([for Qt5 moc]) - mocversion=`$MOCQT5 -v 2>&1` - mocversiongrep=`echo $mocversion | grep "Qt 5\|moc 5"` - if test x"$mocversiongrep" != x"$mocversion"; then - AC_MSG_RESULT([no]) - # moc was not the qt5 one, try with moc-qt5 - AC_CHECK_TOOL(MOCQT52, moc-qt5) - AC_MSG_CHECKING([for Qt5 moc-qt5]) - mocversion=`$MOCQT52 -v 2>&1` - mocversiongrep=`echo $mocversion | grep "Qt 5\|moc-qt5 5\|moc 5"` - if test x"$mocversiongrep" != x"$mocversion"; then - AC_CHECK_TOOL(QTCHOOSER, qtchooser) - AC_MSG_CHECKING([for qtchooser]) - qt5tooldir=`QT_SELECT=qt5 qtchooser -print-env | grep QTTOOLDIR | cut -d '=' -f 2 | cut -d \" -f 2` - mocversion=`$qt5tooldir/moc -v 2>&1` - mocversiongrep=`echo $mocversion | grep "Qt 5\|moc 5"` - if test x"$mocversiongrep" != x"$mocversion"; then - # no valid moc found - enable_poppler_qt5=no; - MOCQT5="not found" - else - MOCQT5=$qt5tooldir/moc - fi - else - MOCQT5=$MOCQT52 - fi - fi - AC_SUBST(MOCQT5) - AC_MSG_RESULT([$MOCQT5]) -fi - -AM_CONDITIONAL(BUILD_POPPLER_QT5, test "x$enable_poppler_qt5" = "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") - - -GTK_TEST_DEPS='gtk+-3.0 >= 3.8 gdk-pixbuf-2.0' -if test x$enable_cairo_output = xyes; then - GTK_TEST_DEPS="$GTK_TEST_DEPS $CAIRO_DEPS" -fi -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_TEST_DEPS) -elif test x$enable_gtk_test = xtry; then - PKG_CHECK_MODULES(GTK_TEST, $GTK_TEST_DEPS, - [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([--enable-cms=@<:@auto/lcms1/lcms2/none@:>@], - [Use color management system. 'auto' prefers lcms2 over lcms1 if both are available [[default=auto]]]), - [enable_cms=$enableval], - [enable_cms="auto"]) -if test x$enable_cms = xauto; then - PKG_CHECK_MODULES(LCMS, lcms2, [lcms2=yes], [lcms2=no]) - if test x$lcms2 = xno; then - PKG_CHECK_MODULES(LCMS, lcms, [lcms1=yes], [lcms1=no]) - fi -elif test x$enable_cms = xlcms1; then - PKG_CHECK_MODULES(LCMS, lcms, [lcms1=yes], [lcms1=no]) -elif test x$enable_cms = xlcms2; then - PKG_CHECK_MODULES(LCMS, lcms2, [lcms2=yes], [lcms2=no]) -fi - -if test x$lcms1 = xyes || test x$lcms2 = xyes; then - enable_cms=yes - AC_DEFINE(USE_CMS, 1, [Defines if use cms]) - if test x$lcms1 = xyes; then - lcms1=yes; - AC_DEFINE(USE_LCMS1, 1, [Defines if use lcms1]) - fi -else - enable_cms=no -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) - -# some compilers do not support this flag (see bug #76963) -fno_check_new= -AC_MSG_CHECKING([for -fno-check-new compiler flag]) -AC_LANG_PUSH([C++]) -saved_CXXFLAGS=$CXXFLAGS -CXXFLAGS="-fno-check-new $CXXFLAGS" -AC_TRY_COMPILE([], [], - [AC_MSG_RESULT([yes]) - fno_check_new="-fno-check-new"], - AC_MSG_RESULT([no]) -) -CXXFLAGS=$saved_CXXFLAGS -AC_LANG_POP - -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"; - CFLAGS="-Wall $CFLAGS" ;; - 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 "$host_os" in - mingw*) - # mingw prints "warning: -fPIC ignored for target (all code is position independent)" - # for every file - ;; - *) - CXXFLAGS="-fPIC $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 -qt5/Makefile -qt5/src/Makefile -qt5/tests/Makefile -qt5/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-qt5.pc -poppler-qt5-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" -if test x$enable_cmyk = xyes;then - echo " with CMYK support" -fi -echo " cairo output: $use_cairo" -echo " qt4 wrapper: $enable_poppler_qt4" -echo " qt5 wrapper: $enable_poppler_qt5" -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" -if test x$enable_libopenjpeg = xyes;then - if test x$openjpeg1 = xyes;then - echo " with openjpeg1" - else - echo " with openjpeg2" - fi -fi -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 -if test x$enable_build_type != xno;then - echo " build type: $enable_build_type" -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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiBase.cc b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiBase.cc deleted file mode 100644 index 86bafd80208..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiBase.cc +++ /dev/null @@ -1,201 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiBase.h b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiBase.h deleted file mode 100644 index d613acd2bb1..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiBase.h +++ /dev/null @@ -1,56 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiEncodings.cc b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiEncodings.cc deleted file mode 100644 index 5cea6fab7f1..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiEncodings.cc +++ /dev/null @@ -1,994 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiEncodings.h b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiEncodings.h deleted file mode 100644 index ab80ad362a6..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiEncodings.h +++ /dev/null @@ -1,34 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiIdentifier.cc b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiIdentifier.cc deleted file mode 100644 index be28e2568eb..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiIdentifier.cc +++ /dev/null @@ -1,648 +0,0 @@ -//======================================================================== -// -// FoFiIdentifier.cc -// -// Copyright 2009 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) 2013 Christoph Duelli <duelli@melosgmbh.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 -// -//======================================================================== - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include <stdio.h> -#include <string.h> -#include <limits.h> -#include "goo/gtypes.h" -#include "FoFiIdentifier.h" - -//------------------------------------------------------------------------ - -namespace { // do not pollute global namespace - -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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiIdentifier.h b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiIdentifier.h deleted file mode 100644 index af1323b76d6..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiIdentifier.h +++ /dev/null @@ -1,42 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiTrueType.cc b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiTrueType.cc deleted file mode 100644 index 11699dd6119..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiTrueType.cc +++ /dev/null @@ -1,1863 +0,0 @@ -//======================================================================== -// -// 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, 2014, 2015 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> -// Copyright (C) 2014 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2015 Aleksei Volkov <Aleksei Volkov> -// Copyright (C) 2015 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 <string.h> -#include <algorithm> -#include "goo/gtypes.h" -#include "goo/gmem.h" -#include "goo/GooLikely.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::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, vmtxTabLength; - 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 - vmtxTabLength = 0; - 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; - vmtxTabLength = length; - 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) { - if (unlikely(length > (int)sizeof(vheaTab))) { - error(errSyntaxWarning, -1, "length bigger than vheaTab size"); - length = sizeof(vheaTab); - } - dumpString(vheaTab, length, outputFunc, outputStream); - } else if (needVerticalMetrics && i == t42VmtxTable) { - if (unlikely(length > vmtxTabLength)) { - error(errSyntaxWarning, -1, "length bigger than vmtxTab size"); - length = vmtxTabLength; - } - 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 || - (!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; - } - - // read the post table - readPostTable(); -} - -void FoFiTrueType::readPostTable() { - GooString *name; - int tablePos, postFmt, stringIdx, stringPos, savedStringIdx; - 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 { - savedStringIdx = stringIdx; - 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)) { - stringIdx = savedStringIdx; - if (j < 258) { - ok = gTrue; - nameToGID->removeInt(macGlyphNames[j]); - nameToGID->add(new GooString(macGlyphNames[0]), i); - } else { - goto err; - } - } else { - 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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiTrueType.h b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiTrueType.h deleted file mode 100644 index b40a44a8d70..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiTrueType.h +++ /dev/null @@ -1,209 +0,0 @@ -//======================================================================== -// -// 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, 2012 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); - - // 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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1.cc b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1.cc deleted file mode 100644 index 827ebc7d7c3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1.cc +++ /dev/null @@ -1,359 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2014 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> - -#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 && code < INT_MAX / (base + (*p - '0')); ++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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1.h b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1.h deleted file mode 100644 index f4e29b4ef0b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1.h +++ /dev/null @@ -1,62 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1C.cc b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1C.cc deleted file mode 100644 index c4595a3260e..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1C.cc +++ /dev/null @@ -1,2745 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1C.h b/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1C.h deleted file mode 100644 index 698dccd77fd..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/FoFiType1C.h +++ /dev/null @@ -1,266 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/fofi/Makefile.am b/Build/source/libs/poppler/poppler-0.35.0/fofi/Makefile.am deleted file mode 100644 index 4deb7d5e063..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/fofi/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -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 - -libfofi_la_CPPFLAGS = \ - -I$(top_srcdir) diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/FixedPoint.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/FixedPoint.cc deleted file mode 100644 index 26b2f0fe890..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/FixedPoint.cc +++ /dev/null @@ -1,135 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/goo/FixedPoint.h b/Build/source/libs/poppler/poppler-0.35.0/goo/FixedPoint.h deleted file mode 100644 index 99749802db7..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/FixedPoint.h +++ /dev/null @@ -1,166 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/goo/GooHash.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/GooHash.cc deleted file mode 100644 index f4a92f17506..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooHash.cc +++ /dev/null @@ -1,384 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/goo/GooHash.h b/Build/source/libs/poppler/poppler-0.35.0/goo/GooHash.h deleted file mode 100644 index eda19e31409..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooHash.h +++ /dev/null @@ -1,92 +0,0 @@ -//======================================================================== -// -// GooHash.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) 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 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: - GooHash(const GooHash &other); - GooHash& operator=(const GooHash &other); - - 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/Build/source/libs/poppler/poppler-0.35.0/goo/GooLikely.h b/Build/source/libs/poppler/poppler-0.35.0/goo/GooLikely.h deleted file mode 100644 index 724ccf00870..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooLikely.h +++ /dev/null @@ -1,22 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/goo/GooList.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/GooList.cc deleted file mode 100644 index 6ce4952dc6a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooList.cc +++ /dev/null @@ -1,122 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/goo/GooList.h b/Build/source/libs/poppler/poppler-0.35.0/goo/GooList.h deleted file mode 100644 index c83a0e36a8a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooList.h +++ /dev/null @@ -1,120 +0,0 @@ -//======================================================================== -// -// GooList.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) 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 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: - GooList(const GooList &other); - GooList& operator=(const GooList &other); - - 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/Build/source/libs/poppler/poppler-0.35.0/goo/GooMutex.h b/Build/source/libs/poppler/poppler-0.35.0/goo/GooMutex.h deleted file mode 100644 index b2714b048c7..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooMutex.h +++ /dev/null @@ -1,85 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> -// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com> -// Copyright (C) 2014 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 -// -//======================================================================== - -#ifndef GMUTEX_H -#define GMUTEX_H - -// Usage: -// -// GooMutex m; -// gInitMutex(&m); -// ... -// gLockMutex(&m); -// ... critical section ... -// gUnlockMutex(&m); -// ... -// gDestroyMutex(&m); - -#ifdef _WIN32 -#ifndef NOMINMAX -#define NOMINMAX -#endif -#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; - -inline void gInitMutex(GooMutex *m) { - pthread_mutexattr_t mutexattr; - pthread_mutexattr_init(&mutexattr); - pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(m, &mutexattr); - pthread_mutexattr_destroy(&mutexattr); -} -#define gDestroyMutex(m) pthread_mutex_destroy(m) -#define gLockMutex(m) pthread_mutex_lock(m) -#define gUnlockMutex(m) pthread_mutex_unlock(m) - -#endif - -class MutexLocker { -public: - MutexLocker(GooMutex *mutexA) : mutex(mutexA) { gLockMutex(mutex); } - ~MutexLocker() { gUnlockMutex(mutex); } - -private: - GooMutex *mutex; -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/GooString.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/GooString.cc deleted file mode 100644 index 3f22f368560..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooString.cc +++ /dev/null @@ -1,962 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2012 Pino Toscano <pino@kde.org> -// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> -// Copyright (C) 2015 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 <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, - fmtIntHexUpper, - fmtIntOctal, - fmtIntBinary, - fmtUIntDecimal, - fmtUIntHex, - fmtUIntHexUpper, - fmtUIntOctal, - fmtUIntBinary, - fmtLongDecimal, - fmtLongHex, - fmtLongHexUpper, - fmtLongOctal, - fmtLongBinary, - fmtULongDecimal, - fmtULongHex, - fmtULongHexUpper, - fmtULongOctal, - fmtULongBinary, -#ifdef LLONG_MAX - fmtLongLongDecimal, - fmtLongLongHex, - fmtLongLongHexUpper, - fmtLongLongOctal, - fmtLongLongBinary, -#endif -#ifdef ULLONG_MAX - fmtULongLongDecimal, - fmtULongLongHex, - fmtULongLongHexUpper, - fmtULongLongOctal, - fmtULongLongBinary, -#endif - fmtDouble, - fmtDoubleTrimSmallAware, - fmtDoubleTrim, - fmtChar, - fmtString, - fmtGooString, - fmtSpace -}; - -static const char *formatStrings[] = { - "d", "x", "X", "o", "b", "ud", "ux", "uX", "uo", "ub", - "ld", "lx", "lX", "lo", "lb", "uld", "ulx", "ulX", "ulo", "ulb", -#ifdef LLONG_MAX - "lld", "llx", "llX", "llo", "llb", -#endif -#ifdef ULLONG_MAX - "ulld", "ullx", "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; - GooStringFormatArg argsBuf[ 8 ]; - - argsLen = 0; - argsSize = sizeof(argsBuf) / sizeof(argsBuf[0]); - args = argsBuf; - - 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; - if (args == argsBuf) { - args = (GooStringFormatArg *)gmallocn(argsSize, sizeof(GooStringFormatArg)); - memcpy(args, argsBuf, argsLen * sizeof(GooStringFormatArg)); - } else { - args = (GooStringFormatArg *)greallocn(args, argsSize, - sizeof(GooStringFormatArg)); - } - } - switch (ft) { - case fmtIntDecimal: - case fmtIntHex: - case fmtIntHexUpper: - case fmtIntOctal: - case fmtIntBinary: - case fmtSpace: - args[argsLen].i = va_arg(argList, int); - break; - case fmtUIntDecimal: - case fmtUIntHex: - case fmtUIntHexUpper: - case fmtUIntOctal: - case fmtUIntBinary: - args[argsLen].ui = va_arg(argList, Guint); - break; - case fmtLongDecimal: - case fmtLongHex: - case fmtLongHexUpper: - case fmtLongOctal: - case fmtLongBinary: - args[argsLen].l = va_arg(argList, long); - break; - case fmtULongDecimal: - case fmtULongHex: - case fmtULongHexUpper: - case fmtULongOctal: - case fmtULongBinary: - args[argsLen].ul = va_arg(argList, Gulong); - break; -#ifdef LLONG_MAX - case fmtLongLongDecimal: - case fmtLongLongHex: - case fmtLongLongHexUpper: - case fmtLongLongOctal: - case fmtLongLongBinary: - args[argsLen].ll = va_arg(argList, long long); - break; -#endif -#ifdef ULLONG_MAX - case fmtULongLongDecimal: - case fmtULongLongHex: - case fmtULongLongHexUpper: - 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 fmtIntHexUpper: - formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 16, &str, &len, - gTrue); - 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 fmtUIntHexUpper: - formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 16, - &str, &len, gTrue); - 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 fmtLongHexUpper: - formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 16, &str, &len, - gTrue); - 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 fmtULongHexUpper: - formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 16, - &str, &len, gTrue); - 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 fmtLongLongHexUpper: - formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 16, &str, &len, - gTrue); - 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 fmtULongLongHexUpper: - formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 16, - &str, &len, gTrue); - 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; - } - } - - if (args != argsBuf) { - gfree(args); - } - - return this; -} - -static const char lowerCaseDigits[17] = "0123456789abcdef"; -static const char upperCaseDigits[17] = "0123456789ABCDEF"; - -#ifdef LLONG_MAX -void GooString::formatInt(long long x, char *buf, int bufSize, - GBool zeroFill, int width, int base, - char **p, int *len, GBool upperCase) { -#else -void GooString::formatInt(long x, char *buf, int bufSize, - GBool zeroFill, int width, int base, - char **p, int *len, GBool upperCase) { -#endif - const char *vals = upperCase ? upperCaseDigits : lowerCaseDigits; - GBool neg; - int start, i, j; -#ifdef LLONG_MAX - unsigned long long abs_x; -#else - unsigned long abs_x; -#endif - - i = bufSize; - if ((neg = x < 0)) { - abs_x = -x; - } else { - abs_x = x; - } - start = neg ? 1 : 0; - if (abs_x == 0) { - buf[--i] = '0'; - } else { - while (i > start && abs_x) { - buf[--i] = vals[abs_x % base]; - abs_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, GBool upperCase) { -#else -void GooString::formatUInt(Gulong x, char *buf, int bufSize, - GBool zeroFill, int width, int base, - char **p, int *len, GBool upperCase) { -#endif - const char *vals = upperCase ? upperCaseDigits : lowerCaseDigits; - 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 prevLen = length; - if (CALC_STRING_LEN == lengthA) - lengthA = strlen(str); - - resize(length + lengthA); - memmove(s+i+lengthA, s+i, prevLen-i); - 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::endsWith(const char *suffix) const { - int suffixLen = strlen(suffix); - - if (length < suffixLen) - return gFalse; - - return strcmp(s + length - suffixLen, suffix) == 0; -} - -GBool GooString::hasUnicodeMarker(void) -{ - return length > 1 && (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/Build/source/libs/poppler/poppler-0.35.0/goo/GooString.h b/Build/source/libs/poppler/poppler-0.35.0/goo/GooString.h deleted file mode 100644 index cca5a905e97..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooString.h +++ /dev/null @@ -1,233 +0,0 @@ -//======================================================================== -// -// 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, 2014 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2012-2014 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> -// Copyright (C) 2015 Adam Reichold <adam.reichold@t-online.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 GooString_H -#define GooString_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include <limits.h> // for LLONG_MAX and ULLONG_MAX - -/* <limits.h> and/or the compiler may or may not define these. */ -/* Minimum and maximum values a `signed long long int' can hold. */ -#ifndef LLONG_MAX -# define LLONG_MAX 9223372036854775807LL -#endif -#ifndef LLONG_MIN -# define LLONG_MIN (-LLONG_MAX - 1LL) -#endif - -/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */ -#ifndef ULLONG_MAX -# define ULLONG_MAX 18446744073709551615ULL -#endif - -#include <stdarg.h> -#include <stdlib.h> // for NULL -#include "gtypes.h" - -#ifdef __clang__ -# define GOOSTRING_FORMAT __attribute__((__annotate__("gooformat"))) -#else -# define GOOSTRING_FORMAT -#endif - -class GooString { -public: - - // 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; - - // 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, X, o, b -- int in decimal, lowercase hex, uppercase hex, octal, binary - // ud, ux, uX, uo, ub -- unsigned int - // ld, lx, lX, lo, lb, uld, ulx, ulX, ulo, ulb -- long, unsigned long - // lld, llx, llX, llo, llb, ulld, ullx, ullX, ullo, ullb - // -- long long, unsigned long long - // f, g, gs -- floating point (float or double) - // f -- always prints trailing zeros (eg 1.0 with .2f will print 1.00) - // g -- omits trailing zeros and, if possible, the dot (eg 1.0 shows up as 1) - // gs -- is like g, but treats <precision> as number of significant - // digits to show (eg 0.0123 with .2gs will print 0.012) - // c -- character (char, short or int) - // s -- string (char *) - // t -- GooString * - // w -- blank space; arg determines width - // To get literal curly braces, use {{ or }}. - static GooString *format(const char *fmt, ...) GOOSTRING_FORMAT; - static GooString *formatv(const char *fmt, va_list argList); - - // Destructor. - ~GooString(); - - // Get length. - int getLength() const { return length; } - - // Get C string. - char *getCString() { return s; } - const char *getCString() const { return s; } - - // Get <i>th character. - char getChar(int i) const { 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_FORMAT; - 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; - - // Return true if string ends with suffix - GBool endsWith(const char *suffix) 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 the final object size for different time/space tradeoffs. - // In libc malloc(), rounding is 16 so it's best to choose a value that - // is a multiple of 16. - class MemoryLayout { - char c[sizeof(char*)]; - int i; - char* s; - }; - - static const int STR_FINAL_SIZE = 32; - static const int STR_STATIC_SIZE = STR_FINAL_SIZE - sizeof(MemoryLayout) + sizeof(char*); - - 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, GBool upperCase = gFalse); -#else - static void formatInt(long x, char *buf, int bufSize, - GBool zeroFill, int width, int base, - char **p, int *len, GBool upperCase = gFalse); -#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, GBool upperCase = gFalse); -#else - static void formatUInt(Gulong x, char *buf, int bufSize, - GBool zeroFill, int width, int base, - char **p, int *len, GBool upperCase = gFalse); -#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/Build/source/libs/poppler/poppler-0.35.0/goo/GooTimer.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/GooTimer.cc deleted file mode 100644 index c766c6bf2e4..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooTimer.cc +++ /dev/null @@ -1,95 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/goo/GooTimer.h b/Build/source/libs/poppler/poppler-0.35.0/goo/GooTimer.h deleted file mode 100644 index ac64f6b4868..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/GooTimer.h +++ /dev/null @@ -1,62 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright 2014 Bogdan Cristea <cristeab@gmail.com> -// Copyright 2014 Peter Breitenlohner <peb@mppmu.mpg.de> -// 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 -#ifndef NOMINMAX -#define NOMINMAX -#endif -#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/Build/source/libs/poppler/poppler-0.35.0/goo/ImgWriter.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/ImgWriter.cc deleted file mode 100644 index a30d26d89ad..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/ImgWriter.cc +++ /dev/null @@ -1,15 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/goo/ImgWriter.h b/Build/source/libs/poppler/poppler-0.35.0/goo/ImgWriter.h deleted file mode 100644 index 8feb3511e4d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/ImgWriter.h +++ /dev/null @@ -1,33 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/goo/JpegWriter.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/JpegWriter.cc deleted file mode 100644 index 9b7c5051838..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/JpegWriter.cc +++ /dev/null @@ -1,184 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> -// -//======================================================================== - -#include "JpegWriter.h" - -#ifdef ENABLE_LIBJPEG - -extern "C" { -#include <jpeglib.h> -} - -#include "poppler/Error.h" - -struct JpegWriterPrivate { - bool progressive; - int quality; - JpegWriter::Format format; - struct jpeg_compress_struct cinfo; - struct jpeg_error_mgr jerr; -}; - -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, Format formatA) -{ - priv = new JpegWriterPrivate; - priv->progressive = p; - priv->quality = q; - priv->format = formatA; -} - -JpegWriter::JpegWriter(Format formatA) -{ - priv = new JpegWriterPrivate; - priv->progressive = false; - priv->quality = -1; - priv->format = formatA; -} - -JpegWriter::~JpegWriter() -{ - // cleanup - jpeg_destroy_compress(&priv->cinfo); - delete priv; -} - -bool JpegWriter::init(FILE *f, int width, int height, int hDPI, int vDPI) -{ - // Setup error handler - priv->cinfo.err = jpeg_std_error(&priv->jerr); - priv->jerr.output_message = &outputMessage; - - // Initialize libjpeg - jpeg_create_compress(&priv->cinfo); - - // First set colorspace and call jpeg_set_defaults() since - // jpeg_set_defaults() sets default values for all fields in - // cinfo based on the colorspace. - switch (priv->format) { - case RGB: - priv->cinfo.in_color_space = JCS_RGB; - break; - case GRAY: - priv->cinfo.in_color_space = JCS_GRAYSCALE; - break; - case CMYK: - priv->cinfo.in_color_space = JCS_CMYK; - break; - default: - return false; - } - jpeg_set_defaults(&priv->cinfo); - - // Set destination file - jpeg_stdio_dest(&priv->cinfo, f); - - // Set libjpeg configuration - priv->cinfo.image_width = width; - priv->cinfo.image_height = height; - priv->cinfo.density_unit = 1; // dots per inch - priv->cinfo.X_density = hDPI; - priv->cinfo.Y_density = vDPI; - switch (priv->format) { - case GRAY: - priv->cinfo.input_components = 1; - break; - case RGB: - priv->cinfo.input_components = 3; - break; - case CMYK: - priv->cinfo.input_components = 4; - jpeg_set_colorspace(&priv->cinfo, JCS_YCCK); - priv->cinfo.write_JFIF_header = TRUE; - break; - default: - return false; - } - - // Set quality - if (priv->quality >= 0 && priv->quality <= 100) { - jpeg_set_quality(&priv->cinfo, priv->quality, TRUE); - } - - // Use progressive mode - if (priv->progressive) { - jpeg_simple_progression(&priv->cinfo); - } - - // Get ready for data - jpeg_start_compress(&priv->cinfo, TRUE); - - return true; -} - -bool JpegWriter::writePointers(unsigned char **rowPointers, int rowCount) -{ - if (priv->format == CMYK) { - for (int y = 0; y < rowCount; y++) { - unsigned char *row = rowPointers[y]; - for (unsigned int x = 0; x < priv->cinfo.image_width; x++) { - for (int n = 0; n < 4; n++) { - *row = 0xff - *row; - row++; - } - } - } - } - // Write all rows to the file - jpeg_write_scanlines(&priv->cinfo, rowPointers, rowCount); - - return true; -} - -bool JpegWriter::writeRow(unsigned char **rowPointer) -{ - if (priv->format == CMYK) { - unsigned char *row = rowPointer[0]; - for (unsigned int x = 0; x < priv->cinfo.image_width; x++) { - for (int n = 0; n < 4; n++) { - *row = 0xff - *row; - row++; - } - } - } - // Write the row to the file - jpeg_write_scanlines(&priv->cinfo, rowPointer, 1); - - return true; -} - -bool JpegWriter::close() -{ - jpeg_finish_compress(&priv->cinfo); - - return true; -} - -bool JpegWriter::supportCMYK() -{ - return priv->format == CMYK; -} - - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/JpegWriter.h b/Build/source/libs/poppler/poppler-0.35.0/goo/JpegWriter.h deleted file mode 100644 index d69bbbb8dda..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/JpegWriter.h +++ /dev/null @@ -1,59 +0,0 @@ -//======================================================================== -// -// JpegWriter.h -// -// 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 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" - -struct JpegWriterPrivate; - -class JpegWriter : public ImgWriter -{ -public: - /* RGB - 3 bytes/pixel - * GRAY - 1 byte/pixel - * CMYK - 4 bytes/pixel - */ - enum Format { RGB, GRAY, CMYK }; - - JpegWriter(int quality, bool progressive, Format format = RGB); - JpegWriter(Format format = 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(); - -private: - JpegWriter(const JpegWriter &other); - JpegWriter& operator=(const JpegWriter &other); - - JpegWriterPrivate *priv; -}; - -#endif - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/Makefile.am b/Build/source/libs/poppler/poppler-0.35.0/goo/Makefile.am deleted file mode 100644 index 370e85021be..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/Makefile.am +++ /dev/null @@ -1,66 +0,0 @@ -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 \ - NetPBMWriter.h \ - PNGWriter.h \ - JpegWriter.h \ - TiffWriter.h \ - ImgWriter.h \ - GooLikely.h \ - gstrtod.h \ - grandom.h - -endif - -libgoo_la_SOURCES = \ - gfile.cc \ - gmempp.cc \ - GooHash.cc \ - GooList.cc \ - GooTimer.cc \ - GooString.cc \ - gmem.cc \ - FixedPoint.cc \ - NetPBMWriter.cc \ - PNGWriter.cc \ - JpegWriter.cc \ - TiffWriter.cc \ - ImgWriter.cc \ - gtypes_p.h \ - gstrtod.cc \ - grandom.cc - -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 - -libgoo_la_CPPFLAGS = \ - -I$(top_srcdir) \ - $(libjpeg_includes) \ - $(libtiff_includes) \ - $(libjpeg2000_includes) \ - $(libpng_includes) diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/NetPBMWriter.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/NetPBMWriter.cc deleted file mode 100644 index fca00b26b1a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/NetPBMWriter.cc +++ /dev/null @@ -1,84 +0,0 @@ -//======================================================================== -// -// NetPBMWriter.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) 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, 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Thomas Fischer <fischer@unix-ag.uni-kl.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 "poppler-config.h" - -#include "NetPBMWriter.h" - -// Writer for the NetPBM formats (PBM and PPM) -// This format is documented at: -// http://netpbm.sourceforge.net/doc/pbm.html -// http://netpbm.sourceforge.net/doc/ppm.html - -NetPBMWriter::NetPBMWriter(Format formatA) : format(formatA) -{ -} - -bool NetPBMWriter::init(FILE *f, int widthA, int heightA, int hDPI, int vDPI) -{ - file = f; - width = widthA; - if (format == MONOCHROME) { - fprintf(file, "P4\n"); - fprintf(file, "%d %d\n", widthA, heightA); - } else { - fprintf(file, "P6\n"); - fprintf(file, "%d %d\n", widthA, heightA); - fprintf(file, "255\n"); - } - return true; -} - -bool NetPBMWriter::writePointers(unsigned char **rowPointers, int rowCount) -{ - for (int i = 0; i < rowCount; i++) - writeRow(&rowPointers[i]); - return true; -} - -bool NetPBMWriter::writeRow(unsigned char **row) -{ - if (format == MONOCHROME) { - // PBM uses 0 = white, 1 = black so we need to invert the colors - int size = (width + 7)/8; - for (int i = 0; i < size; i++) - fputc((*row)[i] ^ 0xff, file); - } else { - fwrite(*row, 1, width*3, file); - } - return true; -} - - -bool NetPBMWriter::close() -{ - return true; -} - diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/NetPBMWriter.h b/Build/source/libs/poppler/poppler-0.35.0/goo/NetPBMWriter.h deleted file mode 100644 index 21a19ee7508..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/NetPBMWriter.h +++ /dev/null @@ -1,52 +0,0 @@ -//======================================================================== -// -// NetPBMWriter.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, 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2010 Brian Cameron <brian.cameron@oracle.com> -// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de> -// -//======================================================================== - -#ifndef NETPBMWRITER_H -#define NETPBMWRITER_H - -#include "poppler-config.h" - -#include "ImgWriter.h" - -// Writer for the NetPBM formats (PBM and PPM) -// This format is documented at: -// http://netpbm.sourceforge.net/doc/pbm.html -// http://netpbm.sourceforge.net/doc/ppm.html - -class NetPBMWriter : public ImgWriter -{ -public: - - /* RGB - 3 bytes/pixel - * MONOCHROME - 8 pixels/byte - */ - enum Format { RGB, MONOCHROME }; - - NetPBMWriter(Format formatA = RGB); - ~NetPBMWriter() {}; - - 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: - FILE *file; - Format format; - int width; -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/PNGWriter.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/PNGWriter.cc deleted file mode 100644 index c9d5199d040..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/PNGWriter.cc +++ /dev/null @@ -1,189 +0,0 @@ -//======================================================================== -// -// 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, 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2011 Thomas Klausner <wiz@danbala.tuwien.ac.at> -// Copyright (C) 2012 Pino Toscano <pino@kde.org> -// -//======================================================================== - -#include "PNGWriter.h" - -#ifdef ENABLE_LIBPNG - -#include <zlib.h> -#include <stdlib.h> -#include <string.h> - -#include "poppler/Error.h" -#include "goo/gmem.h" - -#include <png.h> - -struct PNGWriterPrivate { - PNGWriter::Format format; - png_structp png_ptr; - png_infop info_ptr; - unsigned char *icc_data; - int icc_data_size; - char *icc_name; - bool sRGB_profile; -}; - -PNGWriter::PNGWriter(Format formatA) -{ - priv = new PNGWriterPrivate; - priv->format = formatA; - priv->icc_data = NULL; - priv->icc_data_size = 0; - priv->icc_name = NULL; - priv->sRGB_profile = false; -} - -PNGWriter::~PNGWriter() -{ - /* cleanup heap allocation */ - png_destroy_write_struct(&priv->png_ptr, &priv->info_ptr); - if (priv->icc_data) { - gfree(priv->icc_data); - free(priv->icc_name); - } - - delete priv; -} - -void PNGWriter::setICCProfile(const char *name, unsigned char *data, int size) -{ - priv->icc_data = (unsigned char *)gmalloc(size); - memcpy(priv->icc_data, data, size); - priv->icc_data_size = size; - priv->icc_name = strdup(name); -} - -void PNGWriter::setSRGBProfile() -{ - priv->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)priv->icc_data; -#else - png_const_bytep icc_data_ptr = (png_const_bytep)priv->icc_data; -#endif - - /* initialize stuff */ - priv->png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!priv->png_ptr) { - error(errInternal, -1, "png_create_write_struct failed"); - return false; - } - - priv->info_ptr = png_create_info_struct(priv->png_ptr); - if (!priv->info_ptr) { - error(errInternal, -1, "png_create_info_struct failed"); - return false; - } - - if (setjmp(png_jmpbuf(priv->png_ptr))) { - error(errInternal, -1, "png_jmpbuf failed"); - return false; - } - - /* write header */ - png_init_io(priv->png_ptr, f); - if (setjmp(png_jmpbuf(priv->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(priv->png_ptr, Z_BEST_COMPRESSION); - - // Silence silly gcc - png_byte bit_depth = -1; - png_byte color_type = -1; - switch (priv->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(priv->png_ptr, priv->info_ptr, width, height, bit_depth, color_type, interlace_type, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - - png_set_pHYs(priv->png_ptr, priv->info_ptr, hDPI/0.0254, vDPI/0.0254, PNG_RESOLUTION_METER); - - if (priv->icc_data) - png_set_iCCP(priv->png_ptr, priv->info_ptr, priv->icc_name, PNG_COMPRESSION_TYPE_BASE, icc_data_ptr, priv->icc_data_size); - else if (priv->sRGB_profile) - png_set_sRGB(priv->png_ptr, priv->info_ptr, PNG_sRGB_INTENT_RELATIVE); - - png_write_info(priv->png_ptr, priv->info_ptr); - if (setjmp(png_jmpbuf(priv->png_ptr))) { - error(errInternal, -1, "error during writing png info bytes"); - return false; - } - - return true; -} - -bool PNGWriter::writePointers(unsigned char **rowPointers, int rowCount) -{ - png_write_image(priv->png_ptr, rowPointers); - /* write bytes */ - if (setjmp(png_jmpbuf(priv->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(priv->png_ptr, row, 1); - if (setjmp(png_jmpbuf(priv->png_ptr))) { - error(errInternal, -1, "error during png row write"); - return false; - } - - return true; -} - -bool PNGWriter::close() -{ - /* end write */ - png_write_end(priv->png_ptr, priv->info_ptr); - if (setjmp(png_jmpbuf(priv->png_ptr))) { - error(errInternal, -1, "Error during end of write"); - return false; - } - - return true; -} - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/PNGWriter.h b/Build/source/libs/poppler/poppler-0.35.0/goo/PNGWriter.h deleted file mode 100644 index 90a298e7ef3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/PNGWriter.h +++ /dev/null @@ -1,61 +0,0 @@ -//======================================================================== -// -// 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-2013 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com> -// Copyright (C) 2010, 2011, 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2012 Pino Toscano <pino@kde.org> -// -//======================================================================== - -#ifndef PNGWRITER_H -#define PNGWRITER_H - -#include "poppler-config.h" - -#ifdef ENABLE_LIBPNG - -#include "ImgWriter.h" - -struct PNGWriterPrivate; - -class PNGWriter : public ImgWriter -{ -public: - - /* RGB - 3 bytes/pixel - * RGBA - 4 bytes/pixel - * GRAY - 1 byte/pixel - * MONOCHROME - 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: - PNGWriter(const PNGWriter &other); - PNGWriter& operator=(const PNGWriter &other); - - PNGWriterPrivate *priv; -}; - -#endif - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/TiffWriter.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/TiffWriter.cc deleted file mode 100644 index 316008778b1..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/TiffWriter.cc +++ /dev/null @@ -1,236 +0,0 @@ -//======================================================================== -// -// TiffWriter.cc -// -// This file is licensed under the GPLv2 or later -// -// Copyright (C) 2010, 2012 William Bader <williambader@hotmail.com> -// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2012 Pino Toscano <pino@kde.org> -// Copyright (C) 2014 Steven Lee <roc.sky@gmail.com> -// -//======================================================================== - -#include "TiffWriter.h" - -#if ENABLE_LIBTIFF - -#include <string.h> - -#ifdef _WIN32 -#include <io.h> -#endif - -extern "C" { -#include <tiffio.h> -} - -struct TiffWriterPrivate { - TIFF *f; // LibTiff file context - int numRows; // number of rows in the image - int curRow; // number of rows written - const char *compressionString; // compression type - TiffWriter::Format format; // format of image data -}; - -TiffWriter::~TiffWriter() -{ - delete priv; -} - -TiffWriter::TiffWriter(Format formatA) -{ - priv = new TiffWriterPrivate; - priv->f = NULL; - priv->numRows = 0; - priv->curRow = 0; - priv->compressionString = NULL; - priv->format = formatA; -} - -// Set the compression type - -void TiffWriter::setCompressionString(const char *compressionStringArg) -{ - priv->compressionString = compressionStringArg; -} - -// Write a TIFF file. - -bool TiffWriter::init(FILE *openedFile, int width, int height, int hDPI, int vDPI) -{ - unsigned int compression; - uint16 photometric = 0; - uint32 rowsperstrip = (uint32) -1; - int bitspersample; - uint16 samplesperpixel = 0; - 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 - - priv->f = NULL; - priv->curRow = 0; - - // Store the number of rows - - priv->numRows = height; - - // Set the compression - - compression = COMPRESSION_NONE; - - if (priv->compressionString == NULL || strcmp(priv->compressionString, "") == 0) { - compression = COMPRESSION_NONE; - } else { - int i; - for (i = 0; compressionList[i].compressionName != NULL; i++) { - if (strcmp(priv->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", priv->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 format - - bitspersample = (priv->format == MONOCHROME ? 1 : 8); - - switch (priv->format) { - case MONOCHROME: - case GRAY: - samplesperpixel = 1; - photometric = PHOTOMETRIC_MINISBLACK; - break; - - case RGB: - samplesperpixel = 3; - photometric = PHOTOMETRIC_RGB; - break; - - case RGBA_PREMULTIPLIED: - samplesperpixel = 4; - photometric = PHOTOMETRIC_RGB; - break; - - case CMYK: - samplesperpixel = 4; - photometric = PHOTOMETRIC_SEPARATED; - break; - } - - // Open the file - - if (openedFile == NULL) { - fprintf(stderr, "TiffWriter: No output file given.\n"); - return false; - } - -#ifdef _WIN32 - //Convert C Library handle to Win32 Handle - priv->f = TIFFFdOpen(_get_osfhandle(fileno(openedFile)), "-", "w"); -#else - priv->f = TIFFFdOpen(fileno(openedFile), "-", "w"); -#endif - - - if (!priv->f) { - return false; - } - - // Set TIFF tags - - TIFFSetField(priv->f, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField(priv->f, TIFFTAG_IMAGELENGTH, height); - TIFFSetField(priv->f, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField(priv->f, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); - TIFFSetField(priv->f, TIFFTAG_BITSPERSAMPLE, bitspersample); - TIFFSetField(priv->f, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField(priv->f, TIFFTAG_PHOTOMETRIC, photometric); - TIFFSetField(priv->f, TIFFTAG_COMPRESSION, (uint16) compression); - TIFFSetField(priv->f, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(priv->f, rowsperstrip)); - TIFFSetField(priv->f, TIFFTAG_XRESOLUTION, (double) hDPI); - TIFFSetField(priv->f, TIFFTAG_YRESOLUTION, (double) vDPI); - TIFFSetField(priv->f, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); - - if (priv->format == RGBA_PREMULTIPLIED) { - uint16 extra = EXTRASAMPLE_ASSOCALPHA; - TIFFSetField(priv->f, TIFFTAG_EXTRASAMPLES, 1, &extra); - } - - if (priv->format == CMYK) { - TIFFSetField(priv->f, TIFFTAG_INKSET, INKSET_CMYK); - TIFFSetField(priv->f, TIFFTAG_NUMBEROFINKS, 4); - } - - 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(priv->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(priv->f, *rowData, priv->curRow, 0) < 0) { - fprintf(stderr, "TiffWriter: Error writing tiff row %d\n", priv->curRow); - return false; - } - - priv->curRow++; - - return true; -} - -bool TiffWriter::close() -{ - // Close the file - - TIFFClose(priv->f); - - return true; -} - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/TiffWriter.h b/Build/source/libs/poppler/poppler-0.35.0/goo/TiffWriter.h deleted file mode 100644 index 52fdd53efa5..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/TiffWriter.h +++ /dev/null @@ -1,60 +0,0 @@ -//======================================================================== -// -// TiffWriter.h -// -// This file is licensed under the GPLv2 or later -// -// Copyright (C) 2010, 2012 William Bader <williambader@hotmail.com> -// Copyright (C) 2011, 2012 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2012 Pino Toscano <pino@kde.org> -// -//======================================================================== - -#ifndef TIFFWRITER_H -#define TIFFWRITER_H - -#include "poppler-config.h" - -#ifdef ENABLE_LIBTIFF - -#include <sys/types.h> -#include "ImgWriter.h" - -struct TiffWriterPrivate; - -class TiffWriter : public ImgWriter -{ -public: - /* RGB - 3 bytes/pixel - * RGBA_PREMULTIPLIED - 4 bytes/pixel premultiplied by alpha - * GRAY - 1 byte/pixel - * MONOCHROME - 8 pixels/byte - * CMYK - 4 bytes/pixel - */ - enum Format { RGB, RGBA_PREMULTIPLIED, GRAY, MONOCHROME, CMYK }; - - TiffWriter(Format format = RGB); - ~TiffWriter(); - - void setCompressionString(const char *compressionStringArg); - - 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 supportCMYK() { return true; } - - bool close(); - -private: - TiffWriter(const TiffWriter &other); - TiffWriter& operator=(const TiffWriter &other); - - TiffWriterPrivate *priv; -}; - -#endif - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/gfile.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/gfile.cc deleted file mode 100644 index 3528bb357d8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/gfile.cc +++ /dev/null @@ -1,811 +0,0 @@ -//======================================================================== -// -// 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, 2012, 2013 Hib Eris <hib@hiberis.nl> -// Copyright (C) 2009, 2012, 2014 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> -// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> -// Copyright (C) 2013 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 _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 <stdio.h> -#include <limits> -#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 *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 -} - -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; - 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 -} - -#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; - size_t 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; (i < sizeof(mode) - 1) && mode[i]; ++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; -} - -int Gfseek(FILE *f, Goffset offset, int whence) { -#if HAVE_FSEEKO - return fseeko(f, offset, whence); -#elif HAVE_FSEEK64 - return fseek64(f, offset, whence); -#elif defined(__MINGW32__) - return fseeko64(f, offset, whence); -#elif _WIN32 - return _fseeki64(f, offset, whence); -#else - return fseek(f, offset, whence); -#endif -} - -Goffset Gftell(FILE *f) { -#if HAVE_FSEEKO - return ftello(f); -#elif HAVE_FSEEK64 - return ftell64(f); -#elif defined(__MINGW32__) - return ftello64(f); -#elif _WIN32 - return _ftelli64(f); -#else - return ftell(f); -#endif -} - -Goffset GoffsetMax() { -#if HAVE_FSEEKO - return (std::numeric_limits<off_t>::max)(); -#elif HAVE_FSEEK64 || defined(__MINGW32__) - return (std::numeric_limits<off64_t>::max)(); -#elif _WIN32 - return (std::numeric_limits<__int64>::max)(); -#else - return (std::numeric_limits<long>::max)(); -#endif -} - -//------------------------------------------------------------------------ -// GooFile -//------------------------------------------------------------------------ - -#ifdef _WIN32 - -int GooFile::read(char *buf, int n, Goffset offset) const { - DWORD m; - - LARGE_INTEGER largeInteger = {0}; - largeInteger.QuadPart = offset; - - OVERLAPPED overlapped = {0}; - overlapped.Offset = largeInteger.LowPart; - overlapped.OffsetHigh = largeInteger.HighPart; - - return FALSE == ReadFile(handle, buf, n, &m, &overlapped) ? -1 : m; -} - -Goffset GooFile::size() const { - LARGE_INTEGER size = {(DWORD)-1,-1}; - - GetFileSizeEx(handle, &size); - - return size.QuadPart; -} - -GooFile* GooFile::open(const GooString *fileName) { - HANDLE handle = CreateFile(fileName->getCString(), - GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - - return handle == INVALID_HANDLE_VALUE ? NULL : new GooFile(handle); -} - -GooFile* GooFile::open(const wchar_t *fileName) { - HANDLE handle = CreateFileW(fileName, - GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - - return handle == INVALID_HANDLE_VALUE ? NULL : new GooFile(handle); -} - -#else - -int GooFile::read(char *buf, int n, Goffset offset) const { -#ifdef HAVE_PREAD64 - return pread64(fd, buf, n, offset); -#else - return pread(fd, buf, n, offset); -#endif -} - -Goffset GooFile::size() const { -#ifdef HAVE_LSEEK64 - return lseek64(fd, 0, SEEK_END); -#else - return lseek(fd, 0, SEEK_END); -#endif -} - -GooFile* GooFile::open(const GooString *fileName) { -#ifdef VMS - int fd = ::open(fileName->getCString(), Q_RDONLY, "ctx=stm"); -#else - int fd = ::open(fileName->getCString(), O_RDONLY); -#endif - - return fd < 0 ? NULL : new GooFile(fd); -} - -#endif // _WIN32 - -//------------------------------------------------------------------------ -// 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 = NULL; - -#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; - } - } -#elif defined(ACORN) -#elif defined(MACOS) -#elif defined(VMS) - struct dirent *ent; - 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; - 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/Build/source/libs/poppler/poppler-0.35.0/goo/gfile.h b/Build/source/libs/poppler/poppler-0.35.0/goo/gfile.h deleted file mode 100644 index 1365a9cf2ab..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/gfile.h +++ /dev/null @@ -1,209 +0,0 @@ -//======================================================================== -// -// 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, 2012 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> -// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com> -// Copyright (C) 2014 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 -// -//======================================================================== - -#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 -# ifndef NOMINMAX -# define NOMINMAX -# endif -# 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 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); - -// 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); - -#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); - -// Like fseek/ftell but uses platform specific variants that support large files -extern int Gfseek(FILE *f, Goffset offset, int whence); -extern Goffset Gftell(FILE *f); - -// Largest offset supported by Gfseek/Gftell -extern Goffset GoffsetMax(); - -//------------------------------------------------------------------------ -// GooFile -//------------------------------------------------------------------------ - -class GooFile -{ -public: - int read(char *buf, int n, Goffset offset) const; - Goffset size() const; - - static GooFile *open(const GooString *fileName); - -#ifdef _WIN32 - static GooFile *open(const wchar_t *fileName); - - ~GooFile() { CloseHandle(handle); } - -private: - GooFile(HANDLE handleA): handle(handleA) {} - HANDLE handle; -#else - ~GooFile() { close(fd); } - -private: - GooFile(int fdA) : fd(fdA) {} - int fd; -#endif // _WIN32 -}; - -//------------------------------------------------------------------------ -// 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: - GDirEntry(const GDirEntry &other); - GDirEntry& operator=(const GDirEntry &other); - - 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: - GDir(const GDir &other); - GDir& operator=(const GDir &other); - - 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/Build/source/libs/poppler/poppler-0.35.0/goo/gmem.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/gmem.cc deleted file mode 100644 index c1c607ac3f3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/gmem.cc +++ /dev/null @@ -1,326 +0,0 @@ -/* - * 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, 2012 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) { - 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) { - 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) { - 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) { - 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/Build/source/libs/poppler/poppler-0.35.0/goo/gmem.h b/Build/source/libs/poppler/poppler-0.35.0/goo/gmem.h deleted file mode 100644 index 898f33933f9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/gmem.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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/Build/source/libs/poppler/poppler-0.35.0/goo/gmempp.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/gmempp.cc deleted file mode 100644 index a70338ca3ce..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/gmempp.cc +++ /dev/null @@ -1,32 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/goo/grandom.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/grandom.cc deleted file mode 100644 index 1237175420b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/grandom.cc +++ /dev/null @@ -1,70 +0,0 @@ -/* - * grandom.cc - * - * This file is licensed under the GPLv2 or later - * - * Pseudo-random number generation - * - * Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> - */ - -#include <config.h> -#include "grandom.h" -#include "gtypes.h" - -#ifdef HAVE_RAND_R // rand_r backend (POSIX) - -static GBool initialized = gFalse; - -#include <stdlib.h> -#include <time.h> -static unsigned int seed; - -static void initialize() { - if (!initialized) { - seed = time(NULL); - initialized = gTrue; - } -} - -void grandom_fill(Guchar *buff, int size) -{ - initialize(); - while (size--) - *buff++ = rand_r(&seed) % 256; -} - -double grandom_double() -{ - initialize(); - return rand_r(&seed) / (1 + (double)RAND_MAX); -} - -#else // srand+rand backend (unsafe, because it may interfere with the application) - -static GBool initialized = gFalse; - -#include <stdlib.h> -#include <time.h> - -static void initialize() { - if (!initialized) { - srand(time(NULL)); - initialized = gTrue; - } -} - -void grandom_fill(Guchar *buff, int size) -{ - initialize(); - while (size--) - *buff++ = rand() % 256; -} - -double grandom_double() -{ - initialize(); - return rand() / (1 + (double)RAND_MAX); -} - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/grandom.h b/Build/source/libs/poppler/poppler-0.35.0/goo/grandom.h deleted file mode 100644 index 45fa791aba8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/grandom.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * grandom.h - * - * This file is licensed under the GPLv2 or later - * - * Pseudo-random number generation - * - * Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> - */ - -#ifndef GRANDOM_H -#define GRANDOM_H - -#include "gtypes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Fills the given buffer with random bytes - */ -extern void grandom_fill(Guchar *buff, int size); - -/* - * Returns a random number in [0,1) - */ -extern double grandom_double(); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/gstrtod.cc b/Build/source/libs/poppler/poppler-0.35.0/goo/gstrtod.cc deleted file mode 100644 index cd1d5b554f7..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/gstrtod.cc +++ /dev/null @@ -1,147 +0,0 @@ -/* 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/Build/source/libs/poppler/poppler-0.35.0/goo/gstrtod.h b/Build/source/libs/poppler/poppler-0.35.0/goo/gstrtod.h deleted file mode 100644 index e8abdadf53e..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/gstrtod.h +++ /dev/null @@ -1,43 +0,0 @@ -/* 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/Build/source/libs/poppler/poppler-0.35.0/goo/gtypes.h b/Build/source/libs/poppler/poppler-0.35.0/goo/gtypes.h deleted file mode 100644 index a8d4519497e..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/gtypes.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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> -// Copyright (C) 2013 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 GTYPES_H -#define GTYPES_H - -#include "poppler-config.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; -typedef long long Goffset; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/goo/gtypes_p.h b/Build/source/libs/poppler/poppler-0.35.0/goo/gtypes_p.h deleted file mode 100644 index cc4866e1389..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/goo/gtypes_p.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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/Build/source/libs/poppler/poppler-0.35.0/gtk-doc.make b/Build/source/libs/poppler/poppler-0.35.0/gtk-doc.make deleted file mode 100644 index e7916563d75..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/gtk-doc.make +++ /dev/null @@ -1,289 +0,0 @@ -# -*- 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 - -gtkdoc-check.test: Makefile - $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ - echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ - chmod +x $@ - -CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test - -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-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) -.PHONY: all-gtk-doc - -if ENABLE_GTK_DOC -all-local: all-gtk-doc -endif - -docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) - -$(REPORT_FILES): sgml-build.stamp - -#### setup #### - -GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_$(V)) -GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) -GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; - -setup-build.stamp: - -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ - files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ - if test "x$$files" != "x" ; then \ - for file in $$files ; do \ - destdir=`dirname $(abs_builddir)/$$file`; \ - test -d "$$destdir" || mkdir -p "$$destdir"; \ - test -f $(abs_srcdir)/$$file && \ - cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ - done; \ - fi; \ - fi - $(AM_V_at)touch setup-build.stamp - - -#### scan #### - -GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_$(V)) -GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) -GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; - -GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_$(V)) -GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) -GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; - -scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) - $(GTK_DOC_V_SCAN)_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) - $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ - 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 - $(AM_V_at)touch scan-build.stamp - -$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp - @true - -#### xml #### - -GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V)) -GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) -GTK_DOC_V_XML_0=@echo " DOC Building XML"; - -sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) - $(GTK_DOC_V_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) - $(AM_V_at)touch sgml-build.stamp - -sgml.stamp: sgml-build.stamp - @true - -#### html #### - -GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V)) -GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) -GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; - -GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V)) -GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) -GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; - -html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) - $(GTK_DOC_V_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; - $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) - $(AM_V_at)touch html-build.stamp - -#### pdf #### - -GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V)) -GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) -GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; - -pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) - $(GTK_DOC_V_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) - $(AM_V_at)touch pdf-build.stamp - -############## - -clean-local: - @rm -f *~ *.bak - @rm -rf .libs - @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ - rm -f $(DOC_MODULE).types; \ - fi - -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: - @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 HAVE_GTK_DOC -dist-check-gtkdoc: docs -else -dist-check-gtkdoc: - @echo "*** gtk-doc is needed to run 'make dist'. ***" - @echo "*** gtk-doc was not found when 'configure' ran. ***" - @echo "*** please install gtk-doc and rerun 'configure'. ***" - @false -endif - -dist-hook: dist-check-gtkdoc all-gtk-doc 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/Build/source/libs/poppler/poppler-0.35.0/poppler-cairo-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-cairo-uninstalled.pc.in deleted file mode 100644 index 2458eb20df8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-cairo-uninstalled.pc.in +++ /dev/null @@ -1,6 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-cairo.pc.cmake b/Build/source/libs/poppler/poppler-0.35.0/poppler-cairo.pc.cmake deleted file mode 100644 index b32f118314b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-cairo.pc.cmake +++ /dev/null @@ -1,9 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-cairo.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-cairo.pc.in deleted file mode 100644 index 367a5b690bf..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-cairo.pc.in +++ /dev/null @@ -1,9 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-cpp-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-cpp-uninstalled.pc.in deleted file mode 100644 index af3640eb2c1..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-cpp-uninstalled.pc.in +++ /dev/null @@ -1,7 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-cpp.pc.cmake b/Build/source/libs/poppler/poppler-0.35.0/poppler-cpp.pc.cmake deleted file mode 100644 index 3f56b3d9d90..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-cpp.pc.cmake +++ /dev/null @@ -1,13 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-cpp.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-cpp.pc.in deleted file mode 100644 index a7e97c25dfe..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-cpp.pc.in +++ /dev/null @@ -1,13 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-glib-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-glib-uninstalled.pc.in deleted file mode 100644 index 5506c4e53ac..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-glib-uninstalled.pc.in +++ /dev/null @@ -1,7 +0,0 @@ -Name: poppler-glib -Description: GLib wrapper for poppler - uninstalled -Version: @VERSION@ -Requires: glib-2.0 >= @GLIB_REQUIRED@ gobject-2.0 >= @GLIB_REQUIRED@ gio-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/Build/source/libs/poppler/poppler-0.35.0/poppler-glib.pc.cmake b/Build/source/libs/poppler/poppler-0.35.0/poppler-glib.pc.cmake deleted file mode 100644 index e15e6699a43..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-glib.pc.cmake +++ /dev/null @@ -1,13 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-glib.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-glib.pc.in deleted file mode 100644 index cd30feb728f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-glib.pc.in +++ /dev/null @@ -1,13 +0,0 @@ -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@ gio-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@ -@PC_REQUIRES_PRIVATE@ - -Libs: -L${libdir} -lpoppler-glib -Cflags: -I${includedir}/poppler/glib diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler-qt4-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-qt4-uninstalled.pc.in deleted file mode 100644 index 3a336c6c294..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-qt4-uninstalled.pc.in +++ /dev/null @@ -1,7 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-qt4.pc.cmake b/Build/source/libs/poppler/poppler-0.35.0/poppler-qt4.pc.cmake deleted file mode 100644 index b17fd5d8453..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-qt4.pc.cmake +++ /dev/null @@ -1,13 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-qt4.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-qt4.pc.in deleted file mode 100644 index 306ae46e0b0..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-qt4.pc.in +++ /dev/null @@ -1,13 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-qt5-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-qt5-uninstalled.pc.in deleted file mode 100644 index a91e1d5a3bd..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-qt5-uninstalled.pc.in +++ /dev/null @@ -1,7 +0,0 @@ -Name: poppler-qt5 -Description: Qt5 bindings for poppler - uninstalled -Version: @VERSION@ -Requires: poppler = @VERSION@ - -Libs: ${pc_top_builddir}/${pcfiledir}/qt5/src/libpoppler-qt5.la -Cflags: -I${pc_top_builddir}/${pcfiledir}/qt5/src diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler-qt5.pc.cmake b/Build/source/libs/poppler/poppler-0.35.0/poppler-qt5.pc.cmake deleted file mode 100644 index b4d87b76675..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-qt5.pc.cmake +++ /dev/null @@ -1,13 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=${prefix} -libdir=${exec_prefix}/lib@LIB_SUFFIX@ -includedir=${prefix}/include - -Name: poppler-qt5 -Description: Qt5 bindings for poppler -Version: @POPPLER_VERSION@ -Requires: @PC_REQUIRES@ -@PC_REQUIRES_PRIVATE@ - -Libs: -L${libdir} -lpoppler-qt5 -Cflags: -I${includedir}/poppler/qt5 diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler-qt5.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-qt5.pc.in deleted file mode 100644 index cda4c6f80fe..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-qt5.pc.in +++ /dev/null @@ -1,13 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: poppler-qt5 -Description: Qt5 bindings for poppler -Version: @VERSION@ -Requires: @PC_REQUIRES@ -@PC_REQUIRES_PRIVATE@ - -Libs: -L${libdir} -lpoppler-qt5 -Cflags: -I${includedir}/poppler/qt5 diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler-splash-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-splash-uninstalled.pc.in deleted file mode 100644 index 436ecdb8f1b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-splash-uninstalled.pc.in +++ /dev/null @@ -1,7 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-splash.pc.cmake b/Build/source/libs/poppler/poppler-0.35.0/poppler-splash.pc.cmake deleted file mode 100644 index cb95b3d2d27..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-splash.pc.cmake +++ /dev/null @@ -1,9 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-splash.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-splash.pc.in deleted file mode 100644 index cf3491fc7cf..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-splash.pc.in +++ /dev/null @@ -1,9 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler-uninstalled.pc.in deleted file mode 100644 index 6076e80c5b3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler-uninstalled.pc.in +++ /dev/null @@ -1,6 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler.pc.cmake b/Build/source/libs/poppler/poppler-0.35.0/poppler.pc.cmake deleted file mode 100644 index f1aebedbefd..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler.pc.cmake +++ /dev/null @@ -1,11 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler.pc.in b/Build/source/libs/poppler/poppler-0.35.0/poppler.pc.in deleted file mode 100644 index 8605b28673b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler/Annot.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Annot.cc deleted file mode 100644 index 18576c8d94f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Annot.cc +++ /dev/null @@ -1,6872 +0,0 @@ -//======================================================================== -// -// 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-2013 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2007-2013 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, 2013 José Aliste <jaliste@src.gnome.org> -// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2012, 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012 Tobias Koenig <tokoe@kdab.com> -// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2014 Marek Kasik <mkasik@redhat.com> -// Copyright (C) 2014 Jiri Slaby <jirislaby@gmail.com> -// Copyright (C) 2014 Anuj Khare <khareanuj18@gmail.com> -// Copyright (C) 2015 Petr Gajdos <pgajdos@suse.cz> -// Copyright (C) 2015 Philipp Reinkemeier <philipp.reinkemeier@offis.de> -// Copyright (C) 2015 Tamas Szekeres <szekerest@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 <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> -#include <algorithm> - -#if MULTITHREADED -# define annotLocker() MutexLocker locker(&mutex) -# define annotCondLocker(X) MutexLocker locker(&mutex, (X)) -#else -# define annotLocker() -# define annotCondLocker(X) -#endif - -#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; -} - -static LinkAction* getAdditionalAction(Annot::AdditionalActionsType type, Object *additionalActions, PDFDoc *doc) { - Object additionalActionsObject; - LinkAction *linkAction = NULL; - - if (additionalActions->fetch(doc->getXRef(), &additionalActionsObject)->isDict()) { - const char *key = (type == Annot::actionCursorEntering ? "E" : - type == Annot::actionCursorLeaving ? "X" : - type == Annot::actionMousePressed ? "D" : - type == Annot::actionMouseReleased ? "U" : - type == Annot::actionFocusIn ? "Fo" : - type == Annot::actionFocusOut ? "BI" : - type == Annot::actionPageOpening ? "PO" : - type == Annot::actionPageClosing ? "PC" : - type == Annot::actionPageVisible ? "PV" : - type == Annot::actionPageInvisible ? "PI" : NULL); - - Object actionObject; - - if (additionalActionsObject.dictLookup(key, &actionObject)->isDict()) - linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); - actionObject.free(); - } - - additionalActionsObject.free(); - - return linkAction; -} - -static LinkAction* getFormAdditionalAction(Annot::FormAdditionalActionsType type, Object *additionalActions, PDFDoc *doc) { - Object additionalActionsObject; - LinkAction *linkAction = NULL; - - if (additionalActions->fetch(doc->getXRef(), &additionalActionsObject)->isDict()) { - const char *key = (type == Annot::actionFieldModified ? "K" : - type == Annot::actionFormatField ? "F" : - type == Annot::actionValidateField ? "V" : - type == Annot::actionCalculateField ? "C" : NULL); - - Object actionObject; - - if (additionalActionsObject.dictLookup(key, &actionObject)->isDict()) - linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); - actionObject.free(); - } - - additionalActionsObject.free(); - - return linkAction; -} - -//------------------------------------------------------------------------ -// 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() { - 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() { - 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)); - - if (dashLength > 0) { - Object obj3; - - obj1->arrayAdd(obj3.initArray(xref)); - for (int i = 0; i < dashLength; i++) - obj3.arrayAdd(obj2.initReal(dash[i])); - } -} - -//------------------------------------------------------------------------ -// AnnotBorderBS -//------------------------------------------------------------------------ - -AnnotBorderBS::AnnotBorderBS() { -} - -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; - } - } -} - -const char *AnnotBorderBS::getStyleName() const { - switch (style) { - case borderSolid: - return "S"; - case borderDashed: - return "D"; - case borderBeveled: - return "B"; - case borderInset: - return "I"; - case borderUnderlined: - return "U"; - } - - return "S"; -} - -void AnnotBorderBS::writeToObject(XRef *xref, Object *obj1) const { - Object obj2; - - obj1->initDict(xref); - obj1->dictSet("W", obj2.initReal(width)); - obj1->dictSet("S", obj2.initName(getStyleName())); - if (style == borderDashed && dashLength > 0) { - Object obj3; - - obj1->dictSet("D", obj3.initArray(xref)); - for (int i = 0; i < dashLength; i++) - obj3.arrayAdd(obj2.initReal(dash[i])); - } -} - -//------------------------------------------------------------------------ -// 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(AnnotAppearanceType type, const char *state, Object *dest) { - Object apData, stream; - apData.initNull(); - - // Obtain dictionary or stream associated to appearance type - switch (type) { - case appearRollover: - if (appearDict.dictLookupNF("R", &apData)->isNull()) - appearDict.dictLookupNF("N", &apData); - break; - case appearDown: - if (appearDict.dictLookupNF("D", &apData)->isNull()) - appearDict.dictLookupNF("N", &apData); - break; - case appearNormal: - appearDict.dictLookupNF("N", &apData); - break; - } - - dest->initNull(); - if (apData.isDict() && state) - apData.dictLookupNF(state, dest); - else if (apData.isRef()) - apData.copy(dest); - apData.free(); -} - -GooString * AnnotAppearance::getStateKey(int i) { - Object obj1; - GooString * res = NULL; - if (appearDict.dictLookupNF("N", &obj1)->isDict()) - res = new GooString(obj1.dictGetKey(i)); - obj1.free(); - return res; -} - -int AnnotAppearance::getNumStates() { - Object obj1; - int res = 0; - if (appearDict.dictLookupNF("N", &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()) { - Array *colorComponents = obj1.getArray(); - if (colorComponents->getLength() > 0) { - borderColor = new AnnotColor(colorComponents); - } else { - borderColor = NULL; - } - } else { - borderColor = NULL; - } - obj1.free(); - - if (dict->lookup("BG", &obj1)->isArray()) { - Array *colorComponents = obj1.getArray(); - if (colorComponents->getLength() > 0) { - backColor = new AnnotColor(colorComponents); - } else { - backColor = NULL; - } - } 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 { - 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 = new GooString(); - } - obj1.free(); - - // Note: This value is overwritten by Annots ctor - 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 - // According to the spec if neither the Border nor the BS entry is present, - // the border shall be drawn as a solid line with a width of 1 point. But acroread - // seems to ignore the Border entry for annots that can't have a BS entry. So, we only - // follow this rule for annots tha can have a BS entry. - if (dict->lookup("Border", &obj1)->isArray()) - border = new AnnotBorderArray(obj1.getArray()); - else - 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); - -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -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); - invalidateAppearance(); -} - -GBool Annot::inRect(double x, double y) const { - return rect->contains(x, y); -} - -void Annot::update(const char *key, Object *value) { - annotLocker(); - /* 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) { - annotLocker(); - 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) { - annotLocker(); - 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) { - annotLocker(); - 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) { - annotLocker(); - Object obj1; - flags = new_flags; - obj1.initInt(flags); - update ("F", &obj1); -} - -void Annot::setBorder(AnnotBorder *new_border) { - annotLocker(); - delete border; - - if (new_border) { - Object obj1; - new_border->writeToObject(xref, &obj1); - update(new_border->getType() == AnnotBorder::typeArray ? "Border" : "BS", &obj1); - border = new_border; - } else { - border = NULL; - } - invalidateAppearance(); -} - -void Annot::setColor(AnnotColor *new_color) { - annotLocker(); - delete color; - - if (new_color) { - Object obj1; - new_color->writeToObject(xref, &obj1); - update ("C", &obj1); - color = new_color; - } else { - color = NULL; - } - invalidateAppearance(); -} - -void Annot::setPage(int pageIndex, GBool updateP) { - annotLocker(); - Page *pageobj = doc->getPage(pageIndex); - Object obj1; - - if (pageobj) { - Ref pageRef = pageobj->getRef(); - obj1.initRef(pageRef.num, pageRef.gen); - page = pageIndex; - } else { - obj1.initNull(); - page = 0; - } - - if (updateP) { - update("P", &obj1); - } -} - -void Annot::setAppearanceState(const char *state) { - annotLocker(); - 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() { - annotLocker(); - if (appearStreams) { // Remove existing appearance streams - appearStreams->removeAllStreams(); - } - delete appearStreams; - appearStreams = NULL; - - delete appearState; - appearState = NULL; - - delete appearBBox; - appearBBox = NULL; - - appearance.free(); - appearance.initNull(); - - Object obj1, obj2; - obj1.initNull(); - if (!annotObj.dictLookup("AP", &obj2)->isNull()) - update ("AP", &obj1); // Remove AP - obj2.free(); - - if (!annotObj.dictLookup("AS", &obj2)->isNull()) - update ("AS", &obj1); // Remove AS - obj2.free(); -} - -double Annot::getXMin() { - return rect->x1; -} - -double Annot::getYMin() { - return rect->y1; -} - -double Annot::getXMax() { - return rect->x2; -} - -double Annot::getYMax() { - return rect->y2; -} - -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::removeReferencedObjects() { - // Remove appearance streams (if any) - invalidateAppearance(); -} - -void Annot::incRefCnt() { - annotLocker(); - refCnt++; -} - -void Annot::decRefCnt() { -#if MULTITHREADED - gLockMutex(&mutex); -#endif - if (--refCnt == 0) { -#if MULTITHREADED - gUnlockMutex(&mutex); -#endif - delete this; - return; - } -#if MULTITHREADED - gUnlockMutex(&mutex); -#endif -} - -Annot::~Annot() { - annotObj.free(); - - delete rect; - 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(); - -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -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; - } -} - -void Annot::setLineStyleForBorder(AnnotBorder *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()); -} - -// 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; -} - -int Annot::getRotation() const -{ - Page *pageobj = doc->getPage(page); - assert(pageobj != NULL); - - if (flags & flagNoRotate) { - return (360 - pageobj->getRotate()) % 360; - } else { - return 0; - } -} - -void Annot::draw(Gfx *gfx, GBool printing) { - Object obj; - - annotLocker(); - if (!isVisible (printing)) - return; - - // draw the appearance stream - appearance.fetch(gfx->getXRef(), &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - 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) { - // If there exists an old popup annotation that is already - // associated with a page, then we need to remove that - // popup annotation from the page. Otherwise we would have - // dangling references to it. - if (popup != NULL && popup->getPageNum() != 0) { - Page *pageobj = doc->getPage(popup->getPageNum()); - if (pageobj) { - pageobj->removeAnnot(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; - - // If this annotation is already added to a page, then we - // add the new popup annotation to the same page. - if (page != 0) { - Page *pageobj = doc->getPage(page); - assert(pageobj != NULL); // pageobj should exist in doc (see setPage()) - - pageobj->addAnnot(popup); - } - } else { - popup = NULL; - } -} - -void AnnotMarkup::setOpacity(double opacityA) { - Object obj1; - - opacity = opacityA; - obj1.initReal(opacity); - update ("CA", &obj1); - invalidateAppearance(); -} - -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); -} - -void AnnotMarkup::removeReferencedObjects() { - Page *pageobj = doc->getPage(page); - assert(pageobj != NULL); // We're called when removing an annot from a page - - // Remove popup - if (popup) { - pageobj->removeAnnot(popup); - } - - Annot::removeReferencedObjects(); -} - -//------------------------------------------------------------------------ -// 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); - invalidateAppearance(); -} - -#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; - - annotLocker(); - 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->y2 - 24, rect->x1 + 24, rect->y2); - 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(gfx->getXRef(), &obj); - if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - appearBBox->getPageXMin(), appearBBox->getPageYMin(), - appearBBox->getPageXMax(), appearBBox->getPageYMax(), - getRotation()); - } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - } - 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(); - - if (dict->lookup("BS", &obj1)->isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); - } else if (!border) { - border = new AnnotBorderBS(); - } - obj1.free(); -} - -void AnnotLink::draw(Gfx *gfx, GBool printing) { - Object obj; - - if (!isVisible (printing)) - return; - - annotLocker(); - // draw the appearance stream - appearance.fetch(gfx->getXRef(), &obj); - gfx->drawAnnot(&obj, border, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - 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("BS", &obj1)->isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); - } else if (!border) { - border = new AnnotBorderBS(); - } - 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::setContents(GooString *new_content) { - Annot::setContents(new_content); - invalidateAppearance(); -} - -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); - invalidateAppearance(); -} - -void AnnotFreeText::setQuadding(AnnotFreeTextQuadding new_quadding) { - Object obj1; - quadding = new_quadding; - obj1.initInt((int)quadding); - update ("Q", &obj1); - invalidateAppearance(); -} - -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); - invalidateAppearance(); -} - -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"); - - borderWidth = border->getWidth(); - if (borderWidth > 0) - setLineStyleForBorder(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 - if (!contents) - contents = new GooString (); - - // 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; - - annotLocker(); - if (appearance.isNull()) { - generateFreeTextAppearance(); - } - - // draw the appearance stream - appearance.fetch(gfx->getXRef(), &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - 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) : - AnnotMarkup(docA, rect) { - Object obj1; - - type = typeLine; - annotObj.dictSet ("Subtype", obj1.initName ("Line")); - - 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(); - - if (dict->lookup("BS", &obj1)->isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); - } else if (!border) { - border = new AnnotBorderBS(); - } - obj1.free(); -} - -void AnnotLine::setContents(GooString *new_content) { - Annot::setContents(new_content); - if (caption) - invalidateAppearance(); -} - -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); - invalidateAppearance(); -} - -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); - invalidateAppearance(); -} - -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; - } - invalidateAppearance(); -} - -void AnnotLine::setLeaderLineLength(double len) { - Object obj1; - - leaderLineLength = len; - obj1.initReal(len); - update ("LL", &obj1); - invalidateAppearance(); -} - -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); - invalidateAppearance(); -} - -void AnnotLine::setCaption(bool new_cap) { - Object obj1; - - caption = new_cap; - obj1.initBool(new_cap); - update ("Cap", &obj1); - invalidateAppearance(); -} - -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); - } - - setLineStyleForBorder(border); - borderWidth = border->getWidth(); - appearBBox->setBorderWidth(std::max(1., borderWidth)); - - 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; - - annotLocker(); - if (appearance.isNull()) { - generateLineAppearance(); - } - - // draw the appearance stream - appearance.fetch(gfx->getXRef(), &obj); - if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - appearBBox->getPageXMin(), appearBBox->getPageYMin(), - appearBBox->getPageXMax(), appearBBox->getPageYMax(), - getRotation()); - } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - } - 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) : - 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"); - } - - // Store dummy quadrilateral with null coordinates - Object obj2, obj3; - obj2.initArray (doc->getXRef()); - for (int i = 0; i < 4*2; ++i) { - obj2.arrayAdd (obj3.initReal (0)); - } - 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); - invalidateAppearance(); -} - -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))); - } - - delete quadrilaterals; - quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect); - - annotObj.dictSet ("QuadPoints", &obj1); - invalidateAppearance(); -} - -void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) { - Object obj; - double ca = 1; - int i; - Object obj1, obj2; - - if (!isVisible (printing)) - return; - - annotLocker(); - 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 x3, y3, x4, y4; - - x3 = quadrilaterals->getX3(i); - y3 = quadrilaterals->getY3(i); - x4 = quadrilaterals->getX4(i); - y4 = quadrilaterals->getY4(i); - - appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x3, y3); - appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x4, y4); - 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, y2; - double x3, y3, x4, y4; - - 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); - - appearBuf->appendf ("{0:.2f} {1:.2f} m\n", (x1+x3)/2., (y1+y3)/2.); - appearBuf->appendf ("{0:.2f} {1:.2f} l\n", (x2+x4)/2., (y2+y4)/2.); - 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(gfx->getXRef(), &obj); - if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - appearBBox->getPageXMin(), appearBBox->getPageYMin(), - appearBBox->getPageXMax(), appearBBox->getPageYMax(), - getRotation()); - } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - } - 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; - - additionalActions.free(); - - 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(); - - dict->lookupNF("AA", &additionalActions); - - if(dict->lookup("Parent", &obj1)->isDict()) { - parent = NULL; - } else { - parent = NULL; - } - obj1.free(); - - if (dict->lookup("BS", &obj1)->isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); - } - obj1.free(); - - updatedAppearanceStream.num = updatedAppearanceStream.gen = -1; -} - -LinkAction* AnnotWidget::getAdditionalAction(AdditionalActionsType type) -{ - return ::getAdditionalAction(type, &additionalActions, doc); -} - -LinkAction* AnnotWidget::getFormAdditionalAction(FormAdditionalActionsType type) -{ - return ::getFormAdditionalAction(type, &additionalActions, doc); -} - -// 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, 2)) { - 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(); - error(errSyntaxError, -1, "AnnotWidget::layoutText, cannot convert U+{0:04uX}", 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 && - static_cast<FormFieldButton *>(field)->getState(appearState->getCString())) { - 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(copyString(appearBuf->getCString()), 0, - appearBuf->getLength(), &appearDict); - appearance.free(); - appearance.initStream(appearStream); - delete appearBuf; - - appearStream->setNeedFree(gTrue); -} - -void AnnotWidget::updateAppearanceStream() -{ - // If this the first time updateAppearanceStream() is called on this widget, - // destroy the AP dictionary because we are going to create a new one. - if (updatedAppearanceStream.num == -1) { - invalidateAppearance(); // Delete AP dictionary and all referenced streams - } - - // There's no need to create a new appearance stream if NeedAppearances is - // set, because it will be ignored next time anyway. - if (form && form->getNeedAppearances()) - return; - - // Create the new appearance - generateFieldAppearance(); - - // Fetch the appearance stream we've just created - Object obj1; - appearance.fetch(xref, &obj1); - - // If this the first time updateAppearanceStream() is called on this widget, - // create a new AP dictionary containing the new appearance stream. - // Otherwise, just update the stream we had created previously. - if (updatedAppearanceStream.num == -1) { - // Write the appearance stream - updatedAppearanceStream = xref->addIndirectObject(&obj1); - obj1.free(); - - // Write the AP dictionary - Object obj2; - obj1.initDict(xref); - obj1.dictAdd(copyString("N"), obj2.initRef(updatedAppearanceStream.num, updatedAppearanceStream.gen)); - update("AP", &obj1); - - // Update our internal pointers to the appearance dictionary - appearStreams = new AnnotAppearance(doc, &obj1); - } else { - // Replace the existing appearance stream - xref->setModifiedObject(&obj1, updatedAppearanceStream); - obj1.free(); - } -} - -void AnnotWidget::draw(Gfx *gfx, GBool printing) { - Object obj; - - if (!isVisible (printing)) - return; - - annotLocker(); - addDingbatsResource = gFalse; - - // Only construct the appearance stream when - // - annot doesn't have an AP or - // - NeedAppearances is true - if (field) { - if (appearance.isNull() || (form && form->getNeedAppearances())) - generateFieldAppearance(); - } - - // draw the appearance stream - appearance.fetch(gfx->getXRef(), &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(gfx->getXRef()); - fontDict->decRef(); - fontDict->add(copyString("BaseFont"), &baseFontObj); - fontDict->add(copyString("Subtype"), &subtypeObj); - fontDictObj.initDict(fontDict); - - Object fontsDictObj; - Dict *fontsDict = new Dict(gfx->getXRef()); - fontsDict->decRef(); - fontsDict->add(copyString("ZaDb"), &fontDictObj); - fontsDictObj.initDict(fontsDict); - - Dict *dict = new Dict(gfx->getXRef()); - dict->add(copyString("Font"), &fontsDictObj); - gfx->pushResources(dict); - delete dict; - } - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - 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; - - annotLocker(); - 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(gfx->getXRef()); - imgDict.dictSet ("MImg", &poster); - - Object resDict; - resDict.initDict(gfx->getXRef()); - resDict.dictSet ("XObject", &imgDict); - - Object formDict, obj1, obj2; - formDict.initDict(gfx->getXRef()); - formDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); - formDict.dictSet("Subtype", obj1.initName("Form")); - formDict.dictSet("Name", obj1.initName("FRM")); - obj1.initArray(gfx->getXRef()); - 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(gfx->getXRef()); - 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(gfx->getXRef()); - objDict.dictSet ("FRM", &aStream); - - resDict.initDict(gfx->getXRef()); - 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(gfx->getXRef(), &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - 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; - - additionalActions.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->lookupNF("AA", &additionalActions); - - appearCharacs = NULL; - if(dict->lookup("MK", &obj1)->isDict()) { - appearCharacs = new AnnotAppearanceCharacs(obj1.getDict()); - } - obj1.free(); -} - -LinkAction* AnnotScreen::getAdditionalAction(AdditionalActionsType type) -{ - if (type == actionFocusIn || type == actionFocusOut) // not defined for screen annotation - return NULL; - - return ::getAdditionalAction(type, &additionalActions, doc); -} - -//------------------------------------------------------------------------ -// 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); - invalidateAppearance(); -} - -//------------------------------------------------------------------------ -// 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("BS", &obj1)->isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); - } else if (!border) { - border = new AnnotBorderBS(); - } - 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); - invalidateAppearance(); -} - -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; - } - invalidateAppearance(); -} - -void AnnotGeometry::draw(Gfx *gfx, GBool printing) { - Object obj; - double ca = 1; - - if (!isVisible (printing)) - return; - - annotLocker(); - if (appearance.isNull()) { - ca = opacity; - - appearBuf = new GooString (); - appearBuf->append ("q\n"); - if (color) - setColor(color, gFalse); - - double borderWidth = border->getWidth(); - setLineStyleForBorder(border); - - 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(gfx->getXRef(), &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - obj.free(); -} - -//------------------------------------------------------------------------ -// AnnotPolygon -//------------------------------------------------------------------------ -AnnotPolygon::AnnotPolygon(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType) : - 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"); - } - - // Store dummy path with one null vertex only - Object obj2, obj3; - obj2.initArray (doc->getXRef()); - obj2.arrayAdd (obj3.initReal (0)); - obj2.arrayAdd (obj3.initReal (0)); - 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("BS", &obj1)->isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); - } else if (!border) { - border = new AnnotBorderBS(); - } - 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); - invalidateAppearance(); -} - -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); - invalidateAppearance(); -} - -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); - invalidateAppearance(); -} - -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; - } - invalidateAppearance(); -} - -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; - - annotLocker(); - if (appearance.isNull()) { - appearBBox = new AnnotAppearanceBBox(rect); - ca = opacity; - - appearBuf = new GooString (); - appearBuf->append ("q\n"); - - if (color) { - setColor(color, gFalse); - } - - setLineStyleForBorder(border); - appearBBox->setBorderWidth(std::max(1., 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(gfx->getXRef(), &obj); - if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - appearBBox->getPageXMin(), appearBBox->getPageYMin(), - appearBBox->getPageXMax(), appearBBox->getPageYMax(), - getRotation()); - } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - } - 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); - invalidateAppearance(); -} - -//------------------------------------------------------------------------ -// AnnotInk -//------------------------------------------------------------------------ -AnnotInk::AnnotInk(PDFDoc *docA, PDFRectangle *rect) : - AnnotMarkup(docA, rect) { - Object obj1; - - type = typeInk; - - annotObj.dictSet ("Subtype", obj1.initName ("Ink")); - - // Store dummy path with one null vertex only - Object obj2, obj3, obj4; - obj2.initArray (doc->getXRef()); - obj2.arrayAdd (obj3.initArray (doc->getXRef())); - obj3.arrayAdd (obj4.initReal (0)); - obj3.arrayAdd (obj4.initReal (0)); - 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(); - - if (dict->lookup("BS", &obj1)->isDict()) { - delete border; - border = new AnnotBorderBS(obj1.getDict()); - } else if (!border) { - border = new AnnotBorderBS(); - } - 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); - invalidateAppearance(); -} - -void AnnotInk::draw(Gfx *gfx, GBool printing) { - Object obj; - double ca = 1; - - if (!isVisible (printing)) - return; - - annotLocker(); - if (appearance.isNull()) { - appearBBox = new AnnotAppearanceBBox(rect); - ca = opacity; - - appearBuf = new GooString (); - appearBuf->append ("q\n"); - - if (color) { - setColor(color, gFalse); - } - - setLineStyleForBorder(border); - appearBBox->setBorderWidth(std::max(1., 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(gfx->getXRef(), &obj); - if (appearBBox) { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - appearBBox->getPageXMin(), appearBBox->getPageYMin(), - appearBBox->getPageXMax(), appearBBox->getPageYMax(), - getRotation()); - } else { - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - } - 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; - - annotLocker(); - 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(gfx->getXRef(), &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - 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; - - annotLocker(); - 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(gfx->getXRef(), &obj); - gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, - rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); - 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, int page, 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()) { - annot->setPage(page, gFalse); // Don't change /P - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Annot.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Annot.h deleted file mode 100644 index 1e64f59bc76..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Annot.h +++ /dev/null @@ -1,1439 +0,0 @@ -//======================================================================== -// -// 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, 2013, 2015 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, 2013 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2012 Tobias Koenig <tokoe@kdab.com> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 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 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 Page; -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 { - typeArray, - typeBS - }; - - enum AnnotBorderStyle { - borderSolid, // Solid - borderDashed, // Dashed - borderBeveled, // Beveled - borderInset, // Inset - borderUnderlined // Underlined - }; - - virtual ~AnnotBorder(); - - virtual void setWidth(double new_width) { width = new_width; } - - virtual AnnotBorderType getType() const = 0; - virtual double getWidth() const { return width; } - virtual int getDashLength() const { return dashLength; } - virtual double *getDash() const { return dash; } - virtual AnnotBorderStyle getStyle() const { return style; } - - virtual void writeToObject(XRef *xref, Object *obj1) const = 0; - -protected: - AnnotBorder(); - - 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 setHorizontalCorner(double hc) { horizontalCorner = hc; } - void setVerticalCorner(double vc) { verticalCorner = vc; } - - double getHorizontalCorner() const { return horizontalCorner; } - double getVerticalCorner() const { return verticalCorner; } - -private: - virtual AnnotBorderType getType() const { return typeArray; } - virtual void writeToObject(XRef *xref, Object *obj1) const; - - 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: - virtual AnnotBorderType getType() const { return typeBS; } - virtual void writeToObject(XRef *xref, Object *obj1) const; - - const char *getStyleName() const; - - // 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 { - friend class Annots; - friend class Page; -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 - }; - - /** - * Describes the additional actions of a screen or widget annotation. - */ - enum AdditionalActionsType { - actionCursorEntering, ///< Performed when the cursor enters the annotation's active area - actionCursorLeaving, ///< Performed when the cursor exists the annotation's active area - actionMousePressed, ///< Performed when the mouse button is pressed inside the annotation's active area - actionMouseReleased, ///< Performed when the mouse button is released inside the annotation's active area - actionFocusIn, ///< Performed when the annotation receives the input focus - actionFocusOut, ///< Performed when the annotation loses the input focus - actionPageOpening, ///< Performed when the page containing the annotation is opened - actionPageClosing, ///< Performed when the page containing the annotation is closed - actionPageVisible, ///< Performed when the page containing the annotation becomes visible - actionPageInvisible ///< Performed when the page containing the annotation becomes invisible - }; - - enum FormAdditionalActionsType { - actionFieldModified, ///< Performed when the when the user modifies the field - actionFormatField, ///< Performed before the field is formatted to display its value - actionValidateField, ///< Performed when the field value changes - actionCalculateField, ///< Performed when the field needs to be recalculated - }; - - 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 getXMax(); - double getYMax(); - - 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 - virtual void setContents(GooString *new_content); - void setName(GooString *new_name); - void setModified(GooString *new_date); - void setFlags(Guint new_flags); - - void setBorder(AnnotBorder *new_border); // Takes ownership - - // The annotation takes the ownership of - // new_color. - void setColor(AnnotColor *new_color); - - void setAppearanceState(const char *state); - - // 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); - void setPage (int new_page, GBool updateP); // Called by Page::addAnnot and Annots ctor - - -protected: - virtual ~Annot(); - virtual void removeReferencedObjects(); // Called by Page::removeAnnot - void setColor(AnnotColor *color, GBool fill); - void setLineStyleForBorder(AnnotBorder *border); - 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); - int getRotation() const; - - // Updates the field key of the annotation dictionary - // and sets M to the current time - void update(const char *key, Object *value); - - // Delete appearance streams and reset appearance state - void invalidateAppearance(); - - 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; -#if MULTITHREADED - GooMutex mutex; -#endif -}; - -//------------------------------------------------------------------------ -// 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() { 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: - virtual void removeReferencedObjects(); - - 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; } - LinkAction *getAdditionalAction(AdditionalActionsType type); - - private: - void initialize(PDFDoc *docA, Dict *dict); - - - GooString* title; // T - - AnnotAppearanceCharacs* appearCharacs; // MK - - LinkAction *action; // A - Object additionalActions; // 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); - virtual void setContents(GooString *new_content); - - 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); - AnnotLine(PDFDoc *docA, Dict *dict, Object *obj); - ~AnnotLine(); - - virtual void draw(Gfx *gfx, GBool printing); - virtual Object *getAppearanceResDict(Object *dest); - virtual void setContents(GooString *new_content); - - 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); - 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); - 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); - 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 (); - void updateAppearanceStream (); - - AnnotWidgetHighlightMode getMode() { return mode; } - AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; } - LinkAction *getAction() { return action; } - LinkAction *getAdditionalAction(AdditionalActionsType type); - LinkAction *getFormAdditionalAction(FormAdditionalActionsType type); - 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 - Object additionalActions; // AA - // inherited from Annot - // AnnotBorderBS border; // BS - Dict *parent; // Parent - GBool addDingbatsResource; - Ref updatedAppearanceStream; // {-1,-1} if updateAppearanceStream has never been called -}; - -//------------------------------------------------------------------------ -// 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 and call setPage on them - Annots(PDFDoc *docA, int page, 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Array.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Array.cc deleted file mode 100644 index 230c3287683..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Array.cc +++ /dev/null @@ -1,152 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 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 <stddef.h> -#include "goo/gmem.h" -#include "Object.h" -#include "Array.h" - -#if MULTITHREADED -# define arrayLocker() MutexLocker locker(&mutex) -#else -# define arrayLocker() -#endif -//------------------------------------------------------------------------ -// Array -//------------------------------------------------------------------------ - -Array::Array(XRef *xrefA) { - xref = xrefA; - elems = NULL; - size = length = 0; - ref = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -Array::~Array() { - int i; - - for (i = 0; i < length; ++i) - elems[i].free(); - gfree(elems); -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -Object *Array::copy(XRef *xrefA, Object *obj) { - arrayLocker(); - obj->initArray(xrefA); - for (int i = 0; i < length; ++i) { - Object obj1; - obj->arrayAdd(elems[i].copy(&obj1)); - } - return obj; -} - -int Array::incRef() { - arrayLocker(); - ++ref; - return ref; -} - -int Array::decRef() { - arrayLocker(); - --ref; - return ref; -} - -void Array::add(Object *elem) { - arrayLocker(); - 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) { - arrayLocker(); - 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, int recursion) { - if (i < 0 || i >= length) { -#ifdef DEBUG_MEM - abort(); -#else - return obj->initNull(); -#endif - } - return elems[i].fetch(xref, obj, recursion); -} - -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/Build/source/libs/poppler/poppler-0.35.0/poppler/Array.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Array.h deleted file mode 100644 index e78e399baf2..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Array.h +++ /dev/null @@ -1,84 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 ARRAY_H -#define ARRAY_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "poppler-config.h" -#include "Object.h" -#include "goo/GooMutex.h" - -class XRef; - -//------------------------------------------------------------------------ -// Array -//------------------------------------------------------------------------ - -class Array { -public: - - // Constructor. - Array(XRef *xrefA); - - // Destructor. - ~Array(); - - // Reference counting. - int incRef(); - int decRef(); - - // Get number of elements. - int getLength() { return length; } - - // Copy array with new xref - Object *copy(XRef *xrefA, Object *obj); - - // Add an element. - void add(Object *elem); - - // Remove an element by position - void remove(int i); - - // Accessors. - Object *get(int i, Object *obj, int resursion = 0); - 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 -#if MULTITHREADED - GooMutex mutex; -#endif -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFont.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFont.cc deleted file mode 100644 index 20a297d6135..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFont.cc +++ /dev/null @@ -1,65 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFont.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFont.h deleted file mode 100644 index bbdd0558e9f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFont.h +++ /dev/null @@ -1,55 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFontTables.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFontTables.cc deleted file mode 100644 index 5115b7bcf13..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFontTables.cc +++ /dev/null @@ -1,4284 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFontTables.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFontTables.h deleted file mode 100644 index eb45549efd2..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/BuiltinFontTables.h +++ /dev/null @@ -1,23 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CMap.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/CMap.cc deleted file mode 100644 index 6731ab5a1fa..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CMap.cc +++ /dev/null @@ -1,598 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 <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:ux} - {1:ux} [{2:ud} 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CMap.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CMap.h deleted file mode 100644 index f4f5a9141c8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CMap.h +++ /dev/null @@ -1,145 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CachedFile.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/CachedFile.cc deleted file mode 100644 index b0ae8388113..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CachedFile.cc +++ /dev/null @@ -1,257 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Julien Nabet <serval2412@yahoo.fr> -// -//======================================================================== - -#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/Build/source/libs/poppler/poppler-0.35.0/poppler/CachedFile.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CachedFile.h deleted file mode 100644 index b99ea1ecad4..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CachedFile.h +++ /dev/null @@ -1,146 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoFontEngine.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoFontEngine.cc deleted file mode 100644 index 1d611b59d3c..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoFontEngine.cc +++ /dev/null @@ -1,832 +0,0 @@ -//======================================================================== -// -// 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, 2013, 2015 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, 2014 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> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2015 Jason Crain <jason@aquaticape.us> -// -// 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 - -#if MULTITHREADED -# define fontEngineLocker() MutexLocker locker(&mutex) -#else -# define fontEngineLocker() -#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 (data->fd != -1) { -#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4) - munmap ((char*)data->bytes, data->size); -#else - munmap (data->bytes, data->size); -#endif - close (data->fd); - } else { - gfree (data->bytes); - } - - 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); - } else { - gfree (tmpl.bytes); - } - *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; - const 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, NULL))) { - 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, (char*)name); - if (codeToGID[i] == 0) { - name = GfxFont::getAlternateName(name); - if (name) { - codeToGID[i] = FT_Get_Name_Index(face, (char*)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)) { - 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; - gfree (codeToGID); - gfree (font_data); - 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; - XRef *xref; -} 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(), gfx->getXRef()); - 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, XRef *xref) { - 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; - info->xref = xref; - - 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, xref); -} - -CairoType3Font::CairoType3Font(Ref ref, - PDFDoc *doc, - cairo_font_face_t *cairo_font_face, - int *codeToGID, - Guint codeToGIDLen, - GBool printing, XRef *xref) : 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))); -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -CairoFontEngine::~CairoFontEngine() { - int i; - - for (i = 0; i < cairoFontCacheSize; ++i) { - if (fontCache[i]) - delete fontCache[i]; - } -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -CairoFont * -CairoFontEngine::getFont(GfxFont *gfxFont, PDFDoc *doc, GBool printing, XRef *xref) { - int i, j; - Ref ref; - CairoFont *font; - GfxFontType fontType; - - fontEngineLocker(); - 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, xref); - else - font = CairoFreeTypeFont::create (gfxFont, xref, 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoFontEngine.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoFontEngine.h deleted file mode 100644 index 8c0dba116d5..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoFontEngine.h +++ /dev/null @@ -1,129 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 CAIROFONTENGINE_H -#define CAIROFONTENGINE_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "poppler-config.h" -#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, XRef *xref); - 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, XRef *xref); - 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, XRef *xref); - -private: - CairoFont *fontCache[cairoFontCacheSize]; - FT_Library lib; - GBool useCIDs; -#if MULTITHREADED - GooMutex mutex; -#endif -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoOutputDev.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoOutputDev.cc deleted file mode 100644 index a86ec120f20..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoOutputDev.cc +++ /dev/null @@ -1,3329 +0,0 @@ -//======================================================================== -// -// 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, 2013, 2014 Carlos Garcia Campos <carlosgc@gnome.org> -// Copyright (C) 2008 Carl Worth <cworth@cworth.org> -// Copyright (C) 2008-2014 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, 2012 Hib Eris <hib@hiberis.nl> -// Copyright (C) 2009, 2010 David Benjamin <davidben@mit.edu> -// Copyright (C) 2011-2014 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012 Patrick Pfeifer <p2000@mailinator.com> -// Copyright (C) 2012 Jason Crain <jason@aquaticape.us> -// Copyright (C) 2015 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 -// -//======================================================================== - -#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 "UnicodeMap.h" -#include "JBIG2Stream.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; - inUncoloredPattern = gFalse; - inType3Char = gFalse; - t3_glyph_has_bbox = gFalse; - text_matrix_valid = gTrue; - - 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; - xref = NULL; -} - -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; - } - xref = doc->getXRef(); -} - -void CairoOutputDev::startPage(int pageNum, GfxState *state, XRef *xrefA) { - /* 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.); - fill_color.r = fill_color.g = fill_color.b = 0; - stroke_pattern = cairo_pattern_reference(fill_pattern); - stroke_color.r = stroke_color.g = stroke_color.b = 0; - - if (text) - text->startPage(state); - if (xrefA != NULL) { - xref = xrefA; - } -} - -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); - - text_matrix_valid = gTrue; - - /* 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; - - if (inUncoloredPattern) - return; - - 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; - - if (inUncoloredPattern) - return; - - 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; - - if (inUncoloredPattern) - return; - - 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; - - if (inUncoloredPattern) - return; - - 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) { - if (inUncoloredPattern) - return; - - 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, xref); - - 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"); - text_matrix_valid = gFalse; - return; - } - - cairo_set_font_matrix (cairo, &matrix); - text_matrix_valid = gTrue; -} - -/* 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 *gfxA, 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_matrix_t pattern_matrix; - cairo_t *old_cairo; - double xMin, yMin, xMax, yMax; - double width, height; - int surface_width, surface_height; - StrokePathClip *strokePathTmp; - GBool adjusted_stroke_width_tmp; - - width = bbox[2] - bbox[0]; - height = bbox[3] - bbox[1]; - - if (xStep != width || yStep != height) - return gFalse; - /* TODO: implement the other cases here too */ - - // Find the width and height of the transformed pattern - cairo_get_matrix (cairo, &matrix); - cairo_matrix_init (&pattern_matrix, mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]); - cairo_matrix_multiply (&matrix, &matrix, &pattern_matrix); - - double widthX = width, widthY = 0; - cairo_matrix_transform_distance (&matrix, &widthX, &widthY); - surface_width = ceil (sqrt (widthX * widthX + widthY * widthY)); - - double heightX = 0, heightY = height; - cairo_matrix_transform_distance (&matrix, &heightX, &heightY); - surface_height = ceil (sqrt (heightX * heightX + heightY * heightY)); - - 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); - cairo_scale (cairo, surface_width / width, surface_height / height); - - box.x1 = bbox[0]; box.y1 = bbox[1]; - box.x2 = bbox[2]; box.y2 = bbox[3]; - strokePathTmp = strokePathClip; - strokePathClip = NULL; - adjusted_stroke_width_tmp = adjusted_stroke_width; - gfx = new Gfx(doc, this, resDict, &box, NULL, NULL, NULL, gfxA->getXRef()); - if (paintType == 2) - inUncoloredPattern = gTrue; - gfx->display(str); - if (paintType == 2) - inUncoloredPattern = gFalse; - delete gfx; - strokePathClip = strokePathTmp; - adjusted_stroke_width = adjusted_stroke_width_tmp; - - 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_transform (cairo, &pattern_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++) { - if (shading->isParameterized()) { - double color0, color1, color2; - shading->getTriangle(i, &x0, &y0, &color0, - &x1, &y1, &color1, - &x2, &y2, &color2); - shading->getParameterizedColor(color0, &color[0]); - shading->getParameterizedColor(color1, &color[1]); - shading->getParameterizedColor(color2, &color[2]); - } else { - 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) { - GooString enc("UTF-8"); - UnicodeMap *utf8Map = globalParams->getUnicodeMap(&enc); - 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 = utf8Map->mapUnicode(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 || !text_matrix_valid) { - goto finish; - } - - 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); - } - } - -finish: - 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 || transferFunc) { - /* 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 */ - if (!alpha && groupColorSpaceStack->cs) { - 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 = alpha ? fill_opacity : 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 if (alpha) { - 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(const cairo_matrix_t *matrix, - int orig_width, - int orig_height, - int *scaledWidth, - int *scaledHeight) -{ - 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_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; - - /* When printing, don't change the interpolation. */ - if (printing) - return CAIRO_FILTER_NEAREST; - - cairo_matrix_t matrix; - cairo_get_matrix(cairo, &matrix); - int scaled_width, scaled_height; - getScaledSize (&matrix, 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)) { - 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); - } - } - } else { - 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(state, str, ref, colorMap, 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., 1., 1.); - 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., 1., 1.); - 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., 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; -} - -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; -} - -static GBool colorMapHasIdentityDecodeMap(GfxImageColorMap *colorMap) -{ - for (int i = 0; i < colorMap->getNumPixelComps(); i++) { - if (colorMap->getDecodeLow(i) != 0.0 || colorMap->getDecodeHigh(i) != 1.0) - return gFalse; - } - return gTrue; -} - -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2) -static cairo_status_t setMimeIdFromRef(cairo_surface_t *surface, - const char *mime_type, - const char *mime_id_prefix, - Ref ref) -{ - GooString *mime_id; - char *idBuffer; - cairo_status_t status; - - mime_id = new GooString; - - if (mime_id_prefix) - mime_id->append(mime_id_prefix); - - mime_id->appendf("{0:d}-{1:d}", ref.gen, ref.num); - - idBuffer = copyString(mime_id->getCString()); - status = cairo_surface_set_mime_data (surface, mime_type, - (const unsigned char *)idBuffer, - mime_id->getLength(), - gfree, idBuffer); - delete mime_id; - if (status) - gfree (idBuffer); - return status; -} -#endif - -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) -GBool CairoOutputDev::setMimeDataForJBIG2Globals(Stream *str, - cairo_surface_t *image) -{ - JBIG2Stream *jb2Str = static_cast<JBIG2Stream *>(str); - Object* globalsStr = jb2Str->getGlobalsStream(); - char *globalsBuffer; - int globalsLength; - - // nothing to do for JBIG2 stream without Globals - if (!globalsStr->isStream()) - return gTrue; - - if (setMimeIdFromRef(image, CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID, NULL, - jb2Str->getGlobalsStreamRef())) - return gFalse; - - if (!getStreamData(globalsStr->getStream(), &globalsBuffer, &globalsLength)) - return gFalse; - - if (cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_JBIG2_GLOBAL, - (const unsigned char*)globalsBuffer, - globalsLength, - gfree, (void*)globalsBuffer)) - { - gfree (globalsBuffer); - return gFalse; - } - - return gTrue; -} -#endif - -void CairoOutputDev::setMimeData(GfxState *state, Stream *str, Object *ref, - GfxImageColorMap *colorMap, cairo_surface_t *image) -{ - char *strBuffer; - int len; - Object obj; - GfxColorSpace *colorSpace; - StreamKind strKind = str->getKind(); - const char *mime_type; - - if (!printing) - return; - - switch (strKind) { - case strDCT: - mime_type = CAIRO_MIME_TYPE_JPEG; - break; - case strJPX: - mime_type = CAIRO_MIME_TYPE_JP2; - break; -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) - case strJBIG2: - mime_type = CAIRO_MIME_TYPE_JBIG2; - break; -#endif - default: - return; - } - - str->getDict()->lookup("ColorSpace", &obj); - colorSpace = GfxColorSpace::parse(NULL, &obj, this, state); - obj.free(); - - // colorspace in stream dict may be different from colorspace in jpx - // data - if (strKind == strJPX && colorSpace) - return; - - // only embed mime data for gray, rgb, and cmyk colorspaces. - if (colorSpace) { - GfxColorSpaceMode mode = colorSpace->getMode(); - delete colorSpace; - switch (mode) { - case csDeviceGray: - case csCalGray: - case csDeviceRGB: - case csCalRGB: - case csDeviceCMYK: - case csICCBased: - break; - - case csLab: - case csIndexed: - case csSeparation: - case csDeviceN: - case csPattern: - return; - } - } - - if (!colorMapHasIdentityDecodeMap(colorMap)) - return; - -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) - if (strKind == strJBIG2 && !setMimeDataForJBIG2Globals(str, image)) - return; -#endif - - if (getStreamData (str->getNextStream(), &strBuffer, &len)) { - cairo_status_t status = CAIRO_STATUS_SUCCESS; - -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2) - if (ref && ref->isRef()) { - status = setMimeIdFromRef(image, CAIRO_MIME_TYPE_UNIQUE_ID, - "poppler-surface-", ref->getRef()); - } -#endif - if (!status) { - status = cairo_surface_set_mime_data (image, mime_type, - (const unsigned char *)strBuffer, len, - gfree, strBuffer); - } - - if (status) - gfree (strBuffer); - } -} - -class RescaleDrawImage : public CairoRescaleBox { -private: - ImageStream *imgStr; - GfxRGB *lookup; - int width; - GfxImageColorMap *colorMap; - int *maskColors; - int current_row; - GBool imageError; - -public: - cairo_surface_t *getSourceImage(Stream *str, - int widthA, int height, - int scaledWidth, int scaledHeight, - GBool printing, - GfxImageColorMap *colorMapA, - int *maskColorsA) { - cairo_surface_t *image = NULL; - int i; - - lookup = NULL; - colorMap = colorMapA; - maskColors = maskColorsA; - width = widthA; - current_row = -1; - imageError = gFalse; - - /* 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 - - // 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]); - } - } - - if (printing || scaledWidth >= width || scaledHeight >= height) { - // No downscaling. Create cairo image containing the source image data. - unsigned char *buffer; - int stride; - - image = cairo_image_surface_create (maskColors ? - CAIRO_FORMAT_ARGB32 : - CAIRO_FORMAT_RGB24, - width, height); - if (cairo_surface_status (image)) - goto cleanup; - - 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); - getRow(y, dest); - } - } else { - // // Downscaling required. Create cairo image the size of the - // rescaled image and // downscale the source image data into - // the cairo image. downScaleImage() will call getRow() to read - // source image data from the image stream. This avoids having - // to create an image the size of the source image which may - // exceed cairo's 32676x32767 image size limit (and also saves a - // lot of memory). - image = cairo_image_surface_create (maskColors ? - CAIRO_FORMAT_ARGB32 : - CAIRO_FORMAT_RGB24, - scaledWidth, scaledHeight); - if (cairo_surface_status (image)) - goto cleanup; - - downScaleImage(width, height, - scaledWidth, scaledHeight, - 0, 0, scaledWidth, scaledHeight, - image); - } - cairo_surface_mark_dirty (image); - - cleanup: - gfree(lookup); - imgStr->close(); - delete imgStr; - return image; - } - - void getRow(int row_num, uint32_t *row_data) { - int i; - Guchar *pix; - - if (row_num <= current_row) - return; - - while (current_row < row_num) { - pix = imgStr->getLine(); - current_row++; - } - - if (unlikely(pix == NULL)) { - memset(row_data, 0, width*4); - if (!imageError) { - error(errInternal, -1, "Bad image stream"); - imageError = gTrue; - } - } else if (lookup) { - Guchar *p = pix; - GfxRGB rgb; - - for (i = 0; i < width; i++) { - rgb = lookup[*p]; - row_data[i] = - ((int) colToByte(rgb.r) << 16) | - ((int) colToByte(rgb.g) << 8) | - ((int) colToByte(rgb.b) << 0); - p++; - } - } else { - colorMap->getRGBLine (pix, row_data, 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) - *row_data |= 0xff000000; - else - *row_data = 0; - row_data++; - pix += colorMap->getNumPixelComps(); - } - } - } - -}; - -void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, - int widthA, int heightA, - GfxImageColorMap *colorMap, - GBool interpolate, - int *maskColors, GBool inlineImg) -{ - cairo_surface_t *image; - cairo_pattern_t *pattern, *maskPattern; - cairo_matrix_t matrix; - int width, height; - int scaledWidth, scaledHeight; - cairo_filter_t filter = CAIRO_FILTER_BILINEAR; - RescaleDrawImage rescale; - - LOG (printf ("drawImage %dx%d\n", widthA, heightA)); - - cairo_get_matrix(cairo, &matrix); - getScaledSize (&matrix, widthA, heightA, &scaledWidth, &scaledHeight); - image = rescale.getSourceImage(str, widthA, heightA, scaledWidth, scaledHeight, printing, colorMap, maskColors); - if (!image) - return; - - width = cairo_image_surface_get_width (image); - height = cairo_image_surface_get_height (image); - if (width == widthA && height == heightA) - filter = getFilterForSurface (image, interpolate); - - if (!inlineImg) /* don't read stream twice if it is an inline image */ - setMimeData(state, str, ref, colorMap, image); - - pattern = cairo_pattern_create_for_surface (image); - cairo_surface_destroy (image); - if (cairo_pattern_status (pattern)) - return; - - 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); - return; - } - - 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); - if (mask) - 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); -} - - -//------------------------------------------------------------------------ -// 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::getBBox(GfxState *state, int width, int height, - double *x1, double *y1, double *x2, double *y2) -{ - double *ctm = state->getCTM(); - cairo_matrix_t matrix; - cairo_matrix_init(&matrix, - ctm[0], ctm[1], - -ctm[2], -ctm[3], - ctm[2] + ctm[4], ctm[3] + ctm[5]); - - int scaledWidth, scaledHeight; - getScaledSize (&matrix, width, height, &scaledWidth, &scaledHeight); - - if (matrix.xx >= 0) { - *x1 = matrix.x0; - } else { - *x1 = matrix.x0 - scaledWidth; - } - *x2 = *x1 + scaledWidth; - - if (matrix.yy >= 0) { - *y1 = matrix.y0; - } else { - *y1 = matrix.y0 - scaledHeight; - } - *y2 = *y1 + scaledHeight; -} - -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; - CairoImage *image; - - getBBox(state, width, height, &x1, &y1, &x2, &y2); - - 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::setSoftMaskFromImageMask(GfxState *state, Object *ref, Stream *str, - int width, int height, GBool invert, - GBool inlineImg, double *baseMatrix) -{ - cairo_t *cr; - cairo_surface_t *surface; - double x1, y1, x2, y2; - CairoImage *image; - - getBBox(state, width, height, &x1, &y1, &x2, &y2); - - 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, inlineImg, gFalse); - if (state->getFillColorSpace()->getMode() == csPattern) { - cairo_mask (cairo, mask); - } - 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; - CairoImage *image; - - getBBox(state, width, height, &x1, &y1, &x2, &y2); - - 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; - CairoImage *image; - - getBBox(state, width, height, &x1, &y1, &x2, &y2); - - 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; - CairoImage *image; - - getBBox(state, width, height, &x1, &y1, &x2, &y2); - - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoOutputDev.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoOutputDev.h deleted file mode 100644 index 33dde0c570a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoOutputDev.h +++ /dev/null @@ -1,517 +0,0 @@ -//======================================================================== -// -// 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, 2013 Carlos Garcia Campos <carlosgc@gnome.org> -// Copyright (C) 2008, 2009, 2011-2014 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu> -// Copyright (C) 2010-2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2015 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 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; } - - // Does this device need to clip pages to the crop box even when the - // box is the crop box? - virtual GBool needClipToCropBox() { return gTrue; } - - //----- initialization and control - - // Start a page. - virtual void startPage(int pageNum, GfxState *state, XRef *xref); - - // 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 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(const cairo_matrix_t *matrix, - 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(GfxState *state, Stream *str, Object *ref, - GfxImageColorMap *colorMap, cairo_surface_t *image); - void fillToStrokePathClip(GfxState *state); - void alignStrokeCoords(GfxSubpath *subpath, int i, double *x, double *y); -#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) - GBool setMimeDataForJBIG2Globals (Stream *str, cairo_surface_t *image); -#endif - - 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; - XRef *xref; - - 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; - GBool text_matrix_valid; - 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 inUncoloredPattern; // inside a uncolored pattern (PaintType = 2) - 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); - 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) {} - - - //----- 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); - void getBBox(GfxState *state, int width, int height, - double *x1, double *y1, double *x2, double *y2); - - CairoImage **images; - int numImages; - int size; - GBool (*imgDrawCbk)(int img_id, void *data); - void *imgDrawCbkData; -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoRescaleBox.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoRescaleBox.cc deleted file mode 100644 index 3c96f45e5d3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoRescaleBox.cc +++ /dev/null @@ -1,378 +0,0 @@ -/* -*- 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> -// 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 -// -//======================================================================== - - -/* 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 CairoRescaleBox::downScaleImage(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, - cairo_surface_t *dest_surface) { - int pixel_coverage_x, pixel_coverage_y; - int dest_y; - int src_y = 0; - uint32_t *scanline; - int *x_coverage = NULL; - int *y_coverage = NULL; - uint32_t *temp_buf = NULL; - GBool retval = gFalse; - unsigned int *dest; - int dst_stride; - - dest = (unsigned int *)cairo_image_surface_get_data (dest_surface); - dst_stride = cairo_image_surface_get_stride (dest_surface); - - scanline = (uint32_t*)gmallocn3 (orig_width, 1, sizeof(int)); - - 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]; - - getRow(src_y, scanline); - 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) - { - getRow(src_y, scanline); - 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) - { - getRow(src_y, scanline); - 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); - free (scanline); - - return retval; -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoRescaleBox.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoRescaleBox.h deleted file mode 100644 index 072e8a9c80c..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CairoRescaleBox.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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 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 CAIRO_RESCALE_BOX_H -#define CAIRO_RESCALE_BOX_H - -#include "goo/gtypes.h" -#include <cairo.h> - -class CairoRescaleBox { -public: - - CairoRescaleBox() {}; - virtual ~CairoRescaleBox() {}; - - virtual GBool downScaleImage(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, - cairo_surface_t *dest_surface); - - virtual void getRow(int row_num, uint32_t *row_data) = 0; - -}; - -#endif /* CAIRO_RESCALE_BOX_H */ diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Catalog.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Catalog.cc deleted file mode 100644 index 04caa1c1f35..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Catalog.cc +++ /dev/null @@ -1,1142 +0,0 @@ -//======================================================================== -// -// 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-2013, 2015 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> -// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 Julien Nabet <serval2412@yahoo.fr> -// Copyright (C) 2013 Adrian Perez de Castro <aperez@igalia.com> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 José Aliste <jaliste@src.gnome.org> -// Copyright (C) 2014 Ed Porras <ed@moto-research.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 <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" -#include "StructTreeRoot.h" - -#if MULTITHREADED -# define catalogLocker() MutexLocker locker(&mutex) -#else -# define catalogLocker() -#endif -//------------------------------------------------------------------------ -// Catalog -//------------------------------------------------------------------------ - -Catalog::Catalog(PDFDoc *docA) { - Object catDict, pagesDict, pagesDictRef; - Object obj, obj2; - Object optContentProps; - -#if MULTITHREADED - gInitMutex(&mutex); -#endif - 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; - structTreeRoot = NULL; - - pagesList = NULL; - pagesRefList = NULL; - attrsList = NULL; - kidsIdxList = NULL; - lastCachedPage = 0; - markInfo = markInfoNull; - - 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(); - - // actions - catDict.dictLookupNF("AA", &additionalActions); - - // 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; - delete structTreeRoot; - metadata.free(); - outline.free(); - acroForm.free(); - viewerPreferences.free(); - additionalActions.free(); -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -GooString *Catalog::readMetadata() { - GooString *s; - Dict *dict; - Object obj; - - catalogLocker(); - 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; - - catalogLocker(); - if (i > lastCachedPage) { - GBool cached = cachePageTree(i); - if ( cached == gFalse) { - return NULL; - } - } - return pages[i-1]; -} - -Ref *Catalog::getPageRef(int i) -{ - if (i < 1) return NULL; - - catalogLocker(); - if (i > lastCachedPage) { - GBool cached = cachePageTree(i); - if ( cached == 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) { - catalogLocker(); - 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; - catalogLocker(); - 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 - catalogLocker(); - 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() { - - catalogLocker(); - 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() { - - catalogLocker(); - 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; -} - -int NameTree::Entry::cmpEntry(const void *voidEntry, const void *voidOtherEntry) -{ - Entry *entry = *(NameTree::Entry **) voidEntry; - Entry *otherEntry = *(NameTree::Entry **) voidOtherEntry; - - return entry->name.cmp(&otherEntry->name); -} - -void NameTree::init(XRef *xrefA, Object *tree) { - xref = xrefA; - parse(tree); - if (entries && length > 0) { - qsort(entries, length, sizeof(Entry *), Entry::cmpEntry); - } -} - -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 { - error(errSyntaxError, -1, "failed to look up ({0:s})", 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() -{ - catalogLocker(); - 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); - - // 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(); - catDict.free(); - return 0; - } - - pagesDict.dictLookup("Count", &obj); - // some PDF files actually use real numbers here ("/Count 9.0") - if (!obj.isNum()) { - if (pagesDict.dictIs("Page")) { - Object pageRootRef; - catDict.dictLookupNF("Pages", &pageRootRef); - - error(errSyntaxError, -1, "Pages top-level is a single Page. The document is malformed, trying to recover..."); - - Dict *pageDict = pagesDict.getDict(); - if (pageRootRef.isRef()) { - const Ref pageRef = pageRootRef.getRef(); - Page *p = new Page(doc, 1, pageDict, pageRef, new PageAttrs(NULL, pageDict), form); - if (p->isOk()) { - pages = (Page **)gmallocn(1, sizeof(Page *)); - pageRefs = (Ref *)gmallocn(1, sizeof(Ref)); - - pages[0] = p; - pageRefs[0].num = pageRef.num; - pageRefs[0].gen = pageRef.gen; - - numPages = 1; - lastCachedPage = 1; - pagesSize = 1; - } else { - delete p; - numPages = 0; - } - } else { - numPages = 0; - } - } else { - error(errSyntaxError, -1, "Page count in top-level pages object is wrong type ({0:s})", - obj.getTypeName()); - numPages = 0; - } - } else { - numPages = (int)obj.getNum(); - } - - catDict.free(); - obj.free(); - pagesDict.free(); - } - - return numPages; -} - -PageLabelInfo *Catalog::getPageLabelInfo() -{ - catalogLocker(); - 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; -} - -StructTreeRoot *Catalog::getStructTreeRoot() -{ - catalogLocker(); - if (!structTreeRoot) { - Object catalog; - Object root; - - xref->getCatalog(&catalog); - if (!catalog.isDict()) { - error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catalog.getTypeName()); - catalog.free(); - return NULL; - } - - if (catalog.dictLookup("StructTreeRoot", &root)->isDict("StructTreeRoot")) { - structTreeRoot = new StructTreeRoot(doc, root.getDict()); - } - - root.free(); - catalog.free(); - } - return structTreeRoot; -} - -Guint Catalog::getMarkInfo() -{ - if (markInfo == markInfoNull) { - markInfo = 0; - - Object catDict; - catalogLocker(); - xref->getCatalog(&catDict); - - if (catDict.isDict()) { - Object markInfoDict; - catDict.dictLookup("MarkInfo", &markInfoDict); - if (markInfoDict.isDict()) { - Object value; - - if (markInfoDict.dictLookup("Marked", &value)->isBool() && value.getBool()) - markInfo |= markInfoMarked; - else if (!value.isNull()) - error(errSyntaxError, -1, "Marked object is wrong type ({0:s})", value.getTypeName()); - value.free(); - - if (markInfoDict.dictLookup("Suspects", &value)->isBool() && value.getBool()) - markInfo |= markInfoSuspects; - else if (!value.isNull()) - error(errSyntaxError, -1, "Suspects object is wrong type ({0:s})", value.getTypeName()); - value.free(); - - if (markInfoDict.dictLookup("UserProperties", &value)->isBool() && value.getBool()) - markInfo |= markInfoUserProperties; - else if (!value.isNull()) - error(errSyntaxError, -1, "UserProperties object is wrong type ({0:s})", value.getTypeName()); - value.free(); - } else if (!markInfoDict.isNull()) { - error(errSyntaxError, -1, "MarkInfo object is wrong type ({0:s})", markInfoDict.getTypeName()); - } - markInfoDict.free(); - } else { - error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); - } - catDict.free(); - } - return markInfo; -} - -Object *Catalog::getOutline() -{ - catalogLocker(); - 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() -{ - catalogLocker(); - 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; -} - -Catalog::FormType Catalog::getFormType() -{ - Object xfa; - FormType res = NoForm; - - if (acroForm.isDict()) { - acroForm.dictLookup("XFA", &xfa); - if (xfa.isStream() || xfa.isArray()) { - res = XfaForm; - } else { - res = AcroForm; - } - xfa.free(); - } - - return res; -} - -Form *Catalog::getForm() -{ - catalogLocker(); - 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() -{ - catalogLocker(); - 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; -} - -LinkAction* Catalog::getAdditionalAction(DocumentAdditionalActionsType type) { - Object additionalActionsObject; - LinkAction *linkAction = NULL; - - if (additionalActions.fetch(doc->getXRef(), &additionalActionsObject)->isDict()) { - const char *key = (type == actionCloseDocument ? "WC" : - type == actionSaveDocumentStart ? "WS" : - type == actionSaveDocumentFinish ? "DS" : - type == actionPrintDocumentStart ? "WP" : - type == actionPrintDocumentFinish ? "DP" : NULL); - - Object actionObject; - - if (additionalActionsObject.dictLookup(key, &actionObject)->isDict()) - linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); - actionObject.free(); - } - - additionalActionsObject.free(); - - return linkAction; -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Catalog.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Catalog.h deleted file mode 100644 index bc9ce20b098..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Catalog.h +++ /dev/null @@ -1,272 +0,0 @@ -//======================================================================== -// -// 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, 2013 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> -// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 Adrian Perez de Castro <aperez@igalia.com> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 José Aliste <jaliste@src.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 CATALOG_H -#define CATALOG_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "poppler-config.h" -#include "Object.h" -#include "goo/GooMutex.h" - -#include <vector> - -class PDFDoc; -class XRef; -class Object; -class Page; -class PageAttrs; -struct Ref; -class LinkDest; -class LinkAction; -class PageLabelInfo; -class Form; -class OCGs; -class ViewerPreferences; -class FileSpec; -class StructTreeRoot; - -//------------------------------------------------------------------------ -// 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 cmpEntry(const void *voidEntry, const void *voidOtherEntry); - 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. - StructTreeRoot *getStructTreeRoot(); - - // Return values from the MarkInfo dictionary as flags in a bitfield. - enum MarkInfoFlags { - markInfoNull = 1 << 0, - markInfoMarked = 1 << 1, - markInfoUserProperties = 1 << 2, - markInfoSuspects = 1 << 3, - }; - Guint getMarkInfo(); - - // 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(); } - GooString *getJSName(int i) { return getJSNameTree()->getName(i); } - - // 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; } - - enum FormType - { - NoForm, - AcroForm, - XfaForm - }; - - FormType getFormType(); - 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(); - - enum DocumentAdditionalActionsType { - actionCloseDocument, ///< Performed before closing the document - actionSaveDocumentStart, ///< Performed before saving the document - actionSaveDocumentFinish, ///< Performed after saving the document - actionPrintDocumentStart, ///< Performed before printing the document - actionPrintDocumentFinish, ///< Performed after printing the document - }; - - LinkAction *getAdditionalAction(DocumentAdditionalActionsType type); - -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 - StructTreeRoot *structTreeRoot; // structure tree root - Guint markInfo; // Flags from MarkInfo 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 - Object additionalActions; // page additional actions - - GBool cachePageTree(int page); // Cache first <page> pages. - Object *findDestInTree(Object *tree, GooString *name, Object *obj); - - Object *getNames(); - NameTree *getDestNameTree(); - NameTree *getEmbeddedFileNameTree(); - NameTree *getJSNameTree(); -#if MULTITHREADED - GooMutex mutex; -#endif - -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/CharCodeToUnicode.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/CharCodeToUnicode.cc deleted file mode 100644 index 59b7c93e66f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CharCodeToUnicode.cc +++ /dev/null @@ -1,729 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2014 Jiri Slaby <jirislaby@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 <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" -#include "UTF.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; - if (!UnicodeIsValid(map[code])) { - map[code] = 0xfffd; - } - } else { - if (sMapLen >= sMapSize) { - sMapSize = sMapSize + 16; - sMap = (CharCodeToUnicodeString *) - greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString)); - } - map[code] = 0; - sMap[sMapLen].c = code; - int utf16Len = n / 4; - Unicode *utf16 = (Unicode*)gmallocn(utf16Len, sizeof(Unicode)); - for (j = 0; j < utf16Len; ++j) { - if (!parseHex(uStr + j*4, 4, &utf16[j])) { - gfree(utf16); - error(errSyntaxWarning, -1, "Illegal entry in ToUnicode CMap"); - return; - } - } - utf16[utf16Len - 1] += offset; - sMap[sMapLen].len = UTF16toUCS4(utf16, utf16Len, &sMap[sMapLen].u); - gfree(utf16); - ++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) { - if (UnicodeIsValid(u[j])) { - sMap[i].u[j] = u[j]; - } else { - sMap[i].u[j] = 0xfffd; - } - } - } -} - -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 || (usize > 1 && !(*u & ~0xff))) { - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CharCodeToUnicode.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CharCodeToUnicode.h deleted file mode 100644 index 1672105a8f4..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CharCodeToUnicode.h +++ /dev/null @@ -1,146 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CharTypes.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CharTypes.h deleted file mode 100644 index d0df630d0c9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CharTypes.h +++ /dev/null @@ -1,24 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CompactFontTables.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CompactFontTables.h deleted file mode 100644 index cfbfdaf5752..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CompactFontTables.h +++ /dev/null @@ -1,480 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlCachedFile.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlCachedFile.cc deleted file mode 100644 index af4c2b60322..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlCachedFile.cc +++ /dev/null @@ -1,99 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlCachedFile.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlCachedFile.h deleted file mode 100644 index 49882aba8ac..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlCachedFile.h +++ /dev/null @@ -1,40 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlPDFDocBuilder.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlPDFDocBuilder.cc deleted file mode 100644 index 5b02b14a784..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlPDFDocBuilder.cc +++ /dev/null @@ -1,47 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlPDFDocBuilder.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlPDFDocBuilder.h deleted file mode 100644 index fb34862057c..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/CurlPDFDocBuilder.h +++ /dev/null @@ -1,33 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/DCTStream.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/DCTStream.cc deleted file mode 100644 index bfdb0eaf80a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/DCTStream.cc +++ /dev/null @@ -1,266 +0,0 @@ -//======================================================================== -// -// 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, 2013 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, Object *dict, int recursion) : - FilterStream(strA) { - colorXform = colorXformA; - if (dict != NULL) { - Object obj; - - dict->dictLookup("Width", &obj, recursion); - err.width = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0; - obj.free(); - dict->dictLookup("Height", &obj, recursion); - err.height = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0; - obj.free(); - } else - err.height = err.width = 0; - 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; - if (cinfo->err->msg_code == JERR_IMAGE_TOO_BIG && err->width != 0 && err->height != 0) { - cinfo->image_height = err->height; - cinfo->image_width = err->width; - } else { - 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)) - { - if (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/Build/source/libs/poppler/poppler-0.35.0/poppler/DCTStream.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/DCTStream.h deleted file mode 100644 index bc20a7aaab6..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/DCTStream.h +++ /dev/null @@ -1,91 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// -//======================================================================== - -#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> -#include <jerror.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; - int width; - int height; -}; - -class DCTStream: public FilterStream { -public: - - DCTStream(Stream *strA, int colorXformA, Object *dict, int recursion); - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/DateInfo.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/DateInfo.cc deleted file mode 100644 index 563204a1743..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/DateInfo.cc +++ /dev/null @@ -1,118 +0,0 @@ -//======================================================================== -// -// 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", - ¢ury, &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/Build/source/libs/poppler/poppler-0.35.0/poppler/DateInfo.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/DateInfo.h deleted file mode 100644 index 116350f4134..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/DateInfo.h +++ /dev/null @@ -1,35 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Decrypt.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Decrypt.cc deleted file mode 100644 index ba44f959c31..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Decrypt.cc +++ /dev/null @@ -1,1417 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013 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 "goo/gmem.h" -#include "goo/grandom.h" -#include "Decrypt.h" -#include "Error.h" - -static void rc4InitKey(Guchar *key, int keyLen, Guchar *state); -static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c); - -static GBool aesReadBlock(Stream *str, Guchar *in, GBool addPadding); - -static void aesKeyExpansion(DecryptAESState *s, Guchar *objKey, int objKeyLen, GBool decrypt); -static void aesEncryptBlock(DecryptAESState *s, Guchar *in); -static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last); - -static void aes256KeyExpansion(DecryptAES256State *s, Guchar *objKey, int objKeyLen, GBool decrypt); -static void aes256EncryptBlock(DecryptAES256State *s, Guchar *in); -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, gTrue); - 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, gTrue); - 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; -} - -//------------------------------------------------------------------------ -// BaseCryptStream -//------------------------------------------------------------------------ - -BaseCryptStream::BaseCryptStream(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; - autoDelete = gTrue; -} - -BaseCryptStream::~BaseCryptStream() { - if (autoDelete) { - delete str; - } -} - -void BaseCryptStream::reset() { - charactersRead = 0; - nextCharBuff = EOF; - str->reset(); -} - -Goffset BaseCryptStream::getPos() { - return charactersRead; -} - -int BaseCryptStream::getChar() { - // Read next character and empty the buffer, so that a new character will be read next time - int c = lookChar(); - nextCharBuff = EOF; - - if (c != EOF) - charactersRead++; - return c; -} - -GBool BaseCryptStream::isBinary(GBool last) { - return str->isBinary(last); -} - -void BaseCryptStream::setAutoDelete(GBool val) { - autoDelete = val; -} - -//------------------------------------------------------------------------ -// EncryptStream -//------------------------------------------------------------------------ - -EncryptStream::EncryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, - int keyLength, int objNum, int objGen): - BaseCryptStream(strA, fileKey, algoA, keyLength, objNum, objGen) -{ - // Fill the CBC initialization vector for AES and AES-256 - switch (algo) { - case cryptAES: - grandom_fill(state.aes.cbc, 16); - break; - case cryptAES256: - grandom_fill(state.aes256.cbc, 16); - break; - default: - break; - } -} - -EncryptStream::~EncryptStream() { -} - -void EncryptStream::reset() { - BaseCryptStream::reset(); - - switch (algo) { - case cryptRC4: - state.rc4.x = state.rc4.y = 0; - rc4InitKey(objKey, objKeyLength, state.rc4.state); - break; - case cryptAES: - aesKeyExpansion(&state.aes, objKey, objKeyLength, gFalse); - memcpy(state.aes.buf, state.aes.cbc, 16); // Copy CBC IV to buf - state.aes.bufIdx = 0; - state.aes.paddingReached = gFalse; - break; - case cryptAES256: - aes256KeyExpansion(&state.aes256, objKey, objKeyLength, gFalse); - memcpy(state.aes256.buf, state.aes256.cbc, 16); // Copy CBC IV to buf - state.aes256.bufIdx = 0; - state.aes256.paddingReached = gFalse; - break; - } -} - -int EncryptStream::lookChar() { - Guchar in[16]; - int c; - - if (nextCharBuff != EOF) - return nextCharBuff; - - c = EOF; // make gcc happy - switch (algo) { - case cryptRC4: - if ((c = str->getChar()) != EOF) { - // RC4 is XOR-based: the decryption algorithm works for encryption too - c = rc4DecryptByte(state.rc4.state, &state.rc4.x, &state.rc4.y, (Guchar)c); - } - break; - case cryptAES: - if (state.aes.bufIdx == 16 && !state.aes.paddingReached) { - state.aes.paddingReached = !aesReadBlock(str, in, gTrue); - aesEncryptBlock(&state.aes, in); - } - if (state.aes.bufIdx == 16) { - c = EOF; - } else { - c = state.aes.buf[state.aes.bufIdx++]; - } - break; - case cryptAES256: - if (state.aes256.bufIdx == 16 && !state.aes256.paddingReached) { - state.aes256.paddingReached = !aesReadBlock(str, in, gTrue); - aes256EncryptBlock(&state.aes256, in); - } - if (state.aes256.bufIdx == 16) { - c = EOF; - } else { - c = state.aes256.buf[state.aes256.bufIdx++]; - } - break; - } - return (nextCharBuff = c); -} - -//------------------------------------------------------------------------ -// DecryptStream -//------------------------------------------------------------------------ - -DecryptStream::DecryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, - int keyLength, int objNum, int objGen): - BaseCryptStream(strA, fileKey, algoA, keyLength, objNum, objGen) -{ -} - -DecryptStream::~DecryptStream() { -} - -void DecryptStream::reset() { - int i; - BaseCryptStream::reset(); - - switch (algo) { - case cryptRC4: - state.rc4.x = state.rc4.y = 0; - rc4InitKey(objKey, objKeyLength, state.rc4.state); - break; - case cryptAES: - aesKeyExpansion(&state.aes, objKey, objKeyLength, gTrue); - for (i = 0; i < 16; ++i) { - state.aes.cbc[i] = str->getChar(); - } - state.aes.bufIdx = 16; - break; - case cryptAES256: - aes256KeyExpansion(&state.aes256, objKey, objKeyLength, gTrue); - for (i = 0; i < 16; ++i) { - state.aes256.cbc[i] = str->getChar(); - } - state.aes256.bufIdx = 16; - break; - } -} - -int DecryptStream::lookChar() { - Guchar in[16]; - int c; - - if (nextCharBuff != EOF) - return nextCharBuff; - - c = EOF; // make gcc happy - switch (algo) { - case cryptRC4: - if ((c = str->getChar()) != EOF) { - c = rc4DecryptByte(state.rc4.state, &state.rc4.x, &state.rc4.y, (Guchar)c); - } - break; - case cryptAES: - if (state.aes.bufIdx == 16) { - if (aesReadBlock(str, in, gFalse)) { - 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) { - if (aesReadBlock(str, in, gFalse)) { - aes256DecryptBlock(&state.aes256, in, str->lookChar() == EOF); - } - } - if (state.aes256.bufIdx == 16) { - c = EOF; - } else { - c = state.aes256.buf[state.aes256.bufIdx++]; - } - break; - } - return (nextCharBuff = c); -} - -//------------------------------------------------------------------------ -// RC4-compatible decryption -//------------------------------------------------------------------------ - -static 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; - } -} - -static 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 -//------------------------------------------------------------------------ - -// Returns gFalse if EOF was reached, gTrue otherwise -static GBool aesReadBlock(Stream *str, Guchar *in, GBool addPadding) -{ - int c, i; - - for (i = 0; i < 16; ++i) { - if ((c = str->getChar()) != EOF) { - in[i] = (Guchar)c; - } else { - break; - } - } - - if (i == 16) { - return gTrue; - } else { - if (addPadding) { - c = 16 - i; - while (i < 16) { - in[i++] = (Guchar)c; - } - } - return gFalse; - } -} - -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 subBytes(Guchar *state) { - int i; - - for (i = 0; i < 16; ++i) { - state[i] = sbox[state[i]]; - } -} - -static inline void invSubBytes(Guchar *state) { - int i; - - for (i = 0; i < 16; ++i) { - state[i] = invSbox[state[i]]; - } -} - -static inline void shiftRows(Guchar *state) { - Guchar t; - - t = state[4]; - state[4] = state[5]; - state[5] = state[6]; - state[6] = state[7]; - state[7] = t; - - t = state[8]; - state[8] = state[10]; - state[10] = t; - t = state[9]; - state[9] = state[11]; - state[11] = t; - - t = state[15]; - state[15] = state[14]; - state[14] = state[13]; - state[13] = state[12]; - state[12] = t; -} - -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; -} - -// {02} \cdot s -static inline Guchar mul02(Guchar s) { - return (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); -} - -// {03} \cdot s -static inline Guchar mul03(Guchar s) { - Guchar s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); - return s ^ s2; -} - -// {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 mixColumns(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] = mul02(s0) ^ mul03(s1) ^ s2 ^ s3; - state[4+c] = s0 ^ mul02(s1) ^ mul03(s2) ^ s3; - state[8+c] = s0 ^ s1 ^ mul02(s2) ^ mul03(s3); - state[12+c] = mul03(s0) ^ s1 ^ s2 ^ mul02(s3); - } -} - -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*/, GBool decrypt) { - 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; - } - - /* In case of decryption, adjust the key schedule for the equivalent inverse cipher */ - if (decrypt) { - for (round = 1; round <= 9; ++round) { - invMixColumnsW(&s->w[round * 4]); - } - } -} - -static void aesEncryptBlock(DecryptAESState *s, Guchar *in) { - int c, round; - - // initial state (input is xor'd with previous output because of CBC) - for (c = 0; c < 4; ++c) { - s->state[c] = in[4*c] ^ s->buf[4*c]; - s->state[4+c] = in[4*c+1] ^ s->buf[4*c+1]; - s->state[8+c] = in[4*c+2] ^ s->buf[4*c+2]; - s->state[12+c] = in[4*c+3] ^ s->buf[4*c+3]; - } - - // round 0 - addRoundKey(s->state, &s->w[0]); - - // rounds 1-9 - for (round = 1; round <= 9; ++round) { - subBytes(s->state); - shiftRows(s->state); - mixColumns(s->state); - addRoundKey(s->state, &s->w[round * 4]); - } - - // round 10 - subBytes(s->state); - shiftRows(s->state); - addRoundKey(s->state, &s->w[10 * 4]); - - for (c = 0; c < 4; ++c) { - s->buf[4*c] = s->state[c]; - s->buf[4*c+1] = s->state[4+c]; - s->buf[4*c+2] = s->state[8+c]; - s->buf[4*c+3] = s->state[12+c]; - } - - s->bufIdx = 0; -} - -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, GBool decrypt) { - 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; - } - - /* In case of decryption, adjust the key schedule for the equivalent inverse cipher */ - if (decrypt) { - for (round = 1; round <= 13; ++round) { - invMixColumnsW(&s->w[round * 4]); - } - } -} - -static void aes256EncryptBlock(DecryptAES256State *s, Guchar *in) { - int c, round; - - // initial state (input is xor'd with previous output because of CBC) - for (c = 0; c < 4; ++c) { - s->state[c] = in[4*c] ^ s->buf[4*c]; - s->state[4+c] = in[4*c+1] ^ s->buf[4*c+1]; - s->state[8+c] = in[4*c+2] ^ s->buf[4*c+2]; - s->state[12+c] = in[4*c+3] ^ s->buf[4*c+3]; - } - - // round 0 - addRoundKey(s->state, &s->w[0]); - - // rounds 1-13 - for (round = 1; round <= 13; ++round) { - subBytes(s->state); - shiftRows(s->state); - mixColumns(s->state); - addRoundKey(s->state, &s->w[round * 4]); - } - - // round 14 - subBytes(s->state); - shiftRows(s->state); - addRoundKey(s->state, &s->w[14 * 4]); - - for (c = 0; c < 4; ++c) { - s->buf[4*c] = s->state[c]; - s->buf[4*c+1] = s->state[4+c]; - s->buf[4*c+2] = s->state[8+c]; - s->buf[4*c+3] = s->state[12+c]; - } - - s->bufIdx = 0; -} - -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/Build/source/libs/poppler/poppler-0.35.0/poppler/Decrypt.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Decrypt.h deleted file mode 100644 index 10a6386c6b5..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Decrypt.h +++ /dev/null @@ -1,161 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2013 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 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); -}; - -//------------------------------------------------------------------------ -// Helper classes -//------------------------------------------------------------------------ - -/* DecryptRC4State, DecryptAESState, DecryptAES256State are named like this for - * historical reasons, but they're used for encryption too. - * In case of decryption, the cbc field in AES and AES-256 contains the previous - * input block or the CBC initialization vector (IV) if the stream has just been - * reset). In case of encryption, it always contains the IV, whereas the - * previous output is kept in buf. The paddingReached field is only used in - * case of encryption. */ -struct DecryptRC4State { - Guchar state[256]; - Guchar x, y; -}; - -struct DecryptAESState { - Guint w[44]; - Guchar state[16]; - Guchar cbc[16]; - Guchar buf[16]; - GBool paddingReached; // encryption only - int bufIdx; -}; - -struct DecryptAES256State { - Guint w[60]; - Guchar state[16]; - Guchar cbc[16]; - Guchar buf[16]; - GBool paddingReached; // encryption only - int bufIdx; -}; - -class BaseCryptStream : public FilterStream { -public: - - BaseCryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, - int keyLength, int objNum, int objGen); - virtual ~BaseCryptStream(); - virtual StreamKind getKind() { return strCrypt; } - virtual void reset(); - virtual int getChar(); - virtual int lookChar() = 0; - virtual Goffset getPos(); - virtual GBool isBinary(GBool last); - virtual Stream *getUndecodedStream() { return this; } - void setAutoDelete(GBool val); - -protected: - CryptAlgorithm algo; - int objKeyLength; - Guchar objKey[32]; - Goffset charactersRead; // so that getPos() can be correct - int nextCharBuff; // EOF means not read yet - GBool autoDelete; - - union { - DecryptRC4State rc4; - DecryptAESState aes; - DecryptAES256State aes256; - } state; -}; - -//------------------------------------------------------------------------ -// EncryptStream / DecryptStream -//------------------------------------------------------------------------ - -class EncryptStream : public BaseCryptStream { -public: - - EncryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, - int keyLength, int objNum, int objGen); - ~EncryptStream(); - virtual void reset(); - virtual int lookChar(); -}; - -class DecryptStream : public BaseCryptStream { -public: - - DecryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, - int keyLength, int objNum, int objGen); - ~DecryptStream(); - virtual void reset(); - virtual int lookChar(); -}; - -//------------------------------------------------------------------------ - -extern void md5(Guchar *msg, int msgLen, Guchar *digest); - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Dict.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Dict.cc deleted file mode 100644 index c2a94f4a1fa..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Dict.cc +++ /dev/null @@ -1,300 +0,0 @@ -//======================================================================== -// -// 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, 2013, 2014 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2010 PaweÅ‚ Wiejacha <pawel.wiejacha@gmail.com> -// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2014 Scott West <scott.gregory.west@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 <algorithm> -#include <stddef.h> -#include <string.h> -#include "goo/gmem.h" -#include "Object.h" -#include "XRef.h" -#include "Dict.h" - -#if MULTITHREADED -# define dictLocker() MutexLocker locker(&mutex) -#else -# define dictLocker() -#endif -//------------------------------------------------------------------------ -// 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; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -Dict::Dict(Dict* dictA) { - xref = dictA->xref; - size = length = dictA->length; - ref = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif - - sorted = dictA->sorted; - entries = (DictEntry *)gmallocn(size, sizeof(DictEntry)); - for (int i=0; i<length; i++) { - entries[i].key = copyString(dictA->entries[i].key); - dictA->entries[i].val.copy(&entries[i].val); - } -} - -Dict *Dict::copy(XRef *xrefA) { - dictLocker(); - Dict *dictA = new Dict(this); - dictA->xref = xrefA; - for (int i=0; i<length; i++) { - if (dictA->entries[i].val.getType() == objDict) { - Dict *dict = dictA->entries[i].val.getDict(); - Object obj; - obj.initDict(dict->copy(xrefA)); - dictA->entries[i].val.free(); - dictA->entries[i].val = obj; - obj.free(); - } - } - return dictA; -} - -Dict::~Dict() { - int i; - - for (i = 0; i < length; ++i) { - gfree(entries[i].key); - entries[i].val.free(); - } - gfree(entries); -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -int Dict::incRef() { - dictLocker(); - ++ref; - return ref; -} - -int Dict::decRef() { - dictLocker(); - --ref; - return ref; -} - -void Dict::add(char *key, Object *val) { - dictLocker(); - 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) - { - dictLocker(); - 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) { - dictLocker(); - if (sorted) { - const int pos = binarySearch(key, entries, length); - if (pos != -1) { - length -= 1; - gfree(entries[pos].key); - entries[pos].val.free(); - 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 - gfree(entries[i].key); - entries[i].val.free(); - 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) { - dictLocker(); - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Dict.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Dict.h deleted file mode 100644 index fba99edc513..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Dict.h +++ /dev/null @@ -1,112 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 DICT_H -#define DICT_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "poppler-config.h" -#include "Object.h" -#include "goo/GooMutex.h" - -//------------------------------------------------------------------------ -// Dict -//------------------------------------------------------------------------ - -struct DictEntry { - char *key; - Object val; -}; - -class Dict { -public: - - // Constructor. - Dict(XRef *xrefA); - Dict(Dict* dictA); - Dict *copy(XRef *xrefA); - - // Destructor. - ~Dict(); - - // Reference counting. - int incRef(); - int decRef(); - - // 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 -#if MULTITHREADED - GooMutex mutex; -#endif - - DictEntry *find(const char *key); -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Error.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Error.cc deleted file mode 100644 index 99ca3ad3f53..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Error.cc +++ /dev/null @@ -1,98 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2012 Marek Kasik <mkasik@redhat.com> -// Copyright (C) 2013 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 <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, - Goffset pos, char *msg) = NULL; -static void *errorCbkData = NULL; - -void setErrorCallback(void (*cbk)(void *data, ErrorCategory category, - Goffset pos, char *msg), - void *data) { - errorCbk = cbk; - errorCbkData = data; -} - -void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) { - va_list args; - GooString *s, *sanitized; - - // 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); - - sanitized = new GooString (); - for (int i = 0; i < s->getLength(); ++i) { - const char c = s->getChar(i); - if (c < (char)0x20 || c >= (char)0x7f) { - sanitized->appendf("<{0:02x}>", c & 0xff); - } else { - sanitized->append(c); - } - } - - if (errorCbk) { - (*errorCbk)(errorCbkData, category, pos, sanitized->getCString()); - } else { - if (pos >= 0) { - fprintf(stderr, "%s (%lld): %s\n", - errorCategoryNames[category], (long long)pos, sanitized->getCString()); - } else { - fprintf(stderr, "%s: %s\n", - errorCategoryNames[category], sanitized->getCString()); - } - fflush(stderr); - } - delete s; - delete sanitized; -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Error.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Error.h deleted file mode 100644 index 9e11733d803..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Error.h +++ /dev/null @@ -1,60 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2014 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 ERROR_H -#define ERROR_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include <stdarg.h> -#include "poppler-config.h" -#include "goo/gtypes.h" -#include "goo/GooString.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, - Goffset pos, char *msg), - void *data); - -extern void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) GOOSTRING_FORMAT; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/ErrorCodes.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/ErrorCodes.h deleted file mode 100644 index b28528df564..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/ErrorCodes.h +++ /dev/null @@ -1,36 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/FileSpec.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/FileSpec.cc deleted file mode 100644 index bac1eaea0d7..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/FileSpec.cc +++ /dev/null @@ -1,295 +0,0 @@ -//======================================================================== -// -// 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> -// 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 -// -//======================================================================== - -//======================================================================== -// -// 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", ¶mDict)->isDict()) { - Object paramObj; - if (paramDict.dictLookup("ModDate", ¶mObj)->isString()) - m_modDate = new GooString(paramObj.getString()); - paramObj.free(); - - if (paramDict.dictLookup("CreationDate", ¶mObj)->isString()) - m_createDate = new GooString(paramObj.getString()); - paramObj.free(); - - if (paramDict.dictLookup("Size", ¶mObj)->isInt()) - m_size = paramObj.getInt(); - paramObj.free(); - - if (paramDict.dictLookup("CheckSum", ¶mObj)->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 - const 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/Build/source/libs/poppler/poppler-0.35.0/poppler/FileSpec.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/FileSpec.h deleted file mode 100644 index 9f2f6fcd131..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/FileSpec.h +++ /dev/null @@ -1,76 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/FlateStream.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/FlateStream.cc deleted file mode 100644 index 7990dadd821..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/FlateStream.cc +++ /dev/null @@ -1,128 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/FlateStream.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/FlateStream.h deleted file mode 100644 index 9e3835f042a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/FlateStream.h +++ /dev/null @@ -1,77 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/FontEncodingTables.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/FontEncodingTables.cc deleted file mode 100644 index 6ebef787421..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/FontEncodingTables.cc +++ /dev/null @@ -1,1824 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/FontEncodingTables.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/FontEncodingTables.h deleted file mode 100644 index a417b324e48..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/FontEncodingTables.h +++ /dev/null @@ -1,20 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/FontInfo.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/FontInfo.cc deleted file mode 100644 index 8fc89e9d827..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/FontInfo.cc +++ /dev/null @@ -1,245 +0,0 @@ -//======================================================================== -// -// 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, 2013 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; - } - - XRef *xrefA = doc->getXRef()->copy(); - for (int pg = currentPage; pg < lastPage; ++pg) { - page = doc->getPage(pg); - if (!page) continue; - - if ((resDict = page->getResourceDictCopy(xrefA))) { - scanFonts(xrefA, resDict, result); - delete resDict; - } - annots = page->getAnnots(); - for (int i = 0; i < annots->getNumAnnots(); ++i) { - if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) { - scanFonts(xrefA, obj1.getDict(), result); - } - obj1.free(); - } - } - - currentPage = lastPage; - - delete xrefA; - return result; -} - -void FontInfoScanner::scanFonts(XRef *xrefA, 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(xrefA, &obj2); - if (obj2.isDict()) { - r = obj1.getRef(); - gfxFontDict = new GfxFontDict(xrefA, &r, obj2.getDict()); - } - obj2.free(); - } else if (obj1.isDict()) { - gfxFontDict = new GfxFontDict(xrefA, 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, xrefA)); - 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(xrefA, &obj2); - - if (obj2.isStream()) { - obj2.streamGetDict()->lookup("Resources", &resObj); - if (resObj.isDict() && resObj.getDict() != resDict) { - scanFonts(xrefA, resObj.getDict(), fontsList); - } - resObj.free(); - } - obj1.free(); - obj2.free(); - } - } - objDict.free(); - } -} - -FontInfo::FontInfo(GfxFont *font, XRef *xref) { - 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 (xref->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/Build/source/libs/poppler/poppler-0.35.0/poppler/FontInfo.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/FontInfo.h deleted file mode 100644 index 615b6793de3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/FontInfo.h +++ /dev/null @@ -1,103 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 -// -//======================================================================== - -//======================================================================== -// -// 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, XRef *xrefA); - // 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(XRef *xrefA, Dict *resDict, GooList *fontsList); -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Form.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Form.cc deleted file mode 100644 index 661ed8972df..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Form.cc +++ /dev/null @@ -1,1612 +0,0 @@ -//======================================================================== -// -// 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, 2013 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> -// Copyright 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// -//======================================================================== - -#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(); -} - -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; -} - -LinkAction *FormWidget::getAdditionalAction(Annot::FormAdditionalActionsType type) { - return widget ? widget->getFormAdditionalAction(type) : 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; - - 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 () -{ - delete onStr; -} - -FormButtonType FormWidgetButton::getButtonType () const -{ - return parent->getButtonType (); -} - -void FormWidgetButton::setAppearanceState(const char *state) { - if (!widget) - return; - widget->setAppearanceState(state); -} - -void FormWidgetButton::updateWidgetAppearance() -{ - // The appearance stream must NOT be regenerated for this widget type -} - -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; -} - - -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(); -} - -void FormWidgetText::updateWidgetAppearance() -{ - if (widget) - widget->updateAppearanceStream(); -} - -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(); -} - -void FormWidgetChoice::updateWidgetAppearance() -{ - if (widget) - widget->updateAppearanceStream(); -} - -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); -} - -void FormWidgetSignature::updateWidgetAppearance() -{ - // Unimplemented -} - - -//======================================================================== -// 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; - - 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(); - } -} - -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; -} - -void FormField::updateChildrenAppearance() -{ - // Recursively update each child's appearance - if (terminal) { - for (int i = 0; i < numChildren; i++) - widgets[i]->updateWidgetAppearance(); - } else { - for (int i = 0; i < numChildren; i++) - children[i]->updateChildrenAppearance(); - } -} - -//------------------------------------------------------------------------ -// 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; - siblings = NULL; - numSiblings = 0; - 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::setNumSiblings (int num) -{ - numSiblings = num; - siblings = (FormFieldButton**)greallocn(siblings, numSiblings, sizeof(FormFieldButton*)); -} - -void FormFieldButton::fillChildrenSiblingsID() -{ - if (!terminal) { - for(int i=0; i<numChildren; i++) { - FormFieldButton *child = dynamic_cast<FormFieldButton*>(children[i]); - if (child != NULL) { - // Fill the siblings of this node childs - child->setNumSiblings(numChildren-1); - for(int j=0, counter=0; j<numChildren; j++) { - FormFieldButton *otherChild = dynamic_cast<FormFieldButton*>(children[j]); - if (i == j) continue; - if (child == otherChild) continue; - child->setSibling(counter, otherChild); - counter++; - } - - // now call ourselves on the child - // to fill its children data - child->fillChildrenSiblingsID(); - } - } - } -} - -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)) { - 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); - - 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(); - if (siblings) - gfree(siblings); -} - -//------------------------------------------------------------------------ -// 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); - updateChildrenAppearance(); -} - -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 - // Note: PDF specs say that /V has precedence over /I, but acroread seems to - // do the opposite. We do the same. - if (Form::fieldLookup(dict, "I", &obj1)->isArray()) { - for (int i = 0; i < obj1.arrayGetLength(); i++) { - Object obj2; - if (obj1.arrayGet(i, &obj2)->isInt() && obj2.getInt() >= 0 && obj2.getInt() < numChoices) { - choices[obj2.getInt()].selected = true; - } - obj2.free(); - } - } else { - obj1.free(); - // Note: According to PDF specs, /V should *never* contain the exportVal. - // However, if /Opt is an array of (exportVal,optionName) pairs, acroread - // seems to expect the exportVal instead of the optionName and so we do too. - if (Form::fieldLookup(dict, "V", &obj1)->isString()) { - GBool optionFound = gFalse; - - for (int i = 0; i < numChoices; i++) { - if (choices[i].exportVal) { - if (choices[i].exportVal->cmp(obj1.getString()) == 0) { - optionFound = gTrue; - } - } else if (choices[i].optionName) { - if (choices[i].optionName->cmp(obj1.getString()) == 0) { - optionFound = gTrue; - } - } - - if (optionFound) { - choices[i].selected = true; - break; // We've determined that this option is selected. No need to keep on scanning - } - } - - // Set custom value if /V doesn't refer to any predefined option and the field is user-editable - if (!optionFound && edit) { - editedChoice = obj1.getString()->copy(); - } - } else if (obj1.isArray()) { - for (int i = 0; i < numChoices; i++) { - for (int j = 0; j < obj1.arrayGetLength(); j++) { - Object obj2; - obj1.arrayGet(j, &obj2); - GBool matches = gFalse; - - if (choices[i].exportVal) { - if (choices[i].exportVal->cmp(obj2.getString()) == 0) { - matches = gTrue; - } - } else if (choices[i].optionName) { - if (choices[i].optionName->cmp(obj2.getString()) == 0) { - matches = gTrue; - } - } - - obj2.free(); - - if (matches) { - choices[i].selected = true; - break; // We've determined that this option is selected. No need to keep on scanning - } - } - } - } - } - 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 objV, objI, obj1; - objI.initNull(); - - if (edit && editedChoice) { - // This is an editable combo-box with user-entered text - objV.initString(editedChoice->copy()); - } else { - const int numSelected = getNumSelected(); - - // Create /I array only if multiple selection is allowed (as per PDF spec) - if (multiselect) { - objI.initArray(xref); - } - - if (numSelected == 0) { - // No options are selected - objV.initString(new GooString("")); - } else if (numSelected == 1) { - // Only one option is selected - for (int i = 0; i < numChoices; i++) { - if (choices[i].selected) { - if (multiselect) { - objI.arrayAdd(obj1.initInt(i)); - } - - if (choices[i].exportVal) { - objV.initString(choices[i].exportVal->copy()); - } else if (choices[i].optionName) { - objV.initString(choices[i].optionName->copy()); - } - - break; // We've just written the selected option. No need to keep on scanning - } - } - } else { - // More than one option is selected - objV.initArray(xref); - for (int i = 0; i < numChoices; i++) { - if (choices[i].selected) { - if (multiselect) { - objI.arrayAdd(obj1.initInt(i)); - } - - if (choices[i].exportVal) { - objV.arrayAdd(obj1.initString(choices[i].exportVal->copy())); - } else if (choices[i].optionName) { - objV.arrayAdd(obj1.initString(choices[i].optionName->copy())); - } - } - } - } - } - - obj.getDict()->set("V", &objV); - obj.getDict()->set("I", &objI); - xref->setModifiedObject(&obj, ref); - updateChildrenAppearance(); -} - -void FormFieldChoice::unselectAll () -{ - for (int i = 0; i < numChoices; i++) { - choices[i].selected = false; - } -} - -void FormFieldChoice::deselectAll () { - delete editedChoice; - editedChoice = NULL; - - unselectAll(); - updateSelection(); -} - -void FormFieldChoice::toggle (int i) -{ - delete editedChoice; - editedChoice = NULL; - - choices[i].selected = !choices[i].selected; - updateSelection(); -} - -void FormFieldChoice::select (int i) -{ - delete editedChoice; - editedChoice = NULL; - - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Form.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Form.h deleted file mode 100644 index 3778ff6f2ef..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Form.h +++ /dev/null @@ -1,563 +0,0 @@ -//======================================================================== -// -// 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, 2012 Albert Astals Cid <aacid@kde.org> -// Copyright 2010 Mark Riedesel <mark@klowner.com> -// Copyright 2011 Pino Toscano <pino@kde.org> -// Copyright 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright 2013 Adrian Johnson <ajohnson@redneon.com> -// -//======================================================================== - -#ifndef FORM_H -#define FORM_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "Object.h" -#include "Annot.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(); - LinkAction *getAdditionalAction(Annot::FormAdditionalActionsType type); - - // 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; } - - virtual void updateWidgetAppearance() = 0; - -#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 updateWidgetAppearance(); - -protected: - 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); - - void updateWidgetAppearance(); - - 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 (); - - void updateWidgetAppearance(); - 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); - void updateWidgetAppearance(); -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; } - - 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); - int getNumWidgets() { return terminal ? numChildren : 0; } - 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); - void updateChildrenAppearance(); - - FormFieldType type; // field type - Ref ref; - bool terminal; - Object obj; - PDFDoc *doc; - XRef *xref; - FormField **children; - FormField *parent; - int numChildren; - FormWidget **widgets; - bool readOnly; - - 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 (); - - void setNumSiblings (int num); - void setSibling (int i, FormFieldButton *id) { siblings[i] = id; } - - //For radio buttons, return the fields of the other radio buttons in the same group - FormFieldButton* getSibling (int i) const { return siblings[i]; } - int getNumSiblings () const { return numSiblings; } - -#ifdef DEBUG_FORMS - void print(int indent = 0); -#endif - - virtual ~FormFieldButton(); -protected: - void updateState(char *state); - - FormFieldButton** siblings; // IDs of dependent buttons (each button of a radio field has all the others buttons - // of the same field in this array) - int numSiblings; - - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Function.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Function.cc deleted file mode 100644 index 67283dffe9f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Function.cc +++ /dev/null @@ -1,1788 +0,0 @@ -//======================================================================== -// -// 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, 2013, 2014 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> -// Copyright (C) 2012 Adam Reichold <adamreichold@myopera.com> -// Copyright (C) 2013 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 <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; -} - -Function::Function(const Function *func) { - m = func->m; - n = func->n; - - memcpy(domain, func->domain, funcMaxInputs * 2 * sizeof(double)); - memcpy(range, func->range, funcMaxOutputs * 2 * sizeof(double)); - - hasRange = func->hasRange; -} - -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(const SampledFunction *func) : Function(func) { - memcpy(sampleSize, func->sampleSize, funcMaxInputs * sizeof(int)); - - memcpy(encode, func->encode, funcMaxInputs * 2 * sizeof(double)); - memcpy(decode, func->decode, funcMaxOutputs * 2 * sizeof(double)); - - memcpy(inputMul, func->inputMul, funcMaxInputs * sizeof(double)); - - nSamples = func->nSamples; - - 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)); - - memcpy(cacheIn, func->cacheIn, funcMaxInputs * sizeof(double)); - memcpy(cacheOut, func->cacheOut, funcMaxOutputs * sizeof(double)); - - ok = func->ok; -} - -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]; - } -} - -GBool SampledFunction::hasDifferentResultSet(Function *func) { - if (func->getType() == 0) { - SampledFunction *compTo = (SampledFunction *) func; - if (compTo->getSampleNumber() != nSamples) - return gTrue; - double *compSamples = compTo->getSamples(); - for (int i = 0; i < nSamples; i++) { - if (samples[i] != compSamples[i]) - return gTrue; - } - } - return gFalse; -} - -//------------------------------------------------------------------------ -// 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(const ExponentialFunction *func) : Function(func) { - memcpy(c0, func->c0, funcMaxOutputs * sizeof(double)); - memcpy(c1, func->c1, funcMaxOutputs * sizeof(double)); - - e = func->e; - isLinear = func->isLinear; - ok = func->ok; -} - -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(const StitchingFunction *func) : Function(func) { - k = func->k; - - funcs = (Function **)gmallocn(k, sizeof(Function *)); - for (int 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 = func->ok; -} - -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 (unlikely(sp + i + 1 >= psStackSize)) { - error(errSyntaxError, -1, "Stack underflow in PostScript function"); - return; - } - if (unlikely(sp + i + 1 < 0)) { - error(errSyntaxError, -1, "Stack overflow 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 (unlikely(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(const PostScriptFunction *func) : Function(func) { - codeSize = func->codeSize; - - code = (PSObject *)gmallocn(codeSize, sizeof(PSObject)); - memcpy(code, func->code, codeSize * sizeof(PSObject)); - - codeString = func->codeString->copy(); - - memcpy(cacheIn, func->cacheIn, funcMaxInputs * sizeof(double)); - memcpy(cacheOut, func->cacheOut, funcMaxOutputs * sizeof(double)); - - ok = func->ok; -} - -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/Build/source/libs/poppler/poppler-0.35.0/poppler/Function.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Function.h deleted file mode 100644 index 90e2a768ad0..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Function.h +++ /dev/null @@ -1,258 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012 Adam Reichold <adamreichold@myopera.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; } - virtual GBool hasDifferentResultSet(Function *func) { return gFalse; } - - // 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); - - Function(const Function *func); - - 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; } - virtual GBool hasDifferentResultSet(Function *func); - - 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; } - int getSampleNumber() { return nSamples; } - -private: - - SampledFunction(const 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(const 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(const 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(const 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Gfx.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Gfx.cc deleted file mode 100644 index 07d95b355a8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Gfx.cc +++ /dev/null @@ -1,5501 +0,0 @@ -//======================================================================== -// -// 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-2013, 2015 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-2014 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, 2013 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2012 Lu Wang <coolwanglu@gmail.com> -// Copyright (C) 2014 Jason Crain <jason@aquaticape.us> -// -// 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 "Annot.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 *resDictA, GfxResources *nextA) : - gStateCache(2, xref) { - Object obj1, obj2; - Ref r; - - if (resDictA) { - - // build font dictionary - Dict *resDict = resDictA->copy(xref); - 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); - - delete resDict; - } 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, OutputDev *out, GfxState *state) { - 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(resPtr, &obj, out, state); - obj.free(); - return pattern; - } - obj.free(); - } - } - error(errSyntaxError, -1, "Unknown pattern '{0:s}'", name); - return NULL; -} - -GfxShading *GfxResources::lookupShading(char *name, OutputDev *out, GfxState *state) { - 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(resPtr, &obj, out, state); - 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, XRef *xrefA) -{ - int i; - - doc = docA; - xref = (xrefA == NULL) ? doc->getXRef() : xrefA; - 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, xref); - out->setDefaultCTM(state->getCTM()); - out->updateAll(state); - for (i = 0; i < 6; ++i) { - baseMatrix[i] = state->getCTM()[i]; - } - formDepth = 0; - 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(); - } -#ifdef USE_CMS - initDisplayProfile(); -#endif -} - -Gfx::Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict, - PDFRectangle *box, PDFRectangle *cropBox, - GBool (*abortCheckCbkA)(void *data), - void *abortCheckCbkDataA, XRef *xrefA) -{ - int i; - - doc = docA; - xref = (xrefA == NULL) ? doc->getXRef() : xrefA; - 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; - 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(); - } -#ifdef USE_CMS - initDisplayProfile(); -#endif -} - -#ifdef USE_CMS - -#ifdef USE_LCMS1 -#include <lcms.h> -#else -#include <lcms2.h> -#define LCMS_FLAGS cmsFLAGS_NOOPTIMIZE -#endif - -void Gfx::initDisplayProfile() { - Object catDict; - xref->getCatalog(&catDict); - if (catDict.isDict()) { - Object outputIntents; - catDict.dictLookup("OutputIntents", &outputIntents); - if (outputIntents.isArray() && outputIntents.arrayGetLength() == 1) { - Object firstElement; - outputIntents.arrayGet(0, &firstElement); - if (firstElement.isDict()) { - Object profile; - firstElement.dictLookup("DestOutputProfile", &profile); - if (profile.isStream()) { - Stream *iccStream = profile.getStream(); - int length = 0; - Guchar *profBuf = iccStream->toUnsignedChars(&length, 65536, 65536); - cmsHPROFILE hp = cmsOpenProfileFromMem(profBuf,length); - if (hp == 0) { - error(errSyntaxWarning, -1, "read ICCBased color space profile error"); - } else { - state->setDisplayProfile(hp); - } - gfree(profBuf); - } - profile.free(); - } - firstElement.free(); - } - outputIntents.free(); - } - catDict.free(); -} - -#endif - -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; -} - -Goffset 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) { - a->get(i, &obj); - if (obj.isNum()) { - dash[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(res, &obj5, out, state); - } - 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) { - state->setRenderingIntent(args[0].getName()); -} - -//------------------------------------------------------------------------ -// 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(res, &obj, out, state); - } - 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(res, &obj, out, state); - } - 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(res, &obj, out, state); - } - 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(res, &obj, out, state); - } - 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(res, &obj, out, state); - } - 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(res, &obj, out, state); - } - 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(res, &args[0], out, state); - } else { - colorSpace = GfxColorSpace::parse(res, &obj, out, state); - } - 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(res, &args[0], out, state); - } else { - colorSpace = GfxColorSpace::parse(res, &obj, out, state); - } - 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(), out, state))) { - 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(), out, state))) { - 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()); - if (tPat->getBBox()[0] < tPat->getBBox()[2]) { - xi0 = (int)ceil((xMin - tPat->getBBox()[2]) / xstep); - xi1 = (int)floor((xMax - tPat->getBBox()[0]) / xstep) + 1; - } else { - xi0 = (int)ceil((xMin - tPat->getBBox()[0]) / xstep); - xi1 = (int)floor((xMax - tPat->getBBox()[2]) / xstep) + 1; - } - if (tPat->getBBox()[1] < tPat->getBBox()[3]) { - yi0 = (int)ceil((yMin - tPat->getBBox()[3]) / ystep); - yi1 = (int)floor((yMax - tPat->getBBox()[1]) / ystep) + 1; - } else { - yi0 = (int)ceil((yMin - tPat->getBBox()[1]) / ystep); - yi1 = (int)floor((yMax - tPat->getBBox()[3]) / 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(), out, state))) { - 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; -} - -static inline void checkTrue(bool b, const char *message) { - if (unlikely(!b)) { - error(errSyntaxError, -1, message); - } -} - -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(); checkTrue(!path->isEnd(), "Path should not be at end"); - path->setCoord(x0,y0); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); - path->setCoord(x1,y1); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); - path->setCoord(x2,y2); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); - path->setCoord(x0,y0); path->next(); checkTrue( path->isEnd(), "Path should be at end"); - 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(); checkTrue(!path->isEnd(), "Path should not be at end"); - path->setCoord(x0,y0); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); - path->setCoord(x1,y1); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); - path->setCoord(x2,y2); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); - path->setCoord(x0,y0); path->next(); checkTrue( path->isEnd(), "Path should be at end"); - 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; -} - -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); - GBool shouldDoForm = gTrue; - std::set<int>::iterator drawingFormIt; - if (refObj.isRef()) { - const int num = refObj.getRef().num; - if (formsDrawing.find(num) == formsDrawing.end()) { - drawingFormIt = formsDrawing.insert(num).first; - } else { - shouldDoForm = gFalse; - } - } - if (shouldDoForm) { - if (out->useDrawForm() && refObj.isRef()) { - out->drawForm(refObj.getRef()); - } else { - doForm(&obj1); - } - } - if (refObj.isRef() && shouldDoForm) { - formsDrawing.erase(drawingFormIt); - } - 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 || !out->needNonText()) { - 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()) { - Object objIntent; - char *tempIntent = NULL; - dict->lookup("Intent", &objIntent); - if (objIntent.isName()) { - tempIntent = state->getRenderingIntent(); - if (tempIntent != NULL) { - tempIntent = strdup(tempIntent); - } - state->setRenderingIntent(objIntent.getName()); - } - colorSpace = GfxColorSpace::parse(res, &obj1, out, state); - if (objIntent.isName()) { - state->setRenderingIntent(tempIntent); - free(tempIntent); - } - objIntent.free(); - } else if (csMode == streamCSDeviceGray) { - Object objCS; - res->lookupColorSpace("DefaultGray", &objCS); - if (objCS.isNull()) { - colorSpace = new GfxDeviceGrayColorSpace(); - } else { - colorSpace = GfxColorSpace::parse(res, &objCS, out, state); - } - objCS.free(); - } else if (csMode == streamCSDeviceRGB) { - Object objCS; - res->lookupColorSpace("DefaultRGB", &objCS); - if (objCS.isNull()) { - colorSpace = new GfxDeviceRGBColorSpace(); - } else { - colorSpace = GfxColorSpace::parse(res, &objCS, out, state); - } - objCS.free(); - } else if (csMode == streamCSDeviceCMYK) { - Object objCS; - res->lookupColorSpace("DefaultCMYK", &objCS); - if (objCS.isNull()) { - colorSpace = new GfxDeviceCMYKColorSpace(); - } else { - colorSpace = GfxColorSpace::parse(res, &objCS, out, state); - } - 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(NULL, &obj1, out, state); - 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 || !out->needNonText()) { - 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) && obj1.isDict()) { - 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(res, &obj3, out, state); - } - 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 -//------------------------------------------------------------------------ - -struct GfxStackStateSaver { - GfxStackStateSaver(Gfx *gfx) : gfx(gfx) { - gfx->saveState(); - } - - ~GfxStackStateSaver() { - gfx->restoreState(); - } - - Gfx * const gfx; -}; - -void Gfx::drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, - double xMin, double yMin, double xMax, double yMax, int rotate) { - 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; - } - - // saves gfx state and automatically restores it on return - GfxStackStateSaver stackStateSaver(this); - - // Rotation around the topleft corner (for the NoRotate flag) - if (rotate != 0) { - const double angle_rad = rotate * M_PI / 180; - const double c = cos(angle_rad); - const double s = sin(angle_rad); - - // (xMin, yMax) is the pivot - const double unrotateMTX[6] = { - +c, -s, - +s, +c, - -c*xMin - s*yMax + xMin, -c*yMax + s*xMin + yMax - }; - - state->concatCTM(unrotateMTX[0], unrotateMTX[1], unrotateMTX[2], - unrotateMTX[3], unrotateMTX[4], unrotateMTX[5]); - out->updateCTM(state, unrotateMTX[0], unrotateMTX[1], unrotateMTX[2], - unrotateMTX[3], unrotateMTX[4], unrotateMTX[5]); - } - - // 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(); - bboxObj.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); - if (likely(obj1.isNum())) { - m[i] = obj1.getNum(); - obj1.free(); - } else { - obj1.free(); - matrixObj.free(); - error(errSyntaxError, getPos(), "Bad form matrix"); - return; - } - } - } 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) { - 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); - } -} - -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; -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Gfx.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Gfx.h deleted file mode 100644 index a82f9f4af24..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Gfx.h +++ /dev/null @@ -1,387 +0,0 @@ -//======================================================================== -// -// 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-2013 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2009, 2010, 2012, 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2010 David Benjamin <davidben@mit.edu> -// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com> -// Copyright (C) 2013 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 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, OutputDev *out, GfxState *state); - GfxShading *lookupShading(char *name, OutputDev *out, GfxState *state); - 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, XRef *xrefA = 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, XRef *xrefA = NULL); -#ifdef USE_CMS - void initDisplayProfile(); -#endif - ~Gfx(); - - XRef *getXRef() { return xref; } - - // 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, int rotate); - - // 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(); - -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; - GBool ocState; // true if drawing is enabled, false if - // disabled - - MarkedContentStack *mcStack; // current BMC/EMC stack - - Parser *parser; // parser for page content stream(s) - - std::set<int> formsDrawing; // the forms that are being drawn - - 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); - Goffset 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/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxFont.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxFont.cc deleted file mode 100644 index 81f59037f7f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxFont.cc +++ /dev/null @@ -1,2620 +0,0 @@ -//======================================================================== -// -// 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, 2014, 2015 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, 2014 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> -// Copyright (C) 2013-2015 Jason Crain <jason@aquaticape.us> -// Copyright (C) 2014 Olly Betts <olly@survex.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 <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" -#include "PSOutputDev.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, PSOutputDev *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 = ps->getEmbedType1(); - break; - case fontTrueType: - case fontTrueTypeOT: - embed = ps->getEmbedTrueType(); - break; - case fontCIDType0C: - case fontCIDType0COT: - embed = ps->getEmbedCIDPostScript(); - break; - case fontCIDType2: - case fontCIDType2OT: - embed = ps->getEmbedCIDTrueType(); - break; - default: - break; - } - } - if (embed) { - fontLoc = new GfxFontLoc(); - fontLoc->locType = gfxFontLocEmbedded; - fontLoc->fontType = type; - fontLoc->embFontID = embFontID; - return fontLoc; - } - } - } - - //----- PS passthrough - if (ps && !isCIDFont() && ps->getFontPassthrough()) { - 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:s}'", - base14SubstFonts[substIdx], name ? name->getCString() : "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:s}'", - base14SubstFonts[substIdx], name ? name->getCString() : ""); - 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; -} - - -struct AlternateNameMap { - const char *name; - const char *alt; -}; - -static const AlternateNameMap alternateNameMap[] = -{ - { "fi", "f_i" }, - { "fl", "f_l" }, - { "ff", "f_f" }, - { "ffi", "f_f_i" }, - { "ffl", "f_f_l" }, - { 0, 0 } -}; - -const char *GfxFont::getAlternateName(const char *name) { - const AlternateNameMap *map = alternateNameMap; - while (map->name) { - if (strcmp(name, map->name) == 0) { - return map->alt; - } - map++; - } - return 0; -} - -//------------------------------------------------------------------------ -// Gfx8BitFont -//------------------------------------------------------------------------ - -// Parse character 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 decimal digits. -static GBool parseNumericName(char *s, GBool hex, unsigned int *u) { - char *endptr; - - // Strip leading alpha characters. - if (hex) { - int n = 0; - - // Get string length while ignoring junk at end. - while (isalnum(s[n])) - ++n; - - // Only 2 hex characters with optional leading alpha is allowed. - if (n == 3 && isalpha(*s)) { - ++s; - } else if (n != 2) { - return gFalse; - } - } else { - // Strip up to two alpha characters. - for (int i = 0; i < 2 && isalpha(*s); ++i) - ++s; - } - - int v = strtol(s, &endptr, hex ? 16 : 10); - - if (endptr == s) - return gFalse; - - // Skip trailing junk characters. - while (*endptr != '\0' && !isalnum(*endptr)) - ++endptr; - - if (*endptr == '\0') { - if (u) - *u = v; - return gTrue; - } - return gFalse; -} - -// Returns gTrue if the font has character names like xx or Axx which -// should be parsed for hex or decimal values. -static GBool testForNumericNames(Dict *fontDict, GBool hex) { - Object enc, diff, obj; - GBool numeric = gTrue; - - fontDict->lookup("Encoding", &enc); - if (!enc.isDict()) { - enc.free(); - return gFalse; - } - - enc.dictLookup("Differences", &diff); - enc.free(); - if (!diff.isArray()) { - diff.free(); - return gFalse; - } - - for (int i = 0; i < diff.arrayGetLength() && numeric; ++i) { - diff.arrayGet(i, &obj); - if (obj.isInt()) { - // All sequences must start between character codes 0 and 5. - if (obj.getInt() > 5) - numeric = gFalse; - } else if (obj.isName()) { - // All character names must sucessfully parse. - if (!parseNumericName(obj.getName(), hex, NULL)) - numeric = gFalse; - } else { - numeric = gFalse; - } - obj.free(); - } - - diff.free(); - return numeric; -} - -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; - GBool numeric; - 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; - GBool isZapfDingbats = name && name->endsWith("ZapfDingbats"); - for (code = 0; code < 256; ++code) { - if ((charName = enc[code])) { - if (isZapfDingbats) { - // include ZapfDingbats names - toUnicode[code] = globalParams->mapNameToUnicodeAll(charName); - } else { - toUnicode[code] = globalParams->mapNameToUnicodeText(charName); - } - if (!toUnicode[code] && 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]) && - // Only check idx 1 to avoid misidentifying a decimal - // number like a0 - ((charName[1] >= 'a' && charName[1] <= 'f') || - (charName[1] >= 'A' && charName[1] <= 'F')))) { - hex = gTrue; - } - missing = gTrue; - } - } else { - toUnicode[code] = 0; - } - } - - numeric = testForNumericNames(fontDict, hex); - - // 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 - numeric, - hex, - gTrue))) { // do check variants - ctu->setMapping((CharCode)code, uBuf, n); - continue; - } - - // if the 'mapUnknownCharNames' flag is set, do a simple pass-through - // mapping for unknown character names - if (globalParams->getMapUnknownCharNames()) { - 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, 16, 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->mapNameToUnicodeText(charName))) { - return 1; - } - if (globalParams->getMapNumericCharNames()) { - 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 like xx - // or Axx and parse for hex or decimal values. - if (numeric && parseNumericName(charName, hex, uBuf)) - 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->mapNameToUnicodeAll(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 = getWidth(cid); - h = vx = vy = 0; - - // vertical - } else { - w = 0; - h = widths.defHeight; - vx = getWidth(cid) / 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(CID cid) { - double w; - int a, b, m; - - 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; -} - -double GfxCIDFont::getWidth (char* s, int len) { - int nUsed; - CharCode c; - - CID cid = cMap->getCID(s, len, &c, &nUsed); - return getWidth(cid); -} - -//------------------------------------------------------------------------ -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxFont.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxFont.h deleted file mode 100644 index febb902922d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxFont.h +++ /dev/null @@ -1,444 +0,0 @@ -//======================================================================== -// -// 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, 2015 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, 2014 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2015 Jason Crain <jason@aquaticape.us> -// -// 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; -class PSOutputDev; -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 not null, includes PS - // printer-resident fonts. Returns NULL on failure. - GfxFontLoc *locateFont(XRef *xref, PSOutputDev *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; } - - // Return AGLFN names of ligatures in the Standard and Expert encodings - // for use with fonts that are not compatible with the Standard 14 fonts. - // http://sourceforge.net/adobe/aglfn/wiki/AGL%20Specification/ - static const char *getAlternateName(const char *name); - -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); - double getWidth(CID cid); // Get width of a character. - - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState.cc deleted file mode 100644 index 3e9cac41534..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState.cc +++ /dev/null @@ -1,7275 +0,0 @@ -//======================================================================== -// -// 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-2015 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2009, 2012 Koji Otani <sho@bbr.jp> -// Copyright (C) 2009, 2011-2014 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> -// Copyright (C) 2013 Lu Wang <coolwanglu@gmail.com> -// Copyright (C) 2013 Hib Eris <hib@hiberis.nl> -// Copyright (C) 2013 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 <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" -#include "OutputDev.h" -#include "splash/SplashTypes.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 - -static const std::map<unsigned int, unsigned int>::size_type CMSCACHE_LIMIT = 2048; - -#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 | cmsFLAGS_BLACKPOINTCOMPENSATION -#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, int cmsIntentA, unsigned int inputPixelTypeA, unsigned int transformPixelTypeA) { - transform = transformA; - refCount = 1; - cmsIntent = cmsIntentA; - inputPixelType = inputPixelTypeA; - transformPixelType = transformPixelTypeA; -} - -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; - if (displayProfile != NULL) { - cmsHTRANSFORM transform; - unsigned int nChannels; - - 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, INTENT_RELATIVE_COLORIMETRIC, PT_XYZ, displayPixelType); - } - cmsCloseProfile(XYZProfile); - } -} - -void GfxColorSpace::setDisplayProfileName(GooString *name) { - displayProfileName = name->copy(); -} - -cmsHPROFILE GfxColorSpace::getRGBProfile() { - return RGBProfile; -} - -cmsHPROFILE GfxColorSpace::getDisplayProfile() { - return displayProfile; -} - -#endif - -//------------------------------------------------------------------------ -// GfxColorSpace -//------------------------------------------------------------------------ - -GfxColorSpace::GfxColorSpace() { - overprintMask = 0x0f; - mapping = NULL; -} - -GfxColorSpace::~GfxColorSpace() { -} - -GfxColorSpace *GfxColorSpace::parse(GfxResources *res, Object *csObj, OutputDev *out, GfxState *state, 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")) { - if (res != NULL) { - Object objCS; - res->lookupColorSpace("DefaultGray", &objCS); - if (objCS.isNull()) { - cs = new GfxDeviceGrayColorSpace(); - } else { - cs = GfxColorSpace::parse(NULL, &objCS, out, state); - } - objCS.free(); - } else { - cs = new GfxDeviceGrayColorSpace(); - } - } else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) { - if (res != NULL) { - Object objCS; - res->lookupColorSpace("DefaultRGB", &objCS); - if (objCS.isNull()) { - cs = new GfxDeviceRGBColorSpace(); - } else { - cs = GfxColorSpace::parse(NULL, &objCS, out, state); - } - objCS.free(); - } else { - cs = new GfxDeviceRGBColorSpace(); - } - } else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) { - if (res != NULL) { - Object objCS; - res->lookupColorSpace("DefaultCMYK", &objCS); - if (objCS.isNull()) { - cs = new GfxDeviceCMYKColorSpace(); - } else { - cs = GfxColorSpace::parse(NULL, &objCS, out, state); - } - objCS.free(); - } else { - 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")) { - if (res != NULL) { - Object objCS; - res->lookupColorSpace("DefaultGray", &objCS); - if (objCS.isNull()) { - cs = new GfxDeviceGrayColorSpace(); - } else { - cs = GfxColorSpace::parse(NULL, &objCS, out, state); - } - objCS.free(); - } else { - cs = new GfxDeviceGrayColorSpace(); - } - } else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) { - if (res != NULL) { - Object objCS; - res->lookupColorSpace("DefaultRGB", &objCS); - if (objCS.isNull()) { - cs = new GfxDeviceRGBColorSpace(); - } else { - cs = GfxColorSpace::parse(NULL, &objCS, out, state); - } - objCS.free(); - } else { - cs = new GfxDeviceRGBColorSpace(); - } - } else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) { - if (res != NULL) { - Object objCS; - res->lookupColorSpace("DefaultCMYK", &objCS); - if (objCS.isNull()) { - cs = new GfxDeviceCMYKColorSpace(); - } else { - cs = GfxColorSpace::parse(NULL, &objCS, out, state); - } - objCS.free(); - } else { - cs = new GfxDeviceCMYKColorSpace(); - } - } else if (obj1.isName("CalGray")) { - cs = GfxCalGrayColorSpace::parse(csObj->getArray(), state); - } else if (obj1.isName("CalRGB")) { - cs = GfxCalRGBColorSpace::parse(csObj->getArray(), state); - } else if (obj1.isName("Lab")) { - cs = GfxLabColorSpace::parse(csObj->getArray(), state); - } else if (obj1.isName("ICCBased")) { - cs = GfxICCBasedColorSpace::parse(csObj->getArray(), out, state, recursion); - } else if (obj1.isName("Indexed") || obj1.isName("I")) { - cs = GfxIndexedColorSpace::parse(res, csObj->getArray(), out, state, recursion); - } else if (obj1.isName("Separation")) { - cs = GfxSeparationColorSpace::parse(res, csObj->getArray(), out, state, recursion); - } else if (obj1.isName("DeviceN")) { - cs = GfxDeviceNColorSpace::parse(res, csObj->getArray(), out, state, recursion); - } else if (obj1.isName("Pattern")) { - cs = GfxPatternColorSpace::parse(res, csObj->getArray(), out, state, recursion); - } else { - error(errSyntaxWarning, -1, "Bad color space"); - } - obj1.free(); - } else if (csObj->isDict()) { - csObj->dictLookup("ColorSpace", &obj1); - if (obj1.isName("DeviceGray")) { - if (res != NULL) { - Object objCS; - res->lookupColorSpace("DefaultGray", &objCS); - if (objCS.isNull()) { - cs = new GfxDeviceGrayColorSpace(); - } else { - cs = GfxColorSpace::parse(NULL, &objCS, out, state); - } - objCS.free(); - } else { - cs = new GfxDeviceGrayColorSpace(); - } - } else if (obj1.isName("DeviceRGB")) { - if (res != NULL) { - Object objCS; - res->lookupColorSpace("DefaultRGB", &objCS); - if (objCS.isNull()) { - cs = new GfxDeviceRGBColorSpace(); - } else { - cs = GfxColorSpace::parse(NULL, &objCS, out, state); - } - objCS.free(); - } else { - cs = new GfxDeviceRGBColorSpace(); - } - } else if (obj1.isName("DeviceCMYK")) { - if (res != NULL) { - Object objCS; - res->lookupColorSpace("DefaultCMYK", &objCS); - if (objCS.isNull()) { - cs = new GfxDeviceCMYKColorSpace(); - } else { - cs = GfxColorSpace::parse(NULL, &objCS, out, state); - } - objCS.free(); - } else { - cs = new GfxDeviceCMYKColorSpace(); - } - } else { - error(errSyntaxWarning, -1, "Bad color space dict'"); - } - obj1.free(); - } else { - error(errSyntaxWarning, -1, "Bad color space - expected name or array or dict"); - } - return cs; -} - -void GfxColorSpace::createMapping(GooList *separationList, int maxSepComps) { - return; -} - -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 global directory - GooString *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, INTENT_RELATIVE_COLORIMETRIC, PT_XYZ, displayPixelType); - } - 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::getCMYKLine(Guchar *in, Guchar *out, int length) { - for (int i = 0; i < length; i++) { - *out++ = 0; - *out++ = 0; - *out++ = 0; - *out++ = in[i]; - } -} - -void GfxDeviceGrayColorSpace::getDeviceNLine(Guchar *in, Guchar *out, int length) { - for (int i = 0; i < length; i++) { - for (int j = 0; j < SPOT_NCOMPS+4; j++) - out[j] = 0; - out[4] = in[i]; - out += (SPOT_NCOMPS+4); - } -} - -void GfxDeviceGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - cmyk->c = cmyk->m = cmyk->y = 0; - cmyk->k = clip01(gfxColorComp1 - color->c[0]); -} - -void GfxDeviceGrayColorSpace::getDeviceN(GfxColor *color, GfxColor *deviceN) { - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - deviceN->c[3] = 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() { -#ifdef USE_CMS - if (transform != NULL) { - if (transform->unref() == 0) delete transform; - } -#endif -} - -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; -#ifdef USE_CMS - cs->transform = transform; - if (transform != NULL) transform->ref(); -#endif - 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, GfxState *state) { - 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); -#ifdef USE_CMS - cs->transform = (state != NULL) ? state->getXYZ2DisplayTransform() : XYZ2DisplayTransform; - if (cs->transform != NULL) cs->transform->ref(); -#endif - 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 (transform != NULL && transform->getTransformPixelType() == 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); - transform->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 (transform != NULL && transform->getTransformPixelType() == PT_RGB) { - Guchar out[gfxColorMaxComps]; - double in[gfxColorMaxComps]; - - in[0] = clip01(X); - in[1] = clip01(Y); - in[2] = clip01(Z); - transform->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 (transform != NULL && transform->getTransformPixelType() == 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); - - 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]); - 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { - GfxCMYK cmyk; - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - getCMYK(color, &cmyk); - deviceN->c[0] = cmyk.c; - deviceN->c[1] = cmyk.m; - deviceN->c[2] = cmyk.y; - deviceN->c[3] = cmyk.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::getCMYKLine(Guchar *in, Guchar *out, int length) { - GfxColorComp c, m, y, k; - - for (int i = 0; i < length; i++) { - c = byteToCol(255 - *in++); - m = byteToCol(255 - *in++); - y = byteToCol(255 - *in++); - k = c; - if (m < k) { - k = m; - } - if (y < k) { - k = y; - } - *out++ = colToByte(c - k); - *out++ = colToByte(m - k); - *out++ = colToByte(y - k); - *out++ = colToByte(k); - } -} - -void GfxDeviceRGBColorSpace::getDeviceNLine(Guchar *in, Guchar *out, int length) { - GfxColorComp c, m, y, k; - - for (int i = 0; i < length; i++) { - for (int j = 0; j < SPOT_NCOMPS+4; j++) - out[j] = 0; - c = byteToCol(255 - *in++); - m = byteToCol(255 - *in++); - y = byteToCol(255 - *in++); - k = c; - if (m < k) { - k = m; - } - if (y < k) { - k = y; - } - out[0] = colToByte(c - k); - out[1] = colToByte(m - k); - out[2] = colToByte(y - k); - out[3] = colToByte(k); - out += (SPOT_NCOMPS+4); - } -} - -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::getDeviceN(GfxColor *color, GfxColor *deviceN) { - GfxCMYK cmyk; - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - getCMYK(color, &cmyk); - deviceN->c[0] = cmyk.c; - deviceN->c[1] = cmyk.m; - deviceN->c[2] = cmyk.y; - deviceN->c[3] = cmyk.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() { -#ifdef USE_CMS - if (transform != NULL) { - if (transform->unref() == 0) delete transform; - } -#endif -} - -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]; - } -#ifdef USE_CMS - cs->transform = transform; - if (transform != NULL) transform->ref(); -#endif - return cs; -} - -GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr, GfxState *state) { - 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); - -#ifdef USE_CMS - cs->transform = (state != NULL) ? state->getXYZ2DisplayTransform() : XYZ2DisplayTransform; - if (cs->transform != NULL) cs->transform->ref(); -#endif - 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 (transform != NULL && transform->getTransformPixelType() == 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); - transform->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 (transform != NULL && transform->getTransformPixelType() == PT_RGB) { - Guchar out[gfxColorMaxComps]; - double in[gfxColorMaxComps]; - - in[0] = clip01(X/whiteX); - in[1] = clip01(Y/whiteY); - in[2] = clip01(Z/whiteZ); - transform->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 (transform != NULL && transform->getTransformPixelType() == 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); - 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]); - 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { - GfxCMYK cmyk; - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - getCMYK(color, &cmyk); - deviceN->c[0] = cmyk.c; - deviceN->c[1] = cmyk.m; - deviceN->c[2] = cmyk.y; - deviceN->c[3] = cmyk.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::getCMYKLine(Guchar *in, Guchar *out, int length) -{ - for (int i = 0; i < length; i++) { - *out++ = *in++; - *out++ = *in++; - *out++ = *in++; - *out++ = *in++; - } -} - -void GfxDeviceCMYKColorSpace::getDeviceNLine(Guchar *in, Guchar *out, int length) -{ - for (int i = 0; i < length; i++) { - for (int j = 0; j < SPOT_NCOMPS+4; j++) - out[j] = 0; - out[0] = *in++; - out[1] = *in++; - out[2] = *in++; - out[3] = *in++; - out += (SPOT_NCOMPS+4); - } -} - -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::getDeviceN(GfxColor *color, GfxColor *deviceN) { - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - deviceN->c[0] = clip01(color->c[0]); - deviceN->c[1] = clip01(color->c[1]); - deviceN->c[2] = clip01(color->c[2]); - deviceN->c[3] = 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() { -#ifdef USE_CMS - if (transform != NULL) { - if (transform->unref() == 0) delete transform; - } -#endif -} - -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; -#ifdef USE_CMS - cs->transform = transform; - if (transform != NULL) transform->ref(); -#endif - return cs; -} - -GfxColorSpace *GfxLabColorSpace::parse(Array *arr, GfxState *state) { - 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); - -#ifdef USE_CMS - cs->transform = (state != NULL) ? state->getXYZ2DisplayTransform() : XYZ2DisplayTransform; - if (cs->transform != NULL) cs->transform->ref(); -#endif - return cs; -} - -void GfxLabColorSpace::getGray(GfxColor *color, GfxGray *gray) { - GfxRGB rgb; - -#ifdef USE_CMS - if (transform != NULL && transform->getTransformPixelType() == PT_GRAY) { - Guchar out[gfxColorMaxComps]; - double in[gfxColorMaxComps]; - - getXYZ(color, &in[0], &in[1], &in[2]); - transform->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 (transform != NULL && transform->getTransformPixelType() == PT_RGB) { - Guchar out[gfxColorMaxComps]; - double in[gfxColorMaxComps]; - - in[0] = clip01(X); - in[1] = clip01(Y); - in[2] = clip01(Z); - transform->doTransform(in,out,1); - rgb->r = byteToCol(out[0]); - rgb->g = byteToCol(out[1]); - rgb->b = byteToCol(out[2]); - return; - } else if (transform != NULL && transform->getTransformPixelType() == PT_CMYK) { - Guchar out[gfxColorMaxComps]; - double in[gfxColorMaxComps]; - double c, m, y, k, c1, m1, y1, k1, r, g, b; - - in[0] = clip01(X); - in[1] = clip01(Y); - in[2] = clip01(Z); - transform->doTransform(in,out,1); - c = byteToDbl(out[0]); - m = byteToDbl(out[1]); - y = byteToDbl(out[2]); - k = byteToDbl(out[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)); - 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 (transform != NULL && transform->getTransformPixelType() == PT_CMYK) { - double in[gfxColorMaxComps]; - Guchar out[gfxColorMaxComps]; - - getXYZ(color, &in[0], &in[1], &in[2]); - 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]); - 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { - GfxCMYK cmyk; - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - getCMYK(color, &cmyk); - deviceN->c[0] = cmyk.c; - deviceN->c[1] = cmyk.m; - deviceN->c[2] = cmyk.y; - deviceN->c[3] = cmyk.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, OutputDev *out, GfxState *state, 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 (out && iccProfileStreamA.num > 0) { - GfxICCBasedColorSpaceKey k(iccProfileStreamA.num, iccProfileStreamA.gen); - GfxICCBasedColorSpaceItem *item = static_cast<GfxICCBasedColorSpaceItem *>(out->getIccColorSpaceCache()->lookup(k)); - if (item != NULL) - { - cs = static_cast<GfxICCBasedColorSpace*>(item->cs->copy()); - int transformIntent = cs->getIntent(); - int cmsIntent = INTENT_RELATIVE_COLORIMETRIC; - if (state != NULL) { - const char *intent = state->getRenderingIntent(); - if (intent != NULL) { - if (strcmp(intent, "AbsoluteColorimetric") == 0) { - cmsIntent = INTENT_ABSOLUTE_COLORIMETRIC; - } else if (strcmp(intent, "Saturation") == 0) { - cmsIntent = INTENT_SATURATION; - } else if (strcmp(intent, "Perceptual") == 0) { - cmsIntent = INTENT_PERCEPTUAL; - } - } - } - if (transformIntent == cmsIntent) { - return cs; - } - delete 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(NULL, &obj2, out, state, 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 = (state != NULL && state->getDisplayProfile() != NULL) ? state->getDisplayProfile() : 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; - - int cmsIntent = INTENT_RELATIVE_COLORIMETRIC; - if (state != NULL) { - const char *intent = state->getRenderingIntent(); - if (intent != NULL) { - if (strcmp(intent, "AbsoluteColorimetric") == 0) { - cmsIntent = INTENT_ABSOLUTE_COLORIMETRIC; - } else if (strcmp(intent, "Saturation") == 0) { - cmsIntent = INTENT_SATURATION; - } else if (strcmp(intent, "Perceptual") == 0) { - cmsIntent = INTENT_PERCEPTUAL; - } - } - } - if ((transform = cmsCreateTransform(hp, - COLORSPACE_SH(cst) |CHANNELS_SH(nCompsA) | BYTES_SH(1), - dhp, - COLORSPACE_SH(dcst) | - CHANNELS_SH(dNChannels) | BYTES_SH(1), - cmsIntent, LCMS_FLAGS)) == 0) { - error(errSyntaxWarning, -1, "Can't create transform"); - cs->transform = NULL; - } else { - cs->transform = new GfxColorTransform(transform, cmsIntent, cst, dcst); - } - if (dcst == PT_RGB || dcst == PT_CMYK) { - // create line transform only when the display is RGB type color space - if ((transform = cmsCreateTransform(hp, - CHANNELS_SH(nCompsA) | BYTES_SH(1),dhp, - (dcst == PT_RGB) ? TYPE_RGB_8 : TYPE_CMYK_8, cmsIntent, LCMS_FLAGS)) == 0) { - error(errSyntaxWarning, -1, "Can't create transform"); - cs->lineTransform = NULL; - } else { - cs->lineTransform = new GfxColorTransform(transform, cmsIntent, cst, dcst); - } - } - cmsCloseProfile(hp); - } - obj1.free(); - // put this colorSpace into cache - if (out && iccProfileStreamA.num > 0) { - GfxICCBasedColorSpaceKey *k = new GfxICCBasedColorSpaceKey(iccProfileStreamA.num, iccProfileStreamA.gen); - GfxICCBasedColorSpaceItem *item = new GfxICCBasedColorSpaceItem(cs); - out->getIccColorSpaceCache()->put(k, item); - } -#endif - return cs; -} - -void GfxICCBasedColorSpace::getGray(GfxColor *color, GfxGray *gray) { -#ifdef USE_CMS - if (transform != 0 && transform->getTransformPixelType() == PT_GRAY) { - Guchar in[gfxColorMaxComps]; - Guchar out[gfxColorMaxComps]; - - if (nComps == 3 && transform->getInputPixelType() == PT_Lab) { - in[0] = colToByte(dblToCol(colToDbl(color->c[0]) / 100.0)); - in[1] = colToByte(dblToCol((colToDbl(color->c[1]) + 128.0) / 255.0)); - in[2] = colToByte(dblToCol((colToDbl(color->c[2]) + 128.0) / 255.0)); - } else { - for (int i = 0;i < nComps;i++) { - in[i] = colToByte(color->c[i]); - } - } - if (nComps <= 4) { - unsigned int key = 0; - for (int j = 0; j < nComps; j++) { - key = (key << 8) + in[j]; - } - std::map<unsigned int, unsigned int>::iterator it = cmsCache.find(key); - if (it != cmsCache.end()) { - unsigned int value = it->second; - *gray = byteToCol(value & 0xff); - return; - } - } - transform->doTransform(in,out,1); - *gray = byteToCol(out[0]); - if (nComps <= 4 && cmsCache.size() <= CMSCACHE_LIMIT) { - unsigned int key = 0; - for (int j = 0; j < nComps; j++) { - key = (key << 8) + in[j]; - } - unsigned int value = out[0]; - cmsCache.insert(std::pair<unsigned int, unsigned int>(key, value)); - } - } 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 && transform->getTransformPixelType() == PT_RGB) { - Guchar in[gfxColorMaxComps]; - Guchar out[gfxColorMaxComps]; - - if (nComps == 3 && transform->getInputPixelType() == PT_Lab) { - in[0] = colToByte(dblToCol(colToDbl(color->c[0]) / 100.0)); - in[1] = colToByte(dblToCol((colToDbl(color->c[1]) + 128.0) / 255.0)); - in[2] = colToByte(dblToCol((colToDbl(color->c[2]) + 128.0) / 255.0)); - } else { - for (int i = 0;i < nComps;i++) { - in[i] = colToByte(color->c[i]); - } - } - if (nComps <= 4) { - unsigned int key = 0; - for (int j = 0; j < nComps; j++) { - key = (key << 8) + in[j]; - } - std::map<unsigned int, unsigned int>::iterator it = cmsCache.find(key); - if (it != cmsCache.end()) { - unsigned int value = it->second; - rgb->r = byteToCol(value >> 16); - rgb->g = byteToCol((value >> 8) & 0xff); - rgb->b = byteToCol(value & 0xff); - return; - } - } - transform->doTransform(in,out,1); - rgb->r = byteToCol(out[0]); - rgb->g = byteToCol(out[1]); - rgb->b = byteToCol(out[2]); - if (nComps <= 4 && cmsCache.size() <= CMSCACHE_LIMIT) { - unsigned int key = 0; - for (int j = 0; j < nComps; j++) { - key = (key << 8) + in[j]; - } - unsigned int value = (out[0] << 16) + (out[1] << 8) + out[2]; - cmsCache.insert(std::pair<unsigned int, unsigned int>(key, value)); - } - } else if (transform != NULL && transform->getTransformPixelType() == PT_CMYK) { - Guchar in[gfxColorMaxComps]; - Guchar out[gfxColorMaxComps]; - double c, m, y, k, c1, m1, y1, k1, r, g, b; - - if (nComps == 3 && transform->getInputPixelType() == PT_Lab) { - in[0] = colToByte(dblToCol(colToDbl(color->c[0]) / 100.0)); - in[1] = colToByte(dblToCol((colToDbl(color->c[1]) + 128.0) / 255.0)); - in[2] = colToByte(dblToCol((colToDbl(color->c[2]) + 128.0) / 255.0)); - } else { - for (int i = 0;i < nComps;i++) { - in[i] = colToByte(color->c[i]); - } - } - if (nComps <= 4) { - unsigned int key = 0; - for (int j = 0; j < nComps; j++) { - key = (key << 8) + in[j]; - } - std::map<unsigned int, unsigned int>::iterator it = cmsCache.find(key); - if (it != cmsCache.end()) { - unsigned int value = it->second; - rgb->r = byteToCol(value >> 16); - rgb->g = byteToCol((value >> 8) & 0xff); - rgb->b = byteToCol(value & 0xff); - return; - } - } - transform->doTransform(in,out,1); - c = byteToDbl(out[0]); - m = byteToDbl(out[1]); - y = byteToDbl(out[2]); - k = byteToDbl(out[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)); - if (nComps <= 4 && cmsCache.size() <= CMSCACHE_LIMIT) { - unsigned int key = 0; - for (int j = 0; j < nComps; j++) { - key = (key << 8) + in[j]; - } - unsigned int value = (dblToByte(r) << 16) + (dblToByte(g) << 8) + dblToByte(b); - cmsCache.insert(std::pair<unsigned int, unsigned int>(key, value)); - } - } 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 && lineTransform->getTransformPixelType() == PT_RGB) { - 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 && lineTransform->getTransformPixelType() == PT_RGB) { - 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 if (lineTransform != NULL && lineTransform->getTransformPixelType() == PT_CMYK) { - Guchar* tmp = (Guchar *)gmallocn(4 * length, sizeof(Guchar)); - lineTransform->doTransform(in, tmp, length); - Guchar *current = tmp; - double c, m, y, k, c1, m1, y1, k1, r, g, b; - for (int i = 0; i < length; ++i) { - c = byteToDbl(*current++); - m = byteToDbl(*current++); - y = byteToDbl(*current++); - k = byteToDbl(*current++); - c1 = 1 - c; - m1 = 1 - m; - y1 = 1 - y; - k1 = 1 - k; - cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b); - *out++ = dblToByte(r); - *out++ = dblToByte(g); - *out++ = dblToByte(b); - } - 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 && lineTransform->getTransformPixelType() == PT_RGB) { - 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::getCMYKLine(Guchar *in, Guchar *out, int length) { -#ifdef USE_CMS - if (lineTransform != NULL && lineTransform->getTransformPixelType() == PT_CMYK) { - transform->doTransform(in,out,length); - } else if (lineTransform != NULL && nComps != 4) { - GfxColorComp c, m, y, k; - Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar)); - getRGBLine(in, tmp, length); - Guchar *p = tmp; - for (int i = 0; i < length; i++) { - c = byteToCol(255 - *p++); - m = byteToCol(255 - *p++); - y = byteToCol(255 - *p++); - k = c; - if (m < k) { - k = m; - } - if (y < k) { - k = y; - } - *out++ = colToByte(c - k); - *out++ = colToByte(m - k); - *out++ = colToByte(y - k); - *out++ = colToByte(k); - } - gfree(tmp); - } else { - alt->getCMYKLine(in, out, length); - } -#else - alt->getCMYKLine(in, out, length); -#endif -} - -void GfxICCBasedColorSpace::getDeviceNLine(Guchar *in, Guchar *out, int length) { -#ifdef USE_CMS - if (lineTransform != NULL && lineTransform->getTransformPixelType() == PT_CMYK) { - Guchar* tmp = (Guchar *)gmallocn(4 * length, sizeof(Guchar)); - transform->doTransform(in,tmp,length); - Guchar *p = tmp; - for (int i = 0; i < length; i++) { - for (int j = 0; j < 4; j++) - *out++ = *p++; - for (int j = 4; j < SPOT_NCOMPS+4; j++) - *out++ = 0; - } - gfree(tmp); - } else if (lineTransform != NULL && nComps != 4) { - GfxColorComp c, m, y, k; - Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar)); - getRGBLine(in, tmp, length); - Guchar *p = tmp; - for (int i = 0; i < length; i++) { - for (int j = 0; j < SPOT_NCOMPS+4; j++) - out[j] = 0; - c = byteToCol(255 - *p++); - m = byteToCol(255 - *p++); - y = byteToCol(255 - *p++); - k = c; - if (m < k) { - k = m; - } - if (y < k) { - k = y; - } - out[0] = colToByte(c - k); - out[1] = colToByte(m - k); - out[2] = colToByte(y - k); - out[3] = colToByte(k); - out += (SPOT_NCOMPS+4); - } - gfree(tmp); - } else { - alt->getDeviceNLine(in, out, length); - } -#else - alt->getDeviceNLine(in, out, length); -#endif -} - -void GfxICCBasedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { -#ifdef USE_CMS - if (transform != NULL && transform->getTransformPixelType() == PT_CMYK) { - Guchar in[gfxColorMaxComps]; - Guchar out[gfxColorMaxComps]; - - if (nComps == 3 && transform->getInputPixelType() == PT_Lab) { - in[0] = colToByte(dblToCol(colToDbl(color->c[0]) / 100.0)); - in[1] = colToByte(dblToCol((colToDbl(color->c[1]) + 128.0) / 255.0)); - in[2] = colToByte(dblToCol((colToDbl(color->c[2]) + 128.0) / 255.0)); - } else { - for (int i = 0;i < nComps;i++) { - in[i] = colToByte(color->c[i]); - } - } - if (nComps <= 4) { - unsigned int key = 0; - for (int j = 0; j < nComps; j++) { - key = (key << 8) + in[j]; - } - std::map<unsigned int, unsigned int>::iterator it = cmsCache.find(key); - if (it != cmsCache.end()) { - unsigned int value = it->second; - cmyk->c = byteToCol(value >> 24); - cmyk->m = byteToCol((value >> 16) & 0xff); - cmyk->y = byteToCol((value >> 8) & 0xff); - cmyk->k = byteToCol(value & 0xff); - return; - } - } - 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]); - if (nComps <= 4 && cmsCache.size() <= CMSCACHE_LIMIT) { - unsigned int key = 0; - for (int j = 0; j < nComps; j++) { - key = (key << 8) + in[j]; - } - unsigned int value = (out[0] << 24) + (out[1] << 16) + (out[2] << 8) + out[3]; - cmsCache.insert(std::pair<unsigned int, unsigned int>(key, value)); - } - } else if (nComps != 4 && transform != NULL && transform->getTransformPixelType() == PT_RGB) { - 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); - } -#else - alt->getCMYK(color, cmyk); -#endif -} - -GBool GfxICCBasedColorSpace::useGetRGBLine() { -#ifdef USE_CMS - return lineTransform != NULL || alt->useGetRGBLine(); -#else - return alt->useGetRGBLine(); -#endif -} - -GBool GfxICCBasedColorSpace::useGetCMYKLine() { -#ifdef USE_CMS - return lineTransform != NULL || alt->useGetCMYKLine(); -#else - return alt->useGetCMYKLine(); -#endif -} - -GBool GfxICCBasedColorSpace::useGetDeviceNLine() { -#ifdef USE_CMS - return lineTransform != NULL || alt->useGetDeviceNLine(); -#else - return alt->useGetDeviceNLine(); -#endif -} - -void GfxICCBasedColorSpace::getDeviceN(GfxColor *color, GfxColor *deviceN) { - GfxCMYK cmyk; - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - getCMYK(color, &cmyk); - deviceN->c[0] = cmyk.c; - deviceN->c[1] = cmyk.m; - deviceN->c[2] = cmyk.y; - deviceN->c[3] = cmyk.k; -} - -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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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(res, &obj1, out, state, 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()) && idx >= 0)) { - 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::getCMYKLine(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->getCMYKLine(line, out, length); - - gfree (line); -} - -void GfxIndexedColorSpace::getDeviceNLine(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->getDeviceNLine(line, out, length); - - gfree (line); -} - -void GfxIndexedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { - GfxColor color2; - - base->getCMYK(mapColorToBase(color, &color2), cmyk); -} - -void GfxIndexedColorSpace::getDeviceN(GfxColor *color, GfxColor *deviceN) { - GfxColor color2; - - base->getDeviceN(mapColorToBase(color, &color2), deviceN); -} - -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; - } else if (!name->cmp("All")) { - overprintMask = 0xffffffff; - } -} - -GfxSeparationColorSpace::GfxSeparationColorSpace(GooString *nameA, - GfxColorSpace *altA, - Function *funcA, - GBool nonMarkingA, - Guint overprintMaskA, - int *mappingA) { - name = nameA; - alt = altA; - func = funcA; - nonMarking = nonMarkingA; - overprintMask = overprintMaskA; - mapping = mappingA; -} - -GfxSeparationColorSpace::~GfxSeparationColorSpace() { - delete name; - delete alt; - delete func; - if (mapping != NULL) - gfree(mapping); -} - -GfxColorSpace *GfxSeparationColorSpace::copy() { - int *mappingA = NULL; - if (mapping != NULL) { - mappingA = (int *) gmalloc(sizeof(int)); - *mappingA = *mapping; - } - return new GfxSeparationColorSpace(name->copy(), alt->copy(), func->copy(), - nonMarking, overprintMask, mappingA); -} - -//~ handle the 'All' and 'None' colorants -GfxColorSpace *GfxSeparationColorSpace::parse(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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(res, &obj1, out, state, 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; - } - if (funcA->getInputSize() != 1) { - error(errSyntaxWarning, -1, "Bad SeparationColorSpace function"); - goto err5; - } - obj1.free(); - cs = new GfxSeparationColorSpace(nameA, altA, funcA); - return cs; - - err5: - delete funcA; - 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - if (mapping == NULL || mapping[0] == -1) { - GfxCMYK cmyk; - - getCMYK(color, &cmyk); - deviceN->c[0] = cmyk.c; - deviceN->c[1] = cmyk.m; - deviceN->c[2] = cmyk.y; - deviceN->c[3] = cmyk.k; - } else { - deviceN->c[mapping[0]] = color->c[0]; - } -} - -void GfxSeparationColorSpace::getDefaultColor(GfxColor *color) { - color->c[0] = gfxColorComp1; -} - -void GfxSeparationColorSpace::createMapping(GooList *separationList, int maxSepComps) { - if (nonMarking) - return; - mapping = (int *)gmalloc(sizeof(int)); - switch (overprintMask) { - case 0x01: - *mapping = 0; - break; - case 0x02: - *mapping = 1; - break; - case 0x04: - *mapping = 2; - break; - case 0x08: - *mapping = 3; - break; - default: - Guint newOverprintMask = 0x10; - for (int i = 0; i < separationList->getLength(); i++) { - GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(i); - if (!sepCS->getName()->cmp(name)) { - if (sepCS->getFunc()->hasDifferentResultSet(func)) { - error(errSyntaxWarning, -1, - "Different functions found for '{0:t}', convert immediately", name); - gfree(mapping); - mapping = NULL; - return; - } - *mapping = i+4; - overprintMask = newOverprintMask; - return; - } - newOverprintMask <<=1; - } - if (separationList->getLength() == maxSepComps) { - error(errSyntaxWarning, -1, - "Too many ({0:d}) spots, convert '{1:t}' immediately", maxSepComps, name); - gfree(mapping); - mapping = NULL; - return; - } - *mapping = separationList->getLength() + 4; - separationList->append(copy()); - overprintMask = newOverprintMask; - break; - } -} - -//------------------------------------------------------------------------ -// GfxDeviceNColorSpace -//------------------------------------------------------------------------ - -GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA, - GooString **namesA, - GfxColorSpace *altA, - Function *funcA, - GooList *sepsCSA) { - int i; - - nComps = nCompsA; - alt = altA; - func = funcA; - sepsCS = sepsCSA; - nonMarking = gTrue; - overprintMask = 0; - mapping = NULL; - 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 if (!names[i]->cmp("All")) { - overprintMask = 0xffffffff; - } else { - overprintMask = 0x0f; - } - } -} - -GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA, - GooString **namesA, - GfxColorSpace *altA, - Function *funcA, - GooList *sepsCSA, - int *mappingA, - GBool nonMarkingA, - Guint overprintMaskA) { - int i; - - nComps = nCompsA; - alt = altA; - func = funcA; - sepsCS = sepsCSA; - mapping = mappingA; - 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; - deleteGooList(sepsCS, GfxSeparationColorSpace); - if (mapping != NULL) - gfree(mapping); -} - -GfxColorSpace *GfxDeviceNColorSpace::copy() { - int i; - int *mappingA = NULL; - - GooList *sepsCSA = new GooList(sepsCS->getLength()); - for (i = 0; i < sepsCS->getLength(); i++) { - GfxSeparationColorSpace *scs = (GfxSeparationColorSpace *) sepsCS->get(i); - if (likely(scs != NULL)) { - sepsCSA->append(scs->copy()); - } - } - if (mapping != NULL) { - mappingA = (int *)gmalloc(sizeof(int) * nComps); - for (i = 0; i < nComps; i++) - mappingA[i] = mapping[i]; - } - return new GfxDeviceNColorSpace(nComps, names, alt->copy(), func->copy(), - sepsCSA, mappingA, nonMarking, overprintMask); -} - -//~ handle the 'None' colorant -GfxColorSpace *GfxDeviceNColorSpace::parse(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, int recursion) { - GfxDeviceNColorSpace *cs; - int nCompsA; - GooString *namesA[gfxColorMaxComps]; - GfxColorSpace *altA; - Function *funcA; - Object obj1, obj2; - int i; - GooList *separationList = new GooList(); - - 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(res, &obj1, out, state, 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(); - if (arr->getLength() == 5) { - if (!arr->get(4, &obj1)->isDict()) { - error(errSyntaxWarning, -1, "Bad DeviceN color space (attributes)"); - goto err4; - } - Dict *attribs = obj1.getDict(); - attribs->lookup("Colorants", &obj2); - if (obj2.isDict()) { - Dict *colorants = obj2.getDict(); - for (i = 0; i < colorants->getLength(); i++) { - Object obj3; - colorants->getVal(i, &obj3); - if (obj3.isArray()) { - separationList->append(GfxSeparationColorSpace::parse(res, obj3.getArray(), out, state, recursion)); - } else { - obj3.free(); - obj2.free(); - error(errSyntaxWarning, -1, "Bad DeviceN color space (colorant value entry is not an Array)"); - goto err4; - } - obj3.free(); - } - } - obj2.free(); - obj1.free(); - } - cs = new GfxDeviceNColorSpace(nCompsA, namesA, altA, funcA, separationList); - return cs; - - err4: - delete altA; - err3: - for (i = 0; i < nCompsA; ++i) { - delete namesA[i]; - } - err2: - obj1.free(); - err1: - delete separationList; - 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - if (mapping == NULL) { - GfxCMYK cmyk; - - getCMYK(color, &cmyk); - deviceN->c[0] = cmyk.c; - deviceN->c[1] = cmyk.m; - deviceN->c[2] = cmyk.y; - deviceN->c[3] = cmyk.k; - } else { - for (int j = 0; j < nComps; j++) - if (mapping[j] != -1) - deviceN->c[mapping[j]] = color->c[j]; - } -} - -void GfxDeviceNColorSpace::getDefaultColor(GfxColor *color) { - int i; - - for (i = 0; i < nComps; ++i) { - color->c[i] = gfxColorComp1; - } -} - -void GfxDeviceNColorSpace::createMapping(GooList *separationList, int maxSepComps) { - if (nonMarking) // None - return; - mapping = (int *)gmalloc(sizeof(int) * nComps); - Guint newOverprintMask = 0; - for (int i = 0; i < nComps; i++) { - if (!names[i]->cmp("None")) { - mapping[i] = -1; - } else if (!names[i]->cmp("Cyan")) { - newOverprintMask |= 0x01; - mapping[i] = 0; - } else if (!names[i]->cmp("Magenta")) { - newOverprintMask |= 0x02; - mapping[i] = 1; - } else if (!names[i]->cmp("Yellow")) { - newOverprintMask |= 0x04; - mapping[i] = 2; - } else if (!names[i]->cmp("Black")) { - newOverprintMask |= 0x08; - mapping[i] = 3; - } else { - Guint startOverprintMask = 0x10; - GBool found = gFalse; - Function *sepFunc = NULL; - if (nComps == 1) - sepFunc = func; - else { - for (int k = 0; k < sepsCS->getLength(); k++) { - GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)sepsCS->get(k); - if (!sepCS->getName()->cmp(names[i])) { - sepFunc = sepCS->getFunc(); - break; - } - } - } - for (int j = 0; j < separationList->getLength(); j++) { - GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(j); - if (!sepCS->getName()->cmp(names[i])) { - if (sepFunc != NULL && sepCS->getFunc()->hasDifferentResultSet(sepFunc)) { - error(errSyntaxWarning, -1, - "Different functions found for '{0:t}', convert immediately", names[i]); - gfree(mapping); - mapping = NULL; - overprintMask = 0xffffffff; - return; - } - mapping[i] = j+4; - newOverprintMask |= startOverprintMask; - found = gTrue; - break; - } - startOverprintMask <<=1; - } - if (!found) { - if (separationList->getLength() == maxSepComps) { - error(errSyntaxWarning, -1, - "Too many ({0:d}) spots, convert '{1:t}' immediately", maxSepComps, names[i]); - gfree(mapping); - mapping = NULL; - overprintMask = 0xffffffff; - return; - } - mapping[i] = separationList->getLength() + 4; - newOverprintMask |= startOverprintMask; - if (nComps == 1) - separationList->append(new GfxSeparationColorSpace(names[i]->copy(),alt->copy(), func->copy())); - else { - for (int k = 0; k < sepsCS->getLength(); k++) { - GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)sepsCS->get(k); - if (!sepCS->getName()->cmp(names[i])) { - found = gTrue; - separationList->append(sepCS->copy()); - break; - } - } - if(!found) { - error(errSyntaxWarning, -1, "DeviceN has no suitable colorant"); - gfree(mapping); - mapping = NULL; - overprintMask = 0xffffffff; - return; - } - } - } - } - } - overprintMask = newOverprintMask; -} - -//------------------------------------------------------------------------ -// 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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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(res, &obj1, out, state, 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { - for (int i = 0; i < gfxColorMaxComps; i++) - deviceN->c[i] = 0; - deviceN->c[3] = 1; -} - -void GfxPatternColorSpace::getDefaultColor(GfxColor *color) { - color->c[0]=0; -} - -//------------------------------------------------------------------------ -// Pattern -//------------------------------------------------------------------------ - -GfxPattern::GfxPattern(int typeA) { - type = typeA; -} - -GfxPattern::~GfxPattern() { -} - -GfxPattern *GfxPattern::parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state) { - 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(res, obj, out, state); - } - 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(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state) { - 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(res, &obj1, out, state); - 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(GfxResources *res, Object *obj, OutputDev *out, GfxState *state) { - 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(res, dict, out, state); - break; - case 2: - shading = GfxAxialShading::parse(res, dict, out, state); - break; - case 3: - shading = GfxRadialShading::parse(res, dict, out, state); - break; - case 4: - if (obj->isStream()) { - shading = GfxGouraudTriangleShading::parse(res, 4, dict, obj->getStream(), out, state); - } else { - error(errSyntaxWarning, -1, "Invalid Type 4 shading object"); - goto err1; - } - break; - case 5: - if (obj->isStream()) { - shading = GfxGouraudTriangleShading::parse(res, 5, dict, obj->getStream(), out, state); - } else { - error(errSyntaxWarning, -1, "Invalid Type 5 shading object"); - goto err1; - } - break; - case 6: - if (obj->isStream()) { - shading = GfxPatchMeshShading::parse(res, 6, dict, obj->getStream(), out, state); - } else { - error(errSyntaxWarning, -1, "Invalid Type 6 shading object"); - goto err1; - } - break; - case 7: - if (obj->isStream()) { - shading = GfxPatchMeshShading::parse(res, 7, dict, obj->getStream(), out, state); - } 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state) { - Object obj1, obj2; - int i; - - dict->lookup("ColorSpace", &obj1); - if (!(colorSpace = GfxColorSpace::parse(res, &obj1, out, state))) { - 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state) { - 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 || nFuncsA <= 0) { - 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(res, dict, out, state)) { - 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) { - if (funcs[i]->getInputSize() != 1) { - error(errSyntaxWarning, -1, "Invalid shading function (input != 1)"); - break; - } - 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state) { - 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 || nFuncsA == 0) { - 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) { - obj1.arrayGet(0, &obj2); - if (obj2.isBool()) { - extend0A = obj2.getBool(); - } else { - error(errSyntaxWarning, -1, "Invalid axial shading extend (0)"); - } - obj2.free(); - obj1.arrayGet(1, &obj2); - if (obj2.isBool()) { - extend1A = obj2.getBool(); - } else { - error(errSyntaxWarning, -1, "Invalid axial shading extend (1)"); - } - obj2.free(); - } - obj1.free(); - - shading = new GfxAxialShading(x0A, y0A, x1A, y1A, t0A, t1A, - funcsA, nFuncsA, extend0A, extend1A); - if (!shading->init(res, dict, out, state)) { - 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state) { - 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(res, dict, out, state)) { - 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(GfxResources *res, int typeA, - Dict *dict, - Stream *str, - OutputDev *out, GfxState *gfxState) { - 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(res, dict, out, gfxState)) { - 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(GfxResources *res, int typeA, Dict *dict, - Stream *str, OutputDev *out, GfxState *state) { - 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(res, dict, out, state)) { - 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() || colorSpace2->useGetCMYKLine() || colorSpace2->useGetDeviceNLine()) { - 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() || colorSpace2->useGetCMYKLine() || colorSpace2->useGetDeviceNLine()) { - 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() || colorSpace->useGetCMYKLine() || colorSpace->useGetDeviceNLine()) { - 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::getCMYKLine(Guchar *in, Guchar *out, int length) { - int i, j; - Guchar *inp, *tmp_line; - - if (!useCMYKLine()) { - GfxCMYK cmyk; - - inp = in; - for (i = 0; i < length; i++) { - getCMYK (inp, &cmyk); - *out++ = colToByte(cmyk.c); - *out++ = colToByte(cmyk.m); - *out++ = colToByte(cmyk.y); - *out++ = colToByte(cmyk.k); - 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->getCMYKLine(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->getCMYKLine(in, out, length); - break; - } - -} - -void GfxImageColorMap::getDeviceNLine(Guchar *in, Guchar *out, int length) { - int i, j; - Guchar *inp, *tmp_line; - - if (!useDeviceNLine()) { - GfxColor deviceN; - - inp = in; - for (i = 0; i < length; i++) { - getDeviceN (inp, &deviceN); - for (int j = 0; j < SPOT_NCOMPS+4; j++) - *out++ = deviceN.c[j]; - 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->getDeviceNLine(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->getDeviceNLine(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::getDeviceN(Guchar *x, GfxColor *deviceN) { - GfxColor color; - int i; - - if (colorSpace2) { - for (i = 0; i < nComps2; ++i) { - color.c[i] = lookup2[i][x[0]]; - } - colorSpace2->getDeviceN(&color, deviceN); - } else { - for (i = 0; i < nComps; ++i) { - color.c[i] = lookup[i][x[i]]; - } - colorSpace->getDeviceN(&color, deviceN); - } -} - -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; - - renderingIntent[0] = 0; - - saved = NULL; -#ifdef USE_CMS - GfxColorSpace::setupColorProfiles(); - XYZ2DisplayTransformRelCol = NULL; - XYZ2DisplayTransformAbsCol = NULL; - XYZ2DisplayTransformSat = NULL; - XYZ2DisplayTransformPerc = NULL; - localDisplayProfile = NULL; - displayProfileRef = 0; -#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(); - } -#ifdef USE_CMS - if (XYZ2DisplayTransformRelCol) { - if (XYZ2DisplayTransformRelCol->unref() == 0) - delete XYZ2DisplayTransformRelCol; - } - if (XYZ2DisplayTransformAbsCol) { - if (XYZ2DisplayTransformAbsCol->unref() == 0) - delete XYZ2DisplayTransformAbsCol; - } - if (XYZ2DisplayTransformSat) { - if (XYZ2DisplayTransformSat->unref() == 0) - delete XYZ2DisplayTransformSat; - } - if (XYZ2DisplayTransformPerc) { - if (XYZ2DisplayTransformPerc->unref() == 0) - delete XYZ2DisplayTransformPerc; - } - if (--displayProfileRef == 0 && localDisplayProfile != NULL) { - cmsCloseProfile(localDisplayProfile); - } -#endif -} - -// 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; -#ifdef USE_CMS - if (XYZ2DisplayTransformRelCol) { - XYZ2DisplayTransformRelCol->ref(); - } - if (XYZ2DisplayTransformAbsCol) { - XYZ2DisplayTransformAbsCol->ref(); - } - if (XYZ2DisplayTransformSat) { - XYZ2DisplayTransformSat->ref(); - } - if (XYZ2DisplayTransformPerc) { - XYZ2DisplayTransformPerc->ref(); - } - if (localDisplayProfile) { - displayProfileRef++; - } -#endif -} - -#ifdef USE_CMS -void GfxState::setDisplayProfile(cmsHPROFILE localDisplayProfileA) { - if (localDisplayProfile != NULL) { - cmsCloseProfile(localDisplayProfile); - } - localDisplayProfile = localDisplayProfileA; - if (localDisplayProfileA != NULL) { - cmsHTRANSFORM transform; - unsigned int nChannels; - unsigned int localDisplayPixelType; - - localDisplayPixelType = getCMSColorSpaceType(cmsGetColorSpace(localDisplayProfile)); - nChannels = getCMSNChannels(cmsGetColorSpace(localDisplayProfile)); - displayProfileRef = 1; - // create transform from XYZ - cmsHPROFILE XYZProfile = cmsCreateXYZProfile(); - if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL, - localDisplayProfile, - COLORSPACE_SH(localDisplayPixelType) | - CHANNELS_SH(nChannels) | BYTES_SH(1), - INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) { - error(errSyntaxWarning, -1, "Can't create Lab transform"); - } else { - XYZ2DisplayTransformRelCol = new GfxColorTransform(transform, INTENT_RELATIVE_COLORIMETRIC, PT_XYZ, localDisplayPixelType); - } - if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL, - localDisplayProfile, - COLORSPACE_SH(localDisplayPixelType) | - CHANNELS_SH(nChannels) | BYTES_SH(1), - INTENT_ABSOLUTE_COLORIMETRIC,LCMS_FLAGS)) == 0) { - error(errSyntaxWarning, -1, "Can't create Lab transform"); - } else { - XYZ2DisplayTransformAbsCol = new GfxColorTransform(transform, INTENT_ABSOLUTE_COLORIMETRIC, PT_XYZ, localDisplayPixelType); - } - if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL, - localDisplayProfile, - COLORSPACE_SH(localDisplayPixelType) | - CHANNELS_SH(nChannels) | BYTES_SH(1), - INTENT_SATURATION,LCMS_FLAGS)) == 0) { - error(errSyntaxWarning, -1, "Can't create Lab transform"); - } else { - XYZ2DisplayTransformSat = new GfxColorTransform(transform, INTENT_SATURATION, PT_XYZ, localDisplayPixelType); - } - if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL, - localDisplayProfile, - COLORSPACE_SH(localDisplayPixelType) | - CHANNELS_SH(nChannels) | BYTES_SH(1), - INTENT_PERCEPTUAL,LCMS_FLAGS)) == 0) { - error(errSyntaxWarning, -1, "Can't create Lab transform"); - } else { - XYZ2DisplayTransformPerc = new GfxColorTransform(transform, INTENT_PERCEPTUAL, PT_XYZ, localDisplayPixelType); - } - cmsCloseProfile(XYZProfile); - } -} - -GfxColorTransform *GfxState::getXYZ2DisplayTransform() { - GfxColorTransform *transform; - - transform = XYZ2DisplayTransformRelCol; - if (renderingIntent != NULL) { - if (strcmp(renderingIntent, "AbsoluteColorimetric") == 0) { - transform = XYZ2DisplayTransformAbsCol; - } else if (strcmp(renderingIntent, "Saturation") == 0) { - transform = XYZ2DisplayTransformSat; - } else if (strcmp(renderingIntent, "Perceptual") == 0) { - transform = XYZ2DisplayTransformPerc; - } - } - if (transform == NULL) { - transform = XYZ2DisplayTransform; - } - return transform; -} - -#endif - -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::shiftCTMAndClip(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/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState.h deleted file mode 100644 index f018e93dd34..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState.h +++ /dev/null @@ -1,1651 +0,0 @@ -//======================================================================== -// -// 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, 2013 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-2014 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 Lu Wang <coolwanglu@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 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> -#include <map> - -class Array; -class Gfx; -class GfxFont; -class PDFRectangle; -class GfxShading; -class PopplerCache; -class GooList; -class OutputDev; -class GfxState; -class GfxResources; - -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, int cmsIntent, unsigned int inputPixelType, unsigned int transformPixelType); - ~GfxColorTransform(); - int getIntent() { return cmsIntent; } - int getInputPixelType() { return inputPixelType; } - int getTransformPixelType() { return transformPixelType; } - void ref(); - unsigned int unref(); -private: - GfxColorTransform() {} - void *transform; - unsigned int refCount; - int cmsIntent; - unsigned int inputPixelType; - unsigned int transformPixelType; -}; - -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(GfxResources *res, Object *csObj, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN) = 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"); } - virtual void getCMYKLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getCMYKLine this should not happen"); } - virtual void getDeviceNLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getDeviceNLine this should not happen"); } - - // create mapping for spot colorants - virtual void createMapping(GooList *separationList, int maxSepComps); - - // Does this ColorSpace support getRGBLine? - virtual GBool useGetRGBLine() { return gFalse; } - // Does this ColorSpace support getGrayLine? - virtual GBool useGetGrayLine() { return gFalse; } - // Does this ColorSpace support getCMYKLine? - virtual GBool useGetCMYKLine() { return gFalse; } - // Does this ColorSpace support getDeviceNLine? - virtual GBool useGetDeviceNLine() { 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; - int *mapping; -}; - -//------------------------------------------------------------------------ -// 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 getDeviceN(GfxColor *color, GfxColor *deviceN); - 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 void getCMYKLine(Guchar *in, Guchar *out, int length); - virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); - - virtual GBool useGetRGBLine() { return gTrue; } - virtual GBool useGetGrayLine() { return gTrue; } - virtual GBool useGetCMYKLine() { return gTrue; } - virtual GBool useGetDeviceNLine() { 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, GfxState *state); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - virtual void getDeviceN(GfxColor *color, GfxColor *deviceN); - - 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); -#ifdef USE_CMS - GfxColorTransform *transform; -#endif -}; - -//------------------------------------------------------------------------ -// 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 getDeviceN(GfxColor *color, GfxColor *deviceN); - 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 void getCMYKLine(Guchar *in, Guchar *out, int length); - virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); - - virtual GBool useGetRGBLine() { return gTrue; } - virtual GBool useGetGrayLine() { return gTrue; } - virtual GBool useGetCMYKLine() { return gTrue; } - virtual GBool useGetDeviceNLine() { 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, GfxState *state); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - virtual void getDeviceN(GfxColor *color, GfxColor *deviceN); - - 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); -#ifdef USE_CMS - GfxColorTransform *transform; -#endif -}; - -//------------------------------------------------------------------------ -// 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 getDeviceN(GfxColor *color, GfxColor *deviceN); - 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 void getCMYKLine(Guchar *in, Guchar *out, int length); - virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); - virtual GBool useGetRGBLine() { return gTrue; } - virtual GBool useGetCMYKLine() { return gTrue; } - virtual GBool useGetDeviceNLine() { 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, GfxState *state); - - virtual void getGray(GfxColor *color, GfxGray *gray); - virtual void getRGB(GfxColor *color, GfxRGB *rgb); - virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); - virtual void getDeviceN(GfxColor *color, GfxColor *deviceN); - - 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); -#ifdef USE_CMS - GfxColorTransform *transform; -#endif -}; - -//------------------------------------------------------------------------ -// 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, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); - 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 void getCMYKLine(Guchar *in, Guchar *out, int length); - virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); - - virtual GBool useGetRGBLine(); - virtual GBool useGetCMYKLine(); - virtual GBool useGetDeviceNLine(); - - 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 - int getIntent() { return (transform != NULL) ? transform->getIntent() : 0; } - GfxColorTransform *transform; - GfxColorTransform *lineTransform; // color transform for line - std::map<unsigned int, unsigned int> cmsCache; -#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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); - 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 void getCMYKLine(Guchar *in, Guchar *out, int length); - virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); - - virtual GBool useGetRGBLine() { return gTrue; } - virtual GBool useGetCMYKLine() { return gTrue; } - virtual GBool useGetDeviceNLine() { 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); - Guint getOverprintMask() { return base->getOverprintMask(); } - virtual void createMapping(GooList *separationList, int maxSepComps) - { base->createMapping(separationList, maxSepComps); } - - -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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); - - virtual void createMapping(GooList *separationList, int maxSepComps); - - 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, int *mappingA); - - 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, GooList *sepsCS); - virtual ~GfxDeviceNColorSpace(); - virtual GfxColorSpace *copy(); - virtual GfxColorSpaceMode getMode() { return csDeviceN; } - - // Construct a DeviceN color space. Returns NULL if unsuccessful. - static GfxColorSpace *parse(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); - - virtual void createMapping(GooList *separationList, int maxSepComps); - - 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, GooList *sepsCSA, - int *mappingA, 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; - GooList *sepsCS; // list of separation cs for spot colorants; -}; - -//------------------------------------------------------------------------ -// 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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); - - 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(GfxResources *res, Object *obj, OutputDev *out, GfxState *state); - - 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(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state); - 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(GfxResources *res, Object *obj, OutputDev *out, GfxState *state); - - 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state); - - 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state); - - 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state); - - 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state); - - 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(GfxResources *res, int typeA, Dict *dict, Stream *str, OutputDev *out, GfxState *state); - - 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(GfxResources *res, int typeA, Dict *dict, Stream *str, OutputDev *out, GfxState *state); - - 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 ()); } - bool useCMYKLine() { return (colorSpace2 && colorSpace2->useGetCMYKLine ()) || (!colorSpace2 && colorSpace->useGetCMYKLine ()); } - bool useDeviceNLine() { return (colorSpace2 && colorSpace2->useGetDeviceNLine ()) || (!colorSpace2 && colorSpace->useGetDeviceNLine ()); } - - // 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 getCMYKLine(Guchar *in, Guchar *out, int length); - void getDeviceNLine(Guchar *in, Guchar *out, int length); - void getCMYK(Guchar *x, GfxCMYK *cmyk); - void getDeviceN(Guchar *x, GfxColor *deviceN); - 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 getFillDeviceN(GfxColor *deviceN) - { fillColorSpace->getDeviceN(&fillColor, deviceN); } - void getStrokeCMYK(GfxCMYK *cmyk) - { strokeColorSpace->getCMYK(&strokeColor, cmyk); } - void getStrokeDeviceN(GfxColor *deviceN) - { strokeColorSpace->getDeviceN(&strokeColor, deviceN); } - 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; } - char *getRenderingIntent() { return renderingIntent; } - 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 shiftCTMAndClip(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; } - void setRenderingIntent(const char *intent) - { strncpy(renderingIntent, intent, 31); } - -#ifdef USE_CMS - void setDisplayProfile(void *localDisplayProfileA); - void *getDisplayProfile() { return localDisplayProfile; } - GfxColorTransform *getXYZ2DisplayTransform(); -#endif - - // 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; - char renderingIntent[32]; - - GfxState *saved; // next GfxState on stack - - GfxState(GfxState *state, GBool copyPath); - -#ifdef USE_CMS - void *localDisplayProfile; - int displayProfileRef; - GfxColorTransform *XYZ2DisplayTransformRelCol; - GfxColorTransform *XYZ2DisplayTransformAbsCol; - GfxColorTransform *XYZ2DisplayTransformSat; - GfxColorTransform *XYZ2DisplayTransformPerc; -#endif -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState_helpers.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState_helpers.h deleted file mode 100644 index bc0024edd79..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/GfxState_helpers.h +++ /dev/null @@ -1,82 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParams.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParams.cc deleted file mode 100644 index 7e110d05b15..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParams.cc +++ /dev/null @@ -1,2031 +0,0 @@ -//======================================================================== -// -// 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, 2015 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, 2015 William Bader <williambader@hotmail.com> -// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> -// Copyright (C) 2010, 2012 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> -// Copyright (C) 2013, 2014 Jason Crain <jason@aquaticape.us> -// -// 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 const 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 = new GooString(POPPLER_DATADIR); - 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 - substFiles = new GooHash(gTrue); -#endif - nameToUnicodeZapfDingbats = new NameToCharCode(); - nameToUnicodeText = 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(); - 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; - 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 = gTrue; - 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 tables - for (i = 0; nameToUnicodeZapfDingbatsTab[i].name; ++i) { - nameToUnicodeZapfDingbats->add(nameToUnicodeZapfDingbatsTab[i].name, nameToUnicodeZapfDingbatsTab[i].u); - } - - for (i = 0; nameToUnicodeTextTab[i].name; ++i) { - nameToUnicodeText->add(nameToUnicodeTextTab[i].name, nameToUnicodeTextTab[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); - nameToUnicodeText->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 nameToUnicodeZapfDingbats; - delete nameToUnicodeText; - 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 -} - -//------------------------------------------------------------------------ -// accessors -//------------------------------------------------------------------------ - -CharCode GlobalParams::getMacRomanCharCode(char *charName) { - // no need to lock - macRomanReverseMap is constant - return macRomanReverseMap->lookup(charName); -} - -Unicode GlobalParams::mapNameToUnicodeAll(const char *charName) { - // no need to lock - nameToUnicodeZapfDingbats and nameToUnicodeText are constant - Unicode u = nameToUnicodeZapfDingbats->lookup(charName); - if (!u) - u = nameToUnicodeText->lookup(charName); - return u; -} - -Unicode GlobalParams::mapNameToUnicodeText(const char *charName) { - // no need to lock - nameToUnicodeText is constant - return nameToUnicodeText->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; -} - -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::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::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; -} - -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/Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParams.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParams.h deleted file mode 100644 index 16d615ae6d9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParams.h +++ /dev/null @@ -1,336 +0,0 @@ -//======================================================================== -// -// 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, 2012, 2015 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, 2014, 2015 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> -// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> -// -// 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 setupBaseFonts(char *dir); - - //----- accessors - - CharCode getMacRomanCharCode(char *charName); - - // Return Unicode values for character names. Used for general text - // extraction. - Unicode mapNameToUnicodeText(const char *charName); - - // Return Unicode values for character names. Used for glyph - // lookups or text extraction with ZapfDingbats fonts. - Unicode mapNameToUnicodeAll(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); - GooString *getTextEncodingName(); - EndOfLineKind getTextEOL(); - GBool getTextPageBreaks(); - GBool getTextKeepTinyChars(); - GBool getEnableFreeType(); - 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(); - - 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 setTextEncoding(char *encodingName); - GBool setTextEOL(char *s); - void setTextPageBreaks(GBool pageBreaks); - void setTextKeepTinyChars(GBool keep); - GBool setEnableFreeType(char *s); - GBool setDisableFreeTypeHinting(char *s); - 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); - - static GBool parseYesNo2(const char *token, GBool *flag); - - //----- security handlers - - void addSecurityHandler(XpdfSecurityHandler *handler); - XpdfSecurityHandler *getSecurityHandler(char *name); - -private: - - void parseNameToUnicode(GooString *name); - 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 - - NameToCharCode * // mapping from char name to Unicode for ZapfDingbats - nameToUnicodeZapfDingbats; - NameToCharCode * // mapping from char name to Unicode for text - nameToUnicodeText; // extraction - 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] - 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 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/Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParamsWin.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParamsWin.cc deleted file mode 100644 index f9f40ef4e29..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/GlobalParamsWin.cc +++ /dev/null @@ -1,598 +0,0 @@ -/* Written by Krzysztof Kowalczyk (http://blog.kowalczyk.info) - but mostly based on xpdf code. - - // Copyright (C) 2010, 2012 Hib Eris <hib@hiberis.nl> - // Copyright (C) 2012, 2013 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> - // Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> - // Copyright (C) 2013 Dmytro Morgun <lztoad@gmail.com> - -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; - const 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, - ®Key) == 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; - GooFile *file; - - 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}'", displayFontTab[i].name); - delete fontName; - } - } - if (winFontDir[0]) { - GooString gooWinFontsDir(winFontDir); - sysFonts->scanWindowsFonts(&gooWinFontsDir); - } - - fileName = new GooString(dataRoot); - fileName->append("/cidfmap"); - - // try to open file - file = GooFile::open(fileName); - - if (file != NULL) { - Parser *parser; - Object obj1, obj2; - - obj1.initNull(); - parser = new Parser(NULL, - new Lexer(NULL, - new FileStream(file, 0, gFalse, file->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); - } - } - delete file; - delete parser; - } - else { - delete fileName; - } -} - -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/Build/source/libs/poppler/poppler-0.35.0/poppler/Hints.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Hints.cc deleted file mode 100644 index bdd0d322612..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Hints.cc +++ /dev/null @@ -1,452 +0,0 @@ -//======================================================================== -// -// Hints.cc -// -// This file is licensed under the GPLv2 or later -// -// Copyright 2010, 2012 Hib Eris <hib@hiberis.nl> -// Copyright 2010, 2011, 2013, 2014 Albert Astals Cid <aacid@kde.org> -// Copyright 2010, 2013 Pino Toscano <pino@kde.org> -// Copyright 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright 2014 Fabio D'Urso <fabiodurso@hotmail.it> -// -//======================================================================== - -#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 ({0: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 = (Goffset *) gmallocn_checkoverflow(nPages, sizeof(Goffset)); - 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 table"); - 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); - if (nObjectLeast < 1) { - error(errSyntaxWarning, -1, "Invalid least number of objects reading page offset hints table"); - nPages = 0; - return; - } - - 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"); - nSharedGroups = 0; - return; - } - - 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]; - } - } -} - -Goffset 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Hints.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Hints.h deleted file mode 100644 index f46c07f673b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Hints.h +++ /dev/null @@ -1,95 +0,0 @@ -//======================================================================== -// -// Hints.h -// -// This file is licensed under the GPLv2 or later -// -// Copyright 2010 Hib Eris <hib@hiberis.nl> -// Copyright 2010, 2013 Albert Astals Cid <aacid@kde.org> -// Copyright 2013 Adrian Johnson <ajohnson@redneon.com> -// -//======================================================================== - -#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); - Goffset 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; - Goffset pageOffsetFirst; - Guint pageEndFirst; - - 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; - Goffset *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/Build/source/libs/poppler/poppler-0.35.0/poppler/JArithmeticDecoder.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/JArithmeticDecoder.cc deleted file mode 100644 index d23f7ea3887..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/JArithmeticDecoder.cc +++ /dev/null @@ -1,355 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/JArithmeticDecoder.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/JArithmeticDecoder.h deleted file mode 100644 index 3c3e6fed0e5..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/JArithmeticDecoder.h +++ /dev/null @@ -1,111 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/JBIG2Stream.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/JBIG2Stream.cc deleted file mode 100644 index 66c1d2505e8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/JBIG2Stream.cc +++ /dev/null @@ -1,4292 +0,0 @@ -//======================================================================== -// -// 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, 2014 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> -// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013, 2014 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2015 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 -// -//======================================================================== - -#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); - } - if (unlikely((code & 0xff) < 64)) { - break; - } - 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_checkoverflow(h * line + 1); - if (data != NULL) { - 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) { if (likely(idx < size)) bitmaps[idx] = bitmap; } - JBIG2Bitmap *getBitmap(Guint idx) { return (idx < size) ? bitmaps[idx] : NULL; } - -private: - - Guint size; - JBIG2Bitmap **bitmaps; -}; - -JBIG2PatternDict::JBIG2PatternDict(Guint segNumA, Guint sizeA): - JBIG2Segment(segNumA) -{ - bitmaps = (JBIG2Bitmap **)gmallocn_checkoverflow(sizeA, sizeof(JBIG2Bitmap *)); - if (bitmaps) { - size = sizeA; - } else { - size = 0; - error(errSyntaxError, -1, "JBIG2PatternDict: can't allocate bitmaps"); - } -} - -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, Object *globalsStreamRefA): - 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(); - - if (globalsStreamA->isStream()) { - globalsStreamA->copy(&globalsStream); - if (globalsStreamRefA->isRef()) - globalsStreamRef = globalsStreamRefA->getRef(); - } - - 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; -} - -Goffset 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; - Goffset 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) { - - Goffset 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:lld} 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 (Goffset 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; - if (unlikely(symHeight > 0x40000000)) { - error(errSyntaxError, curStr->getPos(), "Bad height value in JBIG2 symbol dictionary"); - goto syntaxError; - } - 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]; - if (unlikely(refBitmap == NULL)) { - error(errSyntaxError, curStr->getPos(), "Invalid ref bitmap for symbol ID {0:ud} in JBIG2 symbol dictionary", symID); - goto syntaxError; - } - 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(); - if (unlikely(p == NULL)) { - delete collBitmap; - goto syntaxError; - } - 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) { - if (unlikely(i == 0)) ++i; - 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"); - delete codeTables; - gfree(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"); - if (unlikely(numInstances - inst > 0x800)) { - // don't loop too often with damaged JBIg2 streams - delete bitmap; - return NULL; - } - } 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; - if (unlikely(symbolBitmap->getHeight() == 0)) { - error(errSyntaxError, curStr->getPos(), "Invalid symbol bitmap height"); - if (ri) { - delete symbolBitmap; - } - delete bitmap; - return NULL; - } - bh = symbolBitmap->getHeight() - 1; - if (transposed) { - if (unlikely(s > 2 * bitmap->getHeight())) { - error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); - if (ri) { - delete symbolBitmap; - } - delete bitmap; - return NULL; - } - 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 - if (unlikely(tt - (int) bh > 2 * bitmap->getHeight())) { - error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); - if (ri) { - delete symbolBitmap; - } - delete bitmap; - return NULL; - } - bitmap->combine(symbolBitmap, s, tt - bh, combOp); - break; - case 1: // top left - if (unlikely(tt > 2 * bitmap->getHeight())) { - error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); - if (ri) { - delete symbolBitmap; - } - delete bitmap; - return NULL; - } - bitmap->combine(symbolBitmap, s, tt, combOp); - break; - case 2: // bottom right - if (unlikely(tt - (int) bh > 2 * bitmap->getHeight())) { - error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); - if (ri) { - delete symbolBitmap; - } - delete bitmap; - return NULL; - } - bitmap->combine(symbolBitmap, s, tt - bh, combOp); - break; - case 3: // top right - if (unlikely(tt > 2 * bitmap->getHeight())) { - error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); - if (ri) { - delete symbolBitmap; - } - delete bitmap; - return NULL; - } - 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->getSize(); ++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]); - if (unlikely(patternBitmap == NULL)) { - error(errSyntaxError, curStr->getPos(), "Bad pattern bitmap"); - return; - } - 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 && y + aty[0] < bitmap->getHeight()) { - 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 && y + aty[1] < bitmap->getHeight()) { - 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 && y + aty[2] < bitmap->getHeight()) { - 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 && y + aty[3] < bitmap->getHeight()) { - 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 - const int atY = y + aty[0]; - if ((atY >= 0) && (atY < bitmap->getHeight())) { - atP0 = bitmap->getDataPtr() + atY * 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 - const int atY = y + aty[0]; - if ((atY >= 0) && (atY < bitmap->getHeight())) { - atP0 = bitmap->getDataPtr() + atY * 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 - const int atY = y + aty[0]; - if ((atY >= 0) && (atY < bitmap->getHeight())) { - atP0 = bitmap->getDataPtr() + atY * 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 && bitmap) { - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/JBIG2Stream.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/JBIG2Stream.h deleted file mode 100644 index 1e14c5cf783..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/JBIG2Stream.h +++ /dev/null @@ -1,169 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2015 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 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, Object *globalsStreamRefA); - virtual ~JBIG2Stream(); - virtual StreamKind getKind() { return strJBIG2; } - virtual void reset(); - virtual void close(); - virtual Goffset getPos(); - virtual int getChar(); - virtual int lookChar(); - virtual GooString *getPSFilter(int psLevel, const char *indent); - virtual GBool isBinary(GBool last = gTrue); - virtual Object *getGlobalsStream() { return &globalsStream; } - virtual Ref getGlobalsStreamRef() { return globalsStreamRef; } - -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; - Ref globalsStreamRef; - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/JPEG2000Stream.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/JPEG2000Stream.cc deleted file mode 100644 index 35e98b86ebc..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/JPEG2000Stream.cc +++ /dev/null @@ -1,448 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright 2014 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright 2013, 2014 Adrian Johnson <ajohnson@redneon.com> -// Copyright 2015 Adam Reichold <adam.reichold@t-online.de> -// -// Licensed under GPLv2 or later -// -//======================================================================== - -#include "config.h" -#include "JPEG2000Stream.h" -#include <openjpeg.h> - -#define OPENJPEG_VERSION_ENCODE(major, minor, micro) ( \ - ((major) * 10000) \ - + ((minor) * 100) \ - + ((micro) * 1)) - -#ifdef USE_OPENJPEG2 -#ifdef OPJ_VERSION_MAJOR -#define OPENJPEG_VERSION OPENJPEG_VERSION_ENCODE(OPJ_VERSION_MAJOR, OPJ_VERSION_MINOR, OPJ_VERSION_BUILD) -#else -// OpenJPEG started providing version macros in version 2.1. -// If the version macro is not found, set the version to 2.0.0 and -// assume there will be no API changes in 2.0.x. -#define OPENJPEG_VERSION OPENJPEG_VERSION_ENCODE(2, 0, 0) -#endif -#endif - -struct JPXStreamPrivate { - opj_image_t *image; - int counter; - int ccounter; - int npixels; - int ncomps; - GBool inited; -#ifdef USE_OPENJPEG1 - opj_dinfo_t *dinfo; - void init2(unsigned char *buf, int bufLen, OPJ_CODEC_FORMAT format); -#endif -#ifdef USE_OPENJPEG2 - void init2(OPJ_CODEC_FORMAT format, unsigned char *data, int length); -#endif -}; - -static inline int doLookChar(JPXStreamPrivate* priv) { - if (unlikely(priv->counter >= priv->npixels)) - return EOF; - - return ((unsigned char *)priv->image->comps[priv->ccounter].data)[priv->counter]; -} - -static inline int doGetChar(JPXStreamPrivate* priv) { - const int result = doLookChar(priv); - if (++priv->ccounter == priv->ncomps) { - priv->ccounter = 0; - ++priv->counter; - } - return result; -} - -JPXStream::JPXStream(Stream *strA) : FilterStream(strA) { - priv = new JPXStreamPrivate; - priv->inited = gFalse; - priv->image = NULL; - priv->npixels = 0; - priv->ncomps = 0; -#ifdef USE_OPENJPEG1 - priv->dinfo = NULL; -#endif -} - -JPXStream::~JPXStream() { - delete str; - close(); - delete priv; -} - -void JPXStream::reset() { - priv->counter = 0; - priv->ccounter = 0; -} - -void JPXStream::close() { - if (priv->image != NULL) { - opj_image_destroy(priv->image); - priv->image = NULL; - priv->npixels = 0; - } - -#ifdef USE_OPENJPEG1 - if (priv->dinfo != NULL) { - opj_destroy_decompress(priv->dinfo); - priv->dinfo = NULL; - } -#endif -} - -Goffset JPXStream::getPos() { - return priv->counter * priv->ncomps + priv->ccounter; -} - -int JPXStream::getChars(int nChars, Guchar *buffer) { - if (unlikely(priv->inited == gFalse)) { init(); } - - for (int i = 0; i < nChars; ++i) { - const int c = doGetChar(priv); - if (likely(c != EOF)) buffer[i] = c; - else return i; - } - return nChars; -} - -int JPXStream::getChar() { - if (unlikely(priv->inited == gFalse)) { init(); } - - return doGetChar(priv); -} - -int JPXStream::lookChar() { - if (unlikely(priv->inited == gFalse)) { init(); } - - return doLookChar(priv); -} - -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 (unlikely(priv->inited == gFalse)) { init(); } - - *bitsPerComponent = 8; - if (priv->image && priv->image->numcomps == 3) - *csMode = streamCSDeviceRGB; - else if (priv->image && priv->image->numcomps == 4) - *csMode = streamCSDeviceCMYK; - else - *csMode = streamCSDeviceGray; -} - - -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); -} - -#ifdef USE_OPENJPEG1 - -#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); - priv->init2(buf, length, CODEC_JP2); - free(buf); - - if (priv->image) { - priv->npixels = priv->image->comps[0].w * priv->image->comps[0].h; - priv->ncomps = priv->image->numcomps; - for (int component = 0; component < priv->ncomps; component++) { - if (priv->image->comps[component].data == NULL) { - close(); - break; - } - unsigned char *cdata = (unsigned char *)priv->image->comps[component].data; - int adjust = 0; - if (priv->image->comps[component].prec > 8) - adjust = priv->image->comps[component].prec - 8; - int sgndcorr = 0; - if (priv->image->comps[component].sgnd) - sgndcorr = 1 << (priv->image->comps[0].prec - 1); - for (int i = 0; i < priv->npixels; i++) { - int r = priv->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 - priv->npixels = 0; - - priv->counter = 0; - priv->ccounter = 0; - priv->inited = gTrue; -} - -void JPXStreamPrivate::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(¶meters); -#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, ¶meters); - - /* 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."); - } -} -#endif - - -#ifdef USE_OPENJPEG2 -typedef struct JPXData_s -{ - unsigned char *data; - int size; - int pos; -} JPXData; - -#define BUFFER_INITIAL_SIZE 4096 - -static OPJ_SIZE_T jpxRead_callback(void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) -{ - JPXData *jpxData = (JPXData *)p_user_data; - int len; - - len = jpxData->size - jpxData->pos; - if (len < 0) - len = 0; - if (len == 0) - return (OPJ_SIZE_T)-1; /* End of file! */ - if ((OPJ_SIZE_T)len > p_nb_bytes) - len = p_nb_bytes; - memcpy(p_buffer, jpxData->data + jpxData->pos, len); - jpxData->pos += len; - return len; -} - -static OPJ_OFF_T jpxSkip_callback(OPJ_OFF_T skip, void * p_user_data) -{ - JPXData *jpxData = (JPXData *)p_user_data; - - jpxData->pos += (skip > jpxData->size - jpxData->pos) ? jpxData->size - jpxData->pos : skip; - /* Always return input value to avoid "Problem with skipping JPEG2000 box, stream error" */ - return skip; -} - -static OPJ_BOOL jpxSeek_callback(OPJ_OFF_T seek_pos, void * p_user_data) -{ - JPXData *jpxData = (JPXData *)p_user_data; - - if (seek_pos > jpxData->size) - return OPJ_FALSE; - jpxData->pos = seek_pos; - return OPJ_TRUE; -} - -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); - priv->init2(OPJ_CODEC_JP2, buf, length); - gfree(buf); - - if (priv->image) { - priv->npixels = priv->image->comps[0].w * priv->image->comps[0].h; - priv->ncomps = priv->image->numcomps; - for (int component = 0; component < priv->ncomps; component++) { - if (priv->image->comps[component].data == NULL) { - close(); - break; - } - unsigned char *cdata = (unsigned char *)priv->image->comps[component].data; - int adjust = 0; - if (priv->image->comps[component].prec > 8) - adjust = priv->image->comps[component].prec - 8; - int sgndcorr = 0; - if (priv->image->comps[component].sgnd) - sgndcorr = 1 << (priv->image->comps[0].prec - 1); - for (int i = 0; i < priv->npixels; i++) { - int r = priv->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 { - priv->npixels = 0; - } - - priv->counter = 0; - priv->ccounter = 0; - priv->inited = gTrue; -} - -void JPXStreamPrivate::init2(OPJ_CODEC_FORMAT format, unsigned char *buf, int length) -{ - JPXData jpxData; - - jpxData.data = buf; - jpxData.pos = 0; - jpxData.size = length; - - opj_stream_t *stream; - - stream = opj_stream_default_create(OPJ_TRUE); - -#if OPENJPEG_VERSION >= OPENJPEG_VERSION_ENCODE(2, 1, 0) - opj_stream_set_user_data (stream, &jpxData, NULL); -#else - opj_stream_set_user_data (stream, &jpxData); -#endif - - opj_stream_set_read_function(stream, jpxRead_callback); - opj_stream_set_skip_function(stream, jpxSkip_callback); - opj_stream_set_seek_function(stream, jpxSeek_callback); - /* Set the length to avoid an assert */ - opj_stream_set_user_data_length(stream, length); - - opj_codec_t *decoder; - - /* Use default decompression parameters */ - opj_dparameters_t parameters; - opj_set_default_decoder_parameters(¶meters); - parameters.flags |= OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; - - /* Get the decoder handle of the format */ - decoder = opj_create_decompress(format); - if (decoder == NULL) { - error(errSyntaxWarning, -1, "Unable to create decoder"); - goto error; - } - - /* Catch events using our callbacks */ - opj_set_warning_handler(decoder, libopenjpeg_warning_callback, NULL); - opj_set_error_handler(decoder, libopenjpeg_error_callback, NULL); - - /* Setup the decoder decoding parameters */ - if (!opj_setup_decoder(decoder, ¶meters)) { - error(errSyntaxWarning, -1, "Unable to set decoder parameters"); - goto error; - } - - /* Decode the stream and fill the image structure */ - image = NULL; - if (!opj_read_header(stream, decoder, &image)) { - error(errSyntaxWarning, -1, "Unable to read header"); - goto error; - } - - /* Optional if you want decode the entire image */ - if (!opj_set_decode_area(decoder, image, parameters.DA_x0, - parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)){ - error(errSyntaxWarning, -1, "X2"); - goto error; - } - - /* Get the decoded image */ - if (!(opj_decode(decoder, stream, image) && opj_end_decompress(decoder, stream))) { - error(errSyntaxWarning, -1, "Unable to decode image"); - goto error; - } - - opj_destroy_codec(decoder); - opj_stream_destroy(stream); - - if (image != NULL) - return; - -error: - opj_destroy_codec(decoder); - if (format == OPJ_CODEC_JP2) { - error(errSyntaxWarning, -1, "Did no succeed opening JPX Stream as JP2, trying as J2K."); - init2(OPJ_CODEC_J2K, buf, length); - } else if (format == OPJ_CODEC_J2K) { - error(errSyntaxWarning, -1, "Did no succeed opening JPX Stream as J2K, trying as JPT."); - init2(OPJ_CODEC_JPT, buf, length); - } else { - error(errSyntaxError, -1, "Did no succeed opening JPX Stream."); - } -} -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/JPEG2000Stream.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/JPEG2000Stream.h deleted file mode 100644 index 73b6bdd97b8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/JPEG2000Stream.h +++ /dev/null @@ -1,55 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright 2013, 2014 Adrian Johnson <ajohnson@redneon.com> -// Copyright 2015 Adam Reichold <adam.reichold@t-online.de> -// -// Licensed under GPLv2 or later -// -//======================================================================== - - -#ifndef JPEG2000STREAM_H -#define JPEG2000STREAM_H - -#include "config.h" -#include "goo/gtypes.h" -#include "Object.h" -#include "Stream.h" - -struct JPXStreamPrivate; - -class JPXStream: public FilterStream { -public: - - JPXStream(Stream *strA); - virtual ~JPXStream(); - virtual StreamKind getKind() { return strJPX; } - virtual void reset(); - virtual void close(); - virtual Goffset 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); - - int readStream(int nChars, Guchar *buffer) { - return str->doGetChars(nChars, buffer); - } -private: - JPXStream(const JPXStream &other); - JPXStream& operator=(const JPXStream &other); - JPXStreamPrivate *priv; - - void init(); - virtual GBool hasGetChars() { return true; } - virtual int getChars(int nChars, Guchar *buffer); -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/JPXStream.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/JPXStream.cc deleted file mode 100644 index 1476e6a0cfe..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/JPXStream.cc +++ /dev/null @@ -1,3478 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012 Even Rouault <even.rouault@mines-paris.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; - - curX = curY = 0; - curComp = 0; - readBufLen = 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 - if (img.tiles == NULL || tileIdx >= img.nXTiles * img.nYTiles || img.tiles[tileIdx].tileComps == NULL) { - error(errSyntaxError, getPos(), "Unexpected tileIdx in fillReadBuf in JPX stream"); - return; - } - 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; - } - if (unlikely(tx >= (tileComp->x1 - tileComp->x0))) { - error(errSyntaxError, getPos(), "Unexpected tx 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; - } - if( dataLen >= 7 ) { - for (i = 0; i < dataLen - 7; ++i) { - if (bufStr->getChar() == EOF) - break; - } - } - } - } else { - if( dataLen >= 3 ) { - for (i = 0; i < dataLen - 3; ++i) { - if (bufStr->getChar() == EOF) - break; - } - } - } - } - } else if (boxType == 0x6A703263) { // codestream - cover(3); - if (!(haveBPC && haveCSMode)) { - getImageParams2(bitsPerComponent, csMode); - } - break; - } else { - cover(4); - for (i = 0; i < dataLen; ++i) { - if (unlikely(bufStr->getChar() == EOF)) { - error(errSyntaxError, getPos(), "Unexpected EOF in getImageParams in JPX stream"); - break; - } - } - } - } - } - 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; - - // initialize in case there is a parse error - img.xSize = img.ySize = 0; - img.xOffset = img.yOffset = 0; - img.xTileSize = img.yTileSize = 0; - img.xTileOffset = img.yTileOffset = 0; - img.nComps = 0; - - // 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, nDecompLevels; - 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 >= 65535 / 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 (img.tiles == NULL || img.nXTiles * img.nYTiles == 0 || img.tiles[0].tileComps == NULL) { - error(errSyntaxError, getPos(), "Error in JPX COD marker 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(&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 (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].nDecompLevels = nDecompLevels; - 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_checkoverflow( - (img.tiles[i].tileComps[comp].nDecompLevels + 1), - sizeof(JPXResLevel)); - if (img.tiles[i].tileComps[comp].resLevels == NULL) { - error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); - return gFalse; - } - 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(&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 (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].nDecompLevels = nDecompLevels; - 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, nDecompLevels; - 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 (tileIdx >= img.nXTiles * img.nYTiles || - (tilePartIdx > 0 && !img.tiles[tileIdx].init)) { - 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(&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 (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].nDecompLevels = nDecompLevels; - 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(&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 (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].nDecompLevels = nDecompLevels; - 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; - } - } - tileComp = &tile->tileComps[tile->comp]; - if (tile->res >= tileComp->nDecompLevels + 1) { - if (++tile->comp == img.nComps) { - return gTrue; - } - } - } - 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); - const Guint stepIndex = 3*r - 2 + sb; - if (unlikely(stepIndex >= tileComp->nQuantSteps)) { - error(errSyntaxError, getPos(), - "Wrong index for quantSteps in inverseTransformLevel in JPX stream"); - break; - } - eps = (tileComp->quantSteps[stepIndex] >> 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]; - } - } - if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) { - x = tileComp->x1 - tileComp->x0 + 5; - } else { - x = tileComp->y1 - tileComp->y0 + 5; - } - if (offset + nx2 > x || nx2 == 0) { - error(errSyntaxError, getPos(), - "Invalid call of inverseTransform1D in inverseTransformLevel in JPX stream"); - return; - } - 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]; - } - } - if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) { - y = tileComp->x1 - tileComp->x0 + 5; - } else { - y = tileComp->y1 - tileComp->y0 + 5; - } - if (offset + ny2 > y || ny2 == 0) { - error(errSyntaxError, getPos(), - "Invalid call of inverseTransform1D in inverseTransformLevel in JPX stream"); - return; - } - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/JPXStream.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/JPXStream.h deleted file mode 100644 index 30855431fb4..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/JPXStream.h +++ /dev/null @@ -1,338 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Lexer.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Lexer.cc deleted file mode 100644 index 952967a998a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Lexer.cc +++ /dev/null @@ -1,645 +0,0 @@ -//======================================================================== -// -// 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, 2012-2014 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, 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 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 <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; -static const long long LongLongSafeLimit = (LLONG_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, overflownLongLong; - int numParen; - int xi; - long long xll = 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; - overflownLongLong = 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(overflownLongLong)) { - xf = xf * 10.0 + (c - '0'); - } else if (unlikely (overflownInteger)) { - if (unlikely(xll > LongLongSafeLimit) && - (xll > (LLONG_MAX - (c - '0')) / 10.0)) { - overflownLongLong = gTrue; - xf = xll * 10.0 + (c - '0'); - } else { - xll = xll * 10 + (c - '0'); - } - } else { - if (unlikely(xi > IntegerSafeLimit) && - (xi > (INT_MAX - (c - '0')) / 10.0)) { - overflownInteger = gTrue; - xll = xi * 10LL + (c - '0'); - } else { - xi = xi * 10 + (c - '0'); - } - } - } else if (c == '.') { - getChar(); - goto doReal; - } else { - break; - } - } - if (neg) { - xi = -xi; - xll = -xll; - xf = -xf; - } - if (unlikely(overflownInteger)) { - if (overflownLongLong) { - obj->initReal(xf); - } else { - if (unlikely(xll == INT_MIN)) { - obj->initInt(INT_MIN); - } else { - obj->initInt64(xll); - } - } - } else { - obj->initInt(xi); - } - break; - doReal: - if (likely(!overflownInteger)) { - xf = xi; - } else if (!overflownLongLong) { - xf = xll; - } - 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; -} - -Object *Lexer::getObj(Object *obj, const char *cmdA, int objNum) { - char *p; - int c; - GBool comment; - int n; - - // skip whitespace and comments - comment = gFalse; - const char *cmd1 = tokBuf; - *tokBuf = 0; - while (strcmp(cmdA, cmd1) && (objNum < 0 || (xref && xref->getNumEntry(getPos()) == objNum))) { - 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; - } - } - p = tokBuf; - *p++ = c; - n = 1; - while ((c = lookChar()) != EOF && specialChars[c] == 0) { - getChar(); - if (++n == tokBufSize) { - break; - } - *p++ = c; - } - *p = '\0'; - } - obj->initCmd(tokBuf); - - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Lexer.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Lexer.h deleted file mode 100644 index 02b6cdc6923..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Lexer.h +++ /dev/null @@ -1,108 +0,0 @@ -//======================================================================== -// -// 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, 2013 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 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 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); - Object *getObj(Object *obj, const char *cmdA, int objNum); - - // 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. - Goffset getPos() - { return curStr.isStream() ? curStr.streamGetPos() : -1; } - - // Set position in file. - void setPos(Goffset 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Linearization.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Linearization.cc deleted file mode 100644 index 33331d1af37..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Linearization.cc +++ /dev/null @@ -1,222 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Linearization.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Linearization.h deleted file mode 100644 index 6728a750aba..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Linearization.h +++ /dev/null @@ -1,45 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Link.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Link.cc deleted file mode 100644 index 4ab5f52ceda..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Link.cc +++ /dev/null @@ -1,951 +0,0 @@ -//======================================================================== -// -// 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-2014 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> -// Copyright (C) 2009 Ilya Gorenbein <igorenbein@finjan.com> -// Copyright (C) 2012 Tobias Koening <tobias.koenig@kdab.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()) { - zoom = obj2.getNum(); - changeZoom = (zoom == 0) ? gFalse : gTrue; - } 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(); - if (uri->getLength() > 0) { - 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 = NoRendition; - media = NULL; - js = NULL; - int operationCode = -1; - - 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()) { - operationCode = tmp.getInt(); - if (!js && (operationCode < 0 || operationCode > 4)) { - error(errSyntaxWarning, -1, "Invalid Rendition Action: unrecognized operation valued: {0:d}", operationCode); - } else { - Object obj1; - - // retrieve rendition object - if (obj->dictLookup("R", &renditionObj)->isDict()) { - media = new MediaRendition(&renditionObj); - } else if (operationCode == 0 || operationCode == 4) { - error(errSyntaxWarning, -1, "Invalid Rendition Action: no R field with op = {0:d}", operationCode); - 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}", operationCode); - screenRef.free(); - } - } - - switch (operationCode) { - case 0: - operation = PlayRendition; - break; - case 1: - operation = StopRendition; - break; - case 2: - operation = PauseRendition; - break; - case 3: - operation = ResumeRendition; - break; - case 4: - operation = PlayRendition; - break; - } - } 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Link.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Link.h deleted file mode 100644 index fc2abe60052..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Link.h +++ /dev/null @@ -1,501 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2012 Tobias Koening <tobias.koenig@kdab.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 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, // rendition action - 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: - /** - * Describes the possible rendition operations. - */ - enum RenditionOperation { - NoRendition, - PlayRendition, - StopRendition, - PauseRendition, - ResumeRendition - }; - - 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(); } - - RenditionOperation getOperation() { return operation; } - - MediaRendition* getMedia() { return media; } - - GooString *getScript() { return js; } - -private: - - Object screenRef; - Object renditionObj; - RenditionOperation 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/Build/source/libs/poppler/poppler-0.35.0/poppler/LocalPDFDocBuilder.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/LocalPDFDocBuilder.cc deleted file mode 100644 index 6f6f1fca9f7..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/LocalPDFDocBuilder.cc +++ /dev/null @@ -1,46 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/LocalPDFDocBuilder.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/LocalPDFDocBuilder.h deleted file mode 100644 index c2b1d903885..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/LocalPDFDocBuilder.h +++ /dev/null @@ -1,33 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Makefile.am b/Build/source/libs/poppler/poppler-0.35.0/poppler/Makefile.am deleted file mode 100644 index 3c943bad331..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Makefile.am +++ /dev/null @@ -1,317 +0,0 @@ -CFLAGS+=$(PTHREAD_CFLAGS) -CXXFLAGS+=$(PTHREAD_CFLAGS) - -AM_CPPFLAGS = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/goo - -lib_LTLIBRARIES = libpoppler.la - -if BUILD_CAIRO_OUTPUT -noinst_LTLIBRARIES = libpoppler-cairo.la -endif - -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_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 - -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 \ - StructElement.h \ - StructTreeRoot.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 \ - MarkedContentOutputDev.h \ - SecurityHandler.h \ - UTF.h \ - UTF8.h \ - XpdfPluginAPI.h \ - Sound.h -nodist_poppler_include_HEADERS = poppler-config.h - -endif - -libpoppler_la_SOURCES = \ - $(splash_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 \ - StructTreeRoot.cc \ - StructElement.cc \ - strtok_r.cpp \ - UnicodeMap.cc \ - UnicodeTypeTable.cc \ - UTF.cc \ - ViewerPreferences.cc \ - XRef.cc \ - PSOutputDev.cc \ - TextOutputDev.cc \ - MarkedContentOutputDev.cc \ - PageLabelInfo.h \ - PageLabelInfo.cc \ - SecurityHandler.cc \ - Sound.cc \ - XpdfPluginAPI.cc - -libpoppler_la_CPPFLAGS = \ - $(cms_includes) \ - $(splash_includes) \ - $(libjpeg_includes) \ - $(libtiff_includes) \ - $(libjpeg2000_includes) \ - $(libpng_includes) \ - $(libcurl_includes) \ - $(FREETYPE_CFLAGS) \ - $(FONTCONFIG_CFLAGS) \ - $(AM_CPPFLAGS) - -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 54:0:0 \ - @create_shared_lib@ \ - @auto_import_flags@ - -libpoppler_cairo_la_SOURCES = \ - CairoFontEngine.cc \ - CairoFontEngine.h \ - CairoOutputDev.cc \ - CairoOutputDev.h \ - CairoRescaleBox.cc \ - CairoRescaleBox.h - -libpoppler_cairo_la_CPPFLAGS = \ - $(CAIRO_CFLAGS) \ - $(AM_CPPFLAGS) - -EXTRA_DIST = gen-unicode-tables.py \ - GlobalParamsWin.cc \ - PageLabelInfo_p.h diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/MarkedContentOutputDev.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/MarkedContentOutputDev.cc deleted file mode 100644 index 7fdd8f54c53..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/MarkedContentOutputDev.cc +++ /dev/null @@ -1,212 +0,0 @@ -//======================================================================== -// -// MarkedContentOutputDev.cc -// -// This file is licensed under the GPLv2 or later -// -// Copyright 2013 Igalia S.L. -// -//======================================================================== - -#include "MarkedContentOutputDev.h" -#include "GlobalParams.h" -#include "UnicodeMap.h" -#include "GfxState.h" -#include "GfxFont.h" -#include "Annot.h" -#include <vector> - - -MarkedContentOutputDev::MarkedContentOutputDev(int mcidA): - currentFont(NULL), - currentText(NULL), - mcid(mcidA), - pageWidth(0.0), - pageHeight(0.0), - unicodeMap(NULL) -{ - currentColor.r = currentColor.g = currentColor.b = 0; -} - - -MarkedContentOutputDev::~MarkedContentOutputDev() -{ - if (unicodeMap) - unicodeMap->decRefCnt(); - if (currentFont) - currentFont->decRefCnt(); - delete currentText; -} - - -void MarkedContentOutputDev::endSpan() -{ - if (currentText && currentText->getLength()) { - // The TextSpan takes ownership of currentText and - // increases the reference count for currentFont. - textSpans.push_back(TextSpan(currentText, - currentFont, - currentColor)); - } - currentText = NULL; -} - - -void MarkedContentOutputDev::startPage(int pageNum, GfxState *state, XRef *xref) -{ - if (state) { - pageWidth = state->getPageWidth(); - pageHeight = state->getPageHeight(); - } else { - pageWidth = pageHeight = 0.0; - } -} - - -void MarkedContentOutputDev::endPage() -{ - pageWidth = pageHeight = 0.0; -} - - -void MarkedContentOutputDev::beginMarkedContent(char *name, Dict *properties) -{ - int id = -1; - if (properties) - properties->lookupInt("MCID", NULL, &id); - - if (id == -1) - return; - - // The stack keep track of MCIDs of nested marked content. - if (inMarkedContent() || id == mcid) - mcidStack.push_back(id); -} - - -void MarkedContentOutputDev::endMarkedContent(GfxState *state) -{ - if (inMarkedContent()) { - mcidStack.pop_back(); - // The outer marked content sequence MCID was popped, ensure - // that the last piece of text collected ends up in a TextSpan. - if (!inMarkedContent()) - endSpan(); - } -} - - -bool MarkedContentOutputDev::needFontChange(GfxFont* font) const -{ - if (currentFont == font) - return gFalse; - - if (!currentFont) - return font != NULL && font->isOk(); - - if (font == NULL) - return gTrue; - - // Two non-null valid fonts are the same if they point to the same Ref - if (currentFont->getID()->num == font->getID()->num && - currentFont->getID()->gen == font->getID()->gen) - return gFalse; - - return gTrue; -} - - -void MarkedContentOutputDev::drawChar(GfxState *state, - double xx, double yy, - double dx, double dy, - double ox, double oy, - CharCode c, int nBytes, - Unicode *u, int uLen) -{ - if (!inMarkedContent() || !uLen) - return; - - - // Color changes are tracked here so the color can be chosen depending on - // the render mode (for mode 1 stroke color is used), so there is no need - // to implement both updateFillColor() and updateStrokeColor(). - GBool colorChange = gFalse; - GfxRGB color; - if ((state->getRender() & 3) == 1) - state->getStrokeRGB(&color); - else - state->getFillRGB(&color); - - colorChange = (color.r != currentColor.r || - color.g != currentColor.g || - color.b != currentColor.b); - - // Check also for font changes. - GBool fontChange = needFontChange(state->getFont()); - - // Save a span with the current changes. - if (colorChange || fontChange) { - endSpan(); - } - - // Perform the color/font changes. - if (colorChange) - currentColor = color; - - if (fontChange) { - if (currentFont != NULL) { - currentFont->decRefCnt(); - currentFont = NULL; - } - if (state->getFont() != NULL) { - currentFont = state->getFont(); - currentFont->incRefCnt(); - } - } - - - double sp, dx2, dy2, w1, h1, x1, y1; - - // 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); - state->transform(xx, yy, &x1, &y1); - - // Throw away characters that are not inside the page boundaries. - if (x1 + w1 < 0 || x1 > pageWidth || y1 + h1 < 0 || y1 > pageHeight) - return; - - // Make a sanity check on character size. Note: (x != x) <-> isnan(x) - if (x1 != x1 || y1 != y1 || w1 != w1 || h1 != h1) - return; - - for (int i = 0; i < uLen; i++) { - // Soft hyphen markers are skipped, as they are invisible unless - // rendering is done to an actual device and the hyphenation hint - // used. MarkedContentOutputDev extracts the *visible* text content. - if (u[i] != 0x00AD) { - // Add the UTF-8 sequence to the current text span. - if (!unicodeMap) - unicodeMap = globalParams->getTextEncoding(); - - char buf[8]; - int n = unicodeMap->mapUnicode(u[i], buf, sizeof(buf)); - if (n > 0) { - if (currentText == NULL) - currentText = new GooString(); - currentText->append(buf, n); - } - } - } -} - - -const TextSpanArray& MarkedContentOutputDev::getTextSpans() const -{ - return textSpans; -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/MarkedContentOutputDev.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/MarkedContentOutputDev.h deleted file mode 100644 index 4ea60c255a1..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/MarkedContentOutputDev.h +++ /dev/null @@ -1,130 +0,0 @@ -//======================================================================== -// -// MarkedContentOutputDev.h -// -// This file is licensed under the GPLv2 or later -// -// Copyright 2013 Igalia S.L. -// -//======================================================================== - -#ifndef MARKEDCONTENTOUTPUTDEV_H -#define MARKEDCONTENTOUTPUTDEV_H - -#include "goo/gtypes.h" -#include "goo/gmem.h" -#include "OutputDev.h" -#include "GfxState.h" -#include "GfxFont.h" -#include <vector> - -class Dict; -class UnicodeMap; - - -class TextSpan { -public: - TextSpan(const TextSpan& other): data(other.data) { - data->refcount++; - } - - TextSpan& operator=(const TextSpan& other) { - if (this != &other) { - data = other.data; - data->refcount++; - } - return *this; - } - - ~TextSpan() { - if (data && --data->refcount == 0) - delete data; - } - - GfxFont* getFont() const { return data->font; } - GooString* getText() const { return data->text; } - GfxRGB& getColor() const { return data->color; } - -private: - // Note: Takes ownership of strings, increases refcount for font. - TextSpan(GooString *text, - GfxFont *font, - const GfxRGB& color) - : data(new Data) { - data->text = text; - data->font = font; - data->color = color; - if (data->font) - data->font->incRefCnt(); - } - - struct Data { - GfxFont *font; - GooString *text; - GfxRGB color; - unsigned refcount; - - Data(): refcount(1) {} - - ~Data() { - assert(refcount == 0); - if (font) - font->decRefCnt(); - delete text; - } - }; - - Data *data; - - friend class MarkedContentOutputDev; -}; - - -typedef std::vector<TextSpan> TextSpanArray; - - -class MarkedContentOutputDev: public OutputDev { -public: - MarkedContentOutputDev(int mcidA); - virtual ~MarkedContentOutputDev(); - - virtual GBool isOk() { return gTrue; } - virtual GBool upsideDown() { return gTrue; } - virtual GBool useDrawChar() { return gTrue; } - virtual GBool interpretType3Chars() { return gFalse; } - virtual GBool needNonText() { return gFalse; } - virtual GBool needCharCount() { return gFalse; } - - virtual void startPage(int pageNum, GfxState *state, XRef *xref); - virtual void endPage(); - - virtual void drawChar(GfxState *state, - double xx, double yy, - double dx, double dy, - double ox, double oy, - CharCode c, int nBytes, - Unicode *u, int uLen); - - virtual void beginMarkedContent(char *name, Dict *properties); - virtual void endMarkedContent(GfxState *state); - - const TextSpanArray& getTextSpans() const; - -private: - - void endSpan(); - bool inMarkedContent() const { return mcidStack.size() > 0; } - bool needFontChange(GfxFont* font) const; - - GfxFont *currentFont; - GooString *currentText; - GfxRGB currentColor; - TextSpanArray textSpans; - int mcid; - std::vector<int> mcidStack; - double pageWidth; - double pageHeight; - UnicodeMap *unicodeMap; -}; - -#endif /* !MARKEDCONTENTOUTPUTDEV_H */ diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Movie.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Movie.cc deleted file mode 100644 index f68b6adcd4d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Movie.cc +++ /dev/null @@ -1,285 +0,0 @@ -//********************************************************************************* -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Movie.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Movie.h deleted file mode 100644 index 1a162659179..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Movie.h +++ /dev/null @@ -1,110 +0,0 @@ -//********************************************************************************* -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/NameToCharCode.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/NameToCharCode.cc deleted file mode 100644 index 5448dc4ce10..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/NameToCharCode.cc +++ /dev/null @@ -1,116 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/NameToCharCode.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/NameToCharCode.h deleted file mode 100644 index 5b1092bb96b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/NameToCharCode.h +++ /dev/null @@ -1,40 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/NameToUnicodeTable.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/NameToUnicodeTable.h deleted file mode 100644 index 827edbaee60..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/NameToUnicodeTable.h +++ /dev/null @@ -1,4484 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> -// -// 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> - -struct NameToUnicodeTab { - Unicode u; - const char *name; -}; - -// map character names to Unicode -static struct NameToUnicodeTab nameToUnicodeTextTab[] = { - {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"}, - {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 } -}; - -// map ZapfDingbats names to Unicode -static struct NameToUnicodeTab nameToUnicodeZapfDingbatsTab[] = { - {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"}, - { 0, NULL } -}; diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Object.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Object.cc deleted file mode 100644 index d06bb39fb6d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Object.cc +++ /dev/null @@ -1,252 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 <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", - "integer64" -}; - -#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 objInt64: - fprintf(f, "%lld", int64g); - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Object.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Object.h deleted file mode 100644 index a4a4930ea9d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Object.h +++ /dev/null @@ -1,373 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Adrian Perez de Castro <aperez@igalia.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 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, "Call to Object where the object was type {0:d}, " \ - "not the expected type {1:d}", type, wanted_type); \ - abort(); \ - } - -#define OBJECT_3TYPES_CHECK(wanted_type1, wanted_type2, wanted_type3) \ - if (unlikely(type != wanted_type1) && unlikely(type != wanted_type2) && unlikely(type != wanted_type3)) { \ - error(errInternal, 0, "Call to Object where the object was type {0:d}, " \ - "not the expected type {1:d}, {2:d} or {3:d}", type, wanted_type1, wanted_type2, wanted_type3); \ - 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 - objInt64 // integer with at least 64-bits -}; - -#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(const char *cmdA) - { initObj(objCmd); cmd = copyString(cmdA); return this; } - Object *initError() - { initObj(objError); return this; } - Object *initEOF() - { initObj(objEOF); return this; } - Object *initInt64(long long int64gA) - { initObj(objInt64); int64g = int64gA; 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 || type == objInt64; } - 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 isInt64() { return type == objInt64; } - - // Special type checking. - GBool isName(const char *nameA) - { return type == objName && !strcmp(name, nameA); } - GBool isDict(const char *dictType); - GBool isStream(const 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; } - - // Note: integers larger than 2^53 can not be exactly represented by a double. - // Where the exact value of integers up to 2^63 is required, use isInt64()/getInt64(). - double getNum() { OBJECT_3TYPES_CHECK(objInt, objInt64, objReal); - return type == objInt ? (double)intg : type == objInt64 ? (double)int64g : real; } - GooString *getString() { OBJECT_TYPE_CHECK(objString); return string; } - // After takeString() the only method that should be called for the object is free() - // because the object it's not expected to have a NULL string. - GooString *takeString() { - OBJECT_TYPE_CHECK(objString); GooString *s = string; string = NULL; return s; } - 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; } - long long getInt64() { OBJECT_TYPE_CHECK(objInt64); return int64g; } - - // Array accessors. - int arrayGetLength(); - void arrayAdd(Object *elem); - void arrayRemove(int i); - Object *arrayGet(int i, Object *obj, int recursion); - 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(const char *dictType); - void streamReset(); - void streamClose(); - int streamGetChar(); - int streamGetChars(int nChars, Guchar *buffer); - int streamLookChar(); - char *streamGetLine(char *buf, int size); - Goffset streamGetPos(); - void streamSetPos(Goffset 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 - long long int64g; // 64-bit 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, int recursion = 0) - { OBJECT_TYPE_CHECK(objArray); return array->get(i, obj, recursion); } - -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(const char *dictType) - { OBJECT_TYPE_CHECK(objStream); return stream->getDict()->is(dictType); } - -inline GBool Object::isStream(const 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 Goffset Object::streamGetPos() - { OBJECT_TYPE_CHECK(objStream); return stream->getPos(); } - -inline void Object::streamSetPos(Goffset 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/Build/source/libs/poppler/poppler-0.35.0/poppler/OptionalContent.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/OptionalContent.cc deleted file mode 100644 index e0d49bc9a5f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/OptionalContent.cc +++ /dev/null @@ -1,553 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/OptionalContent.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/OptionalContent.h deleted file mode 100644 index 2e416462003..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/OptionalContent.h +++ /dev/null @@ -1,140 +0,0 @@ -//======================================================================== -// -// OptionalContent.h -// -// Copyright 2007 Brad Hards <bradh@kde.org> -// Copyright 2008 Carlos Garcia Campos <carlosgc@gnome.org> -// Copyright 2013 Albert Astals Cid <aacid@kde.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: - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Outline.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Outline.cc deleted file mode 100644 index bd4e6d01b6d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Outline.cc +++ /dev/null @@ -1,188 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Outline.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Outline.h deleted file mode 100644 index 90190e69280..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Outline.h +++ /dev/null @@ -1,89 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/OutputDev.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/OutputDev.cc deleted file mode 100644 index ee3cf5a30ff..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/OutputDev.cc +++ /dev/null @@ -1,201 +0,0 @@ -//======================================================================== -// -// 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, 2013 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; -} - -#ifdef USE_CMS -PopplerCache *OutputDev::getIccColorSpaceCache() -{ - return &iccColorSpaceCache; -} -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/OutputDev.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/OutputDev.h deleted file mode 100644 index e8a7a4794ce..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/OutputDev.h +++ /dev/null @@ -1,350 +0,0 @@ -//======================================================================== -// -// 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-2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2009, 2011 Carlos Garcia Campos <carlosgc@gnome.org> -// Copyright (C) 2009, 2012, 2013 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com> -// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// 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 -// -//======================================================================== - -#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" -#include "PopplerCache.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() -#ifdef USE_CMS - : iccColorSpaceCache(5) -#endif - { - 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; } - - // Does this device need to clip pages to the crop box even when the - // box is the crop box? - virtual GBool needClipToCropBox() { 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, XRef *xref) {} - - // 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 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 - -#ifdef USE_CMS - PopplerCache *getIccColorSpaceCache(); -#endif - -private: - - double defCTM[6]; // default coordinate transform matrix - double defICTM[6]; // inverse of default CTM - GooHash *profileHash; - -#ifdef USE_CMS - PopplerCache iccColorSpaceCache; -#endif -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDoc.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDoc.cc deleted file mode 100644 index 71a1efe269d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDoc.cc +++ /dev/null @@ -1,1939 +0,0 @@ -//======================================================================== -// -// 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-2014 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-2012, 2014 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-2014 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013, 2014 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> -// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com> -// Copyright (C) 2015 Li Junling <lijunling@sina.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 <ctype.h> -#include <locale.h> -#include <stdio.h> -#include <errno.h> -#include <stdlib.h> -#include <stddef.h> -#include <string.h> -#include <time.h> -#include <sys/stat.h> -#include "goo/gstrtod.h" -#include "goo/GooString.h" -#include "goo/gfile.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" - -#if MULTITHREADED -# define pdfdocLocker() MutexLocker locker(&mutex) -#else -# define pdfdocLocker() -#endif - -//------------------------------------------------------------------------ - -#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() -{ -#if MULTITHREADED - gInitMutex(&mutex); -#endif - 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 = -1; - secHdlr = NULL; - pageCache = NULL; -} - -PDFDoc::PDFDoc() -{ - init(); -} - -PDFDoc::PDFDoc(GooString *fileNameA, GooString *ownerPassword, - GooString *userPassword, void *guiDataA) { - Object obj; -#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 - - // try to open file - file = GooFile::open(fileName); - 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}': {1:s}.", fileName, strerror(errno)); - errCode = errOpenFile; - return; - } - - // create stream - obj.initNull(); - str = new FileStream(file, 0, gFalse, file->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 - version.dwOSVersionInfoSize = sizeof(version); - GetVersionEx(&version); - if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { - file = GooFile::open(fileNameU); - } else { - file = GooFile::open(fileName); - } - 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, file->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) { - pdfdocLocker(); - 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()) { - if (wasReconstructed) { - delete xref; - startXRefPos = -1; - xref = new XRef(str, getStartXRef(gTrue), getMainXRefEntriesOffset(gTrue), &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) { - delete file; - } - if (fileName) { - delete fileName; - } -#ifdef _WIN32 - if (fileNameU) { - gfree(fileNameU); - } -#endif -#if MULTITHREADED - gDestroyMutex(&mutex); -#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]; - Goffset 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, GBool copyXRef) { - 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, copyXRef); - -} - -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, GBool copyXRef) { - if (getPage(page)) - getPage(page)->displaySlice(out, hDPI, vDPI, - rotate, useMediaBox, crop, - sliceX, sliceY, sliceW, sliceH, - printing, - abortCheckCbk, abortCheckCbkData, - annotDisplayDecideCbk, annotDisplayDecideCbkData, copyXRef); -} - -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(GBool tryingToReconstruct) { - if ((str->getLength()) && - (getLinearization()->getLength() == str->getLength())) - return gTrue; - else { - if (tryingToReconstruct) - return getLinearization()->getLength() > 0; - 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; - - // Make sure that special flags are set, because we are going to read - // all objects, including Unencrypted ones. - xref->scanSpecialFlags(); - - Guchar *fileKey; - CryptAlgorithm encAlgorithm; - int keyLength; - xref->getEncryptionParameters(&fileKey, &encAlgorithm, &keyLength); - - if (pageNo < 1 || pageNo > getNumPages() || !getCatalog()->getPage(pageNo)) { - 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); - 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()); - - if (secHdlr != NULL && !secHdlr->isUnencrypted()) { - yRef->setEncryption(secHdlr->getPermissionFlags(), - secHdlr->getOwnerPasswordOk(), fileKey, keyLength, secHdlr->getEncVersion(), secHdlr->getEncRevision(), encAlgorithm); - } - countRef = new XRef(); - Object *trailerObj = getXRef()->getTrailerDict(); - if (trailerObj->isDict()) { - markPageObjects(trailerObj->getDict(), yRef, countRef, 0, refPage->num, rootNum + 2); - } - 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, refPage->num, rootNum + 2); - 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, annotsObj, afObj; - getXRef()->getCatalog(&catObj); - Dict *catDict = catObj.getDict(); - catDict->lookup("Pages", &pagesObj); - catDict->lookupNF("AcroForm", &afObj); - if (!afObj.isNull()) { - markAcroForm(&afObj, yRef, countRef, 0, refPage->num, rootNum + 2); - afObj.free(); - } - Dict *pagesDict = pagesObj.getDict(); - pagesDict->lookup("Resources", &resourcesObj); - if (resourcesObj.isDict()) - markPageObjects(resourcesObj.getDict(), yRef, countRef, 0, refPage->num, rootNum + 2); - markPageObjects(catDict, yRef, countRef, 0, refPage->num, rootNum + 2); - - Dict *pageDict = page.getDict(); - markPageObjects(pageDict, yRef, countRef, 0, refPage->num, rootNum + 2); - pageDict->lookupNF("Annots", &annotsObj); - if (!annotsObj.isNull()) { - markAnnotations(&annotsObj, yRef, countRef, 0, refPage->num, rootNum + 2); - annotsObj.free(); - } - yRef->markUnencrypted(); - 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, outStr, getXRef(), 0, NULL, cryptRC4, 0, 0, 0); - value.free(); - } - } - catObj.free(); - pagesObj.free(); - outStr->printf(">>\nendobj\n"); - - 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, outStr, getXRef(), 0, NULL, cryptRC4, 0, 0, 0); - resourcesObj.free(); - } - outStr->printf(">>\n"); - outStr->printf("endobj\n"); - - 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, outStr, getXRef(), 0, NULL, cryptRC4, 0, 0, 0); - } - value.free(); - } - outStr->printf(" >>\nendobj\n"); - page.free(); - - Goffset uxrefOffset = outStr->getPos(); - Ref ref; - ref.num = rootNum; - ref.gen = 0; - Dict *trailerDict = createTrailerDict(rootNum + 3, 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; - delete outStr; - - 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)->getFlag(XRefEntry::Updated)) { - updated = gTrue; - break; - } - } - - if (!updated && mode == writeStandard) { - // simply copy the original file - saveWithoutChangesAs (outStr); - } else if (mode == writeForceRewrite) { - saveCompleteRewrite(outStr); - } else { - saveIncrementalUpdate(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; - - BaseStream *copyStr = str->copy(); - copyStr->reset(); - while ((c = copyStr->getChar()) != EOF) { - outStr->put(c); - } - copyStr->close(); - delete copyStr; - - return errNone; -} - -void PDFDoc::saveIncrementalUpdate (OutStream* outStr) -{ - XRef *uxref; - int c; - //copy the original file - BaseStream *copyStr = str->copy(); - copyStr->reset(); - while ((c = copyStr->getChar()) != EOF) { - outStr->put(c); - } - copyStr->close(); - delete copyStr; - - Guchar *fileKey; - CryptAlgorithm encAlgorithm; - int keyLength; - xref->getEncryptionParameters(&fileKey, &encAlgorithm, &keyLength); - - uxref = new XRef(); - uxref->add(0, 65535, 0, gFalse); - xref->lock(); - 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)->getFlag(XRefEntry::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, 1); - Goffset offset = writeObjectHeader(&ref, outStr); - writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen); - writeObjectFooter(outStr); - uxref->add(ref.num, ref.gen, offset, gTrue); - obj1.free(); - } else { - uxref->add(ref.num, ref.gen, 0, gFalse); - } - } - } - xref->unlock(); - if (uxref->getNumObjects() == 0) { //we have nothing to update - delete uxref; - return; - } - - Goffset 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) -{ - // Make sure that special flags are set, because we are going to read - // all objects, including Unencrypted ones. - xref->scanSpecialFlags(); - - Guchar *fileKey; - CryptAlgorithm encAlgorithm; - int keyLength; - xref->getEncryptionParameters(&fileKey, &encAlgorithm, &keyLength); - - outStr->printf("%%PDF-%d.%d\r\n",pdfMajorVersion,pdfMinorVersion); - XRef *uxref = new XRef(); - uxref->add(0, 65535, 0, gFalse); - xref->lock(); - 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 (xref->getEntry(i)->getFlag(XRefEntry::DontRewrite)) { - // This entry must not be written, put a free entry instead (with incremented gen) - ref.num = i; - ref.gen = xref->getEntry(i)->gen + 1; - 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, 1); - Goffset offset = writeObjectHeader(&ref, outStr); - // Write unencrypted objects in unencrypted form - if (xref->getEntry(i)->getFlag(XRefEntry::Unencrypted)) { - writeObject(&obj1, outStr, NULL, cryptRC4, 0, 0, 0); - } else { - writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen); - } - writeObjectFooter(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, 1); - Goffset offset = writeObjectHeader(&ref, outStr); - writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen); - writeObjectFooter(outStr); - uxref->add(ref.num, ref.gen, offset, gTrue); - obj1.free(); - } - } - xref->unlock(); - Goffset 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, Guchar *fileKey, - CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen) -{ - 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), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); - 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() && !obj1.isInt64()) { - error (errSyntaxError, -1, "PDFDoc::writeRawStream, no Length in stream dict"); - return; - } - - Goffset length; - if (obj1.isInt()) - length = obj1.getInt(); - else - length = obj1.getInt64(); - obj1.free(); - - outStr->printf("stream\r\n"); - str->unfilteredReset(); - for (Goffset i = 0; i < length; i++) { - int c = str->getUnfilteredChar(); - if (unlikely(c == EOF)) { - error (errSyntaxError, -1, "PDFDoc::writeRawStream: EOF reading stream"); - break; - } - outStr->printf("%c", c); - } - str->reset(); - outStr->printf("\r\nendstream\r\n"); -} - -void PDFDoc::writeString (GooString* s, OutStream* outStr, Guchar *fileKey, - CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen) -{ - // Encrypt string if encryption is enabled - GooString *sEnc = NULL; - if (fileKey) { - Object obj; - EncryptStream *enc = new EncryptStream(new MemStream(s->getCString(), 0, s->getLength(), obj.initNull()), - fileKey, encAlgorithm, keyLength, objNum, objGen); - sEnc = new GooString(); - int c; - enc->reset(); - while ((c = enc->getChar()) != EOF) { - sEnc->append((char)c); - } - - delete enc; - s = sEnc; - } - - // Write data - 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(") "); - } - - delete sEnc; -} - -Goffset PDFDoc::writeObjectHeader (Ref *ref, OutStream* outStr) -{ - Goffset offset = outStr->getPos(); - outStr->printf("%i %i obj ", ref->num, ref->gen); - return offset; -} - -void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, Guint numOffset, Guchar *fileKey, - CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen) -{ - Array *array; - Object obj1; - Goffset tmp; - - switch (obj->getType()) { - case objBool: - outStr->printf("%s ", obj->getBool()?"true":"false"); - break; - case objInt: - outStr->printf("%i ", obj->getInt()); - break; - case objInt64: - outStr->printf("%lli ", obj->getInt64()); - break; - case objReal: - { - GooString s; - s.appendf("{0:.10g}", obj->getReal()); - outStr->printf("%s ", s.getCString()); - break; - } - case objString: - writeString(obj->getString(), outStr, fileKey, encAlgorithm, keyLength, objNum, objGen); - 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), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); - obj1.free(); - } - outStr->printf("] "); - break; - case objDict: - writeDictionnary (obj->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); - 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 || stream->getKind() == strCrypt) { - //we write the stream unencoded => TODO: write stream encoder - - // Encrypt stream - EncryptStream *encStream = NULL; - GBool removeFilter = gTrue; - if (stream->getKind() == strWeird && fileKey) { - Object filter; - stream->getDict()->lookup("Filter", &filter); - if (!filter.isName("Crypt")) { - if (filter.isArray()) { - for (int i = 0; i < filter.arrayGetLength(); i++) { - Object filterEle; - filter.arrayGet(i, &filterEle); - if (filterEle.isName("Crypt")) { - filterEle.free(); - removeFilter = gFalse; - break; - } - filterEle.free(); - } - if (removeFilter) { - encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen); - encStream->setAutoDelete(gFalse); - stream = encStream; - } - } else { - encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen); - encStream->setAutoDelete(gFalse); - stream = encStream; - } - } else { - removeFilter = gFalse; - } - filter.free(); - } else if (fileKey != NULL) { // Encrypt stream - encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen); - encStream->setAutoDelete(gFalse); - stream = encStream; - } - - stream->reset(); - //recalculate stream length - tmp = 0; - for (int c=stream->getChar(); c!=EOF; c=stream->getChar()) { - tmp++; - } - obj1.initInt64(tmp); - stream->getDict()->set("Length", &obj1); - - //Remove Stream encoding - if (removeFilter) { - stream->getDict()->remove("Filter"); - } - stream->getDict()->remove("DecodeParms"); - - writeDictionnary (stream->getDict(),outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); - writeStream (stream,outStr); - delete encStream; - obj1.free(); - } else { - //raw stream copy - FilterStream *fs = dynamic_cast<FilterStream*>(stream); - if (fs) { - BaseStream *bs = fs->getBaseStream(); - if (bs) { - Goffset streamEnd; - if (xRef->getStreamEnd(bs->getStart(), &streamEnd)) { - Object val; - val.initInt64(streamEnd - bs->getStart()); - stream->getDict()->set("Length", &val); - } - } - } - writeDictionnary (stream->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); - 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; - } -} - -void PDFDoc::writeObjectFooter (OutStream* outStr) -{ - outStr->printf("endobj\r\n"); -} - -Dict *PDFDoc::createTrailerDict(int uxrefSize, GBool incrUpdate, Goffset startxRef, - Ref *root, XRef *xRef, const char *fileName, Goffset 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, "%lli", (long long)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(); - - GBool hasEncrypt = gFalse; - if (!xRef->getTrailerDict()->isNone()) { - Object obj2; - xRef->getTrailerDict()->dictLookupNF("Encrypt", &obj2); - if (!obj2.isNull()) { - trailerDict->set("Encrypt", &obj2); - hasEncrypt = gTrue; - obj2.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); - - // In case of encrypted files, the ID must not be changed because it's used to calculate the key - if (incrUpdate || hasEncrypt) { - 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.initInt64(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, Goffset uxrefOffset, OutStream* outStr, XRef *xRef) -{ - uxref->writeTableToFile( outStr, writeAllEntries ); - outStr->printf( "trailer\r\n"); - writeDictionnary(trailerDict, outStr, xRef, 0, NULL, cryptRC4, 0, 0, 0); - outStr->printf( "\r\nstartxref\r\n"); - outStr->printf( "%lli\r\n", uxrefOffset); - outStr->printf( "%%%%EOF\r\n"); -} - -void PDFDoc::writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef, Goffset 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) ); - writeObjectHeader(uxrefStreamRef, outStr); - writeObject(obj1.initStream(mStream), outStr, xRef, 0, NULL, cryptRC4, 0, 0, 0); - writeObjectFooter(outStr); - obj1.free(); - - outStr->printf( "startxref\r\n"); - outStr->printf( "%lli\r\n", uxrefOffset); - outStr->printf( "%%%%EOF\r\n"); -} - -void PDFDoc::writeXRefTableTrailer(Goffset 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, int oldRefNum, int newRefNum) -{ - Object obj1; - for (int i=0; i<dict->getLength(); i++) { - const char *key = dict->getKey(i); - if (strcmp(key, "Annots") != 0) { - markObject(dict->getValNF(i, &obj1), xRef, countRef, numOffset, oldRefNum, newRefNum); - } else { - Object annotsObj; - dict->getValNF(i, &annotsObj); - if (!annotsObj.isNull()) { - markAnnotations(&annotsObj, xRef, countRef, 0, oldRefNum, newRefNum); - annotsObj.free(); - } - } - obj1.free(); - } -} - -void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum) -{ - 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, oldRefNum, newRefNum); - obj1.free(); - } - break; - case objDict: - markDictionnary (obj->getDict(), xRef, countRef, numOffset, oldRefNum, newRefNum); - break; - case objStream: - { - Stream *stream = obj->getStream(); - markDictionnary (stream->getDict(), xRef, countRef, numOffset, oldRefNum, newRefNum); - } - 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, oldRefNum, newRefNum); - obj1.free(); - } - break; - default: - break; - } -} - -void PDFDoc::replacePageDict(int pageNo, int rotate, - PDFRectangle *mediaBox, - PDFRectangle *cropBox) -{ - Ref *refPage = getCatalog()->getPageRef(pageNo); - Object page; - getXRef()->fetch(refPage->num, refPage->gen, &page); - Dict *pageDict = page.getDict(); - pageDict->remove("MediaBoxssdf"); - pageDict->remove("MediaBox"); - pageDict->remove("CropBox"); - pageDict->remove("ArtBox"); - pageDict->remove("BleedBox"); - pageDict->remove("TrimBox"); - pageDict->remove("Rotate"); - Object mediaBoxObj; - mediaBoxObj.initArray(getXRef()); - Object murx; - murx.initReal(mediaBox->x1); - Object mury; - mury.initReal(mediaBox->y1); - Object mllx; - mllx.initReal(mediaBox->x2); - Object mlly; - 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; - cropBoxObj.initArray(getXRef()); - Object curx; - curx.initReal(cropBox->x1); - Object cury; - cury.initReal(cropBox->y1); - Object cllx; - cllx.initReal(cropBox->x2); - Object clly; - clly.initReal(cropBox->y2); - cropBoxObj.arrayAdd(&curx); - cropBoxObj.arrayAdd(&cury); - cropBoxObj.arrayAdd(&cllx); - cropBoxObj.arrayAdd(&clly); - pageDict->add(copyString("CropBox"), &cropBoxObj); - cropBoxObj.getArray()->incRef(); - pageDict->add(copyString("TrimBox"), &cropBoxObj); - } else { - mediaBoxObj.getArray()->incRef(); - pageDict->add(copyString("TrimBox"), &mediaBoxObj); - } - Object rotateObj; - rotateObj.initInt(rotate); - pageDict->add(copyString("Rotate"), &rotateObj); - getXRef()->setModifiedObject(&page, *refPage); - page.free(); -} - -void PDFDoc::markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum) -{ - 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 && - strcmp(key, "AcroForm") != 0 && - strcmp(key, "Annots") != 0 && - strcmp(key, "P") != 0 && - strcmp(key, "Root") != 0) { - markObject(&value, xRef, countRef, numOffset, oldRefNum, newRefNum); - } - value.free(); - } -} - -GBool PDFDoc::markAnnotations(Object *annotsObj, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum) { - Object annots; - GBool modified = gFalse; - annotsObj->fetch(getXRef(), &annots); - if (annots.isArray()) { - Array *array = annots.getArray(); - for (int i=array->getLength() - 1; i >= 0; i--) { - Object obj1; - if (array->get(i, &obj1)->isDict()) { - Object type; - Dict *dict = obj1.getDict(); - dict->lookup("Type", &type); - if (type.isName() && strcmp(type.getName(), "Annot") == 0) { - Object obj2; - if (dict->lookupNF("P", &obj2)->isRef()) { - if (obj2.getRef().num == oldPageNum) { - Object obj3; - array->getNF(i, &obj3); - if (obj3.isRef()) { - Object *newRef = new Object(); - newRef->initRef(newPageNum, 0); - dict->set("P", newRef); - getXRef()->setModifiedObject(&obj1, obj3.getRef()); - } - obj3.free(); - } else if (obj2.getRef().num == newPageNum) { - obj1.free(); - obj2.free(); - type.free(); - continue; - } else { - array->remove(i); - obj1.free(); - obj2.free(); - type.free(); - modified = gTrue; - continue; - } - } - obj2.free(); - } - type.free(); - markPageObjects(dict, xRef, countRef, numOffset, oldPageNum, newPageNum); - } - obj1.free(); - array->getNF(i, &obj1); - if (obj1.isRef()) { - if (obj1.getRef().num + (int) numOffset >= xRef->getNumObjects() || xRef->getEntry(obj1.getRef().num + numOffset)->type == xrefEntryFree) { - if (getXRef()->getEntry(obj1.getRef().num)->type == xrefEntryFree) { - continue; // already marked as free => should be replaced - } - xRef->add(obj1.getRef().num + numOffset, obj1.getRef().gen, 0, gTrue); - if (getXRef()->getEntry(obj1.getRef().num)->type == xrefEntryCompressed) { - xRef->getEntry(obj1.getRef().num + numOffset)->type = xrefEntryCompressed; - } - } - if (obj1.getRef().num + (int) numOffset >= countRef->getNumObjects() || - countRef->getEntry(obj1.getRef().num + numOffset)->type == xrefEntryFree) - { - countRef->add(obj1.getRef().num + numOffset, 1, 0, gTrue); - } else { - XRefEntry *entry = countRef->getEntry(obj1.getRef().num + numOffset); - entry->gen++; - } - } - obj1.free(); - } - } - if (annotsObj->isRef()) { - if (annotsObj->getRef().num + (int) numOffset >= xRef->getNumObjects() || xRef->getEntry(annotsObj->getRef().num + numOffset)->type == xrefEntryFree) { - if (getXRef()->getEntry(annotsObj->getRef().num)->type == xrefEntryFree) { - return modified; // already marked as free => should be replaced - } - xRef->add(annotsObj->getRef().num + numOffset, annotsObj->getRef().gen, 0, gTrue); - if (getXRef()->getEntry(annotsObj->getRef().num)->type == xrefEntryCompressed) { - xRef->getEntry(annotsObj->getRef().num + numOffset)->type = xrefEntryCompressed; - } - } - if (annotsObj->getRef().num + (int) numOffset >= countRef->getNumObjects() || - countRef->getEntry(annotsObj->getRef().num + numOffset)->type == xrefEntryFree) - { - countRef->add(annotsObj->getRef().num + numOffset, 1, 0, gTrue); - } else { - XRefEntry *entry = countRef->getEntry(annotsObj->getRef().num + numOffset); - entry->gen++; - } - getXRef()->setModifiedObject(&annots, annotsObj->getRef()); - } - annots.free(); - return modified; -} - -void PDFDoc::markAcroForm(Object *afObj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum) { - Object acroform; - GBool modified = gFalse; - afObj->fetch(getXRef(), &acroform); - if (acroform.isDict()) { - Dict *dict = acroform.getDict(); - for (int i=0; i < dict->getLength(); i++) { - if (strcmp(dict->getKey(i), "Fields") == 0) { - Object fields; - modified = markAnnotations(dict->getValNF(i, &fields), xRef, countRef, numOffset, oldRefNum, newRefNum); - fields.free(); - } else { - Object obj; - markObject(dict->getValNF(i, &obj), xRef, countRef, numOffset, oldRefNum, newRefNum); - obj.free(); - } - } - } - if (afObj->isRef()) { - if (afObj->getRef().num + (int) numOffset >= xRef->getNumObjects() || xRef->getEntry(afObj->getRef().num + numOffset)->type == xrefEntryFree) { - if (getXRef()->getEntry(afObj->getRef().num)->type == xrefEntryFree) { - return; // already marked as free => should be replaced - } - xRef->add(afObj->getRef().num + numOffset, afObj->getRef().gen, 0, gTrue); - if (getXRef()->getEntry(afObj->getRef().num)->type == xrefEntryCompressed) { - xRef->getEntry(afObj->getRef().num + numOffset)->type = xrefEntryCompressed; - } - } - if (afObj->getRef().num + (int) numOffset >= countRef->getNumObjects() || - countRef->getEntry(afObj->getRef().num + numOffset)->type == xrefEntryFree) - { - countRef->add(afObj->getRef().num + numOffset, 1, 0, gTrue); - } else { - XRefEntry *entry = countRef->getEntry(afObj->getRef().num + numOffset); - entry->gen++; - } - if (modified){ - getXRef()->setModifiedObject(&acroform, afObj->getRef()); - } - } - acroform.free(); - return; -} - -Guint PDFDoc::writePageObjects(OutStream *outStr, XRef *xRef, Guint numOffset, GBool combine) -{ - Guint objectsCount = 0; //count the number of objects in the XRef(s) - Guchar *fileKey; - CryptAlgorithm encAlgorithm; - int keyLength; - xRef->getEncryptionParameters(&fileKey, &encAlgorithm, &keyLength); - - 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); - Goffset offset = writeObjectHeader(&ref, outStr); - if (combine) { - writeObject(&obj, outStr, getXRef(), numOffset, NULL, cryptRC4, 0, 0, 0); - } else if (xRef->getEntry(n)->getFlag(XRefEntry::Unencrypted)) { - writeObject(&obj, outStr, NULL, cryptRC4, 0, 0, 0); - } else { - writeObject(&obj, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen); - } - writeObjectFooter(outStr); - xRef->add(ref.num, ref.gen, offset, gTrue); - obj.free(); - } - } - return objectsCount; -} - -#ifndef DISABLE_OUTLINE -Outline *PDFDoc::getOutline() -{ - if (!outline) { - pdfdocLocker(); - // 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; -} - -long long PDFDoc::strToLongLong(char *s) { - long long x, d; - char *p; - - x = 0; - for (p = s; *p && isdigit(*p & 0xff); ++p) { - d = *p - '0'; - if (x > (LLONG_MAX - d) / 10) { - break; - } - x = 10 * x + d; - } - return x; -} - -// Read the 'startxref' position. -Goffset PDFDoc::getStartXRef(GBool tryingToReconstruct) -{ - if (startXRefPos == -1) { - - if (isLinearized(tryingToReconstruct)) { - 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 - int segnum = 0; - int maxXRefSearch = 24576; - if (str->getLength() < maxXRefSearch) maxXRefSearch = str->getLength(); - for (; (xrefSearchSize - 16) * segnum < maxXRefSearch; segnum++) { - str->setPos((xrefSearchSize - 16) * segnum + 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 = strToLongLong(p); - break; - } - } - } - - } - - return startXRefPos; -} - -Goffset PDFDoc::getMainXRefEntriesOffset(GBool tryingToReconstruct) -{ - Guint mainXRefEntriesOffset = 0; - - if (isLinearized(tryingToReconstruct)) { - 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()) { - pdfdocLocker(); - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDoc.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDoc.h deleted file mode 100644 index 6c40f7b0c0c..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDoc.h +++ /dev/null @@ -1,343 +0,0 @@ -//======================================================================== -// -// 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, 2014 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, 2014 Hib Eris <hib@hiberis.nl> -// Copyright (C) 2010 Srinivas Adicherla <srinivas.adicherla@geodesic.com> -// Copyright (C) 2011, 2013, 2014 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> -// Copyright (C) 2013 Adrian Perez de Castro <aperez@igalia.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 PDFDOC_H -#define PDFDOC_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "poppler-config.h" -#include <stdio.h> -#include "goo/GooMutex.h" -#include "XRef.h" -#include "Catalog.h" -#include "Page.h" -#include "Annot.h" -#include "OptionalContent.h" -#include "Stream.h" - -class GooString; -class GooFile; -class BaseStream; -class OutputDev; -class Links; -class LinkAction; -class LinkDest; -class Outline; -class Linearization; -class SecurityHandler; -class Hints; -class StructTreeRoot; - -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. - StructTreeRoot *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, GBool copyXRef = gFalse); - - // 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, GBool copyXRef = gFalse); - - // 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(GBool tryingToReconstruct = gFalse); - - // 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); - void markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum); - GBool markAnnotations(Object *annots, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum); - void markAcroForm(Object *acrpForm, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum); - // write all objects used by pageDict to outStr - Guint writePageObjects(OutStream *outStr, XRef *xRef, Guint numOffset, GBool combine = gFalse); - static void writeObject (Object *obj, OutStream* outStr, XRef *xref, Guint numOffset, Guchar *fileKey, - CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen); - static void writeHeader(OutStream *outStr, int major, int minor); - - // Ownership goes to the caller - static Dict *createTrailerDict (int uxrefSize, GBool incrUpdate, Goffset startxRef, - Ref *root, XRef *xRef, const char *fileName, Goffset fileSize); - static void writeXRefTableTrailer (Dict *trailerDict, XRef *uxref, GBool writeAllEntries, - Goffset uxrefOffset, OutStream* outStr, XRef *xRef); - static void writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef, - Goffset uxrefOffset, OutStream* outStr, XRef *xRef); - -private: - // insert referenced objects in XRef - void markDictionnary (Dict* dict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum); - void markObject (Object *obj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum); - static void writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, Guint numOffset, Guchar *fileKey, - CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen); - - // Write object header to current file stream and return its offset - static Goffset writeObjectHeader (Ref *ref, OutStream* outStr); - static void writeObjectFooter (OutStream* outStr); - - void writeObject (Object *obj, OutStream* outStr, Guchar *fileKey, CryptAlgorithm encAlgorithm, - int keyLength, int objNum, int objGen) - { writeObject(obj, outStr, getXRef(), 0, fileKey, encAlgorithm, keyLength, objNum, objGen); } - void writeDictionnary (Dict* dict, OutStream* outStr, Guchar *fileKey, CryptAlgorithm encAlgorithm, - int keyLength, int objNum, int objGen) - { writeDictionnary(dict, outStr, getXRef(), 0, fileKey, encAlgorithm, keyLength, objNum, objGen); } - static void writeStream (Stream* str, OutStream* outStr); - static void writeRawStream (Stream* str, OutStream* outStr); - void writeXRefTableTrailer (Goffset uxrefOffset, XRef *uxref, GBool writeAllEntries, - int uxrefSize, OutStream* outStr, GBool incrUpdate); - static void writeString (GooString* s, OutStream* outStr, Guchar *fileKey, - CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen); - 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. - Goffset getStartXRef(GBool tryingToReconstruct = gFalse); - // Get the offset of the entries in the main XRef table of a - // linearized document (0 for non linearized documents). - Goffset getMainXRefEntriesOffset(GBool tryingToReconstruct = gFalse); - long long strToLongLong(char *s); - - GooString *fileName; -#ifdef _WIN32 - wchar_t *fileNameU; -#endif - GooFile *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; - - Goffset startXRefPos; // offset of last xref table -#if MULTITHREADED - GooMutex mutex; -#endif -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocBuilder.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocBuilder.h deleted file mode 100644 index d6eccf5487a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocBuilder.h +++ /dev/null @@ -1,42 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocEncoding.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocEncoding.cc deleted file mode 100644 index 79408346419..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocEncoding.cc +++ /dev/null @@ -1,69 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocEncoding.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocEncoding.h deleted file mode 100644 index 4f0840bb28a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocEncoding.h +++ /dev/null @@ -1,34 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocFactory.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocFactory.cc deleted file mode 100644 index 1ec46477237..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocFactory.cc +++ /dev/null @@ -1,72 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocFactory.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocFactory.h deleted file mode 100644 index dbceaa567ee..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PDFDocFactory.h +++ /dev/null @@ -1,55 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PSOutputDev.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/PSOutputDev.cc deleted file mode 100644 index 7b93e3bf65a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PSOutputDev.cc +++ /dev/null @@ -1,7565 +0,0 @@ -//======================================================================== -// -// 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-2013, 2015 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-2013 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, 2014, 2015 William Bader <williambader@hotmail.com> -// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> -// Copyright (C) 2009-2011, 2013, 2014 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2012, 2014 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2012 Lu Wang <coolwanglu@gmail.com> -// Copyright (C) 2014 Till Kamppeter <till.kamppeter@gmail.com> -// Copyright (C) 2015 Marek Kasik <mkasik@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 -// -//======================================================================== - -#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 {", - " % Change paper size, but only if different from previous paper size otherwise", - " % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size", - " % so we use the same when checking if the size changes.", - " /setpagedevice where {", - " pop currentpagedevice", - " /PageSize known {", - " 2 copy", - " currentpagedevice /PageSize get aload pop", - " exch 4 1 roll", - " sub abs 5 gt", - " 3 1 roll", - " sub abs 5 gt", - " or", - " } {", - " true", - " } ifelse", - " {", - " 2 array astore", - " 2 dict begin", - " /PageSize exch def", - " /ImagingBBox null def", - " currentdict end", - " setpagedevice", - " } {", - " pop pop", - " } ifelse", - " } {", - " 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(GooString *nameA, int wA, int hA) { name = nameA; w = wA; h = hA; } - ~PSOutPaperSize() { delete name; } - GooString *name; - 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 *psTitleA, - const std::vector<int> &pages, PSOutMode modeA, - int paperWidthA, int paperHeightA, - GBool noCropA, 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; - paperSizes = NULL; - embFontList = NULL; - customColors = NULL; - haveTextClip = gFalse; - t3String = NULL; - forceRasterize = forceRasterizeA; - psTitle = NULL; - - // 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, psTitleA, - doc, pages, modeA, - imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA, - paperWidthA, paperHeightA, noCropA, duplexA); -} - -PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA, - char *psTitleA, - PDFDoc *doc, - const std::vector<int> &pages, PSOutMode modeA, - int paperWidthA, int paperHeightA, - GBool noCropA, 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; - paperSizes = NULL; - embFontList = NULL; - customColors = NULL; - haveTextClip = gFalse; - t3String = NULL; - forceRasterize = forceRasterizeA; - psTitle = NULL; - - init(outputFuncA, outputStreamA, psGeneric, psTitleA, - doc, pages, modeA, - imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA, - paperWidthA, paperHeightA, noCropA, duplexA); -} - -struct StandardMedia { - const char *name; - int width; - int height; -}; - -static const StandardMedia standardMedia[] = -{ - { "A0", 2384, 3371 }, - { "A1", 1685, 2384 }, - { "A2", 1190, 1684 }, - { "A3", 842, 1190 }, - { "A4", 595, 842 }, - { "A5", 420, 595 }, - { "B4", 729, 1032 }, - { "B5", 516, 729 }, - { "Letter", 612, 792 }, - { "Tabloid", 792, 1224 }, - { "Ledger", 1224, 792 }, - { "Legal", 612, 1008 }, - { "Statement", 396, 612 }, - { "Executive", 540, 720 }, - { "Folio", 612, 936 }, - { "Quarto", 610, 780 }, - { "10x14", 720, 1008 }, - { NULL, 0, 0 } -}; - -/* PLRM specifies a tolerance of 5 points when matching page sizes */ -static bool pageDimensionEqual(int a, int b) { - return (abs (a - b) < 5); -} - -// Shared initialization of PSOutputDev members. -// Store the values but do not process them so the function that -// created the PSOutputDev can use the various setters to change defaults. - -void PSOutputDev::init(PSOutputFunc outputFuncA, void *outputStreamA, - PSFileType fileTypeA, char *psTitleA, PDFDoc *docA, - const std::vector<int> &pagesA, PSOutMode modeA, - int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, - GBool manualCtrlA, int paperWidthA, int paperHeightA, - GBool noCropA, GBool duplexA) { - - if (pagesA.empty()) { - ok = gFalse; - return; - } - - // initialize - postInitDone = gFalse; - embedType1 = gTrue; - embedTrueType = gTrue; - embedCIDPostScript = gTrue; - embedCIDTrueType = gTrue; - fontPassthrough = gFalse; - optimizeColorSpace = gFalse; - preloadImagesForms = gFalse; - generateOPI = gFalse; - useASCIIHex = gFalse; - useBinary = gFalse; - rasterMono = gFalse; - rasterResolution = 300; - uncompressPreloadedImages = gFalse; - rasterAntialias = gFalse; - displayText = gTrue; - ok = gTrue; - outputFunc = outputFuncA; - outputStream = outputStreamA; - fileType = fileTypeA; - psTitle = (psTitleA? strdup(psTitleA): NULL); - doc = docA; - level = globalParams->getPSLevel(); - pages = pagesA; - mode = modeA; - paperWidth = paperWidthA; - paperHeight = paperHeightA; - noCrop = noCropA; - duplex = duplexA; - imgLLX = imgLLXA; - imgLLY = imgLLYA; - imgURX = imgURXA; - imgURY = imgURYA; - manualCtrl = manualCtrlA; - - xref = NULL; - - processColors = 0; - inType3Char = gFalse; - inUncoloredPattern = gFalse; - t3FillColorOnly = 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 sequential page number - seqPage = 1; -} - -// Complete the initialization after the function that created the PSOutputDev -// has had a chance to modify default values with the various setters. - -void PSOutputDev::postInit() -{ - Catalog *catalog; - PDFRectangle *box; - PSOutPaperSize *size; - GooList *names; - int w, h, i; - - if (postInitDone || !ok) { - return; - } - - postInitDone = gTrue; - - xref = doc->getXRef(); - catalog = doc->getCatalog(); - - if (paperWidth < 0 || paperHeight < 0) { - paperMatch = gTrue; - } else { - paperMatch = gFalse; - } - Page *page; - paperSizes = new GooList(); - for (size_t pgi = 0; pgi < pages.size(); ++pgi) { - const int pg = pages[pgi]; - page = catalog->getPage(pg); - if (page == NULL) - paperMatch = gFalse; - if (!paperMatch) { - w = paperWidth; - h = paperHeight; - if (w < 0 || h < 0) { - // Unable to obtain a paper size from the document and no page size - // specified. In this case use A4 as the page size to ensure the PS output is - // valid. This will only occur if the PDF is very broken. - w = 595; - h = 842; - } - } else if (noCrop) { - w = (int)ceil(page->getMediaWidth()); - h = (int)ceil(page->getMediaHeight()); - } else { - w = (int)ceil(page->getCropWidth()); - h = (int)ceil(page->getCropHeight()); - } - if (paperMatch) { - int rotate = page->getRotate(); - if (rotate == 90 || rotate == 270) - std::swap(w, h); - } - if (w > paperWidth) - paperWidth = w; - if (h > paperHeight) - paperHeight = h; - for (i = 0; i < paperSizes->getLength(); ++i) { - size = (PSOutPaperSize *)paperSizes->get(i); - if (pageDimensionEqual(w, size->w) && pageDimensionEqual(h, size->h)) - break; - } - if (i == paperSizes->getLength()) { - const StandardMedia *media = standardMedia; - GooString *name = NULL; - while (media->name) { - if (pageDimensionEqual(w, media->width) && pageDimensionEqual(h, media->height)) { - name = new GooString(media->name); - w = media->width; - h = media->height; - break; - } - media++; - } - if (!name) - name = GooString::format("{0:d}x{1:d}mm", int(w*25.4/72), int(h*25.4/72)); - paperSizes->append(new PSOutPaperSize(name, w, h)); - } - pagePaperSize.insert(std::pair<int,int>(pg, i)); - if (!paperMatch) - break; // we only need one entry when all pages are the same size - } - if (imgLLX == 0 && imgURX == 0 && imgLLY == 0 && imgURY == 0) { - imgLLX = imgLLY = 0; - imgURX = paperWidth; - imgURY = paperHeight; - } - std::vector<int> pageList; - if (mode == psModeForm) { - pageList.push_back(pages[0]); - } else { - pageList = pages; - } - - // 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; - - 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(pageList[0]))) { - writeHeader(pageList, - page->getMediaBox(), - page->getCropBox(), - page->getRotate(), - psTitle); - } else { - error(errSyntaxError, -1, "Invalid page {0:d}", pageList[0]); - box = new PDFRectangle(0, 0, 1, 1); - writeHeader(pageList, 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, pageList, duplex); - if (mode != psModeForm) { - writePS("%%EndSetup\n"); - } - } -} - -PSOutputDev::~PSOutputDev() { - PSOutCustomColor *cc; - int i; - - if (ok) { - if (!postInitDone) { - postInit(); - } - 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); - while (customColors) { - cc = customColors; - customColors = cc->next; - delete cc; - } - gfree(psTitle); -} - -void PSOutputDev::writeHeader(const std::vector<int> &pages, - PDFRectangle *mediaBox, PDFRectangle *cropBox, - int pageRotate, char *psTitle) { - Object info, obj1; - PSOutPaperSize *size; - double x1, y1, x2, y2; - int i; - - switch (mode) { - 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) { - char *sanitizedTitle = strdup(psTitle); - for (Guint i = 0; i < strlen(sanitizedTitle); ++i) { - if (sanitizedTitle[i] == '\n' || sanitizedTitle[i] == '\r') { - sanitizedTitle[i] = ' '; - } - } - writePSFmt("%%Title: {0:s}\n", sanitizedTitle); - free(sanitizedTitle); - } - 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) && useBinary) { - writePS("%%DocumentData: Binary\n"); - } - - switch (mode) { - case psModePS: - for (i = 0; i < paperSizes->getLength(); ++i) { - size = (PSOutPaperSize *)paperSizes->get(i); - writePSFmt("%%{0:s} {1:t} {2:d} {3:d} 0 () ()\n", - i==0 ? "DocumentMedia:" : "+", size->name, size->w, size->h); - } - writePSFmt("%%BoundingBox: 0 0 {0:d} {1:d}\n", paperWidth, paperHeight); - writePSFmt("%%Pages: {0:d}\n", static_cast<int>(pages.size())); - writePS("%%EndComments\n"); - if (!paperMatch) { - size = (PSOutPaperSize *)paperSizes->get(0); - writePS("%%BeginDefaults\n"); - writePSFmt("%%PageMedia: {0:t}\n", size->name); - 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)); - 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, - const std::vector<int> &pages, - GBool duplexA) { - Page *page; - Dict *resDict; - Annots *annots; - Object *acroForm; - Object obj1, obj2, obj3; - GooString *s; - int i; - - if (mode == psModeForm) { - // swap the form and xpdf dicts - writePS("xpdf end begin dup begin\n"); - } else { - writePS("xpdf begin\n"); - } - for (size_t pgi = 0; pgi < pages.size(); ++pgi) { - const int pg = pages[pgi]; - 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 (generateOPI) { - 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; - GBool skip; - int i; - - 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(); - if (resourceIDs.find(ref0.num) != resourceIDs.end()) { - skip = gTrue; - } else { - resourceIDs.insert(ref0.num); - } - } - 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(); - } - - 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(); - if (resourceIDs.find(ref0.num) != resourceIDs.end()) { - skip = gTrue; - } else { - resourceIDs.insert(ref0.num); - } - } - 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(); - } - - 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, this); - 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() ? font->getEmbeddedFontName()->copy() : new GooString(); - 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->getEmbeddedFontName()) { - // this assumes that the PS font name matches the PDF font name - psName = font->getEmbeddedFontName()->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; - long 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"); - - strObj.streamReset(); - if (strObj.streamGetChar() == 0x80 && - strObj.streamGetChar() == 1) { - // PFB format - length1 = strObj.streamGetChar() | - (strObj.streamGetChar() << 8) | - (strObj.streamGetChar() << 16) | - (strObj.streamGetChar() << 24); - } else { - strObj.streamReset(); - } - // copy ASCII portion of font - 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) { - if (start[0] == 0x80 && - start[1] == 2) { - length2 = start[2] | - (start[3] << 8) | - (strObj.streamGetChar() << 16) | - (strObj.streamGetChar() << 24); - i = 0; - } else { - 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 - c = strObj.streamGetChar(); - if (c == 0x80) { - c = strObj.streamGetChar(); - if (c == 1) { - length3 = strObj.streamGetChar() | - (strObj.streamGetChar() << 8) | - (strObj.streamGetChar() << 16) | - (strObj.streamGetChar() << 24); - - i = 0; - while (i < length3) { - if ((c = strObj.streamGetChar()) == EOF) { - break; - } - writePSChar(c); - ++i; - } - } - } else { - if (c != EOF) { - writePSChar(c); - - 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: - if (strObj.isStream()) - strObj.streamClose(); - strObj.free(); -} - -void PSOutputDev::setupExternalType1Font(GooString *fileName, GooString *psName) { - static const char hexChar[17] = "0123456789abcdef"; - 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; - } - - c = fgetc(fontFile); - if (c == 0x80) { - // PFB file - ungetc(c, fontFile); - while (!feof(fontFile)) { - fgetc(fontFile); // skip start of segment byte (0x80) - int segType = fgetc(fontFile); - long segLen = fgetc(fontFile) | - (fgetc(fontFile) << 8) | - (fgetc(fontFile) << 16) | - (fgetc(fontFile) << 24); - if (feof(fontFile)) - break; - - if (segType == 1) { - // ASCII segment - for (long i = 0; i < segLen; i++) { - c = fgetc(fontFile); - if (c == EOF) - break; - writePSChar(c); - } - } else if (segType == 2) { - // binary segment - for (long i = 0; i < segLen; i++) { - c = fgetc(fontFile); - if (c == EOF) - break; - writePSChar(hexChar[(c >> 4) & 0x0f]); - writePSChar(hexChar[c & 0x0f]); - if (i % 36 == 35) - writePSChar('\n'); - } - } else { - // end of file - break; - } - } - } else if (c != EOF) { - writePSChar(c); - 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 '{0: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 || preloadImagesForms)) { - 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, doUseASCIIHex; - 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; - doUseASCIIHex = gTrue; - } else { - if (uncompressPreloadedImages) { - 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; - } - } - doUseASCIIHex = useASCIIHex; - } - if (useCompressed) { - str = str->getUndecodedStream(); - } - if (useRLE) { - str = new RunLengthEncoder(str); - } - if (doUseASCIIHex) { - 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 == (doUseASCIIHex ? '>' : '~') || c == EOF) { - break; - } - if (c == 'z') { - ++col; - } else { - ++col; - for (i = 1; i <= (doUseASCIIHex ? 1 : 4); ++i) { - do { - c = str->getChar(); - } while (c == '\n' || c == '\r'); - if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { - break; - } - ++col; - } - if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { - break; - } - } - if (col > 225) { - ++size; - col = 0; - } - } while (c != (doUseASCIIHex ? '>' : '~') && 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 *)(doUseASCIIHex ? "dup 0 <" : "dup 0 <~")); - for (;;) { - do { - c = str->getChar(); - } while (c == '\n' || c == '\r'); - if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { - break; - } - if (c == 'z') { - writePSChar(c); - ++col; - } else { - writePSChar(c); - ++col; - for (i = 1; i <= (doUseASCIIHex ? 1 : 4); ++i) { - do { - c = str->getChar(); - } while (c == '\n' || c == '\r'); - if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { - break; - } - writePSChar(c); - ++col; - } - } - if (c == (doUseASCIIHex ? '>' : '~') || 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 *)(doUseASCIIHex ? "> put\n" : "~> put\n")); - ++line; - if (line >= innerSize) break; - writePSFmt((char *)(doUseASCIIHex ? "dup {0:d} <" : "dup {0:d} <~"), line); - col = 0; - } - } - if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { - writePS((char *)(doUseASCIIHex ? "> 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 (!preloadImagesForms) { - 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 - 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 isGray; - - if (!postInitDone) { - postInit(); - } - 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 - // start the PS page - page->makeBox(rasterResolution, rasterResolution, 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(rasterResolution, rasterResolution, &box, rotateA, gFalse); - startPage(page->getNum(), state, xref); - delete state; - - // set up the SplashOutputDev - if (rasterMono || level == psLevel1) { - numComps = 1; - paperColor[0] = 0xff; - splashOut = new SplashOutputDev(splashModeMono8, 1, gFalse, - paperColor, gFalse); -#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); -#endif - } else { - numComps = 3; - paperColor[0] = paperColor[1] = paperColor[2] = 0xff; - splashOut = new SplashOutputDev(splashModeRGB8, 1, gFalse, - paperColor, gFalse); - } - splashOut->setFontAntialias(rasterAntialias); - splashOut->setVectorAntialias(rasterAntialias); - splashOut->startDoc(doc); - - // break the page into stripes - hDPI2 = xScale * rasterResolution; - vDPI2 = yScale * rasterResolution; - 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: - 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: - p = bitmap->getDataPtr(); - // Check for an all gray image - if (getOptimizeColorSpace()) { - 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(); - } - } else { - isGray = gFalse; - } - 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 (!getOptimizeColorSpace()) { - isGray = gFalse; - } else 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"); - if (useBinary) { - /* nothing to do */; - } else if (useASCIIHex) { - writePS(" /ASCIIHexDecode filter\n"); - } else { - writePS(" /ASCII85Decode filter\n"); - } - writePS(" /RunLengthDecode filter\n"); - writePS(">>\n"); - if (useBinary) { - /* nothing to do */; - } else if (useASCIIHex) { - 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, XRef *xrefA) { - Page *page; - int x1, y1, x2, y2, width, height, t; - int imgWidth, imgHeight, imgWidth2, imgHeight2; - GBool landscape; - GooString *s; - PSOutPaperSize *paperSize; - - if (!postInitDone) { - postInit(); - } - xref = xrefA; - if (mode == psModePS) { - 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; - if (noCrop) { - imgURX = (int)ceil(page->getMediaWidth()); - imgURY = (int)ceil(page->getMediaHeight()); - } else { - imgURX = (int)ceil(page->getCropWidth()); - imgURY = (int)ceil(page->getCropHeight()); - } - if (state->getRotate() == 90 || state->getRotate() == 270) { - t = imgURX; - imgURX = imgURY; - imgURY = t; - } - } - } - - // underlays - if (underlayCbk) { - (*underlayCbk)(this, underlayCbkData); - } - if (overlayCbk) { - saveState(NULL); - } - - xScale = yScale = 1; - switch (mode) { - - 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; - } - } - } - if (paperMatch) { - paperSize = (PSOutPaperSize *)paperSizes->get(pagePaperSize[pageNum]); - writePSFmt("%%PageMedia: {0:t}\n", paperSize->name); - } - if (rotate == 0 || rotate == 180) { - writePSFmt("%%PageBoundingBox: 0 0 {0:d} {1:d}\n", width, height); - } else { - writePSFmt("%%PageBoundingBox: 0 0 {0:d} {1:d}\n", height, width); - } - writePSFmt("%%PageOrientation: {0:s}\n", - landscape ? "Landscape" : "Portrait"); - writePS("%%BeginPageSetup\n"); - 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; - } - } - - 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 *gfxA, 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, NULL, NULL, gfxA->getXRef()); - 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; - - // explicit masking - if (maskStr && !(maskColors && colorMap)) { - maskToClippingPath(maskStr, maskWidth, maskHeight, maskInvert); - } - - if ((inType3Char || preloadImagesForms) && !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 || preloadImagesForms) && !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 || preloadImagesForms) && !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; - - // 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, 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"); - } - - // set up the image data - if (mode == psModeForm || inType3Char || preloadImagesForms) { - 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 || preloadImagesForms) { - 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 || preloadImagesForms) && - uncompressPreloadedImages) { - 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 || preloadImagesForms); - useCompressed = gFalse; - } else { - useRLE = gFalse; - useASCII = str->isBinary() && - !(mode == psModeForm || inType3Char || preloadImagesForms); - 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 || preloadImagesForms) { - - // 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, useCompressed; - GBool maskUseRLE, maskUseASCII, maskUseCompressed; - GooString *maskFilters; - GfxSeparationColorSpace *sepCS; - GfxColor color; - GfxCMYK cmyk; - int c; - int col, i; - - 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 || preloadImagesForms) && - uncompressPreloadedImages) { - s = NULL; - maskUseRLE = gFalse; - maskUseCompressed = gFalse; - maskUseASCII = gFalse; - } else { - s = maskStr->getPSFilter(3, " "); - if (!s) { - maskUseRLE = gTrue; - maskUseASCII = !(mode == psModeForm || inType3Char || preloadImagesForms); - maskUseCompressed = gFalse; - } else { - maskUseRLE = gFalse; - maskUseASCII = maskStr->isBinary() && - !(mode == psModeForm || inType3Char || preloadImagesForms); - 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 || preloadImagesForms) { - 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 || preloadImagesForms) { - 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 || preloadImagesForms) { - 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 || preloadImagesForms) && - uncompressPreloadedImages) { - 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 || preloadImagesForms); - useCompressed = gFalse; - } else { - useRLE = gFalse; - useASCII = str->isBinary() && - !(mode == psModeForm || inType3Char || preloadImagesForms); - 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 || preloadImagesForms) { - writePS(" /DataSource {pdfMaskSrc}\n"); - writePS(maskFilters->getCString()); - } else { - writePS(" /DataSource maskStream\n"); - } - delete maskFilters; - - writePS(">>\n"); - writePS(">>\n"); - } - - if (mode == psModeForm || inType3Char || preloadImagesForms) { - - // 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 || preloadImagesForms) { - 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 || preloadImagesForms)) { - 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 (generateOPI) { - 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 (generateOPI) { - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PSOutputDev.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PSOutputDev.h deleted file mode 100644 index 7318cafdf2a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PSOutputDev.h +++ /dev/null @@ -1,546 +0,0 @@ -//======================================================================== -// -// 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, 2012, 2013, 2015 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2007 Brad Hards <bradh@kde.org> -// Copyright (C) 2009-2013 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, 2015 William Bader <williambader@hotmail.com> -// Copyright (C) 2010 Hib Eris <hib@hiberis.nl> -// Copyright (C) 2011, 2014 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" -#include <set> -#include <map> -#include <vector> - -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 -}; - -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. - // pages has to be sorted in increasing order - PSOutputDev(const char *fileName, PDFDoc *docA, - char *psTitleA, - const std::vector<int> &pages, PSOutMode modeA, - int paperWidthA = -1, int paperHeightA = -1, - GBool noCrop = gFalse, - 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. - // pages has to be sorted in increasing order - PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA, - char *psTitleA, - PDFDoc *docA, - const std::vector<int> &pages, PSOutMode modeA, - int paperWidthA = -1, int paperHeightA = -1, - GBool noCrop = gFalse, - 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 preloadImagesForms; } - - // Does this device use beginType3Char/endType3Char? Otherwise, - // text in Type 3 fonts will be drawn with drawChar/drawString. - virtual GBool interpretType3Chars() { return gFalse; } - - virtual GBool needClipToCropBox() { return mode == psModeEPS; } - - //----- header/trailer (used only if manualCtrl is true) - - // Write the document-level header. - void writeHeader(const std::vector<int> &pages, - 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, XRef *xref); - - // 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 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; } - - void setRasterAntialias(GBool a) { rasterAntialias = a; } - void setRasterResolution(double r) { rasterResolution = r; } - void setRasterMono(GBool b) { rasterMono = b; } - void setUncompressPreloadedImages(GBool b) { uncompressPreloadedImages = b; } - - GBool getEmbedType1() const { return embedType1; } - GBool getEmbedTrueType() const { return embedTrueType; } - GBool getEmbedCIDPostScript() const { return embedCIDPostScript; } - GBool getEmbedCIDTrueType() const { return embedCIDTrueType; } - GBool getFontPassthrough() const { return fontPassthrough; } - GBool getOptimizeColorSpace() const { return optimizeColorSpace; } - void setEmbedType1(GBool b) { embedType1 = b; } - void setEmbedTrueType(GBool b) { embedTrueType = b; } - void setEmbedCIDPostScript(GBool b) { embedCIDPostScript = b; } - void setEmbedCIDTrueType(GBool b) { embedCIDTrueType = b; } - void setFontPassthrough(GBool b) { fontPassthrough = b; } - void setOptimizeColorSpace(GBool b) { optimizeColorSpace = b; } - void setPreloadImagesForms(GBool b) { preloadImagesForms = b; } - void setGenerateOPI(GBool b) { generateOPI = b; } - void setUseASCIIHex(GBool b) { useASCIIHex = b; } - void setUseBinary(GBool b) { useBinary = b; } - -private: - - void init(PSOutputFunc outputFuncA, void *outputStreamA, - PSFileType fileTypeA, char *psTitleA, PDFDoc *doc, - const std::vector<int> &pages, PSOutMode modeA, - int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, - GBool manualCtrlA, int paperWidthA, int paperHeightA, - GBool noCropA, GBool duplexA); - void postInit(); - 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, const std::vector<int> &pages, 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 noCrop; - GBool duplex; - std::vector<int> pages; - char *psTitle; - GBool postInitDone; // true if postInit() was called - - 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 - std::set<int> resourceIDs; // list of object IDs of objects containing Resources we've already set up - 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 - 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] - std::map<int,int> pagePaperSize; // page num to paperSize entry mapping - 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 - GBool rasterAntialias; // antialias on rasterize - GBool uncompressPreloadedImages; - double rasterResolution; // PostScript rasterization resolution (dpi) - GBool rasterMono; // true to do PostScript rasterization - // in monochrome (gray); false to do it - // in color (RGB/CMYK) - GBool embedType1; // embed Type 1 fonts? - GBool embedTrueType; // embed TrueType fonts? - GBool embedCIDPostScript; // embed CID PostScript fonts? - GBool embedCIDTrueType; // embed CID TrueType fonts? - GBool fontPassthrough; // pass all fonts through as-is? - GBool optimizeColorSpace; // false to keep gray RGB images in their original color space - // true to optimize gray images to DeviceGray color space - GBool preloadImagesForms; // preload PostScript images and forms into - // memory - GBool generateOPI; // generate PostScript OPI comments? - GBool useASCIIHex; // use ASCIIHex instead of ASCII85? - GBool useBinary; // use binary instead of hex - -#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/Build/source/libs/poppler/poppler-0.35.0/poppler/PSTokenizer.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/PSTokenizer.cc deleted file mode 100644 index 05127f0d03c..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PSTokenizer.cc +++ /dev/null @@ -1,159 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PSTokenizer.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PSTokenizer.h deleted file mode 100644 index fc2f053d3f2..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PSTokenizer.h +++ /dev/null @@ -1,54 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Page.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Page.cc deleted file mode 100644 index a4af3405b92..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Page.cc +++ /dev/null @@ -1,860 +0,0 @@ -//======================================================================== -// -// 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-2013 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, 2015 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, 2013 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013, 2014 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2015 Philipp Reinkemeier <philipp.reinkemeier@offis.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 <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" - -#if MULTITHREADED -# define pageLocker() MutexLocker locker(&mutex) -#else -# define pageLocker() -#endif -//------------------------------------------------------------------------ -// 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; - -#if MULTITHREADED - gInitMutex(&mutex); -#endif - 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(); -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -Dict *Page::getResourceDict() { - return attrs->getResourceDict(); -} - -Dict *Page::getResourceDictCopy(XRef *xrefA) { - pageLocker(); - Dict *dict = attrs->getResourceDict(); - return dict ? dict->copy(xrefA) : NULL; -} - -void Page::replaceXRef(XRef *xrefA) { - Object obj1; - Dict *pageDict = pageObj.getDict()->copy(xrefA); - xref = xrefA; - trans.free(); - pageDict->lookupNF("Trans", &trans); - annotsObj.free(); - pageDict->lookupNF("Annots", &annotsObj); - contents.free(); - pageDict->lookupNF("Contents", &contents); - if (contents.isArray()) { - contents.free(); - pageDict->lookupNF("Contents", &obj1)->getArray()->copy(xrefA, &contents); - obj1.free(); - } - thumb.free(); - pageDict->lookupNF("Thumb", &thumb); - actions.free(); - pageDict->lookupNF("AA", &actions); - pageDict->lookup("Resources", &obj1); - if (obj1.isDict()) { - attrs->replaceResource(obj1); - } - obj1.free(); - delete pageDict; -} - -Annots *Page::getAnnots(XRef *xrefA) { - if (!annots) { - Object obj; - annots = new Annots(doc, num, getAnnots(&obj, (xrefA == NULL) ? xref : xrefA)); - 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) - pageLocker(); - 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(); - } - - // Popup annots are already handled by markup annots, - // so add to the list only Popup annots without a - // markup annotation associated. - if (annot->getType() != Annot::typePopup || - static_cast<AnnotPopup*>(annot)->getParentNF()->isNull()) { - annots->appendAnnot(annot); - } - annot->setPage(num, gTrue); - - AnnotMarkup *annotMarkup = dynamic_cast<AnnotMarkup*>(annot); - if (annotMarkup) { - AnnotPopup *annotPopup = annotMarkup->getPopup(); - if (annotPopup) - addAnnot(annotPopup); - } -} - -void Page::removeAnnot(Annot *annot) { - Ref annotRef = annot->getRef(); - Object annArray; - - pageLocker(); - getAnnots(&annArray); - if (annArray.isArray()) { - int idx = -1; - // Get annotation position - for (int i = 0; idx == -1 && i < annArray.arrayGetLength(); ++i) { - Object tmp; - if (annArray.arrayGetNF(i, &tmp)->isRef()) { - Ref currAnnot = tmp.getRef(); - if (currAnnot.num == annotRef.num && currAnnot.gen == annotRef.gen) { - idx = i; - } - } - tmp.free(); - } - - 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(); - annot->removeReferencedObjects(); // Note: Might recurse in removeAnnot again - annot->setPage(0, gFalse); -} - -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, - GBool copyXRef) { - displaySlice(out, hDPI, vDPI, rotate, useMediaBox, crop, -1, -1, -1, -1, printing, - abortCheckCbk, abortCheckCbkData, - annotDisplayDecideCbk, annotDisplayDecideCbkData, copyXRef); -} - -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, XRef *xrefA) { - 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()); - } - - if (!crop) { - crop = (box == *cropBox) && out->needClipToCropBox(); - } - gfx = new Gfx(doc, out, num, attrs->getResourceDict(), - hDPI, vDPI, &box, crop ? cropBox : (PDFRectangle *)NULL, - rotate, abortCheckCbk, abortCheckCbkData, xrefA); - - 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, - GBool copyXRef) { - 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; - } - pageLocker(); - XRef *localXRef = (copyXRef) ? xref->copy() : xref; - if (copyXRef) { - replaceXRef(localXRef); - } - - gfx = createGfx(out, hDPI, vDPI, rotate, useMediaBox, crop, - sliceX, sliceY, sliceW, sliceH, - printing, - abortCheckCbk, abortCheckCbkData, localXRef); - - contents.fetch(localXRef, &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; - if (copyXRef) { - replaceXRef(doc->getXRef()); - delete localXRef; - } -} - -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 */ - pageLocker(); - 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(NULL, &obj1, NULL, 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; -} - -LinkAction* Page::getAdditionalAction(PageAdditionalActionsType type) { - Object additionalActionsObject; - LinkAction *linkAction = NULL; - - if (actions.fetch(doc->getXRef(), &additionalActionsObject)->isDict()) { - const char *key = (type == actionOpenPage ? "O" : - type == actionClosePage ? "C" : NULL); - - Object actionObject; - - if (additionalActionsObject.dictLookup(key, &actionObject)->isDict()) - linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); - actionObject.free(); - } - - additionalActionsObject.free(); - - return linkAction; -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Page.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Page.h deleted file mode 100644 index 2aaabae9b16..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Page.h +++ /dev/null @@ -1,287 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 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 PAGE_H -#define PAGE_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "poppler-config.h" -#include "Object.h" -#include "goo/GooMutex.h" - -class Dict; -class PDFDoc; -class XRef; -class OutputDev; -class Links; -class LinkAction; -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); - - bool operator==(const PDFRectangle &rect) const { return x1 == rect.x1 && y1 == rect.y1 && x2 == rect.x2 && y2 == rect.y2; } -}; - -//------------------------------------------------------------------------ -// 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; } - void replaceResource(Object obj1) - { resources.free(); obj1.copy(&resources); } - - // 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; } - Ref getRef() { return pageRef; } - - // Get resource dictionary. - Dict *getResourceDict(); - Dict *getResourceDictCopy(XRef *xrefA); - - // Get annotations array. - Object *getAnnots(Object *obj, XRef *xrefA = NULL) { return annotsObj.fetch((xrefA == NULL) ? xref : xrefA, obj); } - // Add a new annotation to the page - void addAnnot(Annot *annot); - // Remove an existing annotation from the page - 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(XRef *xrefA = NULL); - - // 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); } - - enum PageAdditionalActionsType { - actionOpenPage, ///< Performed when opening the page - actionClosePage, ///< Performed when closing the page - }; - - LinkAction *getAdditionalAction(PageAdditionalActionsType type); - - 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, XRef *xrefA = NULL); - - // 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, - GBool copyXRef = gFalse); - - // 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, - GBool copyXRef = gFalse); - - 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: - // replace xref - void replaceXRef(XRef *xrefA); - - 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 additional actions - double duration; // page duration - GBool ok; // true if page is valid -#if MULTITHREADED - GooMutex mutex; -#endif -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo.cc deleted file mode 100644 index 3153377f6d3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo.cc +++ /dev/null @@ -1,230 +0,0 @@ -//======================================================================== -// -// This file is under the GPLv2 or later license -// -// Copyright (C) 2005-2006 Kristian Høgsberg <krh@redhat.com> -// Copyright (C) 2005, 2009, 2013 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" -#include "PageLabelInfo_p.h" - -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::LowercaseLatin: - toLatin(number, &number_string, gFalse); - break; - case Interval::UppercaseLatin: - toLatin(number, &number_string, gTrue); - 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; -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo.h deleted file mode 100644 index 960e710069d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo.h +++ /dev/null @@ -1,51 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo_p.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo_p.h deleted file mode 100644 index 6cd5220d372..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PageLabelInfo_p.h +++ /dev/null @@ -1,153 +0,0 @@ -//======================================================================== -// -// This file is under the GPLv2 or later license -// -// Copyright (C) 2005-2006 Kristian Høgsberg <krh@redhat.com> -// Copyright (C) 2005, 2009, 2014 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 -// -//======================================================================== - -/* http://mathworld.wolfram.com/RomanNumerals.html */ - -#include "goo/GooString.h" -#include "Error.h" - -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 (number >= 4000) { - error(errUnimplemented, -1, "Conversion to roman numberals of numbers >= 4000 not implemented"); - return; - } - - 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; -} - -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); -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/PageTransition.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/PageTransition.cc deleted file mode 100644 index 441634c039f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PageTransition.cc +++ /dev/null @@ -1,138 +0,0 @@ -/* PageTransition.cc - * Copyright (C) 2005, Net Integration Technologies, Inc. - * Copyright (C) 2010, Albert Astals Cid <aacid@kde.org> - * Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.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. - */ - -#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 scale - if (dict->lookup("SS", &obj)->isNum()) { - scale = obj.getNum(); - } - obj.free(); - - // get rectangular - if (dict->lookup("B", &obj)->isBool()) { - rectangular = obj.getBool(); - } - obj.free(); -} - -PageTransition::~PageTransition() -{ -} - diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/PageTransition.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PageTransition.h deleted file mode 100644 index e892c6c5051..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PageTransition.h +++ /dev/null @@ -1,104 +0,0 @@ -/* 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Parser.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Parser.cc deleted file mode 100644 index 28a54607f5c..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Parser.cc +++ /dev/null @@ -1,325 +0,0 @@ -//======================================================================== -// -// 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, 2013, 2014 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> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 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 "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 (buf2.isCmd("stream")) { - if (allowStreams && (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; - Goffset length; - Goffset pos, endPos; - - // 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 = obj.getInt(); - obj.free(); - } else if (obj.isInt64()) { - length = obj.getInt64(); - 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("endstream", objNum); // kill 'stream' - if (buf1.isCmd("endstream")) { - shift(); - } else { - error(errSyntaxError, getPos(), "Missing 'endstream' or incorrect stream length"); - if (strict) return NULL; - if (xref && lexer->getStream()) { - // shift until we find the proper endstream or we change to another object or reach eof - length = lexer->getPos() - pos; - if (buf1.isCmd("endstream")) { - obj.initInt64(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, recursion); - - 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); -} - -void Parser::shift(const char *cmdA, 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) { - buf2.initNull(); - } else if (buf1.isCmd(cmdA)) { - lexer->getObj(&buf2, objNum); - } else { - lexer->getObj(&buf2, cmdA, objNum); - } -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/Parser.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Parser.h deleted file mode 100644 index 1ce9445e19d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Parser.h +++ /dev/null @@ -1,82 +0,0 @@ -//======================================================================== -// -// 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, 2013 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2012 Hib Eris <hib@hiberis.nl> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 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 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. - Goffset 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); - void shift(const char *cmdA, int objNum); -}; - -#endif - diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/PopplerCache.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/PopplerCache.cc deleted file mode 100644 index 6018a77b70f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PopplerCache.cc +++ /dev/null @@ -1,163 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PopplerCache.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PopplerCache.h deleted file mode 100644 index 74010a2fa6b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PopplerCache.h +++ /dev/null @@ -1,78 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/PreScanOutputDev.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/PreScanOutputDev.cc deleted file mode 100644 index b2af18d86b8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PreScanOutputDev.cc +++ /dev/null @@ -1,369 +0,0 @@ -//======================================================================== -// -// 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, 2014 William Bader <williambader@hotmail.com> -// Copyright (C) 2011, 2013 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*/, XRef * /*xref*/) { -} - -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) { - GBool tilingNeeded = (x1 - x0 != 1 || y1 - y0 != 1); - if (tilingNeeded) { - inTilingPatternFill++; - } - gfx->drawForm(str, resDict, mat, bbox); - if (tilingNeeded) { - inTilingPatternFill--; - } - } 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 || inTilingPatternFill > 0)) { - 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 ((level == psLevel1 || level == psLevel1Sep) && - inTilingPatternFill > 0) { - patternImgMask = gTrue; - } - - 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; - inTilingPatternFill = 0; -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/PreScanOutputDev.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/PreScanOutputDev.h deleted file mode 100644 index 50fcbf22f73..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/PreScanOutputDev.h +++ /dev/null @@ -1,182 +0,0 @@ -//======================================================================== -// -// 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, 2014 William Bader <williambader@hotmail.com> -// Copyright (C) 2011, 2013 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, XRef *xref); - - // 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; - int inTilingPatternFill; -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/ProfileData.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/ProfileData.cc deleted file mode 100644 index a0c44747a56..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/ProfileData.cc +++ /dev/null @@ -1,44 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/ProfileData.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/ProfileData.h deleted file mode 100644 index 418ee010755..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/ProfileData.h +++ /dev/null @@ -1,41 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Rendition.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Rendition.cc deleted file mode 100644 index c040bf2b4a8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Rendition.cc +++ /dev/null @@ -1,401 +0,0 @@ -//********************************************************************************* -// 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", ¶ms)->isDict()) { - MH.parseMediaPlayParameters(¶ms); - } - params.free(); - if (tmp2.dictLookup("BE", ¶ms)->isDict()) { - BE.parseMediaPlayParameters(¶ms); - } - 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", ¶ms)->isDict()) { - MH.parseMediaScreenParameters(¶ms); - } - params.free(); - if (tmp2.dictLookup("BE", ¶ms)->isDict()) { - BE.parseMediaScreenParameters(¶ms); - } - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Rendition.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Rendition.h deleted file mode 100644 index 75bfeff32c9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Rendition.h +++ /dev/null @@ -1,157 +0,0 @@ -//********************************************************************************* -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/SecurityHandler.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/SecurityHandler.cc deleted file mode 100644 index 63d8b4e1287..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/SecurityHandler.cc +++ /dev/null @@ -1,461 +0,0 @@ -//======================================================================== -// -// 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, 2015 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2014 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 "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.isInt64()) { - unsigned int permUint = permObj.getInt64(); - 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 - if (ownerEncObj.isString() && userEncObj.isString()) { - ownerEnc = ownerEncObj.getString()->copy(); - userEnc = userEncObj.getString()->copy(); - if (fileKeyLength > 32 || fileKeyLength < 0) { - fileKeyLength = 32; - } - ok = gTrue; - } else { - error(errSyntaxError, -1, "Weird encryption owner/user info"); - } - } else if (!(encVersion == -1 && encRevision == -1)) { - error(errUnimplemented, -1, - "Unsupported version/revision ({0:d}/{1: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/Build/source/libs/poppler/poppler-0.35.0/poppler/SecurityHandler.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/SecurityHandler.h deleted file mode 100644 index c2991c8f375..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/SecurityHandler.h +++ /dev/null @@ -1,183 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Sound.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Sound.cc deleted file mode 100644 index 6129fdcb47d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Sound.cc +++ /dev/null @@ -1,145 +0,0 @@ -/* 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Sound.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Sound.h deleted file mode 100644 index acb0f8d9acd..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Sound.h +++ /dev/null @@ -1,74 +0,0 @@ -/* 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/Build/source/libs/poppler/poppler-0.35.0/poppler/SplashOutputDev.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/SplashOutputDev.cc deleted file mode 100644 index d9d5699a051..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/SplashOutputDev.cc +++ /dev/null @@ -1,4672 +0,0 @@ -//======================================================================== -// -// 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-2015 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-2015 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org> -// Copyright (C) 2009, 2014, 2015 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, 2012 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Lu Wang <coolwanglu@gmail.com> -// Copyright (C) 2013 Li Junling <lijunling@sina.com> -// Copyright (C) 2014 Ed Porras <ed@moto-research.com> -// Copyright (C) 2014 Richard PALO <richard@netbsd.org> -// Copyright (C) 2015 Tamas Szekeres <szekerest@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 "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" -#include <algorithm> - -#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> -#ifndef isfinite -#define isfinite(x) finite(x) -#endif -#endif - -static inline void convertGfxColor(SplashColorPtr dest, - SplashColorMode colorMode, - GfxColorSpace *colorSpace, - GfxColor *src) { - SplashColor color; - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; - GfxColor deviceN; -#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; - case splashModeDeviceN8: - colorSpace->getDeviceN(src, &deviceN); - for (int i = 0; i < SPOT_NCOMPS + 4; i++) - color[i] = colToByte(deviceN.c[i]); - break; -#endif - } - splashColorCopy(dest, color); -} - -// Copy a color according to the color mode. -// Use convertGfxShortColor() below when the destination is a bitmap -// to avoid overwriting cells. -// Calling this in SplashGouraudPattern::getParameterizedColor() fixes bug 90570. -// Use convertGfxColor() above when the destination is an array of SPOT_NCOMPS+4 bytes, -// to ensure that everything is initialized. - -static inline void convertGfxShortColor(SplashColorPtr dest, - SplashColorMode colorMode, - GfxColorSpace *colorSpace, - GfxColor *src) { - switch (colorMode) { - case splashModeMono1: - case splashModeMono8: - { - GfxGray gray; - colorSpace->getGray(src, &gray); - dest[0] = colToByte(gray); - } - break; - case splashModeXBGR8: - dest[3] = 255; - case splashModeBGR8: - case splashModeRGB8: - { - GfxRGB rgb; - colorSpace->getRGB(src, &rgb); - dest[0] = colToByte(rgb.r); - dest[1] = colToByte(rgb.g); - dest[2] = colToByte(rgb.b); - } - break; -#if SPLASH_CMYK - case splashModeCMYK8: - { - GfxCMYK cmyk; - colorSpace->getCMYK(src, &cmyk); - dest[0] = colToByte(cmyk.c); - dest[1] = colToByte(cmyk.m); - dest[2] = colToByte(cmyk.y); - dest[3] = colToByte(cmyk.k); - } - break; - case splashModeDeviceN8: - { - GfxColor deviceN; - colorSpace->getDeviceN(src, &deviceN); - for (int i = 0; i < SPOT_NCOMPS + 4; i++) - dest[i] = colToByte(deviceN.c[i]); - } - break; -#endif - } -} - -//------------------------------------------------------------------------ -// 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); - gfxMode = shadingA->getColorSpace()->getMode(); -} - -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; - else if (mode == splashModeDeviceN8) - colorComps=4 + SPOT_NCOMPS; -#endif - - shading->getParameterizedColor(colorinterp, &src); - - if (bDirectColorTranslation) { - for (int m = 0; m < colorComps; ++m) - dest[m] = colToByte(src.c[m]); - } else { - convertGfxShortColor(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); - gfxMode = shadingA->getColorSpace()->getMode(); -} - -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 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#endif - { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = (dest[i] * src[i]) / 255; - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } -#endif -} - -static void splashOutBlendScreen(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#endif - { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] + src[i] - (dest[i] * src[i]) / 255; - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } -#endif -} - -static void splashOutBlendOverlay(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#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; - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } -#endif -} - -static void splashOutBlendDarken(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#endif - { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] < src[i] ? dest[i] : src[i]; - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } -#endif -} - -static void splashOutBlendLighten(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#endif - { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] > src[i] ? dest[i] : src[i]; - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } -#endif -} - -static void splashOutBlendColorDodge(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, - SplashColorMode cm) { - int i, x; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#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; - } - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } -#endif -} - -static void splashOutBlendColorBurn(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i, x; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#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; - } - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } -#endif -} - -static void splashOutBlendHardLight(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#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; - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } -#endif -} - -static void splashOutBlendSoftLight(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i, x; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#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; - } - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } -#endif -} - -static void splashOutBlendDifference(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, - SplashColorMode cm) { - int i; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#endif - { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] < src[i] ? src[i] - dest[i] : dest[i] - src[i]; - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } - if (cm == splashModeDeviceN8) { - for (i = 4; i < splashColorModeNComps[cm]; ++i) { - if (dest[i] == 0 && src[i] == 0) - blend[i] = 0; - } - } -#endif -} - -static void splashOutBlendExclusion(SplashColorPtr src, SplashColorPtr dest, - SplashColorPtr blend, SplashColorMode cm) { - int i; - -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - } - } -#endif - { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - blend[i] = dest[i] + src[i] - (2 * dest[i] * src[i]) / 255; - } - } -#if SPLASH_CMYK - if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { - for (i = 0; i < splashColorModeNComps[cm]; ++i) { - dest[i] = 255 - dest[i]; - src[i] = 255 - src[i]; - blend[i] = 255 - blend[i]; - } - } - if (cm == splashModeDeviceN8) { - for (i = 4; i < splashColorModeNComps[cm]; ++i) { - if (dest[i] == 0 && src[i] == 0) - blend[i] = 0; - } - } -#endif -} - -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; -#if 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: - case splashModeDeviceN8: - 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; -#if 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: - case splashModeDeviceN8: - 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: - case splashModeDeviceN8: - 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: - case splashModeDeviceN8: - 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 - SplashBitmap *softmask; // bitmap for softmasks - GfxColorSpace *blendingColorSpace; - GBool isolated; - - //----- for knockout - SplashBitmap *shape; - GBool knockout; - SplashCoord knockoutOpacity; - GBool fontAA; - - //----- saved state - SplashBitmap *origBitmap; - Splash *origSplash; - - SplashTransparencyGroup *next; -}; - -//------------------------------------------------------------------------ -// SplashOutputDev -//------------------------------------------------------------------------ - -SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA, - int bitmapRowPadA, - GBool reverseVideoA, - SplashColorPtr paperColorA, - GBool bitmapTopDownA, - SplashThinLineMode thinLineMode, - GBool overprintPreviewA) { - colorMode = colorModeA; - bitmapRowPad = bitmapRowPadA; - bitmapTopDown = bitmapTopDownA; - bitmapUpsideDown = gFalse; - fontAntialias = gTrue; - vectorAntialias = gTrue; - overprintPreview = overprintPreviewA; - 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->setThinLineMode(thinLineMode); - splash->clear(paperColor, 0); - - fontEngine = NULL; - - nT3Fonts = 0; - t3GlyphStack = NULL; - - font = NULL; - needFontUpdate = gFalse; - textClipPath = NULL; - transpGroupStack = NULL; - nestCount = 0; - xref = NULL; -} - -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 - getFontAntialias() && - colorMode != splashModeMono1); - for (i = 0; i < nT3Fonts; ++i) { - delete t3FontCache[i]; - } - nT3Fonts = 0; -} - -void SplashOutputDev::startPage(int pageNum, GfxState *state, XRef *xrefA) { - int w, h; - double *ctm; - SplashCoord mat[6]; - SplashColor color; - - xref = xrefA; - 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; - } - SplashThinLineMode thinLineMode = splashThinLineDefault; - if (splash) { - thinLineMode = splash->getThinLineMode(); - 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); - if (!bitmap->getDataPtr()) { - delete bitmap; - w = h = 1; - bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, - colorMode != splashModeMono1, bitmapTopDown); - } - } - splash = new Splash(bitmap, vectorAntialias, &screenParams); - splash->setThinLineMode(thinLineMode); - 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; - case splashModeDeviceN8: - for (int i = 0; i < 4 + SPOT_NCOMPS; i++) - color[i] = 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); - updateFillColorSpace(state); - updateFillColor(state); - updateStrokeColorSpace(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::updateFillColorSpace(GfxState *state) { -#if SPLASH_CMYK - if (colorMode == splashModeDeviceN8) - state->getFillColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); -#endif -} - -void SplashOutputDev::updateStrokeColorSpace(GfxState *state) { -#if SPLASH_CMYK - if (colorMode == splashModeDeviceN8) - state->getStrokeColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); -#endif -} - -void SplashOutputDev::updateFillColor(GfxState *state) { - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; - GfxColor deviceN; -#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; - case splashModeDeviceN8: - state->getFillDeviceN(&deviceN); - splash->setFillPattern(getColor(&deviceN)); - break; -#endif - } -} - -void SplashOutputDev::updateStrokeColor(GfxState *state) { - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; - GfxColor deviceN; -#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; - case splashModeDeviceN8: - state->getStrokeDeviceN(&deviceN); - splash->setStrokePattern(getColor(&deviceN)); - 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); -} - -SplashPattern *SplashOutputDev::getColor(GfxColor *deviceN) { - SplashColor color; - - for (int i = 0; i < 4 + SPOT_NCOMPS; i++) - color[i] = colToByte(deviceN->c[i]); - 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 && overprintPreview) { - 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((xref) ? xref : doc->getXRef(), NULL))) { - 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) ? xref : 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) { - t3gs = t3GlyphStack; - while (t3gs != NULL) { - if (t3gs->cache == t3FontCache[nT3Fonts - 1]) { - error(errSyntaxWarning, -1, "t3FontCache reaches limit but font still on stack in SplashOutputDev::beginType3Char"); - return gTrue; - } - t3gs = t3gs->next; - } - 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->setThinLineMode(splashThinLineDefault); - 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) { - 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; - - transpGroupStack->softmask = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), 1, splashModeMono8, gFalse); - maskSplash = new Splash(transpGroupStack->softmask, 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()); - if (transpGroupStack->softmask != NULL) { - Guchar *dest = bitmap->getAlphaPtr(); - Guchar *src = transpGroupStack->softmask->getDataPtr(); - for (int c= 0; c < transpGroupStack->softmask->getRowSize() * transpGroupStack->softmask->getHeight(); c++) { - dest[c] = src[c]; - } - delete transpGroupStack->softmask; - transpGroupStack->softmask = 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; -}; - -#ifdef USE_CMS -GBool SplashOutputDev::useIccImageSrc(void *data) { - SplashOutImageData *imgData = (SplashOutImageData *)data; - - if (!imgData->lookup && imgData->colorMap->getColorSpace()->getMode() == csICCBased) { - GfxICCBasedColorSpace *colorSpace = (GfxICCBasedColorSpace *) imgData->colorMap->getColorSpace(); - switch (imgData->colorMode) { - case splashModeMono1: - case splashModeMono8: - if (colorSpace->getAlt() != NULL && colorSpace->getAlt()->getMode() == csDeviceGray) - return gTrue; - break; - case splashModeXBGR8: - case splashModeRGB8: - case splashModeBGR8: - if (colorSpace->getAlt() != NULL && colorSpace->getAlt()->getMode() == csDeviceRGB) - return gTrue; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - if (colorSpace->getAlt() != NULL && colorSpace->getAlt()->getMode() == csDeviceCMYK) - return gTrue; - break; -#endif - } - } - - return gFalse; -} -#endif - -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; - GfxColor deviceN; -#endif - int nComps, x; - - if (imgData->y == imgData->height) { - return gFalse; - } - if (!(p = imgData->imgStr->getLine())) { - int destComps = 1; - if (imgData->colorMode == splashModeRGB8 || imgData->colorMode == splashModeBGR8) - destComps = 3; - else if (imgData->colorMode == splashModeXBGR8) - destComps = 4; -#if SPLASH_CMYK - else if (imgData->colorMode == splashModeCMYK8) - destComps = 4; - else if (imgData->colorMode == splashModeDeviceN8) - destComps = SPOT_NCOMPS + 4; -#endif - memset(colorLine, 0, imgData->width * destComps); - 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; - case splashModeDeviceN8: - for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) { - col = &imgData->lookup[(SPOT_NCOMPS+4) * *p]; - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *q++ = col[cp]; - } - 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: - if (imgData->colorMap->useRGBLine()) { - imgData->colorMap->getRGBLine(p, (Guchar *) colorLine, imgData->width); - } else { - 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: - if (imgData->colorMap->useRGBLine()) { - imgData->colorMap->getRGBXLine(p, (Guchar *) colorLine, imgData->width); - } else { - 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: - if (imgData->colorMap->useCMYKLine()) { - imgData->colorMap->getCMYKLine(p, (Guchar *) colorLine, imgData->width); - } else { - 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; - case splashModeDeviceN8: - if (imgData->colorMap->useDeviceNLine()) { - imgData->colorMap->getDeviceNLine(p, (Guchar *) colorLine, imgData->width); - } else { - for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) { - imgData->colorMap->getDeviceN(p, &deviceN); - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *q++ = colToByte(deviceN.c[cp]); - } - } - break; -#endif - } - } - - ++imgData->y; - return gTrue; -} - -#ifdef USE_CMS -GBool SplashOutputDev::iccImageSrc(void *data, SplashColorPtr colorLine, - Guchar * /*alphaLine*/) { - SplashOutImageData *imgData = (SplashOutImageData *)data; - Guchar *p; - int nComps; - - if (imgData->y == imgData->height) { - return gFalse; - } - if (!(p = imgData->imgStr->getLine())) { - int destComps = 1; - if (imgData->colorMode == splashModeRGB8 || imgData->colorMode == splashModeBGR8) - destComps = 3; - else if (imgData->colorMode == splashModeXBGR8) - destComps = 4; -#if SPLASH_CMYK - else if (imgData->colorMode == splashModeCMYK8) - destComps = 4; - else if (imgData->colorMode == splashModeDeviceN8) - destComps = SPOT_NCOMPS + 4; -#endif - memset(colorLine, 0, imgData->width * destComps); - return gFalse; - } - - if (imgData->colorMode == splashModeXBGR8) { - SplashColorPtr q; - int x; - for (x = 0, q = colorLine; x < imgData->width; ++x) { - *q++ = *p++; - *q++ = *p++; - *q++ = *p++; - *q++ = 255; - } - } else { - nComps = imgData->colorMap->getNumPixelComps(); - memcpy(colorLine, p, imgData->width * nComps); - } - - ++imgData->y; - return gTrue; -} - -void SplashOutputDev::iccTransform(void *data, SplashBitmap *bitmap) { - SplashOutImageData *imgData = (SplashOutImageData *)data; - int nComps = imgData->colorMap->getNumPixelComps(); - - Guchar *colorLine = (Guchar *) gmalloc(nComps * bitmap->getWidth()); - Guchar *rgbxLine = (imgData->colorMode == splashModeXBGR8) ? (Guchar *) gmalloc(3 * bitmap->getWidth()) : NULL; - for (int i = 0; i < bitmap->getHeight(); i++) { - Guchar *p = bitmap->getDataPtr() + i * bitmap->getRowSize(); - switch (imgData->colorMode) { - case splashModeMono1: - case splashModeMono8: - imgData->colorMap->getGrayLine(p, colorLine, bitmap->getWidth()); - memcpy(p, colorLine, nComps * bitmap->getWidth()); - break; - case splashModeRGB8: - case splashModeBGR8: - imgData->colorMap->getRGBLine(p, colorLine, bitmap->getWidth()); - memcpy(p, colorLine, nComps * bitmap->getWidth()); - break; -#if SPLASH_CMYK - case splashModeCMYK8: - imgData->colorMap->getCMYKLine(p, colorLine, bitmap->getWidth()); - memcpy(p, colorLine, nComps * bitmap->getWidth()); - break; -#endif - case splashModeXBGR8: - Guchar *q; - Guchar *b = p; - int x; - for (x = 0, q = rgbxLine; x < bitmap->getWidth(); ++x, ++b) { - *q++ = *b++; - *q++ = *b++; - *q++ = *b++; - } - imgData->colorMap->getRGBLine(rgbxLine, colorLine, bitmap->getWidth()); - b = p; - for (x = 0, q = colorLine; x < bitmap->getWidth(); ++x, ++b) { - *b++ = *q++; - *b++ = *q++; - *b++ = *q++; - } - break; - } - } - gfree(colorLine); - if (rgbxLine != NULL) - gfree(rgbxLine); -} -#endif - -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; - GfxColor deviceN; -#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; - case splashModeDeviceN8: - col = &imgData->lookup[(SPOT_NCOMPS+4) * *p]; - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *q++ = col[cp]; - 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; - case splashModeDeviceN8: - imgData->colorMap->getDeviceN(p, &deviceN); - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *q++ = colToByte(deviceN.c[cp]); - 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 || imgData->colorMode == splashModeDeviceN8) - 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; - SplashICCTransform tf; - GfxGray gray; - GfxRGB rgb; -#if SPLASH_CMYK - GfxCMYK cmyk; - GBool grayIndexed = gFalse; - GfxColor deviceN; -#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; - case splashModeDeviceN8: - colorMap->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); - grayIndexed = colorMap->getColorSpace()->getMode() != csDeviceGray; - imgData.lookup = (SplashColorPtr)gmallocn(n, SPOT_NCOMPS+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; - } - colorMap->getDeviceN(&pix, &deviceN); - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - imgData.lookup[(SPOT_NCOMPS+4)*i +cp] = colToByte(deviceN.c[cp]); - } - 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; - } -#ifdef USE_CMS - src = maskColors ? &alphaImageSrc : useIccImageSrc(&imgData) ? &iccImageSrc : &imageSrc; - tf = maskColors == NULL && useIccImageSrc(&imgData) ? &iccTransform : NULL; -#else - src = maskColors ? &alphaImageSrc : &imageSrc; - tf = NULL; -#endif - splash->drawImage(src, tf, &imgData, srcMode, maskColors ? gTrue : gFalse, - width, height, mat, interpolate); - 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; - GfxColor deviceN; -#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; - case splashModeDeviceN8: - col = &imgData->lookup[(SPOT_NCOMPS+4) * *p]; - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *q++ = col[cp]; - 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; - case splashModeDeviceN8: - imgData->colorMap->getDeviceN(p, &deviceN); - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *q++ = colToByte(deviceN.c[cp]); - 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; - GfxColor deviceN; -#endif - Guchar pix; - int n, i; - -#if SPLASH_CMYK - colorMap->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); -#endif - 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((xref) ? xref : 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; - case splashModeDeviceN8: - imgData.lookup = (SplashColorPtr)gmallocn(n, SPOT_NCOMPS+4); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getDeviceN(&pix, &deviceN); - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - imgData.lookup[(SPOT_NCOMPS+4)*i + cp] = colToByte(deviceN.c[cp]); - } - break; -#endif - } - } - - if (colorMode == splashModeMono1) { - srcMode = splashModeMono8; - } else { - srcMode = colorMode; - } - splash->drawImage(&maskedImageSrc, NULL, &imgData, srcMode, gTrue, - width, height, mat, interpolate); - 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; - GfxColor deviceN; -#endif - Guchar pix; - int n, i; - -#if SPLASH_CMYK - colorMap->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); -#endif - 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, NULL, &imgMaskData, splashModeMono8, gFalse, - maskWidth, maskHeight, mat, maskInterpolate); - 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; - case splashModeDeviceN8: - imgData.lookup = (SplashColorPtr)gmallocn(n, SPOT_NCOMPS+4); - for (i = 0; i < n; ++i) { - pix = (Guchar)i; - colorMap->getDeviceN(&pix, &deviceN); - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - imgData.lookup[(SPOT_NCOMPS+4)*i + cp] = colToByte(deviceN.c[cp]); - } - break; -#endif - } - } - - if (colorMode == splashModeMono1) { - srcMode = splashModeMono8; - } else { - srcMode = colorMode; - } - splash->drawImage(&imageSrc, NULL, &imgData, srcMode, gFalse, width, height, mat, interpolate); - 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->softmask = NULL; - transpGroup->tx = tx; - transpGroup->ty = ty; - transpGroup->blendingColorSpace = blendingColorSpace; - transpGroup->isolated = isolated; - transpGroup->shape = (knockout && !isolated) ? SplashBitmap::copy(bitmap) : NULL; - transpGroup->knockout = (knockout && isolated); - transpGroup->knockoutOpacity = 1.0; - transpGroup->next = transpGroupStack; - transpGroupStack = transpGroup; - - // save state - transpGroup->origBitmap = bitmap; - transpGroup->origSplash = splash; - transpGroup->fontAA = fontEngine->getAA(); - - //~ 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, bitmap->getSeparationList()); - splash = new Splash(bitmap, vectorAntialias, - transpGroup->origSplash->getScreen()); - if (transpGroup->next != NULL && transpGroup->next->knockout) { - fontEngine->setAA(gFalse); - } - splash->setThinLineMode(transpGroup->origSplash->getThinLineMode()); - 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; - int shapeTx = (knockout) ? tx : - (transpGroup->next != NULL && transpGroup->next->shape != NULL) ? transpGroup->next->tx + tx : tx; - int shapeTy = (knockout) ? ty : - (transpGroup->next != NULL && transpGroup->next->shape != NULL) ? transpGroup->next->ty + ty : ty; - splash->blitTransparent(transpGroup->origBitmap, tx, ty, 0, 0, w, h); - splash->setInNonIsolatedGroup(shape, shapeTx, shapeTy); - } - transpGroup->tBitmap = bitmap; - state->shiftCTMAndClip(-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->shiftCTMAndClip(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); - fontEngine->setAA(transpGroupStack->fontAA); - 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; - GfxColor deviceN; -#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; - case splashModeDeviceN8: - transpGroupStack->blendingColorSpace->getDeviceN(backdropColor, &deviceN); - for (int cp=0; cp < SPOT_NCOMPS+4; cp++) - color[cp] = colToByte(deviceN.c[cp]); - 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 > bitmap->getWidth() - tx) xMax = bitmap->getWidth() - tx; - if (yMax > bitmap->getHeight() - ty) yMax = bitmap->getHeight() - ty; - for (y = 0; y < yMax; ++y) { - for (x = 0; x < xMax; ++x) { - if (alpha) { - if (transferFunc) { - lum = tBitmap->getAlpha(x, y) / 255.0; - transferFunc->transform(&lum, &lum2); - p[x] = (int)(lum2 * 255.0 + 0.5); - } else - 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: - case splashModeDeviceN8: - 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) { - vaa = vaa && colorMode != splashModeMono1; - vectorAntialias = vaa; - splash->setVectorAntialias(vaa); -} -#endif - -void SplashOutputDev::setFreeTypeHinting(GBool enable, GBool enableSlightHintingA) -{ - enableFreeTypeHinting = enable; - enableSlightHinting = enableSlightHintingA; -} - -GBool SplashOutputDev::tilingPatternFill(GfxState *state, Gfx *gfxA, 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; - GBool retValue = gFalse; - - 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])) { - state->setCTM(savedCTM[0], savedCTM[1], savedCTM[2], savedCTM[3], savedCTM[4], savedCTM[5]); - 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 { - if ((unsigned long) result_width * result_height > 0x800000L) { - state->setCTM(savedCTM[0], savedCTM[1], savedCTM[2], savedCTM[3], savedCTM[4], savedCTM[5]); - return gFalse; - } - 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) { - state->setCTM(savedCTM[0], savedCTM[1], savedCTM[2], savedCTM[3], savedCTM[4], savedCTM[5]); - 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, 1, - (paintType == 1) ? colorMode : splashModeMono8, gTrue); - splash = new Splash(bitmap, gTrue); - if (paintType == 2) { - SplashColor clearColor; -#if SPLASH_CMYK - clearColor[0] = (colorMode == splashModeCMYK8 || colorMode == splashModeDeviceN8) ? 0x00 : 0xFF; -#else - clearColor[0] = 0xFF; -#endif - splash->clear(clearColor, 0); - } else { - splash->clear(paperColor, 0); - } - splash->setThinLineMode(formerSplash->getThinLineMode()); - 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, NULL, NULL, gfxA->getXRef()); - // 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); - delete splash; - 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]; - GBool minorAxisZero = matc[1] == 0 && matc[2] == 0; - if (matc[0] > 0 && minorAxisZero && matc[3] > 0) { - // draw the tiles - for (int y = 0; y < imgData.repeatY; ++y) { - for (int x = 0; x < imgData.repeatX; ++x) { - x0 = splashFloor(matc[4]) + x * tBitmap->getWidth(); - y0 = splashFloor(matc[5]) + y * tBitmap->getHeight(); - splash->blitImage(tBitmap, gTrue, x0, y0); - } - } - retValue = gTrue; - } else { - retValue = splash->drawImage(&tilingBitmapSrc, NULL, &imgData, colorMode, gTrue, result_width, result_height, matc, gFalse, gTrue) == splashOk; - } - delete tBitmap; - delete gfx; - return retValue; -} - -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: - case splashModeDeviceN8: - 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; - } - delete splashShading; - 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); - -#if SPLASH_CMYK - pattern->getShading()->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); -#endif - setOverprintMask(pattern->getShading()->getColorSpace(), state->getFillOverprint(), - state->getOverprintMode(), NULL); - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/SplashOutputDev.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/SplashOutputDev.h deleted file mode 100644 index d34426c0f3c..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/SplashOutputDev.h +++ /dev/null @@ -1,442 +0,0 @@ -//======================================================================== -// -// 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-2015 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, 2015 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2015 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 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" -#include "GlobalParams.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; } - - virtual GBool isCMYK() { return gfxMode == csDeviceCMYK; } - -protected: - Matrix ictm; - double t0, t1, dt; - GfxUnivariateShading *shading; - GfxState *state; - SplashColorMode colorMode; - GfxColorSpaceMode gfxMode; -}; - -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 isCMYK() { return gfxMode == csDeviceCMYK; } - - 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; - GfxColorSpaceMode gfxMode; -}; - -// 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, - SplashThinLineMode thinLineMode = splashThinLineDefault, - GBool overprintPreviewA = globalParams->getOverprintPreview()); - - // 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, XRef *xref); - - // 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 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); - - //----- 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 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 - - GBool getFontAntialias() { return fontAntialias; } - void setFontAntialias(GBool anti) { fontAntialias = anti; } - - 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); - SplashPattern *getColor(GfxColor *deviceN); -#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); -#ifdef USE_CMS - GBool useIccImageSrc(void *data); - static void iccTransform(void *data, SplashBitmap *bitmap); - static GBool iccImageSrc(void *data, SplashColorPtr colorLine, - Guchar *alphaLine); -#endif - 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 fontAntialias; - GBool vectorAntialias; - GBool overprintPreview; - GBool enableFreeTypeHinting; - GBool enableSlightHinting; - GBool reverseVideo; // reverse video mode - SplashColor paperColor; // paper color - SplashScreenParams screenParams; - GBool skipHorizText; - GBool skipRotatedText; - - PDFDoc *doc; // the current document - XRef *xref; // the xref of 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/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinCachedFile.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinCachedFile.cc deleted file mode 100644 index db966377bb0..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinCachedFile.cc +++ /dev/null @@ -1,47 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinCachedFile.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinCachedFile.h deleted file mode 100644 index 5be6fa841a3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinCachedFile.h +++ /dev/null @@ -1,27 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinPDFDocBuilder.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinPDFDocBuilder.cc deleted file mode 100644 index 571ee46d7f6..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinPDFDocBuilder.cc +++ /dev/null @@ -1,43 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinPDFDocBuilder.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinPDFDocBuilder.h deleted file mode 100644 index e9b2f47f636..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/StdinPDFDocBuilder.h +++ /dev/null @@ -1,33 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Stream-CCITT.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Stream-CCITT.h deleted file mode 100644 index 7207729a4d1..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Stream-CCITT.h +++ /dev/null @@ -1,478 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Stream.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/Stream.cc deleted file mode 100644 index d2dd761c729..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Stream.cc +++ /dev/null @@ -1,5392 +0,0 @@ -//======================================================================== -// -// 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-2014 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, 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012 Oliver Sander <sander@mi.fu-berlin.de> -// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2012 Even Rouault <even.rouault@mines-paris.org> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> -// Copyright (C) 2013 Pino Toscano <pino@kde.org> -// Copyright (C) 2015 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 -// -//======================================================================== - -#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 "XRef.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 - -#if MULTITHREADED -# define streamLocker() MutexLocker locker(&mutex) -#else -# define streamLocker() -#endif -//------------------------------------------------------------------------ -// Stream (base class) -//------------------------------------------------------------------------ - -Stream::Stream() { - ref = 1; -#if MULTITHREADED - gInitMutex(&mutex); -#endif -} - -Stream::~Stream() { -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -int Stream::incRef() { - streamLocker(); - ++ref; - return ref; -} - -int Stream::decRef() { - streamLocker(); - --ref; - return ref; -} - -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, int recursion) { - Object obj, obj2; - Object params, params2; - Stream *str; - int i; - - str = this; - dict->dictLookup("Filter", &obj, recursion); - if (obj.isNull()) { - obj.free(); - dict->dictLookup("F", &obj); - } - dict->dictLookup("DecodeParms", ¶ms, recursion); - if (params.isNull()) { - params.free(); - dict->dictLookup("DP", ¶ms); - } - if (obj.isName()) { - str = makeFilter(obj.getName(), str, ¶ms, recursion, dict); - } else if (obj.isArray()) { - for (i = 0; i < obj.arrayGetLength(); ++i) { - obj.arrayGet(i, &obj2, recursion); - if (params.isArray()) - params.arrayGet(i, ¶ms2, recursion); - else - params2.initNull(); - if (obj2.isName()) { - str = makeFilter(obj2.getName(), str, ¶ms2, recursion); - } 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 recursion, Object *dict) { - 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, recursion); - if (obj.isInt()) - pred = obj.getInt(); - obj.free(); - params->dictLookup("Columns", &obj, recursion); - if (obj.isInt()) - columns = obj.getInt(); - obj.free(); - params->dictLookup("Colors", &obj, recursion); - if (obj.isInt()) - colors = obj.getInt(); - obj.free(); - params->dictLookup("BitsPerComponent", &obj, recursion); - if (obj.isInt()) - bits = obj.getInt(); - obj.free(); - params->dictLookup("EarlyChange", &obj, recursion); - 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, recursion); - if (obj.isInt()) { - encoding = obj.getInt(); - } - obj.free(); - params->dictLookup("EndOfLine", &obj, recursion); - if (obj.isBool()) { - endOfLine = obj.getBool(); - } - obj.free(); - params->dictLookup("EncodedByteAlign", &obj, recursion); - if (obj.isBool()) { - byteAlign = obj.getBool(); - } - obj.free(); - params->dictLookup("Columns", &obj, recursion); - if (obj.isInt()) { - columns = obj.getInt(); - } - obj.free(); - params->dictLookup("Rows", &obj, recursion); - if (obj.isInt()) { - rows = obj.getInt(); - } - obj.free(); - params->dictLookup("EndOfBlock", &obj, recursion); - if (obj.isBool()) { - endOfBlock = obj.getBool(); - } - obj.free(); - params->dictLookup("BlackIs1", &obj, recursion); - 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, recursion)->isInt()) { - colorXform = obj.getInt(); - } - obj.free(); - } - str = new DCTStream(str, colorXform, dict, recursion); - } else if (!strcmp(name, "FlateDecode") || !strcmp(name, "Fl")) { - pred = 1; - columns = 1; - colors = 1; - bits = 8; - if (params->isDict()) { - params->dictLookup("Predictor", &obj, recursion); - if (obj.isInt()) - pred = obj.getInt(); - obj.free(); - params->dictLookup("Columns", &obj, recursion); - if (obj.isInt()) - columns = obj.getInt(); - obj.free(); - params->dictLookup("Colors", &obj, recursion); - if (obj.isInt()) - colors = obj.getInt(); - obj.free(); - params->dictLookup("BitsPerComponent", &obj, recursion); - if (obj.isInt()) - bits = obj.getInt(); - obj.free(); - } - str = new FlateStream(str, pred, columns, colors, bits); - } else if (!strcmp(name, "JBIG2Decode")) { - if (params->isDict()) { - XRef *xref = params->getDict()->getXRef(); - params->dictLookupNF("JBIG2Globals", &globals); - while (globals.isRef()) { - obj.free(); - globals.copy(&obj); - globals.free(); - obj.fetch(xref, &globals); - } - } - str = new JBIG2Stream(str, &globals, &obj); - globals.free(); - obj.free(); - } else if (!strcmp(name, "JPXDecode")) { - str = new JPXStream(str); - } else if (!strcmp(name, "Crypt")) { - if (str->getKind() == strCrypt) { - str = str->getBaseStream(); - } else { - error(errSyntaxError, getPos(), "Can't revert non decrypt streams"); - } - } 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, Goffset startA) -{ - f = fa; - start = startA; -} - -FileOutStream::~FileOutStream () -{ - close (); -} - -void FileOutStream::close () -{ - -} - -Goffset FileOutStream::getPos () -{ - return Gftell(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, Goffset 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(Goffset 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 (nBits <= 0 || nVals > INT_MAX / nBits - 7 || width > INT_MAX / nComps) { - inputLineSize = -1; - } - inputLine = (Guchar *)gmallocn_checkoverflow(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; - - if (unlikely(inputLine == NULL)) { - return NULL; - } - - 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(GooFile* fileA, Goffset startA, GBool limitedA, - Goffset lengthA, Object *dictA): - BaseStream(dictA, lengthA) { - file = fileA; - offset = start = startA; - limited = limitedA; - length = lengthA; - bufPtr = bufEnd = buf; - bufPos = start; - savePos = 0; - saved = gFalse; -} - -FileStream::~FileStream() { - close(); -} - -BaseStream *FileStream::copy() { - return new FileStream(file, start, limited, length, &dict); -} - -Stream *FileStream::makeSubStream(Goffset startA, GBool limitedA, - Goffset lengthA, Object *dictA) { - return new FileStream(file, startA, limitedA, lengthA, dictA); -} - -void FileStream::reset() { - savePos = offset; - offset = start; - saved = gTrue; - bufPtr = bufEnd = buf; - bufPos = start; -} - -void FileStream::close() { - if (saved) { - offset = savePos; - 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 = file->read(buf, n, offset); - if (n == -1) { - return gFalse; - } - offset += n; - bufEnd = buf + n; - if (bufPtr >= bufEnd) { - return gFalse; - } - return gTrue; -} - -void FileStream::setPos(Goffset pos, int dir) { - Goffset size; - - if (dir >= 0) { - offset = bufPos = pos; - } else { - size = file->size(); - if (pos > size) - pos = size; - offset = size - pos; - bufPos = offset; - } - bufPtr = bufEnd = buf; -} - -void FileStream::moveStart(Goffset delta) { - start += delta; - bufPtr = bufEnd = buf; - bufPos = start; -} - -//------------------------------------------------------------------------ -// CachedFileStream -//------------------------------------------------------------------------ - -CachedFileStream::CachedFileStream(CachedFile *ccA, Goffset startA, - GBool limitedA, Goffset 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(); -} - -BaseStream *CachedFileStream::copy() { - cc->incRefCnt(); - return new CachedFileStream(cc, start, limited, length, &dict); -} - -Stream *CachedFileStream::makeSubStream(Goffset startA, GBool limitedA, - Goffset 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); - } - n = cc->read(buf, 1, n); - bufEnd = buf + n; - if (bufPtr >= bufEnd) { - return gFalse; - } - return gTrue; -} - -void CachedFileStream::setPos(Goffset 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(Goffset delta) -{ - start += delta; - bufPtr = bufEnd = buf; - bufPos = start; -} - -//------------------------------------------------------------------------ -// MemStream -//------------------------------------------------------------------------ - -MemStream::MemStream(char *bufA, Goffset startA, Goffset 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); - } -} - -BaseStream *MemStream::copy() { - return new MemStream(buf, start, length, &dict); -} - -Stream *MemStream::makeSubStream(Goffset startA, GBool limited, - Goffset lengthA, Object *dictA) { - MemStream *subStr; - Goffset 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(Goffset 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(Goffset delta) { - start += delta; - length -= delta; - bufPtr = buf + start; -} - -//------------------------------------------------------------------------ -// EmbedStream -//------------------------------------------------------------------------ - -EmbedStream::EmbedStream(Stream *strA, Object *dictA, - GBool limitedA, Goffset lengthA): - BaseStream(dictA, lengthA) { - str = strA; - limited = limitedA; - length = lengthA; -} - -EmbedStream::~EmbedStream() { -} - -BaseStream *EmbedStream::copy() { - error(errInternal, -1, "Called copy() on EmbedStream"); - return NULL; -} - -Stream *EmbedStream::makeSubStream(Goffset start, GBool limitedA, - Goffset 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 < nChars) { - nChars = length; - } - return str->doGetChars(nChars, buffer); -} - -void EmbedStream::setPos(Goffset pos, int dir) { - error(errInternal, -1, "Internal: called setPos() on EmbedStream"); -} - -Goffset EmbedStream::getStart() { - error(errInternal, -1, "Internal: called getStart() on EmbedStream"); - return 0; -} - -void EmbedStream::moveStart(Goffset 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; i < columns && codingLine[i] < columns; ++i) { - refLine[i] = codingLine[i]; - } - for (; i < columns + 2; ++i) { - 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 && !err) { - 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; - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - } - break; - case twoDimVertR3: - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - addPixels(refLine[b1i] + 3, blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - } - } - break; - case twoDimVertR2: - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - addPixels(refLine[b1i] + 2, blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - } - } - break; - case twoDimVertR1: - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - addPixels(refLine[b1i] + 1, blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - } - } - break; - case twoDimVert0: - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - addPixels(refLine[b1i], blackPixels); - blackPixels ^= 1; - if (codingLine[a0i] < columns) { - ++b1i; - while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { - b1i += 2; - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - } - } - break; - case twoDimVertL3: - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - 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; - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - } - } - break; - case twoDimVertL2: - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - 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; - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - } - } - break; - case twoDimVertL1: - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - 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; - if (unlikely(b1i > columns + 1)) { - error(errSyntaxError, getPos(), - "Bad 2D code {0:04x} in CCITTFax stream", code1); - err = gTrue; - break; - } - } - } - 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; - if (unlikely(a0i > columns)) { - error(errSyntaxError, getPos(), - "Bad bits {0:04x} in CCITTFax stream", bits); - err = gTrue; - break; - } - 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 -#define dctClipLength 768 -static Guchar dctClip[dctClipLength]; -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, Object *dict, int recursion): - 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) { - const int ix = dctClipOffset + 128 + ((dataIn[i] + 8) >> 4); - if (unlikely(ix < 0 || ix >= dctClipLength)) { - dataOut[i] = 0; - } else { - dataOut[i] = dctClip[ix]; - } - } -} - -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::flateReset(GBool unfiltered) { - if (unfiltered) - str->unfilteredReset(); - else - str->reset(); - - index = 0; - remain = 0; - codeBuf = 0; - codeSize = 0; - compressedBlock = gFalse; - endOfBlock = gTrue; - eof = gTrue; -} - -void FlateStream::unfilteredReset() { - flateReset(gTrue); -} - -void FlateStream::reset() { - int cmf, flg; - - flateReset(gFalse); - - // 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/Build/source/libs/poppler/poppler-0.35.0/poppler/Stream.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/Stream.h deleted file mode 100644 index 00b2925b3d5..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/Stream.h +++ /dev/null @@ -1,1258 +0,0 @@ -//======================================================================== -// -// 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, 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> -// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> -// Copyright (C) 2013 Pino Toscano <pino@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_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" -#include "goo/GooMutex.h" - -class GooFile; -class BaseStream; -class CachedFile; - -//------------------------------------------------------------------------ - -enum StreamKind { - strFile, - strCachedFile, - strASCIIHex, - strASCII85, - strLZW, - strRunLength, - strCCITTFax, - strDCT, - strFlate, - strJBIG2, - strJPX, - strWeird, // internal-use stream types - strCrypt // internal-use to detect decode streams -}; - -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(); - int decRef(); - - // 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 Goffset 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(Goffset 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, int recursion = 0); - -private: - virtual GBool hasGetChars() { return false; } - virtual int getChars(int nChars, Guchar *buffer); - - Stream *makeFilter(char *name, Stream *str, Object *params, int recursion = 0, Object *dict = NULL); - - int ref; // reference count -#if MULTITHREADED - GooMutex mutex; -#endif -}; - - - //------------------------------------------------------------------------ -// 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 Goffset getPos() = 0; - - // Put a char in the stream - virtual void put (char c) = 0; - - virtual void printf (const char *format, ...) GCC_PRINTF_FORMAT(2,3) = 0; - -private: - int ref; // reference count - -}; - -//------------------------------------------------------------------------ -// FileOutStream -//------------------------------------------------------------------------ -class FileOutStream : public OutStream { -public: - FileOutStream (FILE* fa, Goffset startA); - - virtual ~FileOutStream (); - - virtual void close(); - - virtual Goffset getPos(); - - virtual void put (char c); - - virtual void printf (const char *format, ...); -private: - FILE *f; - Goffset start; - -}; - - -//------------------------------------------------------------------------ -// BaseStream -// -// This is the base class for all streams that read directly from a file. -//------------------------------------------------------------------------ - -class BaseStream: public Stream { -public: - - BaseStream(Object *dictA, Goffset lengthA); - virtual ~BaseStream(); - virtual BaseStream *copy() = 0; - virtual Stream *makeSubStream(Goffset start, GBool limited, - Goffset length, Object *dict) = 0; - virtual void setPos(Goffset 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 Goffset getLength() { return length; } - - // Get/set position of first byte of stream within the file. - virtual Goffset getStart() = 0; - virtual void moveStart(Goffset delta) = 0; - -protected: - - Goffset length; - 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 Goffset getPos() { return str->getPos(); } - virtual void setPos(Goffset 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(GooFile* fileA, Goffset startA, GBool limitedA, - Goffset lengthA, Object *dictA); - virtual ~FileStream(); - virtual BaseStream *copy(); - virtual Stream *makeSubStream(Goffset startA, GBool limitedA, - Goffset 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 Goffset getPos() { return bufPos + (bufPtr - buf); } - virtual void setPos(Goffset pos, int dir = 0); - virtual Goffset getStart() { return start; } - virtual void moveStart(Goffset 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; - } - -private: - GooFile* file; - Goffset offset; - Goffset start; - GBool limited; - char buf[fileStreamBufSize]; - char *bufPtr; - char *bufEnd; - Goffset bufPos; - Goffset savePos; - GBool saved; -}; - -//------------------------------------------------------------------------ -// CachedFileStream -//------------------------------------------------------------------------ - -#define cachedStreamBufSize 1024 - -class CachedFileStream: public BaseStream { -public: - - CachedFileStream(CachedFile *ccA, Goffset startA, GBool limitedA, - Goffset lengthA, Object *dictA); - virtual ~CachedFileStream(); - virtual BaseStream *copy(); - virtual Stream *makeSubStream(Goffset startA, GBool limitedA, - Goffset 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 Goffset getPos() { return bufPos + (bufPtr - buf); } - virtual void setPos(Goffset pos, int dir = 0); - virtual Goffset getStart() { return start; } - virtual void moveStart(Goffset delta); - - virtual int getUnfilteredChar () { return getChar(); } - virtual void unfilteredReset () { reset(); } - -private: - - GBool fillBuf(); - - CachedFile *cc; - Goffset 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, Goffset startA, Goffset lengthA, Object *dictA); - virtual ~MemStream(); - virtual BaseStream *copy(); - virtual Stream *makeSubStream(Goffset start, GBool limited, - Goffset 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 Goffset getPos() { return (int)(bufPtr - buf); } - virtual void setPos(Goffset pos, int dir = 0); - virtual Goffset getStart() { return start; } - virtual void moveStart(Goffset 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; - Goffset 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, Goffset lengthA); - virtual ~EmbedStream(); - virtual BaseStream *copy(); - virtual Stream *makeSubStream(Goffset start, GBool limitedA, - Goffset lengthA, Object *dictA); - virtual StreamKind getKind() { return str->getKind(); } - virtual void reset() {} - virtual int getChar(); - virtual int lookChar(); - virtual Goffset getPos() { return str->getPos(); } - virtual void setPos(Goffset pos, int dir = 0); - virtual Goffset getStart(); - virtual void moveStart(Goffset 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 (); - - int getEncoding() { return encoding; } - GBool getEndOfLine() { return endOfLine; } - int getColumns() { return columns; } - GBool getBlackIs1() { return black; } - -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, Object *dict, int recursion); - 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: - void flateReset(GBool unfiltered); - 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/Build/source/libs/poppler/poppler-0.35.0/poppler/StructElement.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/StructElement.cc deleted file mode 100644 index c6688208fee..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/StructElement.cc +++ /dev/null @@ -1,1409 +0,0 @@ -//======================================================================== -// -// StructElement.cc -// -// This file is licensed under the GPLv2 or later -// -// Copyright 2013, 2014 Igalia S.L. -// Copyright 2014 Luigi Scarso <luigi.scarso@gmail.com> -// Copyright 2014 Albert Astals Cid <aacid@kde.org> -// Copyright 2015 Dmytro Morgun <lztoad@gmail.com> -// -//======================================================================== - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "StructElement.h" -#include "StructTreeRoot.h" -#include "GlobalParams.h" -#include "UnicodeMap.h" -#include "PDFDoc.h" -#include "Dict.h" - -#include <assert.h> - -class GfxState; - - -static GBool isPlacementName(Object *value) -{ - return value->isName("Block") - || value->isName("Inline") - || value->isName("Before") - || value->isName("Start") - || value->isName("End"); -} - -static GBool isWritingModeName(Object *value) -{ - return value->isName("LrTb") - || value->isName("RlTb") - || value->isName("TbRl"); -} - -static GBool isBorderStyleName(Object *value) -{ - return value->isName("None") - || value->isName("Hidden") - || value->isName("Dotted") - || value->isName("Dashed") - || value->isName("Solid") - || value->isName("Double") - || value->isName("Groove") - || value->isName("Ridge") - || value->isName("Inset") - || value->isName("Outset"); -} - -static GBool isTextAlignName(Object *value) -{ - return value->isName("Start") - || value->isName("End") - || value->isName("Center") - || value->isName("Justify"); -} - -static GBool isBlockAlignName(Object *value) -{ - return value->isName("Before") - || value->isName("Middle") - || value->isName("After") - || value->isName("Justify"); -} - -static GBool isInlineAlignName(Object *value) -{ - return value->isName("Start") - || value->isName("End") - || value->isName("Center"); -} - -static GBool isNumber(Object *value) -{ - return value->isNum(); -} - -static GBool isLineHeight(Object *value) -{ - return value->isName("Normal") - || value->isName("Auto") - || isNumber(value); -} - -static GBool isTextDecorationName(Object *value) -{ - return value->isName("None") - || value->isName("Underline") - || value->isName("Overline") - || value->isName("LineThrough"); -} - -static GBool isRubyAlignName(Object *value) -{ - return value->isName("Start") - || value->isName("End") - || value->isName("Center") - || value->isName("Justify") - || value->isName("Distribute"); -} - -static GBool isRubyPositionName(Object *value) -{ - return value->isName("Before") - || value->isName("After") - || value->isName("Warichu") - || value->isName("Inline"); -} - -static GBool isGlyphOrientationName(Object *value) -{ - return value->isName("Auto") - || value->isName("90") - || value->isName("180") - || value->isName("270") - || value->isName("360") - || value->isName("-90") - || value->isName("-180"); -} - -static GBool isListNumberingName(Object *value) -{ - return value->isName("None") - || value->isName("Disc") - || value->isName("Circle") - || value->isName("Square") - || value->isName("Decimal") - || value->isName("UpperRoman") - || value->isName("LowerRoman") - || value->isName("UpperAlpha") - || value->isName("LowerAlpha"); -} - -static GBool isFieldRoleName(Object *value) -{ - return value->isName("rb") - || value->isName("cb") - || value->isName("pb") - || value->isName("tv"); -} - -static GBool isFieldCheckedName(Object *value) -{ - return value->isName("on") - || value->isName("off") - || value->isName("neutral"); -} - -static GBool isTableScopeName(Object *value) -{ - return value->isName("Row") - || value->isName("Column") - || value->isName("Both"); -} - -static GBool isRGBColor(Object *value) -{ - if (!(value->isArray() && value->arrayGetLength() == 3)) - return gFalse; - - GBool okay = gTrue; - for (int i = 0; i < 3; i++) { - Object obj; - if (!value->arrayGet(i, &obj)->isNum()) { - okay = gFalse; - obj.free(); - break; - } - if (obj.getNum() < 0.0 || obj.getNum() > 1.0) { - okay = gFalse; - obj.free(); - break; - } - obj.free(); - } - - return okay; -} - -static GBool isNatural(Object *value) -{ - return (value->isInt() && value->getInt() > 0) - || (value->isInt64() && value->getInt64() > 0); -} - -static GBool isPositive(Object *value) -{ - return value->isNum() && value->getNum() >= 0.0; -} - -static GBool isNumberOrAuto(Object *value) -{ - return isNumber(value) || value->isName("Auto"); -} - -static GBool isTextString(Object *value) -{ - // XXX: Shall isName() also be checked? - return value->isString(); -} - - -#define ARRAY_CHECKER(name, checkItem, length, allowSingle, allowNulls) \ - static GBool name(Object *value) { \ - if (!value->isArray()) \ - return allowSingle ? checkItem(value) : gFalse; \ - \ - if (length && value->arrayGetLength() != length) \ - return gFalse; \ - \ - GBool okay = gTrue; \ - for (int i = 0; i < value->arrayGetLength(); i++) { \ - Object obj; \ - value->arrayGet(i, &obj); \ - if ((!allowNulls && obj.isNull()) || !checkItem(&obj)) { \ - okay = gFalse; \ - obj.free(); \ - break; \ - } \ - obj.free(); \ - } \ - return okay; \ - } - -ARRAY_CHECKER(isRGBColorOrOptionalArray4, isRGBColor, 4, gTrue, gTrue ); -ARRAY_CHECKER(isPositiveOrOptionalArray4, isPositive, 4, gTrue, gTrue ); -ARRAY_CHECKER(isPositiveOrArray4, isPositive, 4, gTrue, gFalse); -ARRAY_CHECKER(isBorderStyle, isBorderStyleName, 4, gTrue, gTrue ); -ARRAY_CHECKER(isNumberArray4, isNumber, 4, gFalse, gFalse); -ARRAY_CHECKER(isNumberOrArrayN, isNumber, 0, gTrue, gFalse); -ARRAY_CHECKER(isTableHeaders, isTextString, 0, gFalse, gFalse); - - -// Type of functions used to do type-checking on attribute values -typedef GBool (*AttributeCheckFunc)(Object*); - -// Maps attributes to their names and whether the attribute can be inherited. -struct AttributeMapEntry { - Attribute::Type type; - const char *name; - const Object *defval; - GBool inherit; - AttributeCheckFunc check; -}; - -struct AttributeDefaults { - Object Inline; - Object LrTb; - Object Normal; - Object Distribute; - Object off; - Object Zero; - Object Auto; - Object Start; - Object None; - Object Before; - Object Nat1; - - AttributeDefaults() { - Inline.initName("Inline"); - LrTb.initName("LrTb"); - Normal.initName("Normal"); - Distribute.initName("Distribute"); - off.initName("off"); - - Zero.initReal(0.0); - Auto.initName("Auto"); - Start.initName("Start"); - None.initName("None"); - Before.initName("Before"); - Nat1.initInt(1); - } - - ~AttributeDefaults() { - Inline.free(); - LrTb.free(); - Normal.free(); - Distribute.free(); - off.free(); - Zero.free(); - Auto.free(); - Start.free(); - None.free(); - Before.free(); - Nat1.free(); - } -}; - -static const AttributeDefaults attributeDefaults; - - -#define ATTR_LIST_END \ - { Attribute::Unknown, NULL, NULL, gFalse, NULL } - -#define ATTR_WITH_DEFAULT(name, inherit, check, defval) \ - { Attribute::name, \ - #name, \ - &attributeDefaults.defval, \ - inherit, \ - check } - -#define ATTR(name, inherit, check) \ - { Attribute::name, \ - #name, \ - NULL, \ - inherit, \ - check } - -static const AttributeMapEntry attributeMapCommonShared[] = -{ - ATTR_WITH_DEFAULT(Placement, gFalse, isPlacementName, Inline), - ATTR_WITH_DEFAULT(WritingMode, gTrue, isWritingModeName, LrTb), - ATTR (BackgroundColor, gFalse, isRGBColor), - ATTR (BorderColor, gTrue, isRGBColorOrOptionalArray4), - ATTR_WITH_DEFAULT(BorderStyle, gFalse, isBorderStyle, None), - ATTR (BorderThickness, gTrue, isPositiveOrOptionalArray4), - ATTR_WITH_DEFAULT(Padding, gFalse, isPositiveOrArray4, Zero), - ATTR (Color, gTrue, isRGBColor), - ATTR_LIST_END -}; - -static const AttributeMapEntry attributeMapCommonBlock[] = -{ - ATTR_WITH_DEFAULT(SpaceBefore, gFalse, isPositive, Zero), - ATTR_WITH_DEFAULT(SpaceAfter, gFalse, isPositive, Zero), - ATTR_WITH_DEFAULT(StartIndent, gTrue, isNumber, Zero), - ATTR_WITH_DEFAULT(EndIndent, gTrue, isNumber, Zero), - ATTR_WITH_DEFAULT(TextIndent, gTrue, isNumber, Zero), - ATTR_WITH_DEFAULT(TextAlign, gTrue, isTextAlignName, Start), - ATTR (BBox, gFalse, isNumberArray4), - ATTR_WITH_DEFAULT(Width, gFalse, isNumberOrAuto, Auto), - ATTR_WITH_DEFAULT(Height, gFalse, isNumberOrAuto, Auto), - ATTR_WITH_DEFAULT(BlockAlign, gTrue, isBlockAlignName, Before), - ATTR_WITH_DEFAULT(InlineAlign, gTrue, isInlineAlignName, Start), - ATTR_LIST_END -}; - -static const AttributeMapEntry attributeMapCommonInline[] = -{ - ATTR_WITH_DEFAULT(BaselineShift, gFalse, isNumber, Zero), - ATTR_WITH_DEFAULT(LineHeight, gTrue, isLineHeight, Normal), - ATTR (TextDecorationColor, gTrue, isRGBColor), - ATTR (TextDecorationThickness, gTrue, isPositive), - ATTR_WITH_DEFAULT(TextDecorationType, gFalse, isTextDecorationName, None), - ATTR_WITH_DEFAULT(GlyphOrientationVertical, gTrue, isGlyphOrientationName, Auto), - ATTR_LIST_END -}; - -static const AttributeMapEntry attributeMapCommonRubyText[] = -{ - ATTR_WITH_DEFAULT(RubyPosition, gTrue, isRubyPositionName, Before), - ATTR_WITH_DEFAULT(RubyAlign, gTrue, isRubyAlignName, Distribute), - ATTR_LIST_END -}; - -static const AttributeMapEntry attributeMapCommonColumns[] = -{ - ATTR_WITH_DEFAULT(ColumnCount, gFalse, isNatural, Nat1), - ATTR (ColumnGap, gFalse, isNumberOrArrayN), - ATTR (ColumnWidths, gFalse, isNumberOrArrayN), - ATTR_LIST_END -}; - -static const AttributeMapEntry attributeMapCommonList[] = { - ATTR_WITH_DEFAULT(ListNumbering, gTrue, isListNumberingName, None), - ATTR_LIST_END -}; - -static const AttributeMapEntry attributeMapCommonPrintField[] = -{ - ATTR (Role, gFalse, isFieldRoleName), - ATTR_WITH_DEFAULT(checked, gFalse, isFieldCheckedName, off), - ATTR (Desc, gFalse, isTextString), - ATTR_LIST_END -}; - -static const AttributeMapEntry attributeMapCommonTable[] = -{ - ATTR(Headers, gFalse, isTableHeaders), - ATTR(Scope, gFalse, isTableScopeName), - ATTR(Summary, gFalse, isTextString), - ATTR_LIST_END -}; - -static const AttributeMapEntry attributeMapCommonTableCell[] = -{ - ATTR_WITH_DEFAULT(RowSpan, gFalse, isNatural, Nat1), - ATTR_WITH_DEFAULT(ColSpan, gFalse, isNatural, Nat1), - ATTR_WITH_DEFAULT(TBorderStyle, gTrue, isBorderStyle, None), - ATTR_WITH_DEFAULT(TPadding, gTrue, isPositiveOrArray4, Zero), - ATTR_LIST_END -}; - -#undef ATTR_WITH_DEFAULT -#undef ATTR - - -static const AttributeMapEntry *attributeMapAll[] = { - attributeMapCommonShared, - attributeMapCommonBlock, - attributeMapCommonInline, - attributeMapCommonRubyText, - attributeMapCommonColumns, - attributeMapCommonList, - attributeMapCommonPrintField, - attributeMapCommonTable, - attributeMapCommonTableCell, - NULL, -}; - -static const AttributeMapEntry *attributeMapShared[] = { - attributeMapCommonShared, - NULL, -}; - -static const AttributeMapEntry *attributeMapBlock[] = { - attributeMapCommonShared, - attributeMapCommonBlock, - NULL, -}; - -static const AttributeMapEntry *attributeMapInline[] = { - attributeMapCommonShared, - attributeMapCommonInline, - NULL, -}; - -static const AttributeMapEntry *attributeMapTableCell[] = { - attributeMapCommonShared, - attributeMapCommonBlock, - attributeMapCommonTable, - attributeMapCommonTableCell, - NULL, -}; - -static const AttributeMapEntry *attributeMapRubyText[] = { - attributeMapCommonShared, - attributeMapCommonInline, - attributeMapCommonRubyText, - NULL, -}; - -static const AttributeMapEntry *attributeMapColumns[] = { - attributeMapCommonShared, - attributeMapCommonInline, - attributeMapCommonColumns, - NULL, -}; - -static const AttributeMapEntry *attributeMapList[] = { - attributeMapCommonShared, - attributeMapCommonList, - NULL, -}; - -static const AttributeMapEntry *attributeMapTable[] = { - attributeMapCommonShared, - attributeMapCommonBlock, - attributeMapCommonTable, - NULL, -}; - -static const AttributeMapEntry *attributeMapIllustration[] = { - // XXX: Illustrations may have some attributes from the "shared", "inline", - // the "block" sets. This is a loose specification; making it better - // means duplicating entries from the sets. This seems good enough... - attributeMapCommonShared, - attributeMapCommonBlock, - attributeMapCommonInline, - NULL, -}; - -// Table mapping owners of attributes to their names. -static const struct OwnerMapEntry { - Attribute::Owner owner; - const char *name; -} ownerMap[] = { - // XXX: Those are sorted in the owner priority resolution order. If the - // same attribute is defined with two owners, the order in the table - // can be used to know which one has more priority. - { Attribute::XML_1_00, "XML-1.00" }, - { Attribute::HTML_3_20, "HTML-3.20" }, - { Attribute::HTML_4_01, "HTML-4.01" }, - { Attribute::OEB_1_00, "OEB-1.00" }, - { Attribute::RTF_1_05, "RTF-1.05" }, - { Attribute::CSS_1_00, "CSS-1.00" }, - { Attribute::CSS_2_00, "CSS-2.00" }, - { Attribute::Layout, "Layout" }, - { Attribute::PrintField, "PrintField" }, - { Attribute::Table, "Table" }, - { Attribute::List, "List" }, - { Attribute::UserProperties, "UserProperties" }, -}; - - -static GBool ownerHasMorePriority(Attribute::Owner a, Attribute::Owner b) -{ - unsigned aIndex, bIndex; - - for (unsigned i = aIndex = bIndex = 0; i < sizeof(ownerMap) / sizeof(ownerMap[0]); i++) { - if (ownerMap[i].owner == a) - aIndex = i; - if (ownerMap[i].owner == b) - bIndex = i; - } - - return aIndex < bIndex; -} - - -// Maps element types to their names and also serves as lookup table -// for additional element type attributes. - -enum ElementType { - elementTypeUndefined, - elementTypeGrouping, - elementTypeInline, - elementTypeBlock, -}; - -static const struct TypeMapEntry { - StructElement::Type type; - const char *name; - ElementType elementType; - const AttributeMapEntry **attributes; -} typeMap[] = { - { StructElement::Document, "Document", elementTypeGrouping, attributeMapShared }, - { StructElement::Part, "Part", elementTypeGrouping, attributeMapShared }, - { StructElement::Art, "Art", elementTypeGrouping, attributeMapColumns }, - { StructElement::Sect, "Sect", elementTypeGrouping, attributeMapColumns }, - { StructElement::Div, "Div", elementTypeGrouping, attributeMapColumns }, - { StructElement::BlockQuote, "BlockQuote", elementTypeGrouping, attributeMapInline }, - { StructElement::Caption, "Caption", elementTypeGrouping, attributeMapInline }, - { StructElement::NonStruct, "NonStruct", elementTypeGrouping, attributeMapInline }, - { StructElement::Index, "Index", elementTypeGrouping, attributeMapInline }, - { StructElement::Private, "Private", elementTypeGrouping, attributeMapInline }, - { StructElement::Span, "Span", elementTypeInline, attributeMapInline }, - { StructElement::Quote, "Quote", elementTypeInline, attributeMapInline }, - { StructElement::Note, "Note", elementTypeInline, attributeMapInline }, - { StructElement::Reference, "Reference", elementTypeInline, attributeMapInline }, - { StructElement::BibEntry, "BibEntry", elementTypeInline, attributeMapInline }, - { StructElement::Code, "Code", elementTypeInline, attributeMapInline }, - { StructElement::Link, "Link", elementTypeInline, attributeMapInline }, - { StructElement::Annot, "Annot", elementTypeInline, attributeMapInline }, - { StructElement::Ruby, "Ruby", elementTypeInline, attributeMapRubyText }, - { StructElement::RB, "RB", elementTypeUndefined, attributeMapRubyText }, - { StructElement::RT, "RT", elementTypeUndefined, attributeMapRubyText }, - { StructElement::RP, "RP", elementTypeUndefined, attributeMapShared }, - { StructElement::Warichu, "Warichu", elementTypeInline, attributeMapRubyText }, - { StructElement::WT, "WT", elementTypeUndefined, attributeMapShared }, - { StructElement::WP, "WP", elementTypeUndefined, attributeMapShared }, - { StructElement::P, "P", elementTypeBlock, attributeMapBlock }, - { StructElement::H, "H", elementTypeBlock, attributeMapBlock }, - { StructElement::H1, "H1", elementTypeBlock, attributeMapBlock }, - { StructElement::H2, "H2", elementTypeBlock, attributeMapBlock }, - { StructElement::H3, "H3", elementTypeBlock, attributeMapBlock }, - { StructElement::H4, "H4", elementTypeBlock, attributeMapBlock }, - { StructElement::H5, "H5", elementTypeBlock, attributeMapBlock }, - { StructElement::H6, "H6", elementTypeBlock, attributeMapBlock }, - { StructElement::L, "L", elementTypeBlock, attributeMapList }, - { StructElement::LI, "LI", elementTypeBlock, attributeMapBlock }, - { StructElement::Lbl, "Lbl", elementTypeBlock, attributeMapBlock }, - { StructElement::LBody, "LBody", elementTypeBlock, attributeMapBlock }, - { StructElement::Table, "Table", elementTypeBlock, attributeMapTable }, - { StructElement::TR, "TR", elementTypeUndefined, attributeMapShared }, - { StructElement::TH, "TH", elementTypeUndefined, attributeMapTableCell }, - { StructElement::TD, "TD", elementTypeUndefined, attributeMapTableCell }, - { StructElement::THead, "THead", elementTypeUndefined, attributeMapShared }, - { StructElement::TFoot, "TFoot", elementTypeUndefined, attributeMapShared }, - { StructElement::TBody, "TBody", elementTypeUndefined, attributeMapShared }, - { StructElement::Figure, "Figure", elementTypeUndefined, attributeMapIllustration }, - { StructElement::Formula, "Formula", elementTypeUndefined, attributeMapIllustration }, - { StructElement::Form, "Form", elementTypeUndefined, attributeMapIllustration }, - { StructElement::TOC, "TOC", elementTypeGrouping, attributeMapShared }, - { StructElement::TOCI, "TOCI", elementTypeGrouping, attributeMapShared }, -}; - - -//------------------------------------------------------------------------ -// Helpers for the attribute and structure type tables -//------------------------------------------------------------------------ - -static inline const AttributeMapEntry * -getAttributeMapEntry(const AttributeMapEntry **entryList, Attribute::Type type) -{ - assert(entryList); - while (*entryList) { - const AttributeMapEntry *entry = *entryList; - while (entry->type != Attribute::Unknown) { - assert(entry->name); - if (type == entry->type) - return entry; - entry++; - } - entryList++; - } - return NULL; -} - -static inline const AttributeMapEntry * -getAttributeMapEntry(const AttributeMapEntry **entryList, const char *name) -{ - assert(entryList); - while (*entryList) { - const AttributeMapEntry *entry = *entryList; - while (entry->type != Attribute::Unknown) { - assert(entry->name); - if (strcmp(name, entry->name) == 0) - return entry; - entry++; - } - entryList++; - } - return NULL; -} - -static inline const OwnerMapEntry *getOwnerMapEntry(Attribute::Owner owner) -{ - for (unsigned i = 0; i < sizeof(ownerMap) / sizeof(ownerMap[0]); i++) { - if (owner == ownerMap[i].owner) - return &ownerMap[i]; - } - return NULL; -} - -static inline const OwnerMapEntry *getOwnerMapEntry(const char *name) -{ - for (unsigned i = 0; i < sizeof(ownerMap) / sizeof(ownerMap[0]); i++) { - if (strcmp(name, ownerMap[i].name) == 0) - return &ownerMap[i]; - } - return NULL; -} - -static const char *ownerToName(Attribute::Owner owner) -{ - const OwnerMapEntry *entry = getOwnerMapEntry(owner); - return entry ? entry->name : "UnknownOwner"; -} - -static Attribute::Owner nameToOwner(const char *name) -{ - const OwnerMapEntry *entry = getOwnerMapEntry(name); - return entry ? entry->owner : Attribute::UnknownOwner; -} - -static inline const TypeMapEntry *getTypeMapEntry(StructElement::Type type) -{ - for (unsigned i = 0; i < sizeof(typeMap) / sizeof(typeMap[0]); i++) { - if (type == typeMap[i].type) - return &typeMap[i]; - } - return NULL; -} - -static inline const TypeMapEntry *getTypeMapEntry(const char *name) -{ - for (unsigned i = 0; i < sizeof(typeMap) / sizeof(typeMap[0]); i++) { - if (strcmp(name, typeMap[i].name) == 0) - return &typeMap[i]; - } - return NULL; -} - -static const char *typeToName(StructElement::Type type) -{ - if (type == StructElement::MCID) - return "MarkedContent"; - if (type == StructElement::OBJR) - return "ObjectReference"; - - const TypeMapEntry *entry = getTypeMapEntry(type); - return entry ? entry->name : "Unknown"; -} - -static StructElement::Type nameToType(const char *name) -{ - const TypeMapEntry *entry = getTypeMapEntry(name); - return entry ? entry->type : StructElement::Unknown; -} - - -//------------------------------------------------------------------------ -// Attribute -//------------------------------------------------------------------------ - -Attribute::Attribute(const char *nameA, int nameLenA, Object *valueA): - type(UserProperty), - owner(UserProperties), - revision(0), - name(nameA, nameLenA), - value(), - hidden(gFalse), - formatted(NULL) -{ - assert(valueA); - valueA->copy(&value); -} - -Attribute::Attribute(Type type, Object *valueA): - type(type), - owner(UserProperties), // TODO: Determine corresponding owner from Type - revision(0), - name(), - value(), - hidden(gFalse), - formatted(NULL) -{ - assert(valueA); - - valueA->copy(&value); - - if (!checkType()) - type = Unknown; -} - -Attribute::~Attribute() -{ - delete formatted; - value.free(); -} - -const char *Attribute::getTypeName() const -{ - if (type == UserProperty) - return name.getCString(); - - const AttributeMapEntry *entry = getAttributeMapEntry(attributeMapAll, type); - if (entry) - return entry->name; - - return "Unknown"; -} - -const char *Attribute::getOwnerName() const -{ - return ownerToName(owner); -} - -Object *Attribute::getDefaultValue(Attribute::Type type) -{ - const AttributeMapEntry *entry = getAttributeMapEntry(attributeMapAll, type); - return entry ? const_cast<Object*>(entry->defval) : NULL; -} - -void Attribute::setFormattedValue(const char *formattedA) -{ - if (formattedA) { - if (formatted) - formatted->Set(formattedA); - else - formatted = new GooString(formattedA); - } else { - delete formatted; - formatted = NULL; - } -} - -GBool Attribute::checkType(StructElement *element) -{ - // If an element is passed, tighther type-checking can be done. - if (!element) - return gTrue; - - const TypeMapEntry *elementTypeEntry = getTypeMapEntry(element->getType()); - if (elementTypeEntry && elementTypeEntry->attributes) { - const AttributeMapEntry *entry = getAttributeMapEntry(elementTypeEntry->attributes, type); - if (entry) { - if (entry->check && !((*entry->check)(&value))) { - return gFalse; - } - } else { - // No entry: the attribute is not valid for the containing element. - return gFalse; - } - } - - return gTrue; -} - -Attribute::Type Attribute::getTypeForName(const char *name, StructElement *element) -{ - const AttributeMapEntry **attributes = attributeMapAll; - if (element) { - const TypeMapEntry *elementTypeEntry = getTypeMapEntry(element->getType()); - if (elementTypeEntry && elementTypeEntry->attributes) { - attributes = elementTypeEntry->attributes; - } - } - - const AttributeMapEntry *entry = getAttributeMapEntry(attributes, name); - return entry ? entry->type : Unknown; -} - -Attribute *Attribute::parseUserProperty(Dict *property) -{ - Object obj, value; - const char *name = NULL; - int nameLen = GooString::CALC_STRING_LEN; - - if (property->lookup("N", &obj)->isString()) { - GooString *s = obj.getString(); - name = s->getCString(); - nameLen = s->getLength(); - } else if (obj.isName()) - name = obj.getName(); - else { - error(errSyntaxError, -1, "N object is wrong type ({0:s})", obj.getTypeName()); - obj.free(); - return NULL; - } - - if (property->lookup("V", &value)->isNull()) { - error(errSyntaxError, -1, "V object is wrong type ({0:s})", value.getTypeName()); - value.free(); - obj.free(); - return NULL; - } - - Attribute *attribute = new Attribute(name, nameLen, &value); - value.free(); - obj.free(); - - if (property->lookup("F", &obj)->isString()) { - attribute->setFormattedValue(obj.getString()->getCString()); - } else if (!obj.isNull()) { - error(errSyntaxWarning, -1, "F object is wrong type ({0:s})", obj.getTypeName()); - } - obj.free(); - - if (property->lookup("H", &obj)->isBool()) { - attribute->setHidden(obj.getBool()); - } else if (!obj.isNull()) { - error(errSyntaxWarning, -1, "H object is wrong type ({0:s})", obj.getTypeName()); - } - obj.free(); - - return attribute; -} - - -//------------------------------------------------------------------------ -// StructElement -//------------------------------------------------------------------------ - -StructElement::StructData::StructData(): - altText(0), - actualText(0), - id(0), - title(0), - expandedAbbr(0), - language(0), - revision(0) -{ -} - -StructElement::StructData::~StructData() -{ - delete altText; - delete actualText; - delete id; - delete title; - delete language; - parentRef.free(); - for (ElemPtrArray::iterator i = elements.begin(); i != elements.end(); ++i) delete *i; - for (AttrPtrArray::iterator i = attributes.begin(); i != attributes.end(); ++i) delete *i; -} - - -StructElement::StructElement(Dict *element, - StructTreeRoot *treeRootA, - StructElement *parentA, - std::set<int> &seen): - type(Unknown), - treeRoot(treeRootA), - parent(parentA), - s(new StructData()) -{ - assert(treeRoot); - assert(element); - - parse(element); - parseChildren(element, seen); -} - -StructElement::StructElement(int mcid, StructTreeRoot *treeRootA, StructElement *parentA): - type(MCID), - treeRoot(treeRootA), - parent(parentA), - c(new ContentData(mcid)) -{ - assert(treeRoot); - assert(parent); -} - -StructElement::StructElement(const Ref& ref, StructTreeRoot *treeRootA, StructElement *parentA): - type(OBJR), - treeRoot(treeRootA), - parent(parentA), - c(new ContentData(ref)) -{ - assert(treeRoot); - assert(parent); -} - -StructElement::~StructElement() -{ - if (isContent()) - delete c; - else - delete s; - pageRef.free(); -} - -GBool StructElement::isBlock() const -{ - const TypeMapEntry *entry = getTypeMapEntry(type); - return entry ? (entry->elementType == elementTypeBlock) : gFalse; -} - -GBool StructElement::isInline() const -{ - const TypeMapEntry *entry = getTypeMapEntry(type); - return entry ? (entry->elementType == elementTypeInline) : gFalse; -} - -GBool StructElement::isGrouping() const -{ - const TypeMapEntry *entry = getTypeMapEntry(type); - return entry ? (entry->elementType == elementTypeGrouping) : gFalse; -} - -GBool StructElement::hasPageRef() const -{ - return pageRef.isRef() || (parent && parent->hasPageRef()); -} - -bool StructElement::getPageRef(Ref& ref) const -{ - if (pageRef.isRef()) { - ref = pageRef.getRef(); - return gTrue; - } - - if (parent) - return parent->getPageRef(ref); - - return gFalse; -} - -const char *StructElement::getTypeName() const -{ - return typeToName(type); -} - -const Attribute *StructElement::findAttribute(Attribute::Type attributeType, GBool inherit, - Attribute::Owner attributeOwner) const -{ - if (isContent()) - return parent->findAttribute(attributeType, inherit, attributeOwner); - - if (attributeType == Attribute::Unknown || attributeType == Attribute::UserProperty) - return NULL; - - const Attribute *result = NULL; - - if (attributeOwner == Attribute::UnknownOwner) { - // Search for the attribute, no matter who the owner is - for (unsigned i = 0; i < getNumAttributes(); i++) { - const Attribute *attr = getAttribute(i); - if (attributeType == attr->getType()) { - if (!result || ownerHasMorePriority(attr->getOwner(), result->getOwner())) - result = attr; - } - } - } else { - // Search for the attribute, with a specific owner - for (unsigned i = 0; i < getNumAttributes(); i++) { - const Attribute *attr = getAttribute(i); - if (attributeType == attr->getType() && attributeOwner == attr->getOwner()) { - result = attr; - break; - } - } - } - - if (result) - return result; - - if (inherit && parent) { - const AttributeMapEntry *entry = getAttributeMapEntry(attributeMapAll, attributeType); - assert(entry); - // TODO: Take into account special inheritance cases, for example: - // inline elements which have been changed to be block using - // "/Placement/Block" have slightly different rules. - if (entry->inherit) - return parent->findAttribute(attributeType, inherit, attributeOwner); - } - - return NULL; -} - -GooString* StructElement::appendSubTreeText(GooString *string, GBool recursive) const -{ - if (isContent() && !isObjectRef()) { - MarkedContentOutputDev mcdev(getMCID()); - const TextSpanArray& spans(getTextSpansInternal(mcdev)); - - if (!string) - string = new GooString(); - - for (TextSpanArray::const_iterator i = spans.begin(); i != spans.end(); ++i) - string->append(i->getText()); - - return string; - } - - if (!recursive) - return NULL; - - // Do a depth-first traversal, to get elements in logical order - if (!string) - string = new GooString(); - - for (unsigned i = 0; i < getNumChildren(); i++) - getChild(i)->appendSubTreeText(string, recursive); - - return string; -} - -const TextSpanArray& StructElement::getTextSpansInternal(MarkedContentOutputDev& mcdev) const -{ - assert(isContent()); - - int startPage = 0, endPage = 0; - - Ref ref; - if (getPageRef(ref)) { - startPage = endPage = treeRoot->getDoc()->findPage(ref.num, ref.gen); - } - - if (!(startPage && endPage)) { - startPage = 1; - endPage = treeRoot->getDoc()->getNumPages(); - } - - treeRoot->getDoc()->displayPages(&mcdev, startPage, endPage, 72.0, 72.0, 0, gTrue, gFalse, gFalse); - return mcdev.getTextSpans(); -} - -static StructElement::Type roleMapResolve(Dict *roleMap, const char *name, const char *curName, Object *resolved) -{ - // Circular reference - if (curName && !strcmp(name, curName)) - return StructElement::Unknown; - - if (roleMap->lookup(curName ? curName : name, resolved)->isName()) { - StructElement::Type type = nameToType(resolved->getName()); - return type == StructElement::Unknown - ? roleMapResolve(roleMap, name, resolved->getName(), resolved) - : type; - } - - if (!resolved->isNull()) - error(errSyntaxWarning, -1, "RoleMap entry is wrong type ({0:s})", resolved->getTypeName()); - return StructElement::Unknown; -} - -void StructElement::parse(Dict *element) -{ - Object obj; - - // Type is optional, but if present must be StructElem - if (!element->lookup("Type", &obj)->isNull() && !obj.isName("StructElem")) { - error(errSyntaxError, -1, "Type of StructElem object is wrong"); - obj.free(); - return; - } - obj.free(); - - // Parent object reference (required). - if (!element->lookupNF("P", &s->parentRef)->isRef()) { - error(errSyntaxError, -1, "P object is wrong type ({0:s})", obj.getTypeName()); - return; - } - - // Check whether the S-type is valid for the top level - // element and create a node of the appropriate type. - if (!element->lookup("S", &obj)->isName()) { - error(errSyntaxError, -1, "S object is wrong type ({0:s})", obj.getTypeName()); - obj.free(); - return; - } - - // Type name may not be standard, resolve through RoleMap first. - if (treeRoot->getRoleMap()) { - Object resolvedName; - type = roleMapResolve(treeRoot->getRoleMap(), obj.getName(), NULL, &resolvedName); - } - - // Resolving through RoleMap may leave type as Unknown, e.g. for types - // which are not present in it, yet they are standard element types. - if (type == Unknown) - type = nameToType(obj.getName()); - - // At this point either the type name must have been resolved. - if (type == Unknown) { - error(errSyntaxError, -1, "StructElem object is wrong type ({0:s})", obj.getName()); - obj.free(); - return; - } - obj.free(); - - // Object ID (optional), to be looked at the IDTree in the tree root. - if (element->lookup("ID", &obj)->isString()) { - s->id = obj.takeString(); - } - obj.free(); - - // Page reference (optional) in which at least one of the child items - // is to be rendered in. Note: each element stores only the /Pg value - // contained by it, and StructElement::getPageRef() may look in parent - // elements to find the page where an element belongs. - element->lookupNF("Pg", &pageRef); - - // Revision number (optional). - if (element->lookup("R", &obj)->isInt()) { - s->revision = obj.getInt(); - } - obj.free(); - - // Element title (optional). - if (element->lookup("T", &obj)->isString()) { - s->title = obj.takeString(); - } - obj.free(); - - // Language (optional). - if (element->lookup("Lang", &obj)->isString()) { - s->language = obj.takeString(); - } - obj.free(); - - // Alternative text (optional). - if (element->lookup("Alt", &obj)->isString()) { - s->altText = obj.takeString(); - } - obj.free(); - - // Expanded form of an abbreviation (optional). - if (element->lookup("E", &obj)->isString()) { - s->expandedAbbr = obj.takeString(); - } - obj.free(); - - // Actual text (optional). - if (element->lookup("ActualText", &obj)->isString()) { - s->actualText = obj.takeString(); - } - obj.free(); - - // Attributes directly attached to the element (optional). - if (element->lookup("A", &obj)->isDict()) { - parseAttributes(obj.getDict()); - } else if (obj.isArray()) { - Object iobj; - unsigned attrIndex = getNumAttributes(); - for (int i = 0; i < obj.arrayGetLength(); i++) { - if (obj.arrayGet(i, &iobj)->isDict()) { - attrIndex = getNumAttributes(); - parseAttributes(iobj.getDict()); - } else if (iobj.isInt()) { - const int revision = iobj.getInt(); - // Set revision numbers for the elements previously created. - for (unsigned j = attrIndex; j < getNumAttributes(); j++) - getAttribute(j)->setRevision(revision); - } else { - error(errSyntaxWarning, -1, "A item is wrong type ({0:s})", iobj.getTypeName()); - } - iobj.free(); - } - } else if (!obj.isNull()) { - error(errSyntaxWarning, -1, "A is wrong type ({0:s})", obj.getTypeName()); - } - obj.free(); - - // Attributes referenced indirectly through the ClassMap (optional). - if (treeRoot->getClassMap()) { - Object classes; - if (element->lookup("C", &classes)->isName()) { - Object attr; - if (treeRoot->getClassMap()->lookup(classes.getName(), &attr)->isDict()) { - parseAttributes(attr.getDict(), gTrue); - } else if (attr.isArray()) { - for (int i = 0; i < attr.arrayGetLength(); i++) { - Object iobj; - unsigned attrIndex = getNumAttributes(); - if (attr.arrayGet(i, &iobj)->isDict()) { - attrIndex = getNumAttributes(); - parseAttributes(iobj.getDict(), gTrue); - } else if (iobj.isInt()) { - // Set revision numbers for the elements previously created. - const int revision = iobj.getInt(); - for (unsigned j = attrIndex; j < getNumAttributes(); j++) - getAttribute(j)->setRevision(revision); - } else { - error(errSyntaxWarning, -1, "C item is wrong type ({0:s})", iobj.getTypeName()); - } - iobj.free(); - } - } else if (!attr.isNull()) { - error(errSyntaxWarning, -1, "C object is wrong type ({0:s})", classes.getTypeName()); - } - classes.free(); - attr.free(); - } - } -} - -StructElement *StructElement::parseChild(Object *ref, - Object *childObj, - std::set<int> &seen) -{ - assert(childObj); - assert(ref); - - StructElement *child = NULL; - - if (childObj->isInt()) { - child = new StructElement(childObj->getInt(), treeRoot, this); - } else if (childObj->isDict("MCR")) { - /* - * TODO: The optional Stm/StwOwn attributes are not handled, so all the - * page will be always scanned when calling StructElement::getText(). - */ - Object mcidObj; - Object pageRefObj; - - if (!childObj->dictLookup("MCID", &mcidObj)->isInt()) { - error(errSyntaxError, -1, "MCID object is wrong type ({0:s})", mcidObj.getTypeName()); - mcidObj.free(); - return NULL; - } - - child = new StructElement(mcidObj.getInt(), treeRoot, this); - mcidObj.free(); - - if (childObj->dictLookupNF("Pg", &pageRefObj)->isRef()) { - child->pageRef = pageRefObj; - } else { - pageRefObj.free(); - } - } else if (childObj->isDict("OBJR")) { - Object refObj; - - if (childObj->dictLookupNF("Obj", &refObj)->isRef()) { - Object pageRefObj; - - child = new StructElement(refObj.getRef(), treeRoot, this); - - if (childObj->dictLookupNF("Pg", &pageRefObj)->isRef()) { - child->pageRef = pageRefObj; - } else { - pageRefObj.free(); - } - } else { - error(errSyntaxError, -1, "Obj object is wrong type ({0:s})", refObj.getTypeName()); - } - refObj.free(); - } else if (childObj->isDict()) { - if (!ref->isRef()) { - error(errSyntaxError, -1, - "Structure element dictionary is not an indirect reference ({0:s})", - ref->getTypeName()); - } else if (seen.find(ref->getRefNum()) == seen.end()) { - seen.insert(ref->getRefNum()); - child = new StructElement(childObj->getDict(), treeRoot, this, seen); - } else { - error(errSyntaxWarning, -1, - "Loop detected in structure tree, skipping subtree at object {0:d}:{1:d}", - ref->getRefNum(), ref->getRefGen()); - } - } else { - error(errSyntaxWarning, -1, "K has a child of wrong type ({0:s})", childObj->getTypeName()); - } - - if (child) { - if (child->isOk()) { - appendChild(child); - if (ref->isRef()) - treeRoot->parentTreeAdd(ref->getRef(), child); - } else { - delete child; - child = NULL; - } - } - - return child; -} - -void StructElement::parseChildren(Dict *element, std::set<int> &seen) -{ - Object kids; - - if (element->lookup("K", &kids)->isArray()) { - for (int i = 0; i < kids.arrayGetLength(); i++) { - Object obj, ref; - parseChild(kids.arrayGetNF(i, &ref), kids.arrayGet(i, &obj), seen); - obj.free(); - ref.free(); - } - } else if (kids.isDict() || kids.isInt()) { - Object ref; - parseChild(element->lookupNF("K", &ref), &kids, seen); - ref.free(); - } - - kids.free(); -} - -void StructElement::parseAttributes(Dict *attributes, GBool keepExisting) -{ - Object owner; - if (attributes->lookup("O", &owner)->isName("UserProperties")) { - // In this case /P is an array of UserProperty dictionaries - Object userProperties; - if (attributes->lookup("P", &userProperties)->isArray()) { - for (int i = 0; i < userProperties.arrayGetLength(); i++) { - Object property; - if (userProperties.arrayGet(i, &property)->isDict()) { - Attribute *attribute = Attribute::parseUserProperty(property.getDict()); - if (attribute && attribute->isOk()) { - appendAttribute(attribute); - } else { - error(errSyntaxWarning, -1, "Item in P is invalid"); - delete attribute; - } - } else { - error(errSyntaxWarning, -1, "Item in P is wrong type ({0:s})", property.getTypeName()); - } - property.free(); - } - } - userProperties.free(); - } else if (owner.isName()) { - // In this case /P contains standard attributes. - // Check first if the owner is a valid standard one. - Attribute::Owner ownerValue = nameToOwner(owner.getName()); - if (ownerValue != Attribute::UnknownOwner) { - // Iterate over the entries of the "attributes" dictionary. - // The /O entry (owner) is skipped. - for (int i = 0; i < attributes->getLength(); i++) { - const char *key = attributes->getKey(i); - if (strcmp(key, "O") != 0) { - Attribute::Type type = Attribute::getTypeForName(key, this); - - // Check if the attribute is already defined. - if (keepExisting) { - GBool exists = gFalse; - for (unsigned j = 0; j < getNumAttributes(); j++) { - if (getAttribute(j)->getType() == type) { - exists = gTrue; - break; - } - } - if (exists) - continue; - } - - if (type != Attribute::Unknown) { - Object value; - GBool typeCheckOk = gTrue; - Attribute *attribute = new Attribute(type, attributes->getVal(i, &value)); - value.free(); - - if (attribute->isOk() && (typeCheckOk = attribute->checkType(this))) { - appendAttribute(attribute); - } else { - // It is not needed to free "value", the Attribute instance - // owns the contents, so deleting "attribute" is enough. - if (!typeCheckOk) { - error(errSyntaxWarning, -1, "Attribute {0:s} value is of wrong type ({1:s})", - attribute->getTypeName(), attribute->getValue()->getTypeName()); - } - delete attribute; - } - } else { - error(errSyntaxWarning, -1, "Wrong Attribute '{0:s}' in element {1:s}", key, getTypeName()); - } - } - } - } else { - error(errSyntaxWarning, -1, "O object is invalid value ({0:s})", owner.getName()); - } - } else if (!owner.isNull()) { - error(errSyntaxWarning, -1, "O is wrong type ({0:s})", owner.getTypeName()); - } - owner.free(); -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/StructElement.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/StructElement.h deleted file mode 100644 index cd89a970ddb..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/StructElement.h +++ /dev/null @@ -1,310 +0,0 @@ -//======================================================================== -// -// StructElement.h -// -// This file is licensed under the GPLv2 or later -// -// Copyright 2013, 2014 Igalia S.L. -// Copyright 2014 Luigi Scarso <luigi.scarso@gmail.com> -// Copyright 2014 Albert Astals Cid <aacid@kde.org> -// -//======================================================================== - -#ifndef STRUCTELEMENT_H -#define STRUCTELEMENT_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "goo/gtypes.h" -#include "goo/GooString.h" -#include "MarkedContentOutputDev.h" -#include "Object.h" -#include <vector> -#include <set> - -class GooString; -class Dict; -class StructElement; -class StructTreeRoot; - - -class Attribute { -public: - enum Type { - Unknown = 0, // Uninitialized, parsing error, etc. - UserProperty, // User defined attribute (i.e. non-standard) - - // Common standard attributes - Placement, WritingMode, BackgroundColor, BorderColor, BorderStyle, - BorderThickness, Color, Padding, - - // Block element standard attributes - SpaceBefore, SpaceAfter, StartIndent, EndIndent, TextIndent, TextAlign, - BBox, Width, Height, BlockAlign, InlineAlign, TBorderStyle, TPadding, - - // Inline element standard attributes - BaselineShift, LineHeight, TextDecorationColor, TextDecorationThickness, - TextDecorationType, RubyAlign, RubyPosition, GlyphOrientationVertical, - - // Column-only standard attributes - ColumnCount, ColumnGap, ColumnWidths, - - // List-only standard attributes - ListNumbering, - - // PrintField-only standard attributes - Role, checked, Desc, - - // Table-only standard attributes - RowSpan, ColSpan, Headers, Scope, Summary, - }; - - enum Owner { - UnknownOwner = 0, - // User-defined attributes - UserProperties, - // Standard attributes - Layout, List, PrintField, Table, - // Translation to other formats - XML_1_00, HTML_3_20, HTML_4_01, OEB_1_00, RTF_1_05, CSS_1_00, CSS_2_00, - }; - - // Creates a standard attribute. The name is predefined, and the - // value is type-checked to conform to the PDF specification. - Attribute(Type type, Object *value); - - // Creates an UserProperty attribute, with an arbitrary name and value. - Attribute(const char *name, int nameLen, Object *value); - - GBool isOk() const { return type != Unknown; } - - // Name, type and value can be set only on construction. - Type getType() const { return type; } - Owner getOwner() const { return owner; } - const char *getTypeName() const; - const char *getOwnerName() const; - Object *getValue() const { return &value; } - static Object *getDefaultValue(Type type); - - // The caller gets the ownership of the return GooString and is responsible of deleting it - GooString *getName() const { return type == UserProperty ? name.copy() : new GooString(getTypeName()); } - - // The revision is optional, and defaults to zero. - Guint getRevision() const { return revision; } - void setRevision(Guint revisionA) { revision = revisionA; } - - // Hidden elements should not be displayed by the user agent - GBool isHidden() const { return hidden; } - void setHidden(GBool hiddenA) { hidden = hiddenA; } - - // The formatted value may be in the PDF, or be left undefined (NULL). - // In the later case the user agent should provide a default representation. - const char *getFormattedValue() const { return formatted ? formatted->getCString() : NULL; } - void setFormattedValue(const char *formattedA); - - ~Attribute(); - -private: - Type type; - Owner owner; - Guint revision; - mutable GooString name; - mutable Object value; - GBool hidden; - GooString *formatted; - - GBool checkType(StructElement *element = NULL); - static Type getTypeForName(const char *name, StructElement *element = NULL); - static Attribute *parseUserProperty(Dict *property); - - friend class StructElement; -}; - - -class StructElement { -public: - enum Type { - Unknown = 0, - MCID, // MCID reference, used internally - OBJR, // Object reference, used internally - - Document, Part, Art, Sect, Div, // Structural elements - - Span, Quote, Note, Reference, BibEntry, // Inline elements - Code, Link, Annot, - BlockQuote, Caption, NonStruct, - TOC, TOCI, Index, Private, - - P, H, H1, H2, H3, H4, H5, H6, // Paragraph-like - - L, LI, Lbl, LBody, // List elements - - Table, TR, TH, TD, THead, TFoot, TBody, // Table elements - - Ruby, RB, RT, RP, // Ruby text elements - Warichu, WT, WP, - - Figure, Formula, Form, // Illustration-like elements - }; - - static const Ref InvalidRef; - - const char *getTypeName() const; - Type getType() const { return type; } - GBool isOk() const { return type != Unknown; } - GBool isBlock() const; - GBool isInline() const; - GBool isGrouping() const; - - inline GBool isContent() const { return (type == MCID) || isObjectRef(); } - inline GBool isObjectRef() const { return (type == OBJR && c->ref.num != -1 && c->ref.gen != -1); } - - int getMCID() const { return c->mcid; } - Ref getObjectRef() const { return c->ref; } - Ref getParentRef() { return isContent() ? parent->getParentRef() : s->parentRef.getRef(); } - GBool hasPageRef() const; - GBool getPageRef(Ref& ref) const; - StructTreeRoot *getStructTreeRoot() { return treeRoot; } - - // Optional element identifier. - const GooString *getID() const { return isContent() ? NULL : s->id; } - GooString *getID() { return isContent() ? NULL : s->id; } - - // Optional ISO language name, e.g. en_US - GooString *getLanguage() { - if (!isContent() && s->language) return s->language; - return parent ? parent->getLanguage() : NULL; - } - const GooString *getLanguage() const { - if (!isContent() && s->language) return s->language; - return parent ? parent->getLanguage() : NULL; - } - - // Optional revision number, defaults to zero. - Guint getRevision() const { return isContent() ? 0 : s->revision; } - void setRevision(Guint revision) { if (isContent()) s->revision = revision; } - - // Optional element title, in human-readable form. - const GooString *getTitle() const { return isContent() ? NULL : s->title; } - GooString *getTitle() { return isContent() ? NULL : s->title; } - - // Optional element expanded abbreviation text. - const GooString *getExpandedAbbr() const { return isContent() ? NULL : s->expandedAbbr; } - GooString *getExpandedAbbr() { return isContent() ? NULL : s->expandedAbbr; } - - unsigned getNumChildren() const { return isContent() ? 0 : s->elements.size(); } - const StructElement *getChild(int i) const { return isContent() ? NULL : s->elements.at(i); } - StructElement *getChild(int i) { return isContent() ? NULL : s->elements.at(i); } - - void appendChild(StructElement *element) { - if (!isContent() && element && element->isOk()) { - s->elements.push_back(element); - } - } - - unsigned getNumAttributes() const { return isContent() ? 0 : s->attributes.size(); } - const Attribute *getAttribute(int i) const { return isContent() ? NULL : s->attributes.at(i); } - Attribute *getAttribute(int i) { return isContent() ? NULL : s->attributes.at(i); } - - void appendAttribute(Attribute *attribute) { - if (!isContent() && attribute) { - s->attributes.push_back(attribute); - } - } - - const Attribute* findAttribute(Attribute::Type attributeType, GBool inherit = gFalse, - Attribute::Owner owner = Attribute::UnknownOwner) const; - - const GooString *getAltText() const { return isContent() ? NULL : s->altText; } - GooString *getAltText() { return isContent() ? NULL : s->altText; } - - const GooString *getActualText() const { return isContent() ? NULL : s->actualText; } - GooString *getActualText() { return isContent() ? NULL : s->actualText; } - - // Content text referenced by the element: - // - // - For MCID reference elements, this is just the text of the - // corresponding marked content object in the page stream, regardless - // of the setting of the "recursive" flag. - // - For other elements, if the "recursive" flag is set, the text - // enclosed by *all* the child MCID reference elements of the subtree - // is returned. The text is assembled by traversing the leaf MCID - // reference elements in logical order. - // - In any other case, the function returns NULL. - // - // A new string is returned, and the ownership passed to the caller. - // - GooString *getText(GBool recursive = gTrue) const { - return appendSubTreeText(NULL, recursive); - } - - const TextSpanArray getTextSpans() const { - if (!isContent()) - return TextSpanArray(); - MarkedContentOutputDev mcdev(getMCID()); - return getTextSpansInternal(mcdev); - } - - ~StructElement(); - -private: - GooString* appendSubTreeText(GooString *string, GBool recursive) const; - const TextSpanArray& getTextSpansInternal(MarkedContentOutputDev& mcdev) const; - - typedef std::vector<Attribute*> AttrPtrArray; - typedef std::vector<StructElement*> ElemPtrArray; - - struct StructData { - Object parentRef; - GooString *altText; - GooString *actualText; - GooString *id; - GooString *title; - GooString *expandedAbbr; - GooString *language; - Guint revision; - ElemPtrArray elements; - AttrPtrArray attributes; - - StructData(); - ~StructData(); - }; - - // Data in content elements (MCID, MCR) - struct ContentData { - union { - int mcid; - Ref ref; - }; - - ContentData(int mcidA): mcid(mcidA) {} - ContentData(const Ref& r) { ref.num = r.num; ref.gen = r.gen; } - }; - - // Common data - Type type; - StructTreeRoot *treeRoot; - StructElement *parent; - mutable Object pageRef; - - union { - StructData *s; - ContentData *c; - }; - - StructElement(Dict *elementDict, StructTreeRoot *treeRootA, StructElement *parentA, std::set<int> &seen); - StructElement(int mcid, StructTreeRoot *treeRootA, StructElement *parentA); - StructElement(const Ref &ref, StructTreeRoot *treeRootA, StructElement *parentA); - - void parse(Dict* elementDict); - StructElement* parseChild(Object *ref, Object* childObj, std::set<int> &seen); - void parseChildren(Dict* element, std::set<int> &seen); - void parseAttributes(Dict *element, GBool keepExisting = gFalse); - - friend class StructTreeRoot; -}; - -#endif - diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/StructTreeRoot.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/StructTreeRoot.cc deleted file mode 100644 index e46e3e28388..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/StructTreeRoot.cc +++ /dev/null @@ -1,175 +0,0 @@ -//======================================================================== -// -// StructTreeRoot.cc -// -// This file is licensed under the GPLv2 or later -// -// Copyright 2013, 2014 Igalia S.L. -// Copyright 2014 Fabio D'Urso <fabiodurso@hotmail.it> -// -//======================================================================== - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "goo/GooString.h" -#include "StructTreeRoot.h" -#include "StructElement.h" -#include "PDFDoc.h" -#include "Object.h" -#include "Dict.h" -#include <set> -#include <assert.h> - - -StructTreeRoot::StructTreeRoot(PDFDoc *docA, Dict *structTreeRootDict): - doc(docA) -{ - assert(doc); - assert(structTreeRootDict); - parse(structTreeRootDict); -} - -StructTreeRoot::~StructTreeRoot() -{ - for (ElemPtrArray::iterator i = elements.begin(); i != elements.end(); ++i) - delete *i; - classMap.free(); - roleMap.free(); -} - -void StructTreeRoot::parse(Dict *root) -{ - // The RoleMap/ClassMap dictionaries are needed by all the parsing - // functions, which will resolve the custom names to canonical - // standard names. - root->lookup("RoleMap", &roleMap); - root->lookup("ClassMap", &classMap); - - // ParentTree (optional). If present, it must be a number tree, - // otherwise it is not possible to map stream objects to their - // corresponsing structure element. Here only the references are - // loaded into the array, the pointers to the StructElements will - // be filled-in later when parsing them. - Object obj; - if (root->lookup("ParentTree", &obj)->isDict()) { - Object nums; - if (obj.dictLookup("Nums", &nums)->isArray()) { - if (nums.arrayGetLength() % 2 == 0) { - parentTree.resize(nums.arrayGetLength() / 2); - // Index numbers in even positions, references in odd ones - for (int i = 0; i < nums.arrayGetLength(); i += 2) { - Object index, value; - - if (!nums.arrayGet(i, &index)->isInt()) { - error(errSyntaxError, -1, "Nums item at position {0:d} is wrong type ({1:s})", i, index.getTypeName()); - index.free(); - continue; - } - if (index.getInt() < 0) { - error(errSyntaxError, -1, "Nums item at position {0:d} is invalid value ({1:d})", i, index.getInt()); - index.free(); - continue; - } - - const unsigned idx = index.getInt(); - if (nums.arrayGetNF(i + 1, &value)->isRef()) { - parentTree[idx].resize(1); - parentTree[idx][0].ref = value.getRef(); - } else if (nums.arrayGet(i + 1, &value)->isArray()) { - parentTree[idx].resize(value.arrayGetLength()); - for (int j = 0; j < value.arrayGetLength(); j++) { - Object itemvalue; - if (value.arrayGetNF(j, &itemvalue)->isRef()) - parentTree[idx][j].ref = itemvalue.getRef(); - else - error(errSyntaxError, -1, "Nums array item at position {0:d}/{1:d} is invalid type ({2:s})", i, j, itemvalue.getTypeName()); - itemvalue.free(); - } - } else { - error(errSyntaxError, -1, "Nums item at position {0:d} is wrong type ({1:s})", i + 1, value.getTypeName()); - } - - value.free(); - index.free(); - } - } else { - error(errSyntaxError, -1, "Nums array length is not a even ({0:d})", nums.arrayGetLength()); - } - } else { - error(errSyntaxError, -1, "Nums object is wrong type ({0:s})", nums.getTypeName()); - } - nums.free(); - } - obj.free(); - - std::set<int> seenElements; - - // Parse the children StructElements - const GBool marked = doc->getCatalog()->getMarkInfo() & Catalog::markInfoMarked; - Object kids; - if (root->lookup("K", &kids)->isArray()) { - if (marked && kids.arrayGetLength() > 1) { - error(errSyntaxWarning, -1, "K in StructTreeRoot has more than one children in a tagged PDF"); - } - for (int i = 0; i < kids.arrayGetLength(); i++) { - Object obj, ref; - kids.arrayGetNF(i, &ref); - if (ref.isRef()) { - seenElements.insert(ref.getRefNum()); - } - if (kids.arrayGet(i, &obj)->isDict()) { - StructElement *child = new StructElement(obj.getDict(), this, NULL, seenElements); - if (child->isOk()) { - if (marked && !(child->getType() == StructElement::Document || - child->getType() == StructElement::Part || - child->getType() == StructElement::Art || - child->getType() == StructElement::Div)) { - error(errSyntaxWarning, -1, "StructTreeRoot element of tagged PDF is wrong type ({0:s})", child->getTypeName()); - } - appendChild(child); - if (ref.isRef()) { - parentTreeAdd(ref.getRef(), child); - } - } else { - error(errSyntaxWarning, -1, "StructTreeRoot element could not be parsed"); - delete child; - } - } else { - error(errSyntaxWarning, -1, "K has a child of wrong type ({0:s})", obj.getTypeName()); - } - obj.free(); - ref.free(); - } - } else if (kids.isDict()) { - if (marked) { - error(errSyntaxWarning, -1, "K has a child of wrong type for a tagged PDF ({0:s})", kids.getTypeName()); - } - StructElement *child = new StructElement(kids.getDict(), this, NULL, seenElements); - if (child->isOk()) { - appendChild(child); - Object ref; - if (root->lookupNF("K", &ref)->isRef()) - parentTreeAdd(ref.getRef(), child); - ref.free(); - } else { - error(errSyntaxWarning, -1, "StructTreeRoot element could not be parsed"); - delete child; - } - } else if (!kids.isNull()) { - error(errSyntaxWarning, -1, "K in StructTreeRoot is wrong type ({0:s})", kids.getTypeName()); - } - - kids.free(); -} - -void StructTreeRoot::parentTreeAdd(const Ref &objectRef, StructElement *element) -{ - for (std::vector< std::vector<Parent> >::iterator i = parentTree.begin(); i != parentTree.end(); ++i) { - for (std::vector<Parent>::iterator j = i->begin(); j != i->end(); ++j) { - if (j->ref.num == objectRef.num && j->ref.gen == objectRef.gen) - j->element = element; - } - } -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/StructTreeRoot.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/StructTreeRoot.h deleted file mode 100644 index 3b1f3c84421..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/StructTreeRoot.h +++ /dev/null @@ -1,83 +0,0 @@ -//======================================================================== -// -// StructTreeRoot.h -// -// This file is licensed under the GPLv2 or later -// -// Copyright 2013, 2014 Igalia S.L. -// -//======================================================================== - -#ifndef STRUCTTREEROOT_H -#define STRUCTTREEROOT_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "goo/gtypes.h" -#include "Object.h" -#include "StructElement.h" -#include <vector> - -class Dict; -class PDFDoc; - - -class StructTreeRoot -{ -public: - StructTreeRoot(PDFDoc *docA, Dict *rootDict); - ~StructTreeRoot(); - - PDFDoc *getDoc() { return doc; } - Dict *getRoleMap() { return roleMap.isDict() ? roleMap.getDict() : NULL; } - Dict *getClassMap() { return classMap.isDict() ? classMap.getDict() : NULL; } - unsigned getNumChildren() const { return elements.size(); } - const StructElement *getChild(int i) const { return elements.at(i); } - StructElement *getChild(int i) { return elements.at(i); } - - void appendChild(StructElement *element) { - if (element && element->isOk()) { - elements.push_back(element); - } - } - - const StructElement *findParentElement(unsigned index) const { - if (index < parentTree.size() && parentTree[index].size() == 1) { - return parentTree[index][0].element; - } - return NULL; - } - -private: - typedef std::vector<StructElement*> ElemPtrArray; - - // Structure for items in /ParentTree, it keeps a mapping of - // object references and pointers to StructElement objects. - struct Parent { - Ref ref; - StructElement *element; - - Parent(): element(NULL) { ref.num = ref.gen = -1; } - Parent(const Parent &p): element(p.element) { - ref.num = p.ref.num; - ref.gen = p.ref.gen; - } - ~Parent() {} - }; - - PDFDoc *doc; - Object roleMap; - Object classMap; - ElemPtrArray elements; - std::vector< std::vector<Parent> > parentTree; - - void parse(Dict *rootDict); - void parentTreeAdd(const Ref &objectRef, StructElement *element); - - friend class StructElement; -}; - -#endif - diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/TextOutputDev.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/TextOutputDev.cc deleted file mode 100644 index 16f099f291a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/TextOutputDev.cc +++ /dev/null @@ -1,5818 +0,0 @@ -//======================================================================== -// -// 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-2013 Carlos Garcia Campos <carlosgc@gnome.org> -// Copyright (C) 2006, 2007, 2013 Ed Catmur <ed@catmur.co.uk> -// Copyright (C) 2006 Jeff Muizelaar <jeff@infidigm.net> -// Copyright (C) 2007, 2008, 2012 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2008 Koji Otani <sho@bbr.jp> -// Copyright (C) 2008, 2010-2012, 2014, 2015 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 Marek Kasik <mkasik@redhat.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> -// Copyright (C) 2012, 2013-2015 Jason Crain <jason@aquaticape.us> -// Copyright (C) 2012 Peter Breitenlohner <peb@mppmu.mpg.de> -// Copyright (C) 2013 José Aliste <jaliste@src.gnome.org> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2013 Ed Catmur <ed@catmur.co.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> - -#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 "UTF.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.5 - -// 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 - -// Max distance between characters when combining a base character and -// combining character -#define combMaxMidDelta 0.3 -#define combMaxBaseDelta 0.4 - -//------------------------------------------------------------------------ -// 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; -} - -double TextFontInfo::getAscent() { - return gfxFont ? gfxFont->getAscent() : 0.95; -} - -double TextFontInfo::getDescent() { - return gfxFont ? gfxFont->getDescent() : -0.35; -} - -int TextFontInfo::getWMode() { - return gfxFont ? gfxFont->getWMode() : 0; -} - -//------------------------------------------------------------------------ -// TextWord -//------------------------------------------------------------------------ - -TextWord::TextWord(GfxState *state, int rotA, double fontSizeA) { - rot = rotA; - fontSize = fontSizeA; - text = NULL; - charcode = NULL; - edge = NULL; - charPos = NULL; - font = NULL; - textMat = 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); - gfree(font); - gfree(textMat); -} - -void TextWord::addChar(GfxState *state, TextFontInfo *fontA, double x, double y, - double dx, double dy, int charPosA, int charLen, - CharCode c, Unicode u, Matrix textMatA) { - ensureCapacity(len+1); - text[len] = u; - charcode[len] = c; - charPos[len] = charPosA; - charPos[len + 1] = charPosA + charLen; - font[len] = fontA; - textMat[len] = textMatA; - - if (len == 0) - setInitialBounds(fontA, x, y); - - 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: - edge[len] = x - fontSize; - xMax = edge[len+1] = x; - break; - case 1: - edge[len] = y - fontSize; - yMax = edge[len+1] = y; - break; - case 2: - edge[len] = x + fontSize; - xMin = edge[len+1] = x; - break; - case 3: - edge[len] = y + fontSize; - yMin = edge[len+1] = y; - break; - } - } else { // horizontal writing mode - switch (rot) { - case 0: - edge[len] = x; - xMax = edge[len+1] = x + dx; - break; - case 1: - edge[len] = y; - yMax = edge[len+1] = y + dy; - break; - case 2: - edge[len] = x; - xMin = edge[len+1] = x + dx; - break; - case 3: - edge[len] = y; - yMin = edge[len+1] = y + dy; - break; - } - } - ++len; -} - -void TextWord::setInitialBounds(TextFontInfo *fontA, double x, double y) { - double ascent = fontA->getAscent() * fontSize; - double descent = fontA->getDescent() * fontSize; - wMode = fontA->getWMode(); - - 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: - xMin = x - fontSize; - yMin = y - fontSize; - yMax = y; - base = y; - break; - case 1: - xMin = x; - yMin = y - fontSize; - xMax = x + fontSize; - base = x; - break; - case 2: - yMin = y; - xMax = x + fontSize; - yMax = y + fontSize; - base = y; - break; - case 3: - xMin = x - fontSize; - xMax = x; - yMax = y + fontSize; - base = x; - break; - } - } else { // horizontal writing mode - switch (rot) { - case 0: - xMin = x; - 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; - yMin = y; - 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; - xMax = x; - 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; - yMax = y; - 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; - } - } -} - -void TextWord::ensureCapacity(int capacity) { - if (capacity > size) { - size = std::max(size + 16, capacity); - 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)); - font = (TextFontInfo **)greallocn(font, size, sizeof(TextFontInfo *)); - textMat = (Matrix *)greallocn(textMat, size, sizeof(Matrix)); - } -} - -struct CombiningTable { - Unicode base; - Unicode comb; -}; - -static struct CombiningTable combiningTable[] = { - {0x0060, 0x0300}, // grave - {0x00a8, 0x0308}, // dieresis - {0x00af, 0x0304}, // macron - {0x00b4, 0x0301}, // acute - {0x00b8, 0x0327}, // cedilla - {0x02c6, 0x0302}, // circumflex - {0x02c7, 0x030c}, // caron - {0x02d8, 0x0306}, // breve - {0x02d9, 0x0307}, // dotaccent - {0x02da, 0x030a}, // ring - {0x02dc, 0x0303}, // tilde - {0x02dd, 0x030b} // hungarumlaut (double acute accent) -}; - -// returning combining versions of characters -Unicode getCombiningChar(Unicode u) { - int len = sizeof(combiningTable) / sizeof(combiningTable[0]); - for (int i = 0; i < len; ++i) { - if (u == combiningTable[i].base) - return combiningTable[i].comb; - } - return 0; -} - -GBool TextWord::addCombining(GfxState *state, TextFontInfo *fontA, double fontSizeA, double x, double y, - double dx, double dy, int charPosA, int charLen, - CharCode c, Unicode u, Matrix textMatA) { - if (len == 0 || wMode != 0 || fontA->getWMode() != 0) - return gFalse; - - Unicode cCurrent = getCombiningChar(u); - Unicode cPrev = getCombiningChar(text[len-1]); - double edgeMid = (edge[len-1] + edge[len]) / 2; - double charMid, maxScaledMidDelta, charBase, maxScaledBaseDelta; - - if (cCurrent != 0 && unicodeTypeAlphaNum(text[len-1])) { - // Current is a combining character, previous is base character - maxScaledMidDelta = fabs(edge[len] - edge[len-1]) * combMaxMidDelta; - charMid = charBase = maxScaledBaseDelta = 0; - - // Test if characters overlap - if (rot == 0 || rot == 2) { - charMid = x + (dx / 2); - charBase = y; - maxScaledBaseDelta = (yMax - yMin) * combMaxBaseDelta; - } else { - charMid = y + (dy / 2); - charBase = x; - maxScaledBaseDelta = (xMax - xMin) * combMaxBaseDelta; - } - - if (fabs(charMid - edgeMid) >= maxScaledMidDelta || - fabs(charBase - base) >= maxScaledBaseDelta) - return gFalse; - - // Add character, but don't adjust edge / bounding box because - // combining character's positioning could be odd. - ensureCapacity(len+1); - text[len] = cCurrent; - charcode[len] = c; - charPos[len] = charPosA; - charPos[len+1] = charPosA + charLen; - font[len] = fontA; - textMat[len] = textMatA; - edge[len+1] = edge[len]; - edge[len] = (edge[len+1] + edge[len-1]) / 2; - ++len; - return gTrue; - } - - if (cPrev != 0 && unicodeTypeAlphaNum(u)) { - // Previous is a combining character, current is base character - maxScaledBaseDelta = (fontA->getAscent() - fontA->getDescent()) * fontSizeA * combMaxBaseDelta; - charMid = charBase = maxScaledMidDelta = 0; - - // Test if characters overlap - if (rot == 0 || rot == 2) { - charMid = x + (dx / 2); - charBase = y; - maxScaledMidDelta = fabs(dx * combMaxMidDelta); - } else { - charMid = y + (dy / 2); - charBase = x; - maxScaledMidDelta = fabs(dy * combMaxMidDelta); - } - - if (fabs(charMid - edgeMid) >= maxScaledMidDelta || - fabs(charBase - base) >= maxScaledBaseDelta) - return gFalse; - - // move combining character to after base character - ensureCapacity(len+1); - fontSize = fontSizeA; - text[len] = cPrev; - charcode[len] = charcode[len-1]; - charPos[len] = charPosA; - charPos[len+1] = charPosA + charLen; - font[len] = font[len-1]; - textMat[len] = textMat[len-1]; - - text[len-1] = u; - charcode[len-1] = c; - font[len-1] = fontA; - textMat[len-1] = textMatA; - - if (len == 1) - setInitialBounds(fontA, x, y); - - // Updated edges / bounding box because we changed the base - // character. - if (wMode) { - switch (rot) { - case 0: - edge[len-1] = x - fontSize; - xMax = edge[len+1] = x; - break; - case 1: - edge[len-1] = y - fontSize; - yMax = edge[len+1] = y; - break; - case 2: - edge[len-1] = x + fontSize; - xMin = edge[len+1] = x; - break; - case 3: - edge[len-1] = y + fontSize; - yMin = edge[len+1] = y; - break; - } - } else { - switch (rot) { - case 0: - edge[len-1] = x; - xMax = edge[len+1] = x + dx; - break; - case 1: - edge[len-1] = y; - yMax = edge[len+1] = y + dy; - break; - case 2: - edge[len-1] = x; - xMin = edge[len+1] = x + dx; - break; - case 3: - edge[len-1] = y; - yMin = edge[len+1] = y + dy; - break; - } - } - - edge[len] = (edge[len+1] + edge[len-1]) / 2; - ++len; - return gTrue; - } - return gFalse; -} - -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; - } - ensureCapacity(len + word->len); - 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]; - font[len + i] = word->font[i]; - textMat[len + i] = word->textMat[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 - if (unlikely((word->base / textPoolStep) > INT_MAX)) { - error(errSyntaxWarning, -1, "word->base / textPoolStep > INT_MAX"); - return; - } - 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[word0->len - 1] == word1->font[0] && - 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(); - mergeCombining = gTrue; -} - -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); - int nameLen = name ? strlen(name) : 0; - GBool nameOneChar = nameLen == 1 || (nameLen > 1 && name[1] == '\0'); - if (nameOneChar && name[0] == 'm') { - mCode = code; - } - if (letterCode < 0 && nameOneChar && - ((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) { - 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 (gfxFont && gfxFont->getWMode()) { - rot = (rot + 1) & 3; - } - - curWord = new TextWord(state, rot, 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; - int wMode; - Matrix mat; - - // 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 || - x1 != x1 || y1 != y1 || // IEEE way of checking for isnan - w1 != w1 || h1 != h1) { - 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; - } - - state->getFontTransMat(&mat.m[0], &mat.m[1], &mat.m[2], &mat.m[3]); - mat.m[4] = x1; - mat.m[5] = y1; - - if (mergeCombining && curWord && uLen == 1 && - curWord->addCombining(state, curFont, curFontSize, x1, y1, w1, h1, charPos, nBytes, c, - u[0], mat)) { - charPos += nBytes; - 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 - // (5) the WMode 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; - wMode = curFont->getWMode(); - if (overlap || lastCharOverlap || - sp < -minDupBreakOverlap * curWord->fontSize || - sp > minWordBreakSpace * curWord->fontSize || - fabs(base - curWord->base) > 0.5 || - curFontSize != curWord->fontSize || - wMode != curWord->wMode) { - endWord(); - } - lastCharOverlap = overlap; - } else { - lastCharOverlap = gFalse; - } - - if (uLen != 0) { - // start a new word if needed - if (!curWord) { - beginWord(state); - } - - // 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); - 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) { - curWord->addChar(state, curFont, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, u[i], mat); - } - } - 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) { - if (!wholeWord || - ((j == 0 || !unicodeTypeAlphaNum(txt[j - 1])) && - (j + len == m || !unicodeTypeAlphaNum(txt[j + 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); - void endPage(); - - GooString *getText(void); - GooList **takeWordList(int *nLines); - -private: - - void startLine(); - void finishLine(); - - GooList **lines; - int nLines, linesSize; - GooList *words; - int tableId; - TextBlock *currentBlock; -}; - -TextSelectionDumper::TextSelectionDumper(TextPage *page) - : TextSelectionVisitor(page) -{ - linesSize = 256; - lines = (GooList **)gmallocn(linesSize, sizeof(GooList *)); - nLines = 0; - - tableId = -1; - currentBlock = NULL; - words = NULL; -} - -TextSelectionDumper::~TextSelectionDumper() -{ - for (int i = 0; i < nLines; i++) - deleteGooList(lines[i], TextWordSelection); - gfree(lines); -} - -void TextSelectionDumper::startLine() -{ - finishLine(); - words = new GooList(); -} - -void TextSelectionDumper::finishLine() -{ - if (nLines == linesSize) { - linesSize *= 2; - lines = (GooList **)grealloc(lines, linesSize * sizeof(GooList *)); - } - - if (words && words->getLength() > 0) - lines[nLines++] = words; - else if (words) - delete words; - words = NULL; -} - -void TextSelectionDumper::visitLine (TextLine *line, - TextWord *begin, - TextWord *end, - int edge_begin, - int edge_end, - PDFRectangle *selection) -{ - TextLineFrag frag; - - frag.init(line, edge_begin, edge_end - edge_begin); - - if (tableId >= 0 && frag.line->blk->tableId < 0) { - finishLine(); - - tableId = -1; - currentBlock = NULL; - } - - if (frag.line->blk->tableId >= 0) { // a table - if (tableId == -1) { - tableId = frag.line->blk->tableId; - currentBlock = frag.line->blk; - } - - if (currentBlock == frag.line->blk) { // the same block - startLine(); - } else { // another block - if (currentBlock->tableEnd) { // previous block ended its row - startLine(); - } - currentBlock = frag.line->blk; - } - } else { // not a table - startLine(); - } -} - -void TextSelectionDumper::visitWord (TextWord *word, int begin, int end, - PDFRectangle *selection) -{ - words->append(new TextWordSelection(word, begin, end)); -} - -void TextSelectionDumper::endPage() -{ - finishLine(); -} - -GooString *TextSelectionDumper::getText (void) -{ - GooString *text; - int i, j; - UnicodeMap *uMap; - char space[8], eol[16]; - int spaceLen, eolLen; - - text = new GooString(); - - if (!(uMap = globalParams->getTextEncoding())) - return text; - - spaceLen = uMap->mapUnicode(0x20, space, sizeof(space)); - eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol)); - - for (i = 0; i < nLines; i++) { - GooList *lineWords = lines[i]; - for (j = 0; j < lineWords->getLength(); j++) { - TextWordSelection *sel = (TextWordSelection *)lineWords->get(j); - - page->dumpFragment (sel->word->text + sel->begin, sel->end - sel->begin, uMap, text); - if (j < lineWords->getLength() - 1) - text->append(space, spaceLen); - } - if (i < nLines - 1) - text->append(eol, eolLen); - } - - uMap->decRefCnt(); - - return text; -} - -GooList **TextSelectionDumper::takeWordList(int *nLinesOut) -{ - GooList **returnValue = lines; - - *nLinesOut = nLines; - if (nLines == 0) - return NULL; - - nLines = 0; - lines = NULL; - - return returnValue; -} - -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); - void endPage(); - -private: - OutputDev *out; - GfxColor *box_color, *glyph_color; - GfxState *state; - GooList *selectionList; - Matrix ctm, ictm; -}; - -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); - - selectionList = new GooList(); - state = new GfxState(72 * scale, 72 * scale, &box, rotation, gFalse); - - state->getCTM(&ctm); - ctm.invertTo(&ictm); - - out->startPage(0, state, NULL); - out->setDefaultCTM (state->getCTM()); - - state->setFillColorSpace(new GfxDeviceRGBColorSpace()); - state->setFillColor(box_color); - out->updateFillColor(state); -} - -TextSelectionPainter::~TextSelectionPainter() -{ - deleteGooList(selectionList, TextWordSelection); - 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; - - 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); - - 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); - - 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(); -} - -void TextSelectionPainter::visitWord (TextWord *word, int begin, int end, - PDFRectangle *selection) -{ - selectionList->append(new TextWordSelection(word, begin, end)); -} - -void TextSelectionPainter::endPage() -{ - out->fill(state); - - out->saveState(state); - out->clip(state); - - state->clearPath(); - - state->setFillColor(glyph_color); - out->updateFillColor(state); - - for (int i = 0; i < selectionList->getLength(); i++) { - TextWordSelection *sel = (TextWordSelection *) selectionList->get(i); - int begin = sel->begin; - - while (begin < sel->end) { - TextFontInfo *font = sel->word->font[begin]; - font->gfxFont->incRefCnt(); - Matrix *mat = &sel->word->textMat[begin]; - - state->setTextMat(mat->m[0], mat->m[1], mat->m[2], mat->m[3], 0, 0); - state->setFont(font->gfxFont, 1); - out->updateFont(state); - - int fEnd = begin + 1; - while (fEnd < sel->end && font->matches(sel->word->font[fEnd]) && - mat->m[0] == sel->word->textMat[fEnd].m[0] && - mat->m[1] == sel->word->textMat[fEnd].m[1] && - mat->m[2] == sel->word->textMat[fEnd].m[2] && - mat->m[3] == sel->word->textMat[fEnd].m[3]) - fEnd++; - - /* The only purpose of this string is to let the output device query - * it's length. Might want to change this interface later. */ - GooString *string = new GooString ((char *) sel->word->charcode, fEnd - begin); - out->beginString(state, string); - - for (int i = begin; i < fEnd; i++) { - if (i != begin && sel->word->charPos[i] == sel->word->charPos[i - 1]) - continue; - - out->drawChar(state, sel->word->textMat[i].m[4], sel->word->textMat[i].m[5], 0, 0, 0, 0, - sel->word->charcode[i], 1, NULL, 0); - } - out->endString(state); - delete string; - begin = fEnd; - } - } - - out->restoreState(state); - out->endPage (); -} - -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] >= fmin(xMax, pageWidth) && - y[i] >= fmin(yMax, pageHeight))) { - 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); - painter.endPage(); -} - -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); - dumper.endPage(); - - return dumper.getText(); -} - -GooList **TextPage::getSelectionWords(PDFRectangle *selection, - SelectionStyle style, - int *nLines) -{ - TextSelectionDumper dumper(this); - - visitSelection(&dumper, selection, style); - dumper.endPage(); - - return dumper.takeWordList(nLines); -} - -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::setMergeCombining(GBool merge) { - mergeCombining = merge; -} - -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) { - Unicode *uni = NULL; - int length; - - // 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() - length = TextStringToUCS4(actualText, &uni); - text->addChar(state, actualTextX0, actualTextY0, - actualTextX1 - actualTextX0, actualTextY1 - actualTextY0, - 0, actualTextNBytes, uni, length); - gfree(uni); - } - - 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, XRef *xref) { - 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); -} - -void TextOutputDev::setMergeCombining(GBool merge) { - text->setMergeCombining(merge); -} - -#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/Build/source/libs/poppler/poppler-0.35.0/poppler/TextOutputDev.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/TextOutputDev.h deleted file mode 100644 index a0aa6f8a991..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/TextOutputDev.h +++ /dev/null @@ -1,880 +0,0 @@ -//======================================================================== -// -// 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, 2013 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> -// Copyright (C) 2012, 2013, 2015 Jason Crain <jason@aquaticape.us> -// Copyright (C) 2013 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 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); - - // Get the font ascent, or a default value if the font is not set - double getAscent(); - - // Get the font descent, or a default value if the font is not set - double getDescent(); - - // Get the writing mode (0 or 1), or 0 if the font is not set - int getWMode(); - -#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 fontSize); - - // Destructor. - ~TextWord(); - - // Add a character to the word. - void addChar(GfxState *state, TextFontInfo *fontA, double x, double y, - double dx, double dy, int charPosA, int charLen, - CharCode c, Unicode u, Matrix textMatA); - - // Attempt to add a character to the word as a combining character. - // Either character u or the last character in the word must be an - // acute, dieresis, or other combining character. Returns true if - // the character was added. - GBool addCombining(GfxState *state, TextFontInfo *fontA, double fontSizeA, double x, double y, - double dx, double dy, int charPosA, int charLen, - CharCode c, Unicode u, Matrix textMatA); - - // 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 a character. - TextFontInfo *getFontInfo(int idx) { return font[idx]; } - - // 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(int idx) { return font[idx]->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: - void ensureCapacity(int capacity); - void setInitialBounds(TextFontInfo *fontA, double x, double y); - - 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/font arrays - int size; // size of text/edge/charPos/font arrays - TextFontInfo **font; // font information for each char - Matrix *textMat; // transformation matrix for each char - 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 - int wMode; // horizontal (0) or vertical (1) writing mode - -#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 - -class TextWordSelection { -public: - TextWordSelection(TextWord *word, int begin, int end) - : word(word), begin(begin), end(end) - { - } - - TextWord * getWord() const { return word; } - int getBegin() const { return begin; } - int getEnd() const { return end; } - -private: - TextWord *word; - int begin; - int end; - - friend class TextSelectionPainter; - friend class TextSelectionDumper; -}; - -//------------------------------------------------------------------------ -// 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); - - // 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); - - GooList **getSelectionWords(PDFRectangle *selection, - SelectionStyle style, - int *nLines); - - // 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 true, will combine characters when a base and combining - // character are drawn on eachother. - void setMergeCombining(GBool merge); - -#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 - GBool mergeCombining; // merge when combining and base characters - // are drawn on top of each other - - 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, XRef *xref); - - // 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 true, will combine characters when a base and combining - // character are drawn on eachother. - void setMergeCombining(GBool merge); - -#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/Build/source/libs/poppler/poppler-0.35.0/poppler/UTF.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/UTF.cc deleted file mode 100644 index 46007b73006..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UTF.cc +++ /dev/null @@ -1,116 +0,0 @@ -//======================================================================== -// -// UTF.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) 2012 Adrian Johnson <ajohnson@redneon.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 "goo/gmem.h" -#include "PDFDocEncoding.h" -#include "UTF.h" - -bool UnicodeIsValid(Unicode ucs4) -{ - return (ucs4 < 0x110000) && - ((ucs4 & 0xfffff800) != 0xd800) && - (ucs4 < 0xfdd0 || ucs4 > 0xfdef) && - ((ucs4 & 0xfffe) != 0xfffe); -} - -int UTF16toUCS4(const Unicode *utf16, int utf16Len, Unicode **ucs4) -{ - int i, n, len; - Unicode *u; - - // count characters - len = 0; - for (i = 0; i < utf16Len; i++) { - if (utf16[i] >= 0xd800 && utf16[i] < 0xdc00 && i + 1 < utf16Len && - utf16[i+1] >= 0xdc00 && utf16[i+1] < 0xe000) { - i++; /* surrogate pair */ - } - len++; - } - if (ucs4 == NULL) - return len; - - u = (Unicode*)gmallocn(len, sizeof(Unicode)); - n = 0; - // convert string - for (i = 0; i < utf16Len; i++) { - if (utf16[i] >= 0xd800 && utf16[i] < 0xdc00) { /* surrogate pair */ - if (i + 1 < utf16Len && utf16[i+1] >= 0xdc00 && utf16[i+1] < 0xe000) { - /* next code is a low surrogate */ - u[n] = (((utf16[i] & 0x3ff) << 10) | (utf16[i+1] & 0x3ff)) + 0x10000; - ++i; - } else { - /* missing low surrogate - replace it with REPLACEMENT CHARACTER (U+FFFD) */ - u[n] = 0xfffd; - } - } else if (utf16[i] >= 0xdc00 && utf16[i] < 0xe000) { - /* invalid low surrogate - replace it with REPLACEMENT CHARACTER (U+FFFD) */ - u[n] = 0xfffd; - } else { - u[n] = utf16[i]; - } - if (!UnicodeIsValid(u[n])) { - u[n] = 0xfffd; - } - n++; - } - *ucs4 = u; - return len; -} - -int TextStringToUCS4(GooString *textStr, Unicode **ucs4) -{ - int i, len; - const char *s; - Unicode *u; - - len = textStr->getLength(); - s = textStr->getCString(); - if (len == 0) - return 0; - - if (textStr->hasUnicodeMarker()) { - Unicode *utf16; - len = len/2 - 1; - if (len > 0) { - utf16 = new Unicode[len]; - for (i = 0 ; i < len; i++) { - utf16[i] = (s[2 + i*2] & 0xff) << 8 | (s[3 + i*2] & 0xff); - } - len = UTF16toUCS4(utf16, len, &u); - delete[] utf16; - } else { - u = NULL; - } - } else { - u = (Unicode*)gmallocn(len, sizeof(Unicode)); - for (i = 0 ; i < len; i++) { - u[i] = pdfDocEncoding[s[i] & 0xff]; - } - } - *ucs4 = u; - return len; -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/UTF.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/UTF.h deleted file mode 100644 index 248c168cca5..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UTF.h +++ /dev/null @@ -1,39 +0,0 @@ -//======================================================================== -// -// UTF.h -// -// This file is licensed under the GPLv2 or later -// -// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> -// -//======================================================================== - -#ifndef UTF_H -#define UTF_H - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "goo/GooString.h" -#include "CharTypes.h" - -// Convert a UTF-16 string to a UCS-4 -// utf16 - utf16 bytes -// utf16_len - number of UTF-16 characters -// ucs4_out - if not NULL, allocates and returns UCS-4 string. Free with gfree. -// returns number of UCS-4 characters -int UTF16toUCS4(const Unicode *utf16, int utf16_len, Unicode **ucs4_out); - -// Convert a PDF Text String to UCS-4 -// s - PDF text string -// ucs4 - if the number of UCS-4 characters is > 0, allocates and -// returns UCS-4 string. Free with gfree. -// returns number of UCS-4 characters -int TextStringToUCS4(GooString *textStr, Unicode **ucs4); - -// check if UCS-4 character is valid -bool UnicodeIsValid(Unicode ucs4); - - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/UTF8.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/UTF8.h deleted file mode 100644 index 34a07d4082f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UTF8.h +++ /dev/null @@ -1,84 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeCClassTables.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeCClassTables.h deleted file mode 100644 index 62f9ecc3657..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeCClassTables.h +++ /dev/null @@ -1,1827 +0,0 @@ -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeCompTables.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeCompTables.h deleted file mode 100644 index 68e2f86aee9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeCompTables.h +++ /dev/null @@ -1,665 +0,0 @@ -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeDecompTables.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeDecompTables.h deleted file mode 100644 index 4bc34b18d99..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeDecompTables.h +++ /dev/null @@ -1,8526 +0,0 @@ -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMap.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMap.cc deleted file mode 100644 index 0528cdfc686..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMap.cc +++ /dev/null @@ -1,311 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMap.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMap.h deleted file mode 100644 index ba7df2cfb99..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMap.h +++ /dev/null @@ -1,122 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMapTables.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMapTables.h deleted file mode 100644 index 073e474e6be..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeMapTables.h +++ /dev/null @@ -1,365 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeTypeTable.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeTypeTable.cc deleted file mode 100644 index 721af9db6e5..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeTypeTable.cc +++ /dev/null @@ -1,1223 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeTypeTable.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeTypeTable.h deleted file mode 100644 index 869aad9e6c6..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/UnicodeTypeTable.h +++ /dev/null @@ -1,44 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/ViewerPreferences.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/ViewerPreferences.cc deleted file mode 100644 index cba8d0ac512..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/ViewerPreferences.cc +++ /dev/null @@ -1,117 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/ViewerPreferences.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/ViewerPreferences.h deleted file mode 100644 index 8cdc4d40a73..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/ViewerPreferences.h +++ /dev/null @@ -1,76 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/XRef.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/XRef.cc deleted file mode 100644 index 1bbbdc51c25..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/XRef.cc +++ /dev/null @@ -1,1740 +0,0 @@ -//======================================================================== -// -// 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-2014 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, 2013 Thomas Freitag <Thomas.Freitag@kabelmail.de> -// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013, 2014 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2013 Pino Toscano <pino@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 <stddef.h> -#include <string.h> -#include <math.h> -#include <ctype.h> -#include <limits.h> -#include <float.h> -#include "goo/gfile.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 - -#if MULTITHREADED -# define xrefLocker() MutexLocker locker(&mutex) -# define xrefCondLocker(X) MutexLocker locker(&mutex, (X)) -#else -# define xrefLocker() -# define xrefCondLocker(X) -#endif - -//------------------------------------------------------------------------ -// ObjectStream -//------------------------------------------------------------------------ - -class ObjectStream { -public: - - // Create an object stream, using object number <objStrNum>, - // generation 0. - ObjectStream(XRef *xref, int objStrNumA, int recursion = 0); - - 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, int recursion) { - Stream *str; - Parser *parser; - Goffset *offsets; - Object objStr, obj1, obj2; - Goffset first; - int i; - - objStrNum = objStrNumA; - nObjects = 0; - objs = NULL; - objNums = NULL; - ok = gFalse; - - if (!xref->fetch(objStrNum, 0, &objStr, recursion)->isStream()) { - goto err1; - } - - if (!objStr.streamGetDict()->lookup("N", &obj1, recursion)->isInt()) { - obj1.free(); - goto err1; - } - nObjects = obj1.getInt(); - obj1.free(); - if (nObjects <= 0) { - goto err1; - } - - objStr.streamGetDict()->lookup("First", &obj1, recursion); - if (!obj1.isInt() && !obj1.isInt64()) { - obj1.free(); - goto err1; - } - if (obj1.isInt()) - first = obj1.getInt(); - else - first = obj1.getInt64(); - 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 = (Goffset *)gmallocn(nObjects, sizeof(Goffset)); - - // 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() || obj2.isInt64())) { - obj1.free(); - obj2.free(); - delete parser; - gfree(offsets); - goto err1; - } - objNums[i] = obj1.getInt(); - if (obj2.isInt()) - offsets[i] = obj2.getInt(); - else - offsets[i] = obj2.getInt64(); - 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 (Goffset pos = first; pos < offsets[0]; ++pos) { - 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() { -#if MULTITHREADED - gInitMutex(&mutex); -#endif - ok = gTrue; - errCode = errNone; - entries = NULL; - capacity = 0; - size = 0; - streamEnds = NULL; - streamEndsLen = 0; - objStrs = new PopplerCache(5); - mainXRefEntriesOffset = 0; - xRefStream = gFalse; - scannedSpecialFlags = gFalse; - encrypted = gFalse; - permFlags = defPermFlags; - ownerPasswordOk = gFalse; - rootNum = -1; - strOwner = gFalse; -} - -XRef::XRef() { - init(); -} - -XRef::XRef(Object *trailerDictA) { - init(); - - if (trailerDictA->isDict()) - trailerDict.initDict(trailerDictA->getDict()); -} - -XRef::XRef(BaseStream *strA, Goffset pos, Goffset mainXRefEntriesOffsetA, GBool *wasReconstructed, GBool reconstruct) { - Object obj; - - init(); - mainXRefEntriesOffset = mainXRefEntriesOffsetA; - - // read the trailer - str = strA; - start = str->getStart(); - prevXRefOffset = mainXRefOffset = 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<Goffset> followedXRefStm; - readXRef(&prevXRefOffset, &followedXRefStm, NULL); - - // 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; - } - if (strOwner) { - delete str; - } -#if MULTITHREADED - gDestroyMutex(&mutex); -#endif -} - -XRef *XRef::copy() { - XRef *xref = new XRef(); - xref->str = str->copy(); - xref->strOwner = gTrue; - xref->encrypted = encrypted; - xref->permFlags = permFlags; - xref->ownerPasswordOk = ownerPasswordOk; - xref->rootGen = rootGen; - xref->rootNum = rootNum; - - xref->start = start; - xref->prevXRefOffset = prevXRefOffset; - xref->mainXRefEntriesOffset = mainXRefEntriesOffset; - xref->xRefStream = xRefStream; - trailerDict.copy(&xref->trailerDict); - xref->encAlgorithm = encAlgorithm; - xref->encRevision = encRevision; - xref->encVersion = encVersion; - xref->permFlags = permFlags; - xref->keyLength = keyLength; - xref->permFlags = permFlags; - for (int i = 0; i < 32; i++) { - xref->fileKey[i] = fileKey[i]; - } - - if (xref->reserve(size) == 0) { - error(errSyntaxError, -1, "unable to allocate {0:d} entries", size); - delete xref; - return NULL; - } - xref->size = size; - for (int i = 0; i < size; ++i) { - xref->entries[i].offset = entries[i].offset; - xref->entries[i].type = entries[i].type; - xref->entries[i].obj.initNull (); - xref->entries[i].flags = entries[i].flags; - xref->entries[i].gen = entries[i].gen; - } - xref->streamEndsLen = streamEndsLen; - if (streamEndsLen != 0) { - xref->streamEnds = (Goffset *)gmalloc(streamEndsLen * sizeof(Goffset)); - for (int i = 0; i < streamEndsLen; i++) { - xref->streamEnds[i] = streamEnds[i]; - } - } - return xref; -} - -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 = -1; - entries[i].type = xrefEntryNone; - entries[i].obj.initNull (); - entries[i].flags = 0; - 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). - * Arguments: - * pos Points to a Goffset containing the offset of the XRef - * section to be read. If a prev pointer is found, *pos is - * updated with its value - * followedXRefStm Used in case of nested readXRef calls to spot circular - * references in XRefStm pointers - * xrefStreamObjsNum If not NULL, every time a XRef stream is encountered, - * its object number is appended - * Return value: - * gTrue if a prev pointer is found, otherwise gFalse - */ -GBool XRef::readXRef(Goffset *pos, std::vector<Goffset> *followedXRefStm, std::vector<int> *xrefStreamObjsNum) { - 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, xrefStreamObjsNum); - - // parse an xref stream - } else if (obj.isInt()) { - const int objNum = obj.getInt(); - 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; - } - if (xrefStreamObjsNum) { - xrefStreamObjsNum->push_back(objNum); - } - 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, Goffset *pos, std::vector<Goffset> *followedXRefStm, std::vector<int> *xrefStreamObjsNum) { - XRefEntry entry; - GBool more; - Object obj, obj2; - Goffset 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) { - parser->getObj(&obj, gTrue); - if (obj.isInt()) { - entry.offset = obj.getInt(); - } else if (obj.isInt64()) { - entry.offset = obj.getInt64(); - } else { - goto err1; - } - obj.free(); - if (!parser->getObj(&obj, gTrue)->isInt()) { - goto err1; - } - entry.gen = obj.getInt(); - entry.obj.initNull (); - entry.flags = 0; - 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 == -1) { - 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 = -1; - } - } - } - } - - // read the trailer dictionary - if (!parser->getObj(&obj)->isDict()) { - goto err1; - } - - // get the 'Prev' pointer - obj.getDict()->lookupNF("Prev", &obj2); - if (obj2.isInt() || obj2.isInt64()) { - if (obj2.isInt()) - pos2 = obj2.getInt(); - else - pos2 = obj2.getInt64(); - 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 - obj.getDict()->lookup("XRefStm", &obj2); - if (obj2.isInt() || obj2.isInt64()) { - if (obj2.isInt()) - pos2 = obj2.getInt(); - else - pos2 = obj2.getInt64(); - 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, xrefStreamObjsNum); - } - 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, Goffset *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) { - goto err1; - } - } - obj.free(); - if (w[0] > (int)sizeof(int) || w[1] > (int)sizeof(long long) || w[2] > (int)sizeof(int)) { - goto err1; - } - - 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 = obj.getInt(); - more = gTrue; - } else if (obj.isInt64()) { - *pos = obj.getInt64(); - 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) { - unsigned long long 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; - } - if (offset > (unsigned long long)GoffsetMax()) { - error(errSyntaxError, -1, "Offset inside xref table too large for fseek"); - return gFalse; - } - for (gen = 0, j = 0; j < w[2]; ++j) { - if ((c = xrefStr->getChar()) == EOF) { - return gFalse; - } - gen = (gen << 8) + c; - } - if (entries[i].offset == -1) { - 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]; - Goffset 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 = (Goffset *)greallocn(streamEnds, - streamEndsSize, sizeof(Goffset)); - } - 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; -} - -void XRef::getEncryptionParameters(Guchar **fileKeyA, CryptAlgorithm *encAlgorithmA, - int *keyLengthA) { - if (encrypted) { - *fileKeyA = fileKey; - *encAlgorithmA = encAlgorithm; - *keyLengthA = keyLength; - } else { - // null encryption parameters - *fileKeyA = NULL; - *encAlgorithmA = cryptRC4; - *keyLengthA = 0; - } -} - -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; - - xrefLocker(); - // 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 && !e->getFlag(XRefEntry::Unencrypted)) ? fileKey : 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, recursion + 1); - 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(); -} - -void XRef::lock() { -#if MULTITHREADED - gLockMutex(&mutex); -#endif -} - -void XRef::unlock() { -#if MULTITHREADED - gUnlockMutex(&mutex); -#endif -} - -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(Goffset streamStart, Goffset *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(Goffset offset) -{ - if (size > 0) - { - int res = 0; - Goffset 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, Goffset offs, GBool used) { - xrefLocker(); - 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 = -1; - entries[i].type = xrefEntryFree; - entries[i].obj.initNull (); - entries[i].flags = 0; - entries[i].gen = 0; - } - size = num + 1; - } - XRefEntry *e = getEntry(num); - e->gen = gen; - e->obj.initNull (); - e->flags = 0; - if (used) { - e->type = xrefEntryUncompressed; - e->offset = offs; - } else { - e->type = xrefEntryFree; - e->offset = 0; - } -} - -void XRef::setModifiedObject (Object* o, Ref r) { - xrefLocker(); - 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->setFlag(XRefEntry::Updated, gTrue); -} - -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->setFlag(XRefEntry::Updated, gTrue); - - Ref r; - r.num = entryIndexToUse; - r.gen = e->gen; - return r; -} - -void XRef::removeIndirectObject(Ref r) { - xrefLocker(); - 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->setFlag(XRefEntry::Updated, gTrue); -} - -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; - } - } - getEntry(lastFreeEntry)->offset = 0; - - 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(Goffset offset, int gen, XRefEntryType type) { - outStr->printf("%010lli %05i %c\r\n", (long long)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, int offsetSizeA) { - index = indexA; - stmBuf = stmBufA; - offsetSize = offsetSizeA; -} - -void XRef::XRefStreamWriter::startSection(int first, int count) { - Object obj; - index->arrayAdd( obj.initInt(first) ); - index->arrayAdd( obj.initInt(count) ); -} - -void XRef::XRefStreamWriter::writeEntry(Goffset offset, int gen, XRefEntryType type) { - const int entryTotalSize = 1 + offsetSize + 2; /* type + offset + gen */ - char data[16]; - data[0] = (type==xrefEntryFree) ? 0 : 1; - for (int i = offsetSize; i > 0; i--) { - data[i] = offset & 0xff; - offset >>= 8; - } - data[offsetSize + 1] = (gen >> 8) & 0xff; - data[offsetSize + 2] = gen & 0xff; - stmBuf->append(data, entryTotalSize); -} - -XRef::XRefPreScanWriter::XRefPreScanWriter() { - hasOffsetsBeyond4GB = gFalse; -} - -void XRef::XRefPreScanWriter::startSection(int first, int count) { -} - -void XRef::XRefPreScanWriter::writeEntry(Goffset offset, int gen, XRefEntryType type) { - if (offset >= 0x100000000ll) - hasOffsetsBeyond4GB = gTrue; -} - -void XRef::writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref) { - Object index; - index.initArray(xref); - stmBuf->clear(); - - // First pass: determine whether all offsets fit in 4 bytes or not - XRefPreScanWriter prescan; - writeXRef(&prescan, gFalse); - const int offsetSize = prescan.hasOffsetsBeyond4GB ? sizeof(Goffset) : 4; - - // Second pass: actually write the xref stream - XRefStreamWriter writer(&index, stmBuf, offsetSize); - 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(offsetSize) ); - obj2.arrayAdd( obj1.initInt(2) ); - xrefDict->set("W", &obj2); -} - -GBool XRef::parseEntry(Goffset 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(&obj1)->isInt64()) && - (parser.getObj(&obj2)->isInt()) && - (parser.getObj(&obj3)->isCmd("n") || obj3.isCmd("f"))) { - if (obj1.isInt64()) - entry->offset = obj1.getInt64(); - else - entry->offset = obj1.getInt(); - entry->gen = obj2.getInt(); - entry->type = obj3.isCmd("n") ? xrefEntryUncompressed : xrefEntryFree; - entry->obj.initNull (); - entry->flags = 0; - r = gTrue; - } else { - r = gFalse; - } - obj1.free(); - obj2.free(); - obj3.free(); - - return r; -} - -/* Traverse all XRef tables and, if untilEntryNum != -1, stop as soon as - * untilEntryNum is found, or try to reconstruct the xref table if it's not - * present in any xref. - * If xrefStreamObjsNum is not NULL, it is filled with the list of the object - * numbers of the XRef streams that have been traversed */ -void XRef::readXRefUntil(int untilEntryNum, std::vector<int> *xrefStreamObjsNum) -{ - std::vector<Goffset> followedPrev; - while (prevXRefOffset && (untilEntryNum == -1 || (untilEntryNum < size && entries[untilEntryNum].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<Goffset> followedXRefStm; - if (!readXRef(&prevXRefOffset, &followedXRefStm, xrefStreamObjsNum)) { - prevXRefOffset = 0; - } - - // if there was a problem with the xref table, or we haven't found the entry - // we were looking for, try to reconstruct the xref - if (!ok || (!prevXRefOffset && untilEntryNum != -1 && entries[untilEntryNum].type == xrefEntryNone)) { - GBool wasReconstructed = false; - if (!(ok = constructXRef(&wasReconstructed))) { - errCode = errDamaged; - break; - } - break; - } - } -} - -XRefEntry *XRef::getEntry(int i, GBool complainIfMissing) -{ - if (i >= size || 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 { - // Read XRef tables until the entry we're looking for is found - readXRefUntil(i); - - // 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.flags = 0; - return &dummy; - } - - if (entries[i].type == xrefEntryNone) { - if (complainIfMissing) { - error(errSyntaxError, -1, "Invalid XRef entry"); - } - entries[i].type = xrefEntryFree; - } - } - } - - return &entries[i]; -} - -// Recursively sets the Unencrypted flag in all referenced xref entries -void XRef::markUnencrypted(Object *obj) { - Object obj1; - - switch (obj->getType()) { - case objArray: - { - Array *array = obj->getArray(); - for (int i = 0; i < array->getLength(); i++) { - markUnencrypted(array->getNF(i, &obj1)); - obj1.free(); - } - break; - } - case objStream: - case objDict: - { - Dict *dict; - if (obj->getType() == objStream) { - Stream *stream = obj->getStream(); - dict = stream->getDict(); - } else { - dict = obj->getDict(); - } - for (int i = 0; i < dict->getLength(); i++) { - markUnencrypted(dict->getValNF(i, &obj1)); - obj1.free(); - } - break; - } - case objRef: - { - Ref ref = obj->getRef(); - XRefEntry *e = getEntry(ref.num); - if (e->getFlag(XRefEntry::Unencrypted)) - return; // We've already been here: prevent infinite recursion - e->setFlag(XRefEntry::Unencrypted, gTrue); - fetch(ref.num, ref.gen, &obj1); - markUnencrypted(&obj1); - obj1.free(); - break; - } - default: - break; - } -} - -void XRef::scanSpecialFlags() { - if (scannedSpecialFlags) { - return; - } - scannedSpecialFlags = gTrue; - - // "Rewind" the XRef linked list, so that readXRefUntil re-reads all XRef - // tables/streams, even those that had already been parsed - prevXRefOffset = mainXRefOffset; - - std::vector<int> xrefStreamObjNums; - if (!streamEndsLen) { // don't do it for already reconstructed xref - readXRefUntil(-1 /* read all xref sections */, &xrefStreamObjNums); - } - - // Mark object streams as DontRewrite, because we write each object - // individually in full rewrite mode. - for (int i = 0; i < size; ++i) { - if (entries[i].type == xrefEntryCompressed) { - const int objStmNum = entries[i].offset; - if (unlikely(objStmNum < 0 || objStmNum >= size)) { - error(errSyntaxError, -1, "Compressed object offset out of xref bounds"); - } else { - getEntry(objStmNum)->setFlag(XRefEntry::DontRewrite, gTrue); - } - } - } - - // Mark XRef streams objects as Unencrypted and DontRewrite - for (size_t i = 0; i < xrefStreamObjNums.size(); ++i) { - const int objNum = xrefStreamObjNums.at(i); - getEntry(objNum)->setFlag(XRefEntry::Unencrypted, gTrue); - getEntry(objNum)->setFlag(XRefEntry::DontRewrite, gTrue); - } - - // Mark objects referred from the Encrypt dict as Unencrypted - Object obj; - markUnencrypted(trailerDict.dictLookupNF("Encrypt", &obj)); - obj.free(); -} - -void XRef::markUnencrypted() { - // Mark objects referred from the Encrypt dict as Unencrypted - Object obj; - trailerDict.dictLookupNF("Encrypt", &obj); - if (obj.isRef()) { - XRefEntry *e = getEntry(obj.getRefNum()); - e->setFlag(XRefEntry::Unencrypted, gTrue); - } - obj.free(); -} - diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/XRef.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/XRef.h deleted file mode 100644 index 70065d8963e..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/XRef.h +++ /dev/null @@ -1,281 +0,0 @@ -//======================================================================== -// -// 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-2013 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, 2013 Thomas Freitag <Thomas.Freitag@kabelmail.de> -// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> -// Copyright (C) 2013 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 XREF_H -#define XREF_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "poppler-config.h" -#include "goo/gtypes.h" -#include "goo/GooMutex.h" -#include "Object.h" -#include "Stream.h" - -#include <vector> - -class Dict; -class Stream; -class Parser; -class PopplerCache; - -//------------------------------------------------------------------------ -// XRef -//------------------------------------------------------------------------ - -enum XRefEntryType { - xrefEntryFree, - xrefEntryUncompressed, - xrefEntryCompressed, - xrefEntryNone -}; - -struct XRefEntry { - Goffset offset; - int gen; - XRefEntryType type; - int flags; - Object obj; //if this entry was updated, obj will contains the updated object - - enum Flag { - // Regular flags - Updated, // Entry was modified - - // Special flags -- available only after xref->scanSpecialFlags() is run - Unencrypted, // Entry is stored in unencrypted form (meaningless in unencrypted documents) - DontRewrite // Entry must not be written back in case of full rewrite - }; - - inline GBool getFlag(Flag flag) { - const int mask = (1 << (int)flag); - return (flags & mask) != 0; - } - - inline void setFlag(Flag flag, GBool value) { - const int mask = (1 << (int)flag); - if (value) { - flags |= mask; - } else { - flags &= ~mask; - } - } -}; - -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, Goffset pos, Goffset mainXRefEntriesOffsetA = 0, GBool *wasReconstructed = NULL, GBool reconstruct = false); - - // Destructor. - ~XRef(); - - // Copy xref but with new base stream! - XRef *copy(); - - // 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); - // Mark Encrypt entry as Unencrypted - void markUnencrypted(); - - void getEncryptionParameters(Guchar **fileKeyA, CryptAlgorithm *encAlgorithmA, int *keyLengthA); - - // 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(Goffset streamStart, Goffset *streamEnd); - - // Retuns the entry that belongs to the offset - int getNumEntry(Goffset offset); - - // Scans the document and sets special flags in all xref entries. One of those - // flags is Unencrypted, which affects how the object is fetched. Therefore, - // this function must be called before fetching unencrypted objects (e.g. - // Encrypt dictionary, XRef streams). Note that the code that initializes - // decryption doesn't need to call this function, because it runs before - // decryption is enabled, and therefore the Unencrypted flag is ignored. - void scanSpecialFlags(); - - // 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, Goffset 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); - - // to be thread safe during write where changes are not allowed - void lock(); - void unlock(); - -private: - - BaseStream *str; // input stream - Goffset 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 - Goffset *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 - Goffset prevXRefOffset; // position of prev XRef section (= next to read) - Goffset mainXRefEntriesOffset; // offset of entries in main XRef table - GBool xRefStream; // true if last XRef section is a stream - Goffset mainXRefOffset; // position of the main XRef table/stream - GBool scannedSpecialFlags; // true if scanSpecialFlags has been called - GBool strOwner; // true if str is owned by the instance -#if MULTITHREADED - GooMutex mutex; -#endif - - void init(); - int reserve(int newSize); - int resize(int newSize); - GBool readXRef(Goffset *pos, std::vector<Goffset> *followedXRefStm, std::vector<int> *xrefStreamObjsNum); - GBool readXRefTable(Parser *parser, Goffset *pos, std::vector<Goffset> *followedXRefStm, std::vector<int> *xrefStreamObjsNum); - GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n); - GBool readXRefStream(Stream *xrefStr, Goffset *pos); - GBool constructXRef(GBool *wasReconstructed, GBool needCatalogDict = gFalse); - GBool parseEntry(Goffset offset, XRefEntry *entry); - void readXRefUntil(int untilEntryNum, std::vector<int> *xrefStreamObjsNum = NULL); - void markUnencrypted(Object *obj); - - class XRefWriter { - public: - virtual void startSection(int first, int count) = 0; - virtual void writeEntry(Goffset offset, int gen, XRefEntryType type) = 0; - virtual ~XRefWriter() {}; - }; - - // XRefWriter subclass that writes a XRef table - class XRefTableWriter: public XRefWriter { - public: - XRefTableWriter(OutStream* outStrA); - void startSection(int first, int count); - void writeEntry(Goffset offset, int gen, XRefEntryType type); - private: - OutStream* outStr; - }; - - // XRefWriter subclass that writes a XRef stream - class XRefStreamWriter: public XRefWriter { - public: - XRefStreamWriter(Object *index, GooString *stmBuf, int offsetSize); - void startSection(int first, int count); - void writeEntry(Goffset offset, int gen, XRefEntryType type); - private: - Object *index; - GooString *stmBuf; - int offsetSize; - }; - - // Dummy XRefWriter subclass that only checks if all offsets fit in 4 bytes - class XRefPreScanWriter: public XRefWriter { - public: - XRefPreScanWriter(); - void startSection(int first, int count); - void writeEntry(Goffset offset, int gen, XRefEntryType type); - - GBool hasOffsetsBeyond4GB; - }; - - void writeXRef(XRefWriter *writer, GBool writeAllEntries); -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/XpdfPluginAPI.cc b/Build/source/libs/poppler/poppler-0.35.0/poppler/XpdfPluginAPI.cc deleted file mode 100644 index 834c681d991..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/XpdfPluginAPI.cc +++ /dev/null @@ -1,243 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/poppler/XpdfPluginAPI.h b/Build/source/libs/poppler/poppler-0.35.0/poppler/XpdfPluginAPI.h deleted file mode 100644 index 6ed890a8f1f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/XpdfPluginAPI.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - * 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> -// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com> -// Copyright (C) 2014 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 -// -//======================================================================== - -#ifndef XPDFPLUGINAPI_H -#define XPDFPLUGINAPI_H - -#ifdef _WIN32 -#ifndef NOMINMAX -#define NOMINMAX -#endif -#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/Build/source/libs/poppler/poppler-0.35.0/poppler/gen-unicode-tables.py b/Build/source/libs/poppler/poppler-0.35.0/poppler/gen-unicode-tables.py deleted file mode 100644 index 282f6e52518..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/gen-unicode-tables.py +++ /dev/null @@ -1,38 +0,0 @@ -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/Build/source/libs/poppler/poppler-0.35.0/poppler/poppler-config.h.cmake b/Build/source/libs/poppler/poppler-0.35.0/poppler/poppler-config.h.cmake deleted file mode 100644 index b087a693f92..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/poppler-config.h.cmake +++ /dev/null @@ -1,195 +0,0 @@ -//================================================= -*- mode: c++ -*- ==== -// -// poppler-config.h -// -// Copyright 1996-2011 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) 2014 Bogdan Cristea <cristeab@gmail.com> -// Copyright (C) 2014 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 POPPLER_CONFIG_H -#define POPPLER_CONFIG_H - -#include <stdio.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 - -/* 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-2015 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__ && !defined(__WINPTHREADS_VERSION) -char * strtok_r (char *s, const char *delim, char **save_ptr); -#endif -#endif - -//------------------------------------------------------------------------ -// Compiler -//------------------------------------------------------------------------ - -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) -#ifdef __MINGW_PRINTF_FORMAT -#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ - __attribute__((__format__(__MINGW_PRINTF_FORMAT, fmt_index, va_index))) -#else -#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ - __attribute__((__format__(__printf__, fmt_index, va_index))) -#endif -#else -#define GCC_PRINTF_FORMAT(fmt_index, va_index) -#endif - -#if defined(_MSC_VER) -#define fmax(a, b) std::max(a, b) -#define fmin(a, b) std::min(a, b) -#endif - - -#endif /* POPPLER_CONFIG_H */ diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/poppler-config.h.in b/Build/source/libs/poppler/poppler-0.35.0/poppler/poppler-config.h.in deleted file mode 100644 index f73d0f66ee9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/poppler-config.h.in +++ /dev/null @@ -1,195 +0,0 @@ -//================================================= -*- mode: c++ -*- ==== -// -// poppler-config.h -// -// Copyright 1996-2011 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) 2014 Bogdan Cristea <cristeab@gmail.com> -// Copyright (C) 2014 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 POPPLER_CONFIG_H -#define POPPLER_CONFIG_H - -#include <stdio.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 - -/* 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-2015 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__ && !defined(__WINPTHREADS_VERSION) -char * strtok_r (char *s, const char *delim, char **save_ptr); -#endif -#endif - -//------------------------------------------------------------------------ -// Compiler -//------------------------------------------------------------------------ - -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) -#ifdef __MINGW_PRINTF_FORMAT -#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ - __attribute__((__format__(__MINGW_PRINTF_FORMAT, fmt_index, va_index))) -#else -#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ - __attribute__((__format__(__printf__, fmt_index, va_index))) -#endif -#else -#define GCC_PRINTF_FORMAT(fmt_index, va_index) -#endif - -#if defined(_MSC_VER) -#define fmax(a, b) std::max(a, b) -#define fmin(a, b) std::min(a, b) -#endif - - -#endif /* POPPLER_CONFIG_H */ diff --git a/Build/source/libs/poppler/poppler-0.35.0/poppler/strtok_r.cpp b/Build/source/libs/poppler/poppler-0.35.0/poppler/strtok_r.cpp deleted file mode 100644 index 6483e0f7be9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/poppler/strtok_r.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* 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. */ - -//======================================================================== -// -// 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 Alexey Pavlov <alexpux@gmail.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 -// -//======================================================================== - -#if defined(__MINGW32__) && !defined(__WINPTHREADS_VERSION) -#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/Build/source/libs/poppler/poppler-0.35.0/splash/Makefile.am b/Build/source/libs/poppler/poppler-0.35.0/splash/Makefile.am deleted file mode 100644 index 5c265d6360c..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/Makefile.am +++ /dev/null @@ -1,73 +0,0 @@ -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 - -# 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 - -libsplash_la_CPPFLAGS = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/goo \ - $(libjpeg_includes) \ - $(libtiff_includes) \ - $(libpng_includes) \ - $(FREETYPE_CFLAGS) diff --git a/Build/source/libs/poppler/poppler-0.35.0/splash/Splash.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/Splash.cc deleted file mode 100644 index e07fa06db2b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/Splash.cc +++ /dev/null @@ -1,6459 +0,0 @@ -//======================================================================== -// -// 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-2015 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com> -// Copyright (C) 2010-2015 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com> -// Copyright (C) 2011-2013, 2015 William Bader <williambader@hotmail.com> -// Copyright (C) 2012 Markus Trippelsdorf <markus@trippelsdorf.de> -// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> -// Copyright (C) 2012 Matthias Kramm <kramm@quiss.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 <limits.h> -#include <assert.h> -#include <math.h> -#include "goo/gmem.h" -#include "goo/GooLikely.h" -#include "goo/GooList.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, - splashPipeResultColorNoAlphaBlendDeviceN -#endif -}; - -SplashPipeResultColorCtrl Splash::pipeResultColorAlphaNoBlend[] = { - splashPipeResultColorAlphaNoBlendMono, - splashPipeResultColorAlphaNoBlendMono, - splashPipeResultColorAlphaNoBlendRGB, - splashPipeResultColorAlphaNoBlendRGB, - splashPipeResultColorAlphaNoBlendRGB -#if SPLASH_CMYK - , - splashPipeResultColorAlphaNoBlendCMYK, - splashPipeResultColorAlphaNoBlendDeviceN -#endif -}; - -SplashPipeResultColorCtrl Splash::pipeResultColorAlphaBlend[] = { - splashPipeResultColorAlphaBlendMono, - splashPipeResultColorAlphaBlendMono, - splashPipeResultColorAlphaBlendRGB, - splashPipeResultColorAlphaBlendRGB, - splashPipeResultColorAlphaBlendRGB -#if SPLASH_CMYK - , - splashPipeResultColorAlphaBlendCMYK, - splashPipeResultColorAlphaBlendDeviceN -#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; - pipe->shape = 0; - - // 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; - } else if (bitmap->mode == splashModeDeviceN8 && pipe->destAlphaPtr) { - pipe->run = &Splash::pipeRunSimpleDeviceN8; -#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; - } else if (bitmap->mode == splashModeDeviceN8 && pipe->destAlphaPtr) { - pipe->run = &Splash::pipeRunAADeviceN8; -#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; -#if SPLASH_CMYK - int cp, mask; - Guchar cResult[SPOT_NCOMPS+4]; -#endif - - //----- 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 SPLASH_CMYK - if (bitmap->mode == splashModeCMYK8 || bitmap->mode == splashModeDeviceN8) { - if (state->fillOverprint && state->overprintMode && pipe->pattern->isCMYK()) { - Guint mask = 15; - if (pipe->cSrcVal[0] == 0) { - mask &= ~1; - } - if (pipe->cSrcVal[1] == 0) { - mask &= ~2; - } - if (pipe->cSrcVal[2] == 0) { - mask &= ~4; - } - if (pipe->cSrcVal[3] == 0) { - mask &= ~8; - } - state->overprintMask = mask; - } - } -#endif - } - - 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; - case splashModeDeviceN8: - mask = 1; - for (cp = 0; cp < SPOT_NCOMPS + 4; cp ++) { - if (state->overprintMask & mask) { - pipe->destColorPtr[cp] = state->deviceNTransfer[cp][pipe->cSrc[cp]]; - } - mask <<= 1; - } - pipe->destColorPtr += (SPOT_NCOMPS+4); - break; -#endif - } - if (pipe->destAlphaPtr) { - *pipe->destAlphaPtr++ = 255; - } - - } else { - - //----- read destination pixel - - Guchar *destColorPtr; - if (pipe->shape && state->blendFunc && pipe->knockout && alpha0Bitmap != NULL) { - destColorPtr = alpha0Bitmap->data + (alpha0Y+pipe->y)*alpha0Bitmap->rowSize; - switch (bitmap->mode) { - case splashModeMono1: - destColorPtr += (alpha0X+pipe->x) / 8; - break; - case splashModeMono8: - destColorPtr += (alpha0X+pipe->x); - break; - case splashModeRGB8: - case splashModeBGR8: - destColorPtr += (alpha0X+pipe->x) * 3; - break; - case splashModeXBGR8: -#if SPLASH_CMYK - case splashModeCMYK8: -#endif - destColorPtr += (alpha0X+pipe->x) * 4; - break; -#if SPLASH_CMYK - case splashModeDeviceN8: - destColorPtr += (alpha0X+pipe->x) * (SPOT_NCOMPS + 4); - break; -#endif - } - } else { - destColorPtr = pipe->destColorPtr; - } - switch (bitmap->mode) { - case splashModeMono1: - cDest[0] = (*destColorPtr & pipe->destColorMask) ? 0xff : 0x00; - break; - case splashModeMono8: - cDest[0] = *destColorPtr; - break; - case splashModeRGB8: - cDest[0] = destColorPtr[0]; - cDest[1] = destColorPtr[1]; - cDest[2] = destColorPtr[2]; - break; - case splashModeXBGR8: - cDest[0] = destColorPtr[2]; - cDest[1] = destColorPtr[1]; - cDest[2] = destColorPtr[0]; - cDest[3] = 255; - break; - case splashModeBGR8: - cDest[0] = destColorPtr[2]; - cDest[1] = destColorPtr[1]; - cDest[2] = destColorPtr[0]; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - cDest[0] = destColorPtr[0]; - cDest[1] = destColorPtr[1]; - cDest[2] = destColorPtr[2]; - cDest[3] = destColorPtr[3]; - break; - case splashModeDeviceN8: - for (cp = 0; cp < SPOT_NCOMPS + 4; cp++) - cDest[cp] = destColorPtr[cp]; - 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 splashModeDeviceN8: - for (cp = 0; cp < SPOT_NCOMPS + 4; cp++) - cSrcNonIso[cp] = clip255(pipe->cSrc[cp] + - ((pipe->cSrc[cp] - cDest[cp]) * t) / 255); - break; - case splashModeCMYK8: - for (cp = 0; cp < 4; cp++) - cSrcNonIso[cp] = clip255(pipe->cSrc[cp] + - ((pipe->cSrc[cp] - cDest[cp]) * t) / 255); - break; -#endif - case splashModeXBGR8: - cSrcNonIso[3] = 255; - case splashModeRGB8: - 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) { -#if SPLASH_CMYK - if (bitmap->mode == splashModeDeviceN8) { - for (int k = 4; k < 4 + SPOT_NCOMPS; k++) { - cBlend[k] = 0; - } - } -#endif - (*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; - case splashPipeResultColorNoAlphaBlendDeviceN: - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - cResult[cp] = state->deviceNTransfer[cp][div255((255 - aDest) * cSrc[cp] + - aDest * cBlend[cp])]; - 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; - case splashPipeResultColorAlphaNoBlendDeviceN: - if (alphaI == 0) { - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - cResult[cp] = 0; - } else { - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - cResult[cp] = state->deviceNTransfer[cp][((alphaI - aSrc) * cDest[cp] + - aSrc * cSrc[cp]) / 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; - case splashPipeResultColorAlphaBlendDeviceN: - if (alphaI == 0) { - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - cResult[cp] = 0; - } else { - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - cResult[cp] = state->deviceNTransfer[cp][((alphaI - aSrc) * cDest[cp] + - aSrc * ((255 - alphaIm1) * cSrc[cp] + - alphaIm1 * cBlend[cp]) / 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; - case splashModeDeviceN8: - mask = 1; - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) { - if (state->overprintMask & mask) { - pipe->destColorPtr[cp] = cResult[cp]; - } - mask <<=1; - } - pipe->destColorPtr += (SPOT_NCOMPS+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; -} - -// special case: -// !pipe->pattern && pipe->noTransparency && !state->blendFunc && -// bitmap->mode == splashModeDeviceN8 && pipe->destAlphaPtr) { -void Splash::pipeRunSimpleDeviceN8(SplashPipe *pipe) { - //----- write destination pixel - int mask = 1; - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) { - if (state->overprintMask & mask) { - pipe->destColorPtr[cp] = state->deviceNTransfer[cp][pipe->cSrc[cp]]; - } - mask <<=1; - } - pipe->destColorPtr += (SPOT_NCOMPS+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; -} - -// special case: -// !pipe->pattern && !pipe->noTransparency && !state->softMask && -// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc && -// !pipe->nonIsolatedGroup && -// bitmap->mode == splashModeDeviceN8 && pipe->destAlphaPtr -void Splash::pipeRunAADeviceN8(SplashPipe *pipe) { - Guchar aSrc, aDest, alpha2, aResult; - SplashColor cDest; - Guchar cResult[SPOT_NCOMPS+4]; - int cp, mask; - - //----- read destination pixel - for (cp=0; cp < SPOT_NCOMPS+4; cp++) - cDest[cp] = pipe->destColorPtr[cp]; - 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) { - for (cp=0; cp < SPOT_NCOMPS+4; cp++) - cResult[cp] = 0; - } else { - for (cp=0; cp < SPOT_NCOMPS+4; cp++) - cResult[cp] = state->deviceNTransfer[cp][(Guchar)(((alpha2 - aSrc) * cDest[cp] + - aSrc * pipe->cSrc[cp]) / alpha2)]; - } - - //----- write destination pixel - mask = 1; - for (cp=0; cp < SPOT_NCOMPS+4; cp++) { - if (state->overprintMask & mask) { - pipe->destColorPtr[cp] = cResult[cp]; - } - mask <<= 1; - } - pipe->destColorPtr += (SPOT_NCOMPS+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; - case splashModeDeviceN8: - pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + (SPOT_NCOMPS + 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; - case splashModeDeviceN8: - pipe->destColorPtr += (SPOT_NCOMPS+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, GBool adjustLine, Guchar lineOpacity) { -#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 = (adjustLine) ? div255((int) lineOpacity * (double)aaGamma[t]) : (double)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; - thinLineMode = splashThinLineDefault; - clearModRegion(); - debugMode = gFalse; - alpha0Bitmap = NULL; -} - -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; - thinLineMode = splashThinLineDefault; - clearModRegion(); - debugMode = gFalse; - alpha0Bitmap = NULL; -} - -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; - case splashModeDeviceN8: - row = bitmap->data; - for (y = 0; y < bitmap->height; ++y) { - p = row; - for (x = 0; x < bitmap->width; ++x) { - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *p++ = color[cp]; - } - 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 * state->lineWidth <= 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 (lineDashStartIdx < state->lineDashLength && lineDashStartPhase >= state->lineDash[lineDashStartIdx]) { - lineDashStartOn = !lineDashStartOn; - lineDashStartPhase -= state->lineDash[lineDashStartIdx]; - ++lineDashStartIdx; - } - if (unlikely(lineDashStartIdx == state->lineDashLength)) { - return new SplashPath(); - } - } - - 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); -} - -inline void Splash::getBBoxFP(SplashPath *path, SplashCoord *xMinA, SplashCoord *yMinA, - SplashCoord *xMaxA, SplashCoord *yMaxA) { - SplashCoord xMinFP, yMinFP, xMaxFP, yMaxFP, tx, ty; - - // make compiler happy: - xMinFP = xMaxFP = yMinFP = yMaxFP = 0; - for (int i = 0; i < path->length; ++i) { - transform(state->matrix, path->pts[i].x, path->pts[i].y, &tx, &ty); - if (i == 0) { - xMinFP = xMaxFP = tx; - yMinFP = yMaxFP = ty; - } else { - if (tx < xMinFP) xMinFP = tx; - if (tx > xMaxFP) xMaxFP = tx; - if (ty < yMinFP) yMinFP = ty; - if (ty > yMaxFP) yMaxFP = ty; - } - } - - *xMinA = xMinFP; - *yMinA = yMinFP; - *xMaxA = xMaxFP; - *yMaxA = yMaxFP; -} - -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; - GBool adjustLine = gFalse; - int linePosI = 0; - - 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); - } - } - - if (thinLineMode != splashThinLineDefault) { - if (state->clip->getXMinI() == state->clip->getXMaxI()) { - linePosI = state->clip->getXMinI(); - adjustLine = gTrue; - } else if (state->clip->getXMinI() == state->clip->getXMaxI() - 1) { - adjustLine = gTrue; - linePosI = splashFloor(state->clip->getXMin() + state->lineWidth); - } else if (state->clip->getYMinI() == state->clip->getYMaxI()) { - linePosI = state->clip->getYMinI(); - adjustLine = gTrue; - } else if (state->clip->getYMinI() == state->clip->getYMaxI() - 1) { - adjustLine = gTrue; - linePosI = splashFloor(state->clip->getYMin() + state->lineWidth); - } - } - - xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue, - adjustLine, linePosI); - 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); - } - - if (eo && (yMinI == yMaxI || xMinI == xMaxI) && thinLineMode != splashThinLineDefault) { - SplashCoord delta, xMinFP, yMinFP, xMaxFP, yMaxFP; - getBBoxFP(path, &xMinFP, &yMinFP, &xMaxFP, &yMaxFP); - delta = (yMinI == yMaxI) ? yMaxFP - yMinFP : xMaxFP - xMinFP; - if (delta < 0.2) { - opClipRes = splashClipAllOutside; - delete scanner; - delete xPath; - return splashOk; - } - } - - // 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, thinLineMode != splashThinLineDefault && xMinI == xMaxI); - if (clipRes != splashClipAllInside) { - state->clip->clipAALine(aaBuf, &x0, &x1, y, thinLineMode != splashThinLineDefault && xMinI == xMaxI); - } - Guchar lineShape = 255; - GBool adjustLine = gFalse; - if (thinLineMode == splashThinLineShape && (xMinI == xMaxI || yMinI == yMaxI)) { - // compute line shape for thin lines: - SplashCoord mx, my, delta; - transform(state->matrix, 0, 0, &mx, &my); - transform(state->matrix, state->lineWidth, 0, &delta, &my); - adjustLine = gTrue; - lineShape = clip255((delta - mx) * 255); - } - drawAALine(&pipe, x0, x1, y, adjustLine, lineShape); - } - } 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); - if (scaledMask->data == NULL) { - error(errInternal, -1, "scaledMask->data is NULL in Splash::arbitraryTransformMask"); - delete scaledMask; - return; - } - - // 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; - - destPtr = dest->data; - if (destPtr == NULL) { - error(errInternal, -1, "dest->data is NULL in Splash::scaleMaskYdXu"); - return; - } - - // 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; - - 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; - - destPtr0 = dest->data; - if (destPtr0 == NULL) { - error(errInternal, -1, "dest->data is NULL in Splash::scaleMaskYuXd"); - return; - } - - // 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; - - 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; - - destPtr0 = dest->data; - if (destPtr0 == NULL) { - error(errInternal, -1, "dest->data is NULL in Splash::scaleMaskYuXu"); - return; - } - - // 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; - - 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(); - p = src->getDataPtr(); - if (p == NULL) { - error(errInternal, -1, "src->getDataPtr() is NULL in Splash::blitMask"); - return; - } - if (vectorAntialias && clipRes != splashClipAllInside) { - pipeInit(&pipe, xDest, yDest, state->fillPattern, NULL, - (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse); - drawAAPixelInit(); - 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); - 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, SplashICCTransform tf, void *srcData, - SplashColorMode srcMode, GBool srcAlpha, - int w, int h, SplashCoord *mat, GBool interpolate, - 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; - case splashModeDeviceN8: - ok = srcMode == splashModeDeviceN8; - nComps = SPOT_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, interpolate, tilingPattern); - if (scaledImg == NULL) { - return splashErrBadArg; - } - if (tf != NULL) { - (*tf)(srcData, scaledImg); - } - 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, interpolate, tilingPattern); - if (scaledImg == NULL) { - return splashErrBadArg; - } - if (tf != NULL) { - (*tf)(srcData, scaledImg); - } - vertFlipImage(scaledImg, scaledWidth, scaledHeight, nComps); - blitImage(scaledImg, srcAlpha, x0, y0, clipRes); - delete scaledImg; - } - - // all other cases - } else { - return arbitraryTransformImage(src, tf, srcData, srcMode, nComps, srcAlpha, - w, h, mat, interpolate, tilingPattern); - } - - return splashOk; -} - -SplashError Splash::arbitraryTransformImage(SplashImageSource src, SplashICCTransform tf, void *srcData, - SplashColorMode srcMode, int nComps, - GBool srcAlpha, - int srcWidth, int srcHeight, - SplashCoord *mat, GBool interpolate, - 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, yMax); - 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 || scaledWidth <= 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, interpolate); - - if (scaledImg == NULL) { - return splashErrBadArg; - } - - if (tf != NULL) { - (*tf)(srcData, scaledImg); - } - // 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); - if (unlikely(xa < 0)) - xa = 0; - 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; -} - -// determine if a scaled image requires interpolation based on the scale and -// the interpolate flag from the image dictionary -static GBool isImageInterpolationRequired(int srcWidth, int srcHeight, - int scaledWidth, int scaledHeight, - GBool interpolate) { - if (interpolate) - return gTrue; - - /* When scale factor is >= 400% we don't interpolate. See bugs #25268, #9860 */ - if (scaledWidth / srcWidth >= 4 || scaledHeight / srcHeight >= 4) - return gFalse; - - return gTrue; -} - -// 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, GBool interpolate, GBool tilingPattern) { - SplashBitmap *dest; - - dest = new SplashBitmap(scaledWidth, scaledHeight, 1, srcMode, srcAlpha, gTrue, bitmap->getSeparationList()); - 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 { - if (!tilingPattern && isImageInterpolationRequired(srcWidth, srcHeight, scaledWidth, scaledHeight, interpolate)) { - scaleImageYuXuBilinear(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; - Guint pix[SPOT_NCOMPS+4], cp; -#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; - case splashModeDeviceN8: - - // compute the final pixel - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - pix[cp] = 0; - for (i = 0; i < xStep; ++i) { - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) { - pix[cp] += pixBuf[xx + cp]; - } - xx += (SPOT_NCOMPS+4); - } - // pix / xStep * yStep - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - pix[cp] = (pix[cp] * d) >> 23; - - // store the pixel - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - *destPtr++ = (Guchar)pix[cp]; - 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; - case splashModeDeviceN8: - for (i = 0; i < xStep; ++i) { - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *destPtr++ = (Guchar)pix[cp]; - } - 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_checkoverflow(srcWidth, nComps); - if (unlikely(!lineBuf)) - return; - 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; - case splashModeDeviceN8: - for (i = 0; i < yStep; ++i) { - destPtr = destPtr0 + (i * scaledWidth + x) * nComps; - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *destPtr++ = (Guchar)pix[cp]; - } - 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; - case splashModeDeviceN8: - for (i = 0; i < yStep; ++i) { - for (j = 0; j < xStep; ++j) { - destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps; - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *destPtr++ = (Guchar)pix[cp]; - } - } - 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); -} - -// expand source row to scaledWidth using linear interpolation -static void expandRow(Guchar *srcBuf, Guchar *dstBuf, int srcWidth, int scaledWidth, int nComps) -{ - double xStep = (double)srcWidth/scaledWidth; - double xSrc = 0.0; - double xFrac, xInt; - int p; - - // pad the source with an extra pixel equal to the last pixel - // so that when xStep is inside the last pixel we still have two - // pixels to interpolate between. - for (int i = 0; i < nComps; i++) - srcBuf[srcWidth*nComps + i] = srcBuf[(srcWidth-1)*nComps + i]; - - for (int x = 0; x < scaledWidth; x++) { - xFrac = modf(xSrc, &xInt); - p = (int)xInt; - for (int c = 0; c < nComps; c++) { - dstBuf[nComps*x + c] = srcBuf[nComps*p + c]*(1.0 - xFrac) + srcBuf[nComps*(p+1) + c]*xFrac; - } - xSrc += xStep; - } -} - -// Scale up image using bilinear interpolation -void Splash::scaleImageYuXuBilinear(SplashImageSource src, void *srcData, - SplashColorMode srcMode, int nComps, - GBool srcAlpha, int srcWidth, int srcHeight, - int scaledWidth, int scaledHeight, - SplashBitmap *dest) { - Guchar *srcBuf, *lineBuf1, *lineBuf2, *alphaSrcBuf, *alphaLineBuf1, *alphaLineBuf2; - Guint pix[splashMaxColorComps]; - Guchar *destPtr0, *destPtr, *destAlphaPtr0, *destAlphaPtr; - int i; - - if (srcWidth < 1 || srcHeight < 1) - return; - - // allocate buffers - srcBuf = (Guchar *)gmallocn(srcWidth+1, nComps); // + 1 pixel of padding - lineBuf1 = (Guchar *)gmallocn(scaledWidth, nComps); - lineBuf2 = (Guchar *)gmallocn(scaledWidth, nComps); - if (srcAlpha) { - alphaSrcBuf = (Guchar *)gmalloc(srcWidth+1); // + 1 pixel of padding - alphaLineBuf1 = (Guchar *)gmalloc(scaledWidth); - alphaLineBuf2 = (Guchar *)gmalloc(scaledWidth); - } else { - alphaSrcBuf = NULL; - alphaLineBuf1 = NULL; - alphaLineBuf2 = NULL; - } - - double ySrc = 0.0; - double yStep = (double)srcHeight/scaledHeight; - double yFrac, yInt; - int currentSrcRow = -1; - (*src)(srcData, srcBuf, alphaSrcBuf); - expandRow(srcBuf, lineBuf2, srcWidth, scaledWidth, nComps); - if (srcAlpha) - expandRow(alphaSrcBuf, alphaLineBuf2, srcWidth, scaledWidth, 1); - - destPtr0 = dest->data; - destAlphaPtr0 = dest->alpha; - for (int y = 0; y < scaledHeight; y++) { - yFrac = modf(ySrc, &yInt); - if ((int)yInt > currentSrcRow) { - currentSrcRow++; - // Copy line2 data to line1 and get next line2 data. - // If line2 already contains the last source row we don't touch it. - // This effectively adds an extra row of padding for interpolating the - // last source row with. - memcpy(lineBuf1, lineBuf2, scaledWidth * nComps); - if (srcAlpha) - memcpy(alphaLineBuf1, alphaLineBuf2, scaledWidth); - if (currentSrcRow < srcHeight) { - (*src)(srcData, srcBuf, alphaSrcBuf); - expandRow(srcBuf, lineBuf2, srcWidth, scaledWidth, nComps); - if (srcAlpha) - expandRow(alphaSrcBuf, alphaLineBuf2, srcWidth, scaledWidth, 1); - } - } - - // write row y using linear interpolation on lineBuf1 and lineBuf2 - for (int x = 0; x < scaledWidth; ++x) { - // compute the final pixel - for (i = 0; i < nComps; ++i) { - pix[i] = lineBuf1[x*nComps + i]*(1.0 - yFrac) + lineBuf2[x*nComps + i]*yFrac; - } - - // store the pixel - destPtr = destPtr0 + (y * scaledWidth + x) * nComps; - switch (srcMode) { - case splashModeMono1: // mono1 is not allowed - break; - case splashModeMono8: - *destPtr++ = (Guchar)pix[0]; - break; - case splashModeRGB8: - *destPtr++ = (Guchar)pix[0]; - *destPtr++ = (Guchar)pix[1]; - *destPtr++ = (Guchar)pix[2]; - break; - case splashModeXBGR8: - *destPtr++ = (Guchar)pix[2]; - *destPtr++ = (Guchar)pix[1]; - *destPtr++ = (Guchar)pix[0]; - *destPtr++ = (Guchar)255; - break; - case splashModeBGR8: - *destPtr++ = (Guchar)pix[2]; - *destPtr++ = (Guchar)pix[1]; - *destPtr++ = (Guchar)pix[0]; - break; -#if SPLASH_CMYK - case splashModeCMYK8: - *destPtr++ = (Guchar)pix[0]; - *destPtr++ = (Guchar)pix[1]; - *destPtr++ = (Guchar)pix[2]; - *destPtr++ = (Guchar)pix[3]; - break; - case splashModeDeviceN8: - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - *destPtr++ = (Guchar)pix[cp]; - break; -#endif - } - - // process alpha - if (srcAlpha) { - destAlphaPtr = destAlphaPtr0 + y*scaledWidth + x; - *destAlphaPtr = alphaLineBuf1[x]*(1.0 - yFrac) + alphaLineBuf2[x]*yFrac; - } - } - - ySrc += yStep; - } - - gfree(alphaSrcBuf); - gfree(alphaLineBuf1); - gfree(alphaLineBuf2); - gfree(srcBuf); - gfree(lineBuf1); - gfree(lineBuf2); -} - -void Splash::vertFlipImage(SplashBitmap *img, int width, int height, - int nComps) { - Guchar *lineBuf; - Guchar *p0, *p1; - int w; - - if (unlikely(img->data == NULL)) { - error(errInternal, -1, "img->data is NULL in Splash::vertFlipImage"); - return; - } - - 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 = state->clip->testRect(xDest, yDest, xDest + src->getWidth() - 1, yDest + src->getHeight() - 1); - if (clipRes != splashClipAllOutside) { - blitImage(src, srcAlpha, xDest, yDest, clipRes); - } -} - -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 (unlikely(!bitmap->data)) { - return splashErrZeroImage; - } - - if(src->getSeparationList()->getLength() > bitmap->getSeparationList()->getLength()) { - for (x = bitmap->getSeparationList()->getLength(); x < src->getSeparationList()->getLength(); x++) - bitmap->getSeparationList()->append(((GfxSeparationColorSpace *)src->getSeparationList()->get(x))->copy()); - } - 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; - Guchar colorsp[SPOT_NCOMPS+4], cp; -#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; - case splashModeDeviceN8: - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - colorsp[cp] = color[cp]; - 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) - { - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - p[cp] = colorsp[cp]; - } - else if (alpha != 255) - { - alpha1 = 255 - alpha; - for (cp = 0; cp < SPOT_NCOMPS+4; cp++) - p[cp] = div255(alpha1 * colorsp[cp] + alpha * p[cp]); - } - p += (SPOT_NCOMPS+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(); - int bitmapOffLimit = bitmap->getHeight() * bitmap->getRowSize(); - 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; - case splashModeDeviceN8: - colorComps=SPOT_NCOMPS+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 && bitmapOff + colorComps <= bitmapOffLimit; ++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; - } - - if (unlikely(!bitmap->data)) { - return splashErrZeroImage; - } - - 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; - case splashModeDeviceN8: - for (y = 0; y < h; ++y) { - p = &bitmap->data[(yDest + y) * bitmap->rowSize + (SPOT_NCOMPS+4) * xDest]; - sp = &src->data[(ySrc + y) * src->rowSize + (SPOT_NCOMPS+4) * xSrc]; - for (x = 0; x < w; ++x) { - for (int cp=0; cp < SPOT_NCOMPS+4; cp++) - *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/Build/source/libs/poppler/poppler-0.35.0/splash/Splash.h b/Build/source/libs/poppler/poppler-0.35.0/splash/Splash.h deleted file mode 100644 index 75764544fed..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/Splash.h +++ /dev/null @@ -1,429 +0,0 @@ -//======================================================================== -// -// 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-2013, 2015 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.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 -// -//======================================================================== - -#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); - -// Use ICCColorSpace to transform a bitmap -typedef void (*SplashICCTransform)(void *data, SplashBitmap *bitmap); - -//------------------------------------------------------------------------ - -enum SplashPipeResultColorCtrl { -#if SPLASH_CMYK - splashPipeResultColorNoAlphaBlendCMYK, - splashPipeResultColorNoAlphaBlendDeviceN, -#endif - splashPipeResultColorNoAlphaBlendRGB, - splashPipeResultColorNoAlphaBlendMono, - splashPipeResultColorAlphaNoBlendMono, - splashPipeResultColorAlphaNoBlendRGB, -#if SPLASH_CMYK - splashPipeResultColorAlphaNoBlendCMYK, - splashPipeResultColorAlphaNoBlendDeviceN, -#endif - splashPipeResultColorAlphaBlendMono, - splashPipeResultColorAlphaBlendRGB -#if SPLASH_CMYK - , - splashPipeResultColorAlphaBlendCMYK, - splashPipeResultColorAlphaBlendDeviceN -#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, SplashICCTransform tf, void *srcData, - SplashColorMode srcMode, GBool srcAlpha, - int w, int h, SplashCoord *mat, GBool interpolate, - 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); - void blitImage(SplashBitmap *src, GBool srcAlpha, int xDest, int yDest); - - //----- 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; } - - // Setter/Getter for thin line mode - void setThinLineMode(SplashThinLineMode thinLineModeA) { thinLineMode = thinLineModeA; } - SplashThinLineMode getThinLineMode() { return thinLineMode; } - - // 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); - void pipeRunSimpleDeviceN8(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); - void pipeRunAADeviceN8(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, GBool adjustLine = gFalse, Guchar lineOpacity = 0); - 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); - void getBBoxFP(SplashPath *path, SplashCoord *xMinA, SplashCoord *yMinA, SplashCoord *xMaxA, SplashCoord *yMaxA); - 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, SplashICCTransform tf, void *srcData, - SplashColorMode srcMode, int nComps, - GBool srcAlpha, - int srcWidth, int srcHeight, - SplashCoord *mat, GBool interpolate, GBool tilingPattern = gFalse); - SplashBitmap *scaleImage(SplashImageSource src, void *srcData, - SplashColorMode srcMode, int nComps, - GBool srcAlpha, int srcWidth, int srcHeight, - int scaledWidth, int scaledHeight, GBool interpolate, GBool tilingPattern = gFalse); - 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 scaleImageYuXuBilinear(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; - SplashThinLineMode thinLineMode; - int modXMin, modYMin, modXMax, modYMax; - SplashClipResult opClipRes; - GBool vectorAntialias; - GBool inShading; - GBool debugMode; -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashBitmap.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashBitmap.cc deleted file mode 100644 index c905c97afb9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashBitmap.cc +++ /dev/null @@ -1,768 +0,0 @@ -//======================================================================== -// -// 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, 2015 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, 2012 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, 2015 William Bader <williambader@hotmail.com> -// Copyright (C) 2011-2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2012 Anthony Wesley <awesley@smartnetworks.com.au> -// Copyright (C) 2015 Adam Reichold <adamreichold@myopera.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 <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" -#include "goo/GooList.h" - -//------------------------------------------------------------------------ -// SplashBitmap -//------------------------------------------------------------------------ - -SplashBitmap::SplashBitmap(int widthA, int heightA, int rowPadA, - SplashColorMode modeA, GBool alphaA, - GBool topDown, GooList *separationListA) { - 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; - case splashModeDeviceN8: - if (width > 0 && width <= INT_MAX / 4) { - rowSize = width * (SPOT_NCOMPS + 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; - } - separationList = new GooList(); - if (separationListA != NULL) - for (int i = 0; i < separationListA->getLength(); i++) - separationList->append(((GfxSeparationColorSpace *) separationListA->get(i))->copy()); -} - -SplashBitmap *SplashBitmap::copy(SplashBitmap *src) { - SplashBitmap *result = new SplashBitmap(src->getWidth(), src->getHeight(), src->getRowPad(), - src->getMode(), src->getAlphaPtr() != NULL, src->getRowSize() >= 0, src->getSeparationList()); - 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); - deleteGooList(separationList, GfxSeparationColorSpace); -} - - -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: - case splashModeDeviceN8: - // 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 || !data) { - 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; - case splashModeDeviceN8: - p = &data[y * rowSize + (SPOT_NCOMPS + 4) * x]; - for (int cp = 0; cp < SPOT_NCOMPS + 4; cp++) - pixel[cp] = p[cp]; - 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 - #if SPLASH_CMYK - case splashFormatJpegCMYK: - writer = new JpegWriter(JpegWriter::CMYK); - break; - #endif - case splashFormatJpeg: - writer = new JpegWriter(); - break; - #endif - - #ifdef ENABLE_LIBTIFF - case splashFormatTiff: - switch (mode) { - case splashModeMono1: - writer = new TiffWriter(TiffWriter::MONOCHROME); - break; - case splashModeMono8: - writer = new TiffWriter(TiffWriter::GRAY); - break; - case splashModeRGB8: - case splashModeBGR8: - writer = new TiffWriter(TiffWriter::RGB); - break; -#if SPLASH_CMYK - case splashModeCMYK8: - case splashModeDeviceN8: - writer = new TiffWriter(TiffWriter::CMYK); - break; -#endif - default: - fprintf(stderr, "TiffWriter: Mode %d not supported\n", mode); - writer = new TiffWriter(); - } - if (writer) { - ((TiffWriter *)writer)->setCompressionString(compressionString); - } - 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]); -#if SPLASH_CMYK - if (separationList->getLength() > 0) { - for (int i = 0; i < separationList->getLength(); i++) { - if (col[i+4] > 0) { - GfxCMYK cmyk; - GfxColor input; - input.c[0] = byteToCol(col[i+4]); - GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(i); - sepCS->getCMYK(&input, &cmyk); - col[0] = colToByte(cmyk.c); - col[1] = colToByte(cmyk.m); - col[2] = colToByte(cmyk.y); - col[3] = colToByte(cmyk.k); - c += byteToDbl(col[0]); - m += byteToDbl(col[1]); - y += byteToDbl(col[2]); - k += byteToDbl(col[3]); - } - } - if (c > 1) c = 1; - if (m > 1) m = 1; - if (y > 1) y = 1; - if (k > 1) k = 1; - } -#endif - 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)); - } -} - -void SplashBitmap::getXBGRLine(int yl, SplashColorPtr line, bool useAlpha) { - 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]); -#if SPLASH_CMYK - if (separationList->getLength() > 0) { - for (int i = 0; i < separationList->getLength(); i++) { - if (col[i+4] > 0) { - GfxCMYK cmyk; - GfxColor input; - input.c[0] = byteToCol(col[i+4]); - GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(i); - sepCS->getCMYK(&input, &cmyk); - col[0] = colToByte(cmyk.c); - col[1] = colToByte(cmyk.m); - col[2] = colToByte(cmyk.y); - col[3] = colToByte(cmyk.k); - c += byteToDbl(col[0]); - m += byteToDbl(col[1]); - y += byteToDbl(col[2]); - k += byteToDbl(col[3]); - } - } - if (c > 1) c = 1; - if (m > 1) m = 1; - if (y > 1) y = 1; - if (k > 1) k = 1; - } -#endif - 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(b)); - *line++ = dblToByte(clip01(g)); - *line++ = dblToByte(clip01(r)); - *line++ = useAlpha ? getAlpha(x, yl) : 255; - } -} - -GBool SplashBitmap::convertToXBGR(bool useAlpha) { - if (mode == splashModeXBGR8) { - if (useAlpha) { - // Copy the alpha channel into the fourth component so that XBGR becomes ABGR. - const SplashColorPtr dbegin = data; - const SplashColorPtr dend = data + rowSize * height; - - Guchar *const abegin = alpha; - Guchar *const aend = alpha + width * height; - - SplashColorPtr d = dbegin + 3; - Guchar *a = abegin; - - for(; d < dend && a < aend; d += 4, a += 1) { - *d = *a; - } - } - - return gTrue; - } - - int newrowSize = width * 4; - SplashColorPtr newdata = (SplashColorPtr)gmallocn_checkoverflow(newrowSize, height); - if (newdata != NULL) { - for (int y = 0; y < height; y++) { - unsigned char *row = newdata + y * newrowSize; - getXBGRLine(y, row, useAlpha); - } - if (rowSize < 0) { - gfree(data + (height - 1) * rowSize); - } else { - gfree(data); - } - data = newdata; - rowSize = newrowSize; - mode = splashModeXBGR8; - } - return newdata != NULL; -} - -#if SPLASH_CMYK -void SplashBitmap::getCMYKLine(int yl, SplashColorPtr line) { - SplashColor col; - - for (int x = 0; x < width; x++) { - getPixel(x, yl, col); - if (separationList->getLength() > 0) { - double c, m, y, k; - c = byteToDbl(col[0]); - m = byteToDbl(col[1]); - y = byteToDbl(col[2]); - k = byteToDbl(col[3]); - for (int i = 0; i < separationList->getLength(); i++) { - if (col[i+4] > 0) { - GfxCMYK cmyk; - GfxColor input; - input.c[0] = byteToCol(col[i+4]); - GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(i); - sepCS->getCMYK(&input, &cmyk); - col[0] = colToByte(cmyk.c); - col[1] = colToByte(cmyk.m); - col[2] = colToByte(cmyk.y); - col[3] = colToByte(cmyk.k); - c += byteToDbl(col[0]); - m += byteToDbl(col[1]); - y += byteToDbl(col[2]); - k += byteToDbl(col[3]); - } - } - col[0] = dblToByte(clip01(c)); - col[1] = dblToByte(clip01(m)); - col[2] = dblToByte(clip01(y)); - col[3] = dblToByte(clip01(k)); - } - *line++ = col[0]; - *line++ = col[1]; - *line++ = col[2]; - *line++ = col[3]; - } -} -#endif - -SplashError SplashBitmap::writeImgFile(ImgWriter *writer, FILE *f, int hDPI, int vDPI) { - if (mode != splashModeRGB8 && mode != splashModeMono8 && mode != splashModeMono1 && mode != splashModeXBGR8 && mode != splashModeBGR8 -#if SPLASH_CMYK - && mode != splashModeCMYK8 && mode != splashModeDeviceN8 -#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; - case splashModeDeviceN8: - if (writer->supportCMYK()) { - unsigned char *row = new unsigned char[4 * width]; - for (int y = 0; y < height; y++) { - getCMYKLine(y, row); - if (!writer->writeRow(&row)) { - delete[] row; - return splashErrGeneric; - } - } - delete[] row; - } 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 splashModeBGR8: - { - 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 * 3 + 2]; - row[3*x+1] = data[y * rowSize + x * 3 + 1]; - row[3*x+2] = data[y * rowSize + x * 3]; - } - - if (!writer->writeRow(&row)) { - delete[] row; - return splashErrGeneric; - } - } - delete[] row; - } - 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashBitmap.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashBitmap.h deleted file mode 100644 index 9fa7613f879..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashBitmap.h +++ /dev/null @@ -1,109 +0,0 @@ -//======================================================================== -// -// 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, 2012 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> -// Copyright (C) 2015 Adam Reichold <adamreichold@myopera.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 SPLASHBITMAP_H -#define SPLASHBITMAP_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" -#include "poppler/GfxState.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, GooList *separationList = NULL); - 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; } - GooList *getSeparationList() { return separationList; } - - 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); - - GBool convertToXBGR(bool useAlpha = false); - - void getPixel(int x, int y, SplashColorPtr pixel); - void getRGBLine(int y, SplashColorPtr line); - void getXBGRLine(int y, SplashColorPtr line, bool useAlpha = false); -#if SPLASH_CMYK - void getCMYKLine(int y, SplashColorPtr line); -#endif - 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) - GooList *separationList; // list of spot colorants and their mapping functions - - friend class Splash; -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashClip.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashClip.cc deleted file mode 100644 index 85c6b11473d..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashClip.cc +++ /dev/null @@ -1,411 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 "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, GBool adjustVertLine) { - 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 && !adjustVertLine) { - *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 && !adjustVertLine) { - 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashClip.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashClip.h deleted file mode 100644 index 5c0fdba99a7..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashClip.h +++ /dev/null @@ -1,152 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 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, - GBool adjustVertLine = gFalse); - - // 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashErrorCodes.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashErrorCodes.h deleted file mode 100644 index d1f81f85dd8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashErrorCodes.h +++ /dev/null @@ -1,50 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFont.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFont.cc deleted file mode 100644 index b785826d66b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFont.cc +++ /dev/null @@ -1,513 +0,0 @@ -//======================================================================== -// -// 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, 2014 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> -// 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> - -#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 && c >= 0) { - 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 (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 && c >= 0) { - gid = ff->codeToGID[c]; - } else { - gid = (FT_UInt)c; - } - 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; - } - if (FT_Outline_Check(&((FT_OutlineGlyph)glyph)->outline)) { - 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFont.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFont.h deleted file mode 100644 index 98cb29dfbba..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFont.h +++ /dev/null @@ -1,80 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontEngine.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontEngine.cc deleted file mode 100644 index 9fef8f007d1..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontEngine.cc +++ /dev/null @@ -1,180 +0,0 @@ -//======================================================================== -// -// 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, 2012 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 - -//------------------------------------------------------------------------ -// 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) { - SplashFontFile *ret; - ret = SplashFTFontFile::loadTrueTypeFont(this, idA, src, - codeToGID, codeToGIDLen, - faceIndex); - return ret; -} - -#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontEngine.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontEngine.h deleted file mode 100644 index 11bbea74a80..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontEngine.h +++ /dev/null @@ -1,81 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 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); - GBool getAA() { return aa; } - void setAA(GBool aaA) { aa = aaA; } - -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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontFile.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontFile.cc deleted file mode 100644 index f0dcf50384b..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontFile.cc +++ /dev/null @@ -1,148 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2014 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> - -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "goo/gmem.h" -#include "goo/GooString.h" -#include "poppler/GfxFont.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); - if (codeToGIDA[i] == 0) { - name = GfxFont::getAlternateName(name); - if (name) { - codeToGIDA[i] = 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontFile.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontFile.h deleted file mode 100644 index d642af0a0ab..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFTFontFile.h +++ /dev/null @@ -1,86 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFont.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFont.cc deleted file mode 100644 index 3d6d6b2343e..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFont.cc +++ /dev/null @@ -1,224 +0,0 @@ -//======================================================================== -// -// 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, 2014 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 <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 (glyphW > INT_MAX / glyphH) { - glyphSize = -1; - } else { - 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFont.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFont.h deleted file mode 100644 index 78b00d2dcaf..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFont.h +++ /dev/null @@ -1,121 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontEngine.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontEngine.cc deleted file mode 100644 index 73ef8de0877..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontEngine.cc +++ /dev/null @@ -1,337 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> -// Copyright (C) 2015 Dmytro Morgun <lztoad@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 - - // 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::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 - - // 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::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 - - // 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::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); - } - - // 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; -} - -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H -GBool SplashFontEngine::getAA() { - return (ftEngine == NULL) ? gFalse : ftEngine->getAA(); -} - -void SplashFontEngine::setAA(GBool aa) { - if (ftEngine != NULL) { - ftEngine->setAA(aa); - } -} -#endif - -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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontEngine.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontEngine.h deleted file mode 100644 index 6502ea5a7fa..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontEngine.h +++ /dev/null @@ -1,110 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 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); -#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H - GBool getAA(); - void setAA(GBool aa); -#endif - -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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFile.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFile.cc deleted file mode 100644 index 68e8608b6a7..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFile.cc +++ /dev/null @@ -1,124 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFile.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFile.h deleted file mode 100644 index ec87504b9bc..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFile.h +++ /dev/null @@ -1,95 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFileID.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFileID.cc deleted file mode 100644 index a66dabf61e3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFileID.cc +++ /dev/null @@ -1,23 +0,0 @@ -//======================================================================== -// -// SplashFontFileID.cc -// -//======================================================================== - -#include <config.h> - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include "SplashFontFileID.h" - -//------------------------------------------------------------------------ -// SplashFontFileID -//------------------------------------------------------------------------ - -SplashFontFileID::SplashFontFileID() { -} - -SplashFontFileID::~SplashFontFileID() { -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFileID.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFileID.h deleted file mode 100644 index cfd89ebb56a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashFontFileID.h +++ /dev/null @@ -1,28 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashGlyphBitmap.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashGlyphBitmap.h deleted file mode 100644 index c062c106e6a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashGlyphBitmap.h +++ /dev/null @@ -1,24 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashMath.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashMath.h deleted file mode 100644 index ca73c2bd1f3..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashMath.h +++ /dev/null @@ -1,245 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPath.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPath.cc deleted file mode 100644 index bc4ccd524a4..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPath.cc +++ /dev/null @@ -1,185 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPath.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPath.h deleted file mode 100644 index 81273c613e5..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPath.h +++ /dev/null @@ -1,123 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPattern.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPattern.cc deleted file mode 100644 index 28ca4995882..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPattern.cc +++ /dev/null @@ -1,55 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPattern.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPattern.h deleted file mode 100644 index e678c9e20e6..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashPattern.h +++ /dev/null @@ -1,104 +0,0 @@ -//======================================================================== -// -// 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, 2014 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; - - // Returns true if this pattern colorspace is CMYK. - virtual GBool isCMYK() = 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; } - - virtual GBool isCMYK() { return gFalse; } - -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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashScreen.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashScreen.cc deleted file mode 100644 index 68ccd7ddda0..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashScreen.cc +++ /dev/null @@ -1,387 +0,0 @@ -//======================================================================== -// -// 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> -// 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 <string.h> -#include <algorithm> -#include "goo/gmem.h" -#include "goo/grandom.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; - - // 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) * grandom_double()); - 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashScreen.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashScreen.h deleted file mode 100644 index a7fc4559148..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashScreen.h +++ /dev/null @@ -1,80 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashState.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashState.cc deleted file mode 100644 index fd2789d02f9..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashState.cc +++ /dev/null @@ -1,263 +0,0 @@ -//======================================================================== -// -// 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, 4 + SPOT_NCOMPS -#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; -#if SPLASH_CMYK - cmykTransferC[i] = (Guchar)i; - cmykTransferM[i] = (Guchar)i; - cmykTransferY[i] = (Guchar)i; - cmykTransferK[i] = (Guchar)i; - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - deviceNTransfer[cp][i] = (Guchar)i; -#endif - } - 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; -#if SPLASH_CMYK - cmykTransferC[i] = (Guchar)i; - cmykTransferM[i] = (Guchar)i; - cmykTransferY[i] = (Guchar)i; - cmykTransferK[i] = (Guchar)i; - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - deviceNTransfer[cp][i] = (Guchar)i; -#endif - } - 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); -#if SPLASH_CMYK - memcpy(cmykTransferC, state->cmykTransferC, 256); - memcpy(cmykTransferM, state->cmykTransferM, 256); - memcpy(cmykTransferY, state->cmykTransferY, 256); - memcpy(cmykTransferK, state->cmykTransferK, 256); - for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) - memcpy(deviceNTransfer[cp], state->deviceNTransfer[cp], 256); -#endif - 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) { -#if SPLASH_CMYK - int i; - - 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]; - } - for (i = 0; i < 256; ++i) { - deviceNTransfer[0][i] = 255 - rgbTransferR[255 - i]; - deviceNTransfer[1][i] = 255 - rgbTransferG[255 - i]; - deviceNTransfer[2][i] = 255 - rgbTransferB[255 - i]; - deviceNTransfer[3][i] = 255 - grayTransfer[255 - i]; - } -#endif - memcpy(rgbTransferR, red, 256); - memcpy(rgbTransferG, green, 256); - memcpy(rgbTransferB, blue, 256); - memcpy(grayTransfer, gray, 256); -} diff --git a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashState.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashState.h deleted file mode 100644 index 2c603531cfd..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashState.h +++ /dev/null @@ -1,139 +0,0 @@ -//======================================================================== -// -// SplashState.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) 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 -// -//======================================================================== - -#ifndef SPLASHSTATE_H -#define SPLASHSTATE_H - -#ifdef USE_GCC_PRAGMAS -#pragma interface -#endif - -#include "SplashTypes.h" - -class SplashPattern; -class SplashScreen; -class SplashClip; -class SplashBitmap; - -//------------------------------------------------------------------------ -// line cap values -//------------------------------------------------------------------------ - -#define splashLineCapButt 0 -#define splashLineCapRound 1 -#define splashLineCapProjecting 2 - -//------------------------------------------------------------------------ -// line join values -//------------------------------------------------------------------------ - -#define splashLineJoinMiter 0 -#define splashLineJoinRound 1 -#define splashLineJoinBevel 2 - -//------------------------------------------------------------------------ -// SplashState -//------------------------------------------------------------------------ - -class SplashState { -public: - - // Create a new state object, initialized with default settings. - SplashState(int width, int height, GBool vectorAntialias, - SplashScreenParams *screenParams); - SplashState(int width, int height, GBool vectorAntialias, - SplashScreen *screenA); - - // Copy a state object. - SplashState *copy() { return new SplashState(this); } - - ~SplashState(); - - // Set the stroke pattern. This does not copy <strokePatternA>. - void setStrokePattern(SplashPattern *strokePatternA); - - // Set the fill pattern. This does not copy <fillPatternA>. - void setFillPattern(SplashPattern *fillPatternA); - - // Set the screen. This does not copy <screenA>. - void setScreen(SplashScreen *screenA); - - // Set the line dash pattern. This copies the <lineDashA> array. - void setLineDash(SplashCoord *lineDashA, int lineDashLengthA, - SplashCoord lineDashPhaseA); - - // Set the soft mask bitmap. - void setSoftMask(SplashBitmap *softMaskA); - - // Set the overprint parametes. - void setFillOverprint(GBool fillOverprintA) { fillOverprint = fillOverprintA; } - void setStrokeOverprint(GBool strokeOverprintA) { strokeOverprint = strokeOverprintA; } - void setOverprintMode(int overprintModeA) { overprintMode = overprintModeA; } - - // Set the transfer function. - void setTransfer(Guchar *red, Guchar *green, Guchar *blue, Guchar *gray); - -private: - - SplashState(SplashState *state); - - SplashCoord matrix[6]; - SplashPattern *strokePattern; - SplashPattern *fillPattern; - SplashScreen *screen; - SplashBlendFunc blendFunc; - SplashCoord strokeAlpha; - SplashCoord fillAlpha; - SplashCoord lineWidth; - int lineCap; - int lineJoin; - SplashCoord miterLimit; - SplashCoord flatness; - SplashCoord *lineDash; - int lineDashLength; - SplashCoord lineDashPhase; - GBool strokeAdjust; - SplashClip *clip; - SplashBitmap *softMask; - GBool deleteSoftMask; - GBool inNonIsolatedGroup; - GBool fillOverprint; - GBool strokeOverprint; - int overprintMode; - Guchar rgbTransferR[256], - rgbTransferG[256], - rgbTransferB[256]; - Guchar grayTransfer[256]; -#if SPLASH_CMYK - Guchar cmykTransferC[256], - cmykTransferM[256], - cmykTransferY[256], - cmykTransferK[256]; - Guchar deviceNTransfer[SPOT_NCOMPS+4][256]; -#endif - Guint overprintMask; - GBool overprintAdditive; - - SplashState *next; // used by Splash class - - friend class Splash; -}; - -#endif diff --git a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1Font.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1Font.cc deleted file mode 100644 index 0fdfaaf5150..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1Font.cc +++ /dev/null @@ -1,309 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1Font.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1Font.h deleted file mode 100644 index 1dbe66cd7fc..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1Font.h +++ /dev/null @@ -1,69 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontEngine.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontEngine.cc deleted file mode 100644 index fb4b38dae88..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontEngine.cc +++ /dev/null @@ -1,138 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontEngine.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontEngine.h deleted file mode 100644 index 268a01479b0..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontEngine.h +++ /dev/null @@ -1,50 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontFile.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontFile.cc deleted file mode 100644 index 1832a916d9a..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontFile.cc +++ /dev/null @@ -1,134 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontFile.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontFile.h deleted file mode 100644 index c094b6d8b29..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashT1FontFile.h +++ /dev/null @@ -1,70 +0,0 @@ -//======================================================================== -// -// 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashTypes.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashTypes.h deleted file mode 100644 index 5ea816007f8..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashTypes.h +++ /dev/null @@ -1,199 +0,0 @@ -//======================================================================== -// -// 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-2013 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 - -#ifndef SPOT_NCOMPS -#define SPOT_NCOMPS 4 -#endif - -//------------------------------------------------------------------------ -// 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... - splashModeDeviceN8 // 1 byte per component, - // 4 bytes + n bytes spot colors per pixel: - // CMYKSSSSCMYKSSSS... -#endif -}; - -enum SplashThinLineMode { - splashThinLineDefault, // if SA on: draw solid if requested line width, transformed into - // device space, is less than half a pixel and a shaped line else - splashThinLineSolid, // draw line solid at least with 1 pixel - splashThinLineShape // draw line shaped at least with 1 pixel -}; -// number of components in each color mode -// (defined in SplashState.cc) -extern int splashColorModeNComps[]; - -// max number of components in any SplashColor -#if SPLASH_CMYK -#define splashMaxColorComps SPOT_NCOMPS+4 -#else -#define splashMaxColorComps 4 -#endif - -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]; } - -// DEVICEN8 -static inline Guchar splashDeviceN8C(SplashColorPtr deviceN8) { return deviceN8[0]; } -static inline Guchar splashDeviceN8M(SplashColorPtr deviceN8) { return deviceN8[1]; } -static inline Guchar splashDeviceN8Y(SplashColorPtr deviceN8) { return deviceN8[2]; } -static inline Guchar splashDeviceN8K(SplashColorPtr deviceN8) { return deviceN8[3]; } -static inline Guchar splashDeviceN8S(SplashColorPtr deviceN8, int nSpot) { return deviceN8[4 + nSpot]; } -#endif - -static inline void splashClearColor(SplashColorPtr dest) { - dest[0] = 0; - dest[1] = 0; - dest[2] = 0; -#if SPLASH_CMYK - dest[3] = 0; - for (int i = SPOT_NCOMPS; i < SPOT_NCOMPS + 4; i++) - dest[i] = 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]; - for (int i = SPOT_NCOMPS; i < SPOT_NCOMPS + 4; i++) - dest[i] = src[i]; -#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]; - for (int i = SPOT_NCOMPS; i < SPOT_NCOMPS + 4; i++) - dest[i] ^= src[i]; -#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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPath.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPath.cc deleted file mode 100644 index 27106ee3d14..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPath.cc +++ /dev/null @@ -1,472 +0,0 @@ -//======================================================================== -// -// 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> -// Copyright (C) 2013 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 <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, - GBool adjustLines, int linePosI) { - 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) { - if (adjustLines) { - // the adjustment moves thin lines (clip rectangle with - // empty width or height) out of clip area, here we need - // a special adjustment: - x0 = linePosI; - x1 = x0 + 1; - } else { - 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPath.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPath.h deleted file mode 100644 index 1c7040daa23..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPath.h +++ /dev/null @@ -1,107 +0,0 @@ -//======================================================================== -// -// SplashXPath.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) 2013 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 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, - GBool adjustLines = gFalse, int linePosI = 0); - - // 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPathScanner.cc b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPathScanner.cc deleted file mode 100644 index ac47881cb4f..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPathScanner.cc +++ /dev/null @@ -1,544 +0,0 @@ -//======================================================================== -// -// 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, 2014 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2010 PaweÅ‚ Wiejacha <pawel.wiejacha@gmail.com> -// Copyright (C) 2013, 2014 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 <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) { - if (!addIntersection(segYMin, segYMax, seg->flags, - y, splashFloor(seg->x0), splashFloor(seg->x1))) - break; - } - } 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) { - if (!addIntersection(segYMin, segYMax, seg->flags, y, x, x)) - break; - } - } 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; - } - if (!addIntersection(segYMin, segYMax, seg->flags, y, - splashFloor(xx0), splashFloor(xx1))) - break; - } - } - } - 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; -} - -GBool SplashXPathScanner::addIntersection(double segYMin, double segYMax, - Guint segFlags, - int y, int x0, int x1) { - if (allInterLen == allInterSize) { - unsigned int newInterSize = ((unsigned int) allInterSize * 2 > INT_MAX / sizeof(SplashIntersect)) ? allInterSize + 32768 : allInterSize * 2; - if (newInterSize >= INT_MAX / sizeof(SplashIntersect)) { - error(errInternal, -1, "Bogus memory allocation size in SplashXPathScanner::addIntersection {0:d}", newInterSize); - return gFalse; - } - allInterSize = newInterSize; - allInter = (SplashIntersect *)greallocn(allInter, newInterSize, - 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; - return gTrue; -} - -void SplashXPathScanner::renderAALine(SplashBitmap *aaBuf, - int *x0, int *x1, int y, GBool adjustVertLine) { - 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 = adjustVertLine ? 0xff : 0xff >> (xx & 7); - if (!adjustVertLine && (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 |= adjustVertLine ? 0xff : (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 && xx >= 0) { - 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/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPathScanner.h b/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPathScanner.h deleted file mode 100644 index cc295cb68fe..00000000000 --- a/Build/source/libs/poppler/poppler-0.35.0/splash/SplashXPathScanner.h +++ /dev/null @@ -1,108 +0,0 @@ -//======================================================================== -// -// SplashXPathScanner.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) 2013, 2014 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 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, - GBool adjustVertLine = gFalse); - - // 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(); - GBool 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/Build/source/libs/poppler/poppler-0.36.0-PATCHES/ChangeLog b/Build/source/libs/poppler/poppler-0.36.0-PATCHES/ChangeLog new file mode 100644 index 00000000000..8f51405dd95 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0-PATCHES/ChangeLog @@ -0,0 +1,289 @@ +2015-09-10 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.36.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX, patch-03-Object-functions: Adapted. + +2015-09-01 Peter Breitenlohner <peb@mppmu.mpg.de> + + * patch-03-Object-functions (new): Declare parameter of Object + member functions initCmd, isStream, and streamIs as const. + +2015-08-10 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.35.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2015-07-09 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.34.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2015-06-12 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.33.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2015-03-08 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.32.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2015-02-06 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.31.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2015-01-07 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.30.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2014-12-05 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.29.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2014-11-04 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.28.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + * patch-10-UTF-16BE (removed): Included upstream. + +2014-10-08 Peter Breitenlohner <peb@mppmu.mpg.de> + + * patch-10-UTF-16BE (new): Backport from poppler git + (submitted by Luigi Scarso <luigi.scarso@gmail.com>). + +2014-09-29 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.26.5 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2014-08-22 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.26.4 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2014-07-21 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.26.3 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2014-06-20 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.26.2 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2014-05-24 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.26.1 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2014-05-19 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.26.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + + * patch-03-NOMINMAX (removed): Now included upstream. + +2014-03-27 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.25.2 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + + * patch-03-NOMINMAX (new): Avoid to redefine NOMINMAX. + +2014-01-03 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.25.1 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2013-12-12 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.25.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2013-12-02 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.24.4 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2013-10-28 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.24.3 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2013-09-30 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.24.2 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2013-09-10 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.24.1 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2013-07-30 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.24.0 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2013-07-19 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.23.4 source tree from: + http://poppler.freedesktop.org/ + + * patch-02-LLONG_MAX: Adapted. + +2013-07-02 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.23.3 source tree from: + http://poppler.freedesktop.org/ + + * patch-01-MINGW_PRINTF_FORMAT (removed): Now included upstream. + * patch-02-LLONG_MAX: Adapted. + +2013-06-18 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.23.2 source tree from: + http://poppler.freedesktop.org/ + + * patch-01-disable-jpeg (removed): Now included upstream. + * patch-02-warnings (removed): Obsoleted by gcc-4.6. + + * patch-01-MINGW_PRINTF_FORMAT (new): MinGW32 may not define + __MINGW_PRINTF_FORMAT (and __USE_MINGW_ANSI_STDIO could be 0). + * patch-02-LLONG_MAX (new): If necessary define LLONG_MAX etc. + +2013-03-12 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.22.2 source tree from: + http://poppler.freedesktop.org/ + * patch-02-warnings: Adapted. + + * patch-01-disable-jpeg (new): We build without libjpeg. + +2012-12-31 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.22.0 source tree from: + http://poppler.freedesktop.org/ + * patch-02-warnings: Adapted. + +2012-10-15 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.21.0 source tree from: + http://poppler.freedesktop.org/ + * patch-02-warnings: Adapted. + +2012-07-11 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.20.2 source tree from: + http://poppler.freedesktop.org/ + * patch-02-warnings: Adapted. + +2012-05-11 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.20.0 source tree from: + http://poppler.freedesktop.org/ + * patch-01-missing-param (removed): Obsolete. + * patch-02-warnings: Adapted. + +2012-05-09 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.19.4 source tree from: + http://poppler.freedesktop.org/ + * patch-03-POPPLER_VERSION (removed): Obsolete. + * patch-01-missing-param (new): Bug fix, missing new func param. + * patch-02-warnings: Adapted. + +2012-02-23 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.18.4 source tree from: + http://poppler.freedesktop.org/ + * patch-01-PDF_PARSER_ONLY (removed): Obsolete. + * patch-0[23]-*: Adapted. + +2011-10-18 Peter Breitenlohner <peb@mppmu.mpg.de> + + * patch-04-mingw (removed): Instead add `-lgdi32'. + +2011-10-11 Peter Breitenlohner <peb@mppmu.mpg.de> + + * patch-04-mingw (new): Split off ... + * patch-01-PDF_PARSER_ONLY: ... from here. + +2011-10-10 Peter Breitenlohner <peb@mppmu.mpg.de> + + * patch-03-POPPLER_VERSION: Reorg definition of POPPLER_VERSION. + +2011-10-08 Peter Breitenlohner <peb@mppmu.mpg.de> + + Imported poppler-0.18.0 source tree from: + http://poppler.freedesktop.org/ + * patch-0[123]-*: Adapted. + +2011-04-14 Peter Breitenlohner <peb@mppmu.mpg.de> + + * patch-01-PDF_PARSER_ONLY: Fix PDF_PARSER_ONLY for MinGW. + + * patch-03-POPPLER_VERSION (new): #define POPPLER_VERSION. + +2011-04-12 Peter Breitenlohner <peb@mppmu.mpg.de> + + * patch-02-warnings (new): + poppler/Movie.cc: Cast -1 to Gulong. + goo/PNGWriter.h: Add newline at end of file. + +2011-04-12 Taco Hoekwater <taco@luatex.org> + + Imported poppler-0.12.4 source tree from: + http://poppler.freedesktop.org/ + + * patch-01-PDF_PARSER_ONLY (new): Implement PDF_PARSER_ONLY. + diff --git a/Build/source/libs/poppler/poppler-0.36.0-PATCHES/TL-Changes b/Build/source/libs/poppler/poppler-0.36.0-PATCHES/TL-Changes new file mode 100644 index 00000000000..3882f0cbff3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0-PATCHES/TL-Changes @@ -0,0 +1,30 @@ +Changes applied to the poppler-0.36.0 tree as obtained from: + http://poppler.freedesktop.org/ + +Removed: + Makefile.in + aclocal.m4 + compile + config.guess + config.sub + configure + depcomp + install-sh + ltmain.sh + missing + test-driver + fofi/Makefile.in + goo/Makefile.in + poppler/Makefile.in + splash/Makefile.in + +Removed unused dirs: + cmake + cpp + glib + m4 + qt4 + qt5 + test + utils + diff --git a/Build/source/libs/poppler/poppler-0.36.0-PATCHES/patch-02-LLONG_MAX b/Build/source/libs/poppler/poppler-0.36.0-PATCHES/patch-02-LLONG_MAX new file mode 100644 index 00000000000..f0dee49b3a7 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0-PATCHES/patch-02-LLONG_MAX @@ -0,0 +1,25 @@ +diff -ur poppler-0.36.0.orig/goo/GooString.h poppler-0.36.0/goo/GooString.h +--- poppler-0.36.0.orig/goo/GooString.h 2015-07-12 17:05:10.000000000 +0200 ++++ poppler-0.36.0/goo/GooString.h 2015-08-10 09:38:59.000000000 +0200 +@@ -35,6 +35,21 @@ + #endif + + #include <limits.h> // for LLONG_MAX and ULLONG_MAX ++ ++/* <limits.h> and/or the compiler may or may not define these. */ ++/* Minimum and maximum values a `signed long long int' can hold. */ ++#ifndef LLONG_MAX ++# define LLONG_MAX 9223372036854775807LL ++#endif ++#ifndef LLONG_MIN ++# define LLONG_MIN (-LLONG_MAX - 1LL) ++#endif ++ ++/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */ ++#ifndef ULLONG_MAX ++# define ULLONG_MAX 18446744073709551615ULL ++#endif ++ + #include <stdarg.h> + #include <stdlib.h> // for NULL + #include "gtypes.h" diff --git a/Build/source/libs/poppler/poppler-0.36.0-PATCHES/patch-03-Object-functions b/Build/source/libs/poppler/poppler-0.36.0-PATCHES/patch-03-Object-functions new file mode 100644 index 00000000000..4eeab4f4dd3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0-PATCHES/patch-03-Object-functions @@ -0,0 +1,43 @@ +diff -ur poppler-0.36.0.orig/poppler/Object.h poppler-0.36.0/poppler/Object.h +--- poppler-0.36.0.orig/poppler/Object.h 2015-08-17 19:47:55.000000000 +0200 ++++ poppler-0.36.0/poppler/Object.h 2015-09-10 08:15:10.000000000 +0200 +@@ -140,7 +140,7 @@ + Object *initStream(Stream *streamA); + Object *initRef(int numA, int genA) + { initObj(objRef); ref.num = numA; ref.gen = genA; return this; } +- Object *initCmd(char *cmdA) ++ Object *initCmd(const char *cmdA) + { initObj(objCmd); cmd = copyString(cmdA); return this; } + Object *initError() + { initObj(objError); return this; } +@@ -186,7 +186,7 @@ + GBool isName(const char *nameA) + { return type == objName && !strcmp(name, nameA); } + GBool isDict(const char *dictType); +- GBool isStream(char *dictType); ++ GBool isStream(const char *dictType); + GBool isCmd(const char *cmdA) + { return type == objCmd && !strcmp(cmd, cmdA); } + +@@ -233,7 +233,7 @@ + Object *dictGetValNF(int i, Object *obj); + + // Stream accessors. +- GBool streamIs(char *dictType); ++ GBool streamIs(const char *dictType); + void streamReset(); + void streamClose(); + int streamGetChar(); +@@ -337,10 +337,10 @@ + + #include "Stream.h" + +-inline GBool Object::streamIs(char *dictType) ++inline GBool Object::streamIs(const char *dictType) + { OBJECT_TYPE_CHECK(objStream); return stream->getDict()->is(dictType); } + +-inline GBool Object::isStream(char *dictType) ++inline GBool Object::isStream(const char *dictType) + { return type == objStream && streamIs(dictType); } + + inline void Object::streamReset() diff --git a/Build/source/libs/poppler/poppler-0.36.0/AUTHORS b/Build/source/libs/poppler/poppler-0.36.0/AUTHORS new file mode 100644 index 00000000000..a785e403211 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/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/Build/source/libs/poppler/poppler-0.36.0/CMakeLists.txt b/Build/source/libs/poppler/poppler-0.36.0/CMakeLists.txt new file mode 100644 index 00000000000..ac3d090c28a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/CMakeLists.txt @@ -0,0 +1,742 @@ +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) +include(CheckFileOffsetBits) +CHECK_FILE_OFFSET_BITS() + +find_package (ECM 1.6.0 QUIET NO_MODULE) +if (ECM_FOUND) + include("${ECM_MODULE_DIR}/ECMEnableSanitizers.cmake") +endif() + +set(POPPLER_MAJOR_VERSION "0") +set(POPPLER_MINOR_VERSION "36") +set(POPPLER_MICRO_VERSION "0") +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_QT5_TESTS "Whether compile the Qt5 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) +set(ENABLE_LIBOPENJPEG "auto" CACHE STRING "Use libopenjpeg for JPX streams. Possible values: auto, openjpeg1, openjpeg2. 'auto' prefers openjpeg1 over openjpeg2 if both are available. Unset to not use openjpeg.") +set(ENABLE_CMS "auto" CACHE STRING "Use color management system. Possible values: auto, lcms1, lcms2. 'auto' prefers lcms2 over lcms1 if both are available. Unset to disable color management system.") +option(ENABLE_LIBCURL "Build libcurl based HTTP support." OFF) +option(ENABLE_ZLIB "Build with zlib (not totally safe)." OFF) +option(SPLASH_CMYK "Include support for CMYK rasterization." 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(SHARE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share" CACHE STRING "Share directory name") + +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.7.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) +if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_GREATER 2.8.7) + find_package(Qt5Core) + find_package(Qt5Gui) + find_package(Qt5Xml) + find_package(Qt5Widgets) + find_package(Qt5Test) + if (Qt5Core_FOUND AND Qt5Gui_FOUND AND Qt5Xml_FOUND AND Qt5Widgets_FOUND AND Qt5Test_FOUND) + set(QT5_FOUND true) + else () + message("-- Package Qt5Core or Qt5Gui or Qt5Xml or Qt5Widgets or Qt5Test not found") + set(QT5_FOUND false) + endif() +else(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_GREATER 2.8.7) + set(QT5_FOUND false) + message("-- CMake >= 2.8.8 is needed to enable Qt5") +endif(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION} VERSION_GREATER 2.8.7) + +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) +set(USE_OPENJPEG1 FALSE) +set(USE_OPENJPEG2 FALSE) +set(WITH_OPENJPEG FALSE) +if(ENABLE_LIBOPENJPEG STREQUAL "auto") + find_package(LIBOPENJPEG) + set(USE_OPENJPEG1 ${LIBOPENJPEG_FOUND}) + set(WITH_OPENJPEG ${LIBOPENJPEG_FOUND}) + if(NOT LIBOPENJPEG_FOUND) + find_package(LIBOPENJPEG2) + set(USE_OPENJPEG2 ${LIBOPENJPEG2_FOUND}) + set(WITH_OPENJPEG ${LIBOPENJPEG2_FOUND}) + endif() +elseif(ENABLE_LIBOPENJPEG STREQUAL "openjpeg1") + find_package(LIBOPENJPEG) + set(USE_OPENJPEG1 ${LIBOPENJPEG_FOUND}) + set(WITH_OPENJPEG ${LIBOPENJPEG_FOUND}) +elseif(ENABLE_LIBOPENJPEG STREQUAL "openjpeg2") + find_package(LIBOPENJPEG2) + set(USE_OPENJPEG2 ${LIBOPENJPEG2_FOUND}) + set(WITH_OPENJPEG ${LIBOPENJPEG2_FOUND}) +endif() +set(ENABLE_LIBOPENJPEG "${WITH_OPENJPEG}") +if(ENABLE_CMS STREQUAL "auto") + find_package(LCMS2) + set(USE_CMS ${LCMS2_FOUND}) + if(NOT LCMS2_FOUND) + find_package(LCMS) + set(USE_CMS ${LCMS_FOUND}) + set(USE_LCMS1 ${LCMS_FOUND}) + endif(NOT LCMS2_FOUND) +elseif(ENABLE_CMS STREQUAL "lcms1") + find_package(LCMS) + set(USE_CMS ${LCMS_FOUND}) + set(USE_LCMS1 ${LCMS_FOUND}) +elseif(ENABLE_CMS STREQUAL "lcms2") + find_package(LCMS2) + set(USE_CMS ${LCMS2_FOUND}) +endif() +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(MINGW) + # Use mingw's ansi stdio extensions + add_definitions(-D__USE_MINGW_ANSI_STDIO=1) +endif(MINGW) +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(LIBOPENJPEG2_FOUND) + include_directories(${LIBOPENJPEG2_INCLUDE_DIRS}) +endif() +if(LCMS_FOUND) + include_directories(${LCMS_INCLUDE_DIR}) +endif(LCMS_FOUND) +if(LCMS2_FOUND) + include_directories(${LCMS2_INCLUDE_DIR}) +endif(LCMS2_FOUND) + +# Recent versions of poppler-data install a .pc file. +# Use it to determine the encoding data path, if available. +# Default to the same prefix otherwise. +pkg_check_modules(POPPLER_DATA poppler-data) +if(POPPLER_DATA_FOUND) + execute_process(COMMAND "${PKG_CONFIG_EXECUTABLE}" --variable=poppler_datadir poppler-data + RESULT_VARIABLE _result_var + OUTPUT_VARIABLE _output_var OUTPUT_STRIP_TRAILING_WHITESPACE) + if(_result_var STREQUAL "0" AND NOT _output_var STREQUAL "") + set(POPPLER_DATADIR "${_output_var}") + endif(_result_var STREQUAL "0" AND NOT _output_var STREQUAL "") +endif(POPPLER_DATA_FOUND) +if(NOT DEFINED POPPLER_DATADIR) + set(POPPLER_DATADIR "${CMAKE_INSTALL_PREFIX}/share/poppler") +endif(NOT DEFINED POPPLER_DATADIR) + +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_C_FLAGS "-Wall ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_YES} ${CMAKE_CXX_FLAGS}") +endif(_comp_warnings STREQUAL "yes") +if(_comp_warnings STREQUAL "kde") + set(CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS}") + 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/NetPBMWriter.cc + goo/PNGWriter.cc + goo/TiffWriter.cc + goo/JpegWriter.cc + goo/ImgWriter.cc + goo/gstrtod.cc + goo/grandom.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/MarkedContentOutputDev.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/StructTreeRoot.cc + poppler/StructElement.cc + poppler/strtok_r.cpp + poppler/UnicodeMap.cc + poppler/UnicodeTypeTable.cc + poppler/UTF.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}) + add_definitions(-DUSE_OPENJPEG1) +elseif (LIBOPENJPEG2_FOUND) + set(poppler_SRCS ${poppler_SRCS} + poppler/JPEG2000Stream.cc + ) + add_definitions(-DUSE_OPENJPEG2) +MESSAGE(${LIBOPENJPEG2_LIBRARIES}) + set(poppler_LIBS ${poppler_LIBS} ${LIBOPENJPEG2_LIBRARIES}) +else () + set(poppler_SRCS ${poppler_SRCS} + poppler/JPXStream.cc + ) +endif() +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(HAVE_PTHREAD) + set(poppler_LIBS ${poppler_LIBS} ${CMAKE_THREAD_LIBS_INIT}) +endif() + +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 55.0.0 SOVERSION 55) +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/MarkedContentOutputDev.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/StructElement.h + poppler/StructTreeRoot.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/UTF.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 + goo/grandom.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) + if(JPEG_FOUND) + install(FILES + goo/JpegWriter.h + DESTINATION include/poppler/goo) + endif(JPEG_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) + elseif(LIBOPENJPEG2_FOUND) + install(FILES + poppler/JPEG2000Stream.h + DESTINATION include/poppler) + else() + install(FILES + poppler/JPXStream.h + DESTINATION include/poppler) + endif() + 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(QT5_FOUND) + add_subdirectory(qt5) +endif(QT5_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(QT5_FOUND) + poppler_create_install_pkgconfig(poppler-qt5.pc lib${LIB_SUFFIX}/pkgconfig) +endif(QT5_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) +if(SPLASH_CMYK) + message(" with CMYK support") +endif() +show_end_message_yesno("cairo output" CAIRO_FOUND) +show_end_message_yesno("qt4 wrapper" QT4_FOUND) +show_end_message_yesno("qt5 wrapper" QT5_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" WITH_OPENJPEG) +if(USE_OPENJPEG1) + message(" with openjpeg1") +endif() +if(USE_OPENJPEG2) + message(" with openjpeg2") +endif() +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/Build/source/libs/poppler/poppler-0.36.0/COPYING b/Build/source/libs/poppler/poppler-0.36.0/COPYING new file mode 100644 index 00000000000..d511905c164 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/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/Build/source/libs/poppler/poppler-0.36.0/ChangeLog b/Build/source/libs/poppler/poppler-0.36.0/ChangeLog new file mode 100644 index 00000000000..c74b0fda591 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/ChangeLog @@ -0,0 +1,58499 @@ +commit d490c21fe4a60cff26f34c619d3078dcb575bf44 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 9 23:55:57 2015 +0200 + + Update (C) + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fc69a5e7dab48636946282e5d4b7be77e650023c +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 8 17:48:49 2015 +0200 + + Qt5: Minor optimizations + + Call reserve on containers + Use QStringLiteral/QLatin1String + + qt5/src/poppler-annotation.cc | 612 + +++++++++++++++++++++--------------------- + qt5/src/poppler-document.cc | 3 +- + qt5/src/poppler-fontinfo.cc | 3 +- + qt5/src/poppler-form.cc | 3 +- + qt5/src/poppler-optcontent.cc | 2 + + qt5/src/poppler-page.cc | 1 + + qt5/src/poppler-private.cc | 18 +- + 7 files changed, 325 insertions(+), 317 deletions(-) + +commit 9b4e908d86e78535cced9fb7ccac1f3f0e1fc5c1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 8 17:48:16 2015 +0200 + + Qt4: Minor optimization + + Call reserve on containers upfront + + qt4/src/poppler-annotation.cc | 4 +++- + qt4/src/poppler-document.cc | 3 ++- + qt4/src/poppler-fontinfo.cc | 3 ++- + qt4/src/poppler-form.cc | 3 ++- + qt4/src/poppler-optcontent.cc | 2 ++ + qt4/src/poppler-page.cc | 1 + + 6 files changed, 12 insertions(+), 4 deletions(-) + +commit f8182694909c989bd65b7317f9df439c5bfabe95 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 8 17:13:07 2015 +0200 + + renderingIntent is always non null + + poppler/GfxState.cc | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +commit 6f69e2e35b8fe7a347367074ce36959d47fd8635 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 8 09:44:30 2015 +0200 + + Matrix is 48 bytes, pass it by ref instead of by value + + poppler/TextOutputDev.cc | 4 ++-- + poppler/TextOutputDev.h | 6 +++--- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit c871ae2cd6fbc8a827dfe2c4d5595d7439a4b54e +Author: Heiko Becker <heirecka@exherbo.org> +Date: Sun May 3 16:06:30 2015 +0200 + + cmake: Allow configuring SHARE_INSTALL_DIR + + This is helpful on a multiarch layout where the prefix is /usr/${host} + but arch-independent files should still be installed to /usr/share. + + Bug 90293 + + CMakeLists.txt | 1 + + cmake/modules/GObjectIntrospectionMacros.cmake | 2 +- + utils/CMakeLists.txt | 22 + +++++++++++----------- + 3 files changed, 13 insertions(+), 12 deletions(-) + +commit 1e1a2d0600153c98d44f65e83a0555ab5288450b +Author: Jason Crain <jason@aquaticape.us> +Date: Sun Sep 6 22:33:02 2015 +0200 + + Fix JBIG2Decode infinite loop and stack overflow + + Creating a JBIG2Decode filter can create a stack overflow or infinite + loop. Fix stack overflow by adding 'recursion' argument to fetch + call. Fix infinite loop by removing the reference lookup loop. + Chains of references aren't allowed by the spec anyway. + + Bug #91186 + + poppler/Stream.cc | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +commit 3c91ded21c828d3529f9cd00c417601c67c8a741 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 1 23:46:55 2015 +0200 + + Revert a42614284c94c6742b2343abd797657fffa80e0e + + poppler/PDFDoc.cc | 33 ++++++++++++++------------------- + poppler/PDFDoc.h | 11 +++++------ + qt4/src/poppler-pdf-converter.cc | 14 +------------- + qt4/src/poppler-qt4.h | 4 +--- + qt5/src/poppler-pdf-converter.cc | 14 +------------- + qt5/src/poppler-qt5.h | 4 +--- + utils/pdfunite.cc | 3 +-- + 7 files changed, 24 insertions(+), 59 deletions(-) + +commit 911d9fc8d85b776418039b4eebb37200a0987554 +Author: Jeremy Echols <jechols@uoregon.edu> +Date: Tue Sep 1 00:22:28 2015 +0200 + + pdftotext: Add -bbox-layout option + + Adds layout information for blocks and lines in addition to words + + Bug #89941 + + utils/pdftotext.1 | 4 ++ + utils/pdftotext.cc | 115 + +++++++++++++++++++++++++++++++++++++++++++---------- + 2 files changed, 99 insertions(+), 20 deletions(-) + +commit a42614284c94c6742b2343abd797657fffa80e0e +Author: Adam Reichold <adam.reichold@t-online.de> +Date: Tue Sep 1 00:15:46 2015 +0200 + + Add option to strip encryption + + Adds a PDF write mode that forces a complete rewrite that ignores + the original + encryption parameters of the document and also removes the encryption + entry + from the trailer dictionary. + + poppler/PDFDoc.cc | 33 +++++++++++++++++++-------------- + poppler/PDFDoc.h | 11 ++++++----- + qt4/src/poppler-pdf-converter.cc | 14 +++++++++++++- + qt4/src/poppler-qt4.h | 4 +++- + qt5/src/poppler-pdf-converter.cc | 14 +++++++++++++- + qt5/src/poppler-qt5.h | 4 +++- + utils/pdfunite.cc | 3 ++- + 7 files changed, 59 insertions(+), 24 deletions(-) + +commit 72c0162258f2630a3bb11b9c1078ec1ec2812788 +Author: Jason Crain <jason@aquaticape.us> +Date: Tue Aug 18 01:34:10 2015 -0500 + + cairo: fix size of transparency group surface + + Under rotation cairo_surface_create_similar_clip will create a surface + with incorect width/height. Rely on cairo to do the correct + calculation. + + Bug #66229 + + poppler/CairoOutputDev.cc | 30 ++++++++---------------------- + 1 file changed, 8 insertions(+), 22 deletions(-) + +commit 06f942657ee0798d7bdc5bd180150ea0464833a5 +Author: Arthur Stavisky <vovodroid@gmail.com> +Date: Sat Aug 29 15:50:45 2015 +0200 + + Fix for xref table creation + + Bug #90790 + + utils/pdfunite.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6ccdd381b483f50f37005fd9b13f79d2f38273ff +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 29 12:18:44 2015 +0200 + + typo fix, "existant" -> "existent" + + NEWS | 2 +- + poppler/Form.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 9d79f06192d176298b4c911a6702ad1cfe099112 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Aug 27 23:10:05 2015 +0200 + + Do not hardcode -fPIC in Makefile.am + + The flag -fPIC is already set on CXXFLAGS by configure. + For the mingw compiler, you should not use fPIC, see d44e7e35. + + https://bugs.freedesktop.org/show_bug.cgi?id=91466 + + qt5/src/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3e19bec738889ee9140379ac3f871552dbb9bf41 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu Aug 27 23:01:21 2015 +0200 + + pdfunite: Insert embedded files in result pdf + + Bug #90066 + + poppler/PDFDoc.cc | 1 - + utils/pdfunite.cc | 156 + +++++++++++++++++++++++++++++++++++++++++++++++++++++- + 2 files changed, 154 insertions(+), 3 deletions(-) + +commit 6e469dbe239714b478488af5ff73046e6a46a908 +Author: Adam Reichold <adam.reichold@t-online.de> +Date: Sun Aug 16 21:05:38 2015 +0200 + + Change default Qt frontend image format + + Change the default image format used by the Qt frontends to XBGR/RGB32 + which allows efficient blending and pixmap conversion via Qt. Also use + the premultiplied conversion for IgnorePaperColor to elide a further + copy for pixmap conversion. + + qt4/src/poppler-page.cc | 46 + +++++++++++++++------------------------------- + qt5/src/poppler-page.cc | 46 + +++++++++++++++------------------------------- + 2 files changed, 30 insertions(+), 62 deletions(-) + +commit 56fc0bb2f20adfd89835f3132bfef3033fdcd80d +Author: Adam Reichold <adam.reichold@t-online.de> +Date: Sun Aug 16 21:01:52 2015 +0200 + + Add premultiplied alpha channel to SplashBitmap + + This extends the convertToXBGR method so that it can either + * leave the alpha channel of the bitmap data opaque, + * copy the alpha channel into the bitmap data, + * transfer the alpha channel into the bitmap data and + perform premultiplication on the bitmap data. + + qt4/src/poppler-page.cc | 6 +++++- + qt5/src/poppler-page.cc | 6 +++++- + splash/SplashBitmap.cc | 49 + ++++++++++++++++++++++++++++++++++++++----------- + splash/SplashBitmap.h | 11 +++++++++-- + 4 files changed, 57 insertions(+), 15 deletions(-) + +commit e5511b58e732f921c65e366fb4d221371b95d905 +Author: Hans-Peter Deifel <hpdeifel@gmx.de> +Date: Thu Aug 27 22:38:08 2015 +0200 + + cpp: Fix utf8/utf16 conversion + + The old code assumed that ustring::size() would return the number of + bytes in ustring, but it really returns the number of + characters. Since + ustring is a basic_string<unsigned short>, these two values differ + (by a + factor of two). + + This needs to be considered when using iconv, since it operates + on byte + counts, not character counts. + + Bug #91644 + + cpp/poppler-global.cpp | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +commit d06c27584ecf4b7ff2fe492f0133722ac461dfd6 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu Aug 27 22:16:03 2015 +0200 + + File Saving improvements + + Refinement of the /P annotation test + + Fixes file from comment #8 in bug #87637 + + poppler/PDFDoc.cc | 21 +++++++++++++++++++-- + 1 file changed, 19 insertions(+), 2 deletions(-) + +commit 545a8f7cb0a473706858d2851f968ffadcc78ed0 +Author: Jason Crain <jason@aquaticape.us> +Date: Mon Aug 24 01:12:01 2015 +0200 + + Fix bounds check in Linearization::getPageFirst + + Make sure Linearization::pageFirst is in the interval [0, + getNumPages), + otherwise Hints::getPageObjectNum() can have an out of bounds read. + + Bug #91200 + + poppler/Linearization.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3e61c7523416157acadec7fe59429f880a9d0310 +Author: William Bader <williambader@hotmail.com> +Date: Wed Aug 19 23:01:41 2015 +0200 + + Splash: Fix wrong memory access + + Bug #91686 + + splash/Splash.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 431cd5afe7dc931f21f7eadd3e69406612d09a0c +Author: Jakub Wilk <jwilk@jwilk.net> +Date: Mon Aug 17 19:49:51 2015 +0200 + + Update Jakub Wilk's email + + fofi/FoFiType1.cc | 2 +- + poppler/CharCodeToUnicode.cc | 2 +- + poppler/GlobalParams.cc | 2 +- + poppler/Object.h | 2 +- + poppler/PDFDoc.cc | 2 +- + poppler/UnicodeMap.cc | 2 +- + 6 files changed, 6 insertions(+), 6 deletions(-) + +commit 1745d2166dd7680d72fe4a71c1fc7a0a5379dcca +Author: Tobias Koenig <tokoe@kdab.com> +Date: Fri Aug 14 00:10:53 2015 +0200 + + Add basic support for RichMedia annotations to Qt frontends + + Bug #91548 + + qt4/src/poppler-annotation.cc | 615 + ++++++++++++++++++++++++++++++++++++++++- + qt4/src/poppler-annotation.h | 330 +++++++++++++++++++++- + qt5/src/poppler-annotation.cc | 616 + +++++++++++++++++++++++++++++++++++++++++- + qt5/src/poppler-annotation.h | 331 ++++++++++++++++++++++- + 4 files changed, 1888 insertions(+), 4 deletions(-) + +commit da5760675d75acf1883ac6f757f755222248762f +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 14 00:04:15 2015 +0200 + + add (C) + + poppler/Annot.cc | 2 +- + poppler/Annot.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit bc01007d714a58fd0023594b055e0cd5fbad1f7e +Author: Tobias Koenig <tokoe@kdab.com> +Date: Thu Aug 13 23:57:44 2015 +0200 + + Patch to support RichMedia annotations in poppler core + + poppler/Annot.cc | 404 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 172 ++++++++++++++++++++++- + 2 files changed, 575 insertions(+), 1 deletion(-) + +commit 1213501882cf2ec6e3dcb3c078391040c8cb0a57 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 9 18:27:06 2015 +0200 + + 0.35.0 + + CMakeLists.txt | 4 ++-- + NEWS | 29 +++++++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 2 +- + qt5/src/CMakeLists.txt | 2 +- + qt5/src/Doxyfile | 2 +- + qt5/src/Makefile.am | 2 +- + 11 files changed, 40 insertions(+), 11 deletions(-) + +commit a7b1151ce7a14d359d85bacfe02352cdeb8d9a8f +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jul 26 10:38:37 2015 +0200 + + glib-demo: Prefer gtk_label_set_{x,y}align() over deprecated + gtk_misc_set_alignment() + + https://bugs.freedesktop.org/show_bug.cgi?id=88788 + + glib/demo/main.c | 16 ++++++++++++---- + 1 file changed, 12 insertions(+), 4 deletions(-) + +commit e6e7d1492b518d57136031a94069a994182693cc +Author: Hib Eris <hib@hiberis.nl> +Date: Sun May 31 12:32:36 2015 +0200 + + pdftocairo: Fix cast to pointer from integer of different size + on win64 + + Fixes warning: + + [ 322s] CXX pdftocairo-pdftocairo-win32.o + [ 324s] In file included from + /usr/x86_64-w64-mingw32/sys-root/mingw/include/windows.h:72:0, + [ 324s] from + /usr/x86_64-w64-mingw32/sys-root/mingw/include/cairo/cairo-win32.h:44, + [ 324s] from pdftocairo-win32.cc:16: + [ 324s] pdftocairo-win32.cc: In function 'HWND__* + createGroupBox(HWND, HINSTANCE, int, const char*, RECT*)': + [ 324s] pdftocairo-win32.cc:170:23: warning: cast to pointer from + integer of different size [-Wint-to-pointer-cast] + [ 324s] parent, (HMENU)id, + [ 324s] ^ + [ 324s] pdftocairo-win32.cc: In function 'HWND__* + createCheckBox(HWND, HINSTANCE, int, const char*, RECT*)': + [ 324s] pdftocairo-win32.cc:186:23: warning: cast to pointer from + integer of different size [-Wint-to-pointer-cast] + [ 324s] parent, (HMENU)id, + [ 324s] ^ + [ 324s] pdftocairo-win32.cc: In function 'HWND__* + createStaticText(HWND, HINSTANCE, int, const char*, RECT*)': + [ 324s] pdftocairo-win32.cc:202:23: warning: cast to pointer from + integer of different size [-Wint-to-pointer-cast] + [ 324s] parent, (HMENU)id, + [ 324s] ^ + [ 324s] pdftocairo-win32.cc: In function 'HWND__* + createPageScaleComboBox(HWND, HINSTANCE, int, RECT*)': + [ 324s] pdftocairo-win32.cc:219:23: warning: cast to pointer from + integer of different size [-Wint-to-pointer-cast] + [ 324s] parent, (HMENU)id, + [ 324s] ^ + + https://bugs.freedesktop.org/show_bug.cgi?id=91465 + + utils/pdftocairo-win32.cc | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +commit f3a0191abbf67c8b0f83739e1844a2fabe4138a4 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Jul 23 21:44:57 2015 +0200 + + Explicitly link poppler-glib against pthread + + Debian complains about missing symbols: + + dpkg-shlibdeps: warning: symbol pthread_mutexattr_destroy used by + debian/libpoppler-glib8/usr/lib/i386-linux-gnu/libpoppler-glib.so.8.6.0 + found in none of the libraries + dpkg-shlibdeps: warning: symbol pthread_mutexattr_init used by + debian/libpoppler-glib8/usr/lib/i386-linux-gnu/libpoppler-glib.so.8.6.0 + found in none of the libraries + dpkg-shlibdeps: warning: symbol pthread_mutexattr_settype used by + debian/libpoppler-glib8/usr/lib/i386-linux-gnu/libpoppler-glib.so.8.6.0 + found in none of the libraries + + https://bugs.freedesktop.org/show_bug.cgi?id=91450 + + glib/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit fb264bfa8bf7142cabc8d94a86594cf0e7c9f134 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Jul 24 22:18:26 2015 +0200 + + glib-demo: Remove code for no longer supported gtk versions + + https://bugs.freedesktop.org/show_bug.cgi?id=88788 + + glib/demo/annots.c | 8 -------- + glib/demo/selections.c | 16 ---------------- + 2 files changed, 24 deletions(-) + +commit dd0883649ac296c6033474fe5991c534ac2ce594 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Jul 24 22:09:57 2015 +0200 + + glib-demo: Remove use of deprecated + gtk_dialog_set_alternative_button_order() + + https://bugs.freedesktop.org/show_bug.cgi?id=88788 + + glib/demo/main.c | 4 ---- + 1 file changed, 4 deletions(-) + +commit ffc798a7fcf95d2aaf123772072ef956ceb2dff7 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jan 25 18:16:04 2015 +0100 + + glib-demo: Remove deprecated use of gtk_misc_set_alignment() + + https://bugs.freedesktop.org/show_bug.cgi?id=88788 + + glib/demo/main.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 56915b2989fc244b58a454fe40412eb731e706bd +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jan 25 13:10:31 2015 +0100 + + glib-demo: Remove use of deprecated GtkAlignment + + https://bugs.freedesktop.org/show_bug.cgi?id=88788 + + glib/demo/annots.c | 23 +++++++++++--------- + glib/demo/forms.c | 23 +++++++++++--------- + glib/demo/info.cc | 18 +++++++++------ + glib/demo/main.c | 12 +--------- + glib/demo/page.c | 34 ++++++++++++++++++----------- + glib/demo/text.c | 18 +++++++++------ + glib/demo/utils.c | 64 + +++++++++++++++++++++++++++++++----------------------- + 7 files changed, 107 insertions(+), 85 deletions(-) + +commit 49e33e1213a7957d4814656960bf269abcabc7c3 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jan 25 12:21:41 2015 +0100 + + glib-demo: Remove deprecated use of gtk_tree_view_set_rules_hint() + + The use of rules-hint is deprecated in gtk because it is + considered bad application API and is not really usefull. + + See + https://git.gnome.org/browse/gtk+/commit/?id=0ed766ec866a2da7e3db05b1db2fc2519d6b1cdc + + https://bugs.freedesktop.org/show_bug.cgi?id=88788 + + glib/demo/attachments.c | 1 - + glib/demo/find.c | 1 - + glib/demo/fonts.c | 1 - + glib/demo/transitions.c | 1 - + 4 files changed, 4 deletions(-) + +commit 70f3c5ff0010775e5fcd590db1b8d475694fe3a4 +Author: William Bader <williambader@hotmail.com> +Date: Sat Jul 18 16:36:30 2015 +0200 + + Updated patch to add configure --enable-build-type + + Bug #90796 + + configure.ac | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 52 insertions(+) + +commit 1aa2f6e8a41a6a86dc02bf7c5cbc62355e780961 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 17 00:40:56 2015 +0200 + + Silly micro optimization: Move vars inside case {} + + poppler/SplashOutputDev.cc | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit 705615f7569bbadb555bbf45c15c7c01f1690db5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 17 00:38:58 2015 +0200 + + More typo fix + + poppler/Catalog.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3b6b3fefe97b885e42966fece84a123fc4671b20 +Author: William Bader <williambader@hotmail.com> +Date: Fri Jul 17 00:37:46 2015 +0200 + + [Splash] Fix wrong writes on non rgb outputs + + Bug #90570 + + poppler/SplashOutputDev.cc | 52 + +++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 51 insertions(+), 1 deletion(-) + +commit 885b23bfd16a3e4970a52956493e92a160b2d0a8 +Author: Dmytro Morgun <lztoad@gmail.com> +Date: Fri Jul 17 00:30:08 2015 +0200 + + GlobalParamsWin bug/fixes + + Bug #91053 + + poppler/GlobalParamsWin.cc | 57 + ++++++++++++++++++++++++++-------------------- + 1 file changed, 32 insertions(+), 25 deletions(-) + +commit 0ce4da8ab16b4a5497688a6cf86175aaec0f585f +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 15 23:59:11 2015 +0200 + + Make sure pageRootRef is a ref before using it + + Bug #91344 + + poppler/Catalog.cc | 32 ++++++++++++++++++-------------- + 1 file changed, 18 insertions(+), 14 deletions(-) + +commit b71431513b45f8a1aa4154332dae56af241258f8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 15 13:10:27 2015 +0200 + + Typo fix in warning + + poppler/Catalog.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ccd780f9504f5b077ea12370fd5380ff7da5cd23 +Author: Dmytro Morgun <lztoad@gmail.com> +Date: Wed Jul 15 00:26:55 2015 +0200 + + [Windows] remove ifndef + + splash/SplashFontEngine.cc | 9 +-------- + 1 file changed, 1 insertion(+), 8 deletions(-) + +commit 2ed8465074c4fc2c88f745b29bdae92410751327 +Author: William Bader <williambader@hotmail.com> +Date: Wed Jul 15 00:07:48 2015 +0200 + + Allow configuring SPLASH_CMYK support from cmake/configure + + Bug #90795 + + CMakeLists.txt | 4 ++++ + config.h.cmake | 3 +++ + configure.ac | 7 +++++++ + poppler/SplashOutputDev.cc | 4 ++-- + qt4/src/poppler-document.cc | 3 ++- + qt4/src/poppler-page.cc | 4 ++-- + qt5/src/poppler-document.cc | 3 ++- + qt5/src/poppler-page.cc | 4 ++-- + splash/Splash.cc | 2 +- + splash/SplashBitmap.cc | 4 ++-- + 10 files changed, 27 insertions(+), 11 deletions(-) + +commit 334dc56f2f9adf4daa33c20ce034a5b1f8259baf +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 12 23:29:30 2015 +0200 + + [qt] KeepAlphaChannel -> IgnorePaperColor + + qt4/src/poppler-page.cc | 13 ++++++------- + qt4/src/poppler-qt4.h | 4 ++-- + qt5/src/poppler-page.cc | 13 ++++++------- + qt5/src/poppler-qt5.h | 4 ++-- + 4 files changed, 16 insertions(+), 18 deletions(-) + +commit 2a1363a4a3129fe4b5e4fae1018dc8919a2d796a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 12 23:22:32 2015 +0200 + + Update (C) + + splash/SplashBitmap.cc | 1 + + splash/SplashBitmap.h | 1 + + 2 files changed, 2 insertions(+) + +commit e903b2364f55c4f6417d826ab85dcb60cd240563 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 12 23:20:20 2015 +0200 + + [qt] fix spacing in header + + qt4/src/poppler-qt4.h | 4 ++-- + qt5/src/poppler-qt5.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 810c659faea542c3bd6e9c48c9a7c60b886a9269 +Author: Adam Reichold <adam.reichold@t-online.de> +Date: Fri Jul 3 00:31:56 2015 +0200 + + Switch default image format of Qt frontends + + This changes the Poppler::Page::renderToImage method w.r.t. to + the image + formats used to render using Splash, i.e. the default will be RGB8. If + overprint preview is requested, DeviceN8 will be used and converted to + XBGR8 for display. If the internal alpha channel is requested, + XBGR8 will + be used and augmented by Splash's separate alpha channel. + + This yields some improvements w.r.t. to rendering including alpha + blending + with the paper colour, i.e. synthetic benchmarks using structurally + simple + documents yield more than two percent improvement. + + qt4/src/poppler-page.cc | 115 + +++++++++++++++++++++++++++++------------------- + qt5/src/poppler-page.cc | 114 + ++++++++++++++++++++++++++++------------------- + 2 files changed, 138 insertions(+), 91 deletions(-) + +commit 8fea54e48ec9ba35122c565f761e7e7f016a34f9 +Author: Adam Reichold <adam.reichold@t-online.de> +Date: Thu Jul 2 21:08:38 2015 +0200 + + Improve efficiency of Poppler::Page::renderToImage + + Improves the efficiency of rendering into a QImage using + the Splash output device by removing a copy of the raw bitmap data + since Qt5 will properly free this data using a function supplied + during construction, i.e. in this case gfree. + + This improves performance in synthentic rendering benchmarks + by approximately four percent and reduces the maximum working + set size. + + qt5/src/poppler-page.cc | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 09db5a71fff4b7a0ed1d5d7e76c8270e2f6e9a8d +Author: Adam Reichold <adam.reichold@t-online.de> +Date: Thu Jul 2 21:02:59 2015 +0200 + + Add KeepAlphaChannel render flag to Qt frontends + + Adds a new render flag which will indicate that the image return by + Poppler::Page::renderToImage will not be opaque and alpha blended with + the paper colour, but retain its actually background transparency. + + This improves performance in synthentic rendering benchmarks by almost + five percent and the additional alpha blending that is then done + by the + consuming application is often a hardware-accellerated operation. + + qt4/src/poppler-page.cc | 6 ++++-- + qt4/src/poppler-qt4.h | 3 ++- + qt5/src/poppler-page.cc | 6 ++++-- + qt5/src/poppler-qt5.h | 3 ++- + 4 files changed, 12 insertions(+), 6 deletions(-) + +commit d604a075c6b171d5c3fe26c146d3469c4bc0af3f +Author: Adam Reichold <adam.reichold@t-online.de> +Date: Thu Jul 2 21:00:16 2015 +0200 + + Make SplashBitmap XBGR transfer alpha channel + + Adds an option to SplashBitmap::convertToXBGR and + SplashBitmap::getXBGRLine + so that both optionally transfer Splash's internal alpha channel + into the + fourth component of the resulting bitmap data. + + splash/SplashBitmap.cc | 27 ++++++++++++++++++++++----- + splash/SplashBitmap.h | 4 ++-- + 2 files changed, 24 insertions(+), 7 deletions(-) + +commit 17adfc848f99a5c5bfad35c94289ccf03fba1a16 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Sun Jul 12 17:05:24 2015 +0200 + + Adjust memory layout computation of GooString + + GooString uses the small string optimization but the static buffer + size is + hard-coded and hence the final object size becomes dependent on + architecture. + This adds a helper class to compute the memory layout at compile + time so that + the target object size of e.g. 32 or another multiple of 16 is + achieved. + + This also adds an overload so that the C string returned by + GooString's + getCString method respect the constness of this and fixes a constness + issue + in the lexer tests. + + goo/GooString.h | 24 ++++++++++++++++-------- + qt4/tests/check_lexer.cpp | 2 +- + qt5/tests/check_lexer.cpp | 2 +- + 3 files changed, 18 insertions(+), 10 deletions(-) + +commit d1720740f3381f489f1ee83ce1ce53e73aafd537 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 8 23:22:13 2015 +0200 + + Poppler 0.34 + + CMakeLists.txt | 4 ++-- + NEWS | 13 +++++++++++++ + configure.ac | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 19 insertions(+), 6 deletions(-) + +commit 2fc1f540754391ffa87d7fe9f3438e134d821207 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Jul 7 18:48:51 2015 +0200 + + [Splash] Fix crash in PDF with nested softmasks + + Bug #91240 + + poppler/SplashOutputDev.cc | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +commit 0b8919f19dd501c9962bca05c9b0559464e923c3 +Author: Dmytro Morgun <lztoad@gmail.com> +Date: Mon Jul 6 00:28:27 2015 +0200 + + Fix pedantic memory leak + + poppler/StructElement.cc | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 2ef22af960d3d800087209fea047009a8419134c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 5 16:03:57 2015 +0200 + + [cmake] Make sure ENABLE_LIBOPENJPEG is either 0 or 1 + + Otherwise if it was auto it gets translated to 1 for the cmakedefine + boolean + which is wrong when the auto ends up meaning "i din't find it" + + CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit 50455bcf4f1644060b2187d4e60c3798793041cc +Author: Tamas Szekeres <szekerest@gmail.com> +Date: Fri Jul 3 20:24:01 2015 +0200 + + std::max/min need <algorithm> + + Bug #88511 + + cpp/poppler-font.cpp | 3 +++ + cpp/poppler-global.cpp | 3 +++ + poppler/Annot.cc | 2 ++ + poppler/SplashOutputDev.cc | 2 ++ + 4 files changed, 10 insertions(+) + +commit 346fc70dbf2803e23e70b093401aa2cda216492b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 3 20:19:01 2015 +0200 + + Forgot the (C) + + poppler/PSOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit df09c1a84dfe80d2e6cfde3308c79da5b2ea7428 +Author: Marek Kasik <mkasik@redhat.com> +Date: Fri Jul 3 20:14:23 2015 +0200 + + Embed Type1 fonts to PostScript files correctly + + Remove PFB headers from embedded Type1 fonts + before embedding them into a PostScript file. + + Bug #19747 + + poppler/PSOutputDev.cc | 57 + +++++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 50 insertions(+), 7 deletions(-) + +commit 11f117cc71641b89783b207232171f850a2b64ff +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jun 4 10:51:36 2015 +0200 + + regtest: Disable pretty diffs for text files in HTML reports + + difflib is entering in an infinite loop with some files, so disable it + for now. We need to either fix that somehow or find a different way to + generate pretty diffs of text files. + + regtest/HTMLReport.py | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 3db4cb6f07229e26405bfb512c626a272f6351f5 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sun May 24 18:41:30 2015 +0200 + + Splash: Speed up of rendering icc based images + + Bug #90171 + + poppler/SplashOutputDev.cc | 142 + +++++++++++++++++++++++++++++++++++++++++++-- + poppler/SplashOutputDev.h | 8 ++- + splash/Splash.cc | 17 ++++-- + splash/Splash.h | 9 ++- + 4 files changed, 163 insertions(+), 13 deletions(-) + +commit c50720dcc9e15516e0e19072c0df03fbdee63dec +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri May 22 21:44:55 2015 +0930 + + glib: update new symbols section + + glib/reference/poppler-docs.sgml | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit b271a19ec30b20bc11f2240ae6b96672e3cafafb +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 14 21:56:47 2015 +0200 + + Poppler 0.33 + + CMakeLists.txt | 4 ++-- + NEWS | 25 +++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 9 files changed, 34 insertions(+), 9 deletions(-) + +commit 2b2fb719aa5ffe32fbc3fb500444b1643b1c6099 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 14 20:17:12 2015 +0200 + + Add missing (C) + + poppler/Annot.cc | 1 + + poppler/Annot.h | 2 +- + poppler/CairoFontEngine.cc | 1 + + poppler/Page.cc | 3 ++- + 4 files changed, 5 insertions(+), 2 deletions(-) + +commit ae76b75c6a5383eb52f58fba0faba69ae8698ef9 +Author: William Bader <williambader@hotmail.com> +Date: Thu May 14 20:06:22 2015 +0200 + + Fix regression in pdftops parameter passing + + Recent changes to the command line processing moved some options + from GlobalParams to PSOutputDev. + The options used to be set by calling setters in GlobalParams before + creating the PSOutputDev. + Now the options are set by calling setters in PSOutputDev after it + is created. + The problem is that PSOutputDev() calls init() which uses options + that now can not be set until later after PSOutputDev() returns. + These patches split some of the code of init() into a new postInit() + that is automatically called later after the pdftops main program + has had a chance to set the command line options. + When I was looking through the code, I also fixed a misspelling of + sanitizedTitle as sanitizedTile. + + Bug #89827 + + poppler/PSOutputDev.cc | 138 + +++++++++++++++++++++++++++++++------------------ + poppler/PSOutputDev.h | 11 ++-- + 2 files changed, 96 insertions(+), 53 deletions(-) + +commit c516b341a9c2e0c9a985bc14ad3cae73bf10fb02 +Author: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +Date: Sun May 3 15:27:19 2015 +0200 + + Fix invalid shell comparaison in libtiff test + + Bug #115523 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 040b316f0cb1ac933dce616fabe24c93f96fe1cd +Author: Jason Crain <jason@aquaticape.us> +Date: Sat Apr 18 12:44:47 2015 -0500 + + glib: Fix segfault when creating PopplerAction + + Screen annotations and form fields currently pass a NULL pointer to + _poppler_action_new. Pass the PopplerDocument instead. + + Bug #90093 + + glib/poppler-annot.cc | 4 ++-- + glib/poppler-form-field.cc | 2 +- + glib/poppler-page.cc | 2 +- + glib/poppler-private.h | 2 +- + 4 files changed, 5 insertions(+), 5 deletions(-) + +commit 056ee89122385bc2df7cb2c05e1cb1770af8ecce +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Apr 18 12:16:56 2015 +0200 + + glib: Add poppler_annot_markup_set_popup_rectangle() + + It updates the popup rectangle of a markup annotation that already + has a + popup associated. + + glib/poppler-annot.cc | 31 +++++++++++++++++++++++++++++++ + glib/poppler-annot.h | 2 ++ + glib/reference/poppler-sections.txt | 1 + + 3 files changed, 34 insertions(+) + +commit 1aae63ebc6fffe9fa1a2898e4ed733c22e312015 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Apr 18 11:46:41 2015 +0200 + + annots: Add popup annots without a markup annot associated to the + list of annots + + For consistency with Annots::createAnnot(). + + poppler/Annot.h | 2 +- + poppler/Page.cc | 6 +++++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +commit 05ef3f9feee760544108c68e0d45d1de25fd8901 +Author: Philipp Reinkemeier <philipp.reinkemeier@offis.de> +Date: Mon Feb 16 09:11:58 2015 +0100 + + annots: Fixed adding annotation of Subtype Popup to pdf page + + https://bugs.freedesktop.org/show_bug.cgi?id=89136 + + poppler/Annot.cc | 19 +++++++++++++++++++ + poppler/Page.cc | 11 ++++++++++- + 2 files changed, 29 insertions(+), 1 deletion(-) + +commit 8ca43bebf36f8da085917f28230e25524de4f4f4 +Author: Jason Crain <jason@aquaticape.us> +Date: Tue Mar 24 02:51:47 2015 -0500 + + cairo: Fix memory leak in CairoFreeTypeFont::create + + - Free embedded font data in _ft_done_face when the cairo font is + destroyed. + - Free embedded font data if _ft_new_face finds it's a duplicate of an + already open font. + - Free embedded font data and codeToGID array if font creation fails. + + Bug #89952 + + poppler/CairoFontEngine.cc | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +commit edc7bb4fe7b5e718431de12bee1d95036d06efa0 +Author: Jason Crain <jason@aquaticape.us> +Date: Sat Apr 4 18:40:48 2015 +0200 + + Combine base characters and diacritical marks + + LaTeX adds base characters and diacritical marks as separate + characters. When a base character and diacritical mark are drawn over + each other, this patch converts them into a combining character + sequence. + + Bug #87215 + C# poppler-0.31.0.tar.xz + + poppler/TextOutputDev.cc | 419 + ++++++++++++++++++++++++++++++++++------------- + poppler/TextOutputDev.h | 31 +++- + 2 files changed, 336 insertions(+), 114 deletions(-) + +commit 96c35dfde6722ff8c5ef7ff59e37be90d273acab +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 27 22:42:34 2015 +0100 + + pdftohtml: Set exit status adecuately + + Based on a patch by Matt Atkinson <mutley456@ntlworld.com> + Bug #83609 + + utils/pdftohtml.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 0969801c12a6ec0fbc079c8203cece9c70466955 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 26 16:08:20 2015 +0100 + + Fix previous commit about initializing on failure + + It's the nComps of the destination not of the origin we need + + poppler/SplashOutputDev.cc | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit ede6d00688fcf0e3c843b0a507304f5a98395d41 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 26 15:44:40 2015 +0100 + + memset on error to have reproducible outputs + + poppler/SplashOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 4bb2c9b98299f429752b4c60820cea31ef05f7e0 +Author: Jason Crain <jason@aquaticape.us> +Date: Wed Mar 25 21:04:19 2015 +0100 + + Use width from W array for WMode positioning + + Bug #89621 + + poppler/GfxFont.cc | 36 ++++++++++++------------------------ + poppler/GfxFont.h | 2 ++ + 2 files changed, 14 insertions(+), 24 deletions(-) + +commit 033dbbd7fef8c04c7f4961455cc1cd8d6d1bd93b +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 15 14:06:15 2015 +0100 + + Fix the previous pdfDocEncoding fix + + Since actually the previous fix didn't account for non ascii + characters as output of pdfDocEncoding + + qt4/src/poppler-private.cc | 36 +++++++++++++++--------------------- + qt5/src/poppler-private.cc | 36 +++++++++++++++--------------------- + 2 files changed, 30 insertions(+), 42 deletions(-) + +commit bc8076d8f638ccb44f8e3b94aaae96850b025deb +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 15 13:32:41 2015 +0100 + + Fix PDF Text String -> QString conversion + + If they are not UTF16-BE they are in PDFDocEncoding (not ascii) + + Fixes KDE bug #344849 + + qt4/src/poppler-private.cc | 5 +++-- + qt5/src/poppler-private.cc | 5 +++-- + 2 files changed, 6 insertions(+), 4 deletions(-) + +commit d7cc90a8b60d7e353db6e0acdd0b789485e32972 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 7 15:04:52 2015 +0100 + + 0.32.0 + + CMakeLists.txt | 4 ++-- + NEWS | 16 ++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 7 files changed, 23 insertions(+), 7 deletions(-) + +commit c13297d154ded11721fe7d3abdba459ca628cef8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 7 14:58:10 2015 +0100 + + Update (C) + + poppler/SecurityHandler.cc | 2 +- + poppler/SplashOutputDev.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit c909964bff671d5ff0d8eee5f613ded4562f8afd +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 7 14:54:43 2015 +0100 + + Do not assert on broken document + + Bug #89422 + + poppler/SecurityHandler.cc | 14 +++++++++----- + 1 file changed, 9 insertions(+), 5 deletions(-) + +commit 3705fcee0309c50b5fecd563e8e466cbe2c5972b +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Mar 6 15:19:58 2015 +0100 + + Fix Wrong colour shown when GouraudTriangleShFill uses a DeviceN + colorspace + + Bug #89182 + + poppler/SplashOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b7fde1ec83a5fff9bec73becc22e581583a30d43 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 25 21:51:34 2015 +0100 + + Fix last commit regression + + It seems it actually needs to be pipe->shape and not pipe->usesShape + (i.e. it seems at some point we use pipe->shape with useShape + being false) + Otherwise we had a regression on + eci_altona-test-suite-v2_technical2_x4.pdf + + splash/Splash.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7980fe868a8ef2ee3315f0bcb606c448d6604039 +Author: William Bader <williambader@hotmail.com> +Date: Wed Feb 25 15:00:33 2015 +0100 + + Fix uninitialized variable in Splash::pipeRun + + Use useShape is actually the guard for shape, so use it in the if + + splash/Splash.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 57b6b78a0831fb31c06fd1bc6e9803de524f9d2d +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Feb 24 23:34:57 2015 +0100 + + pdfseparate: use always an unique instance for PDFDoc for savePageAs + + utils/pdfseparate.cc | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 8a30d219df71ead323649ff0dfd4a724b5e7bd18 +Author: William Bader <williambader@hotmail.com> +Date: Sat Feb 21 23:55:10 2015 +0100 + + Fix memcpy introduced in ec956ab8552dbe10fac4e649951042bddc424b7d + + goo/GooString.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ec956ab8552dbe10fac4e649951042bddc424b7d +Author: William Bader <williambader@hotmail.com> +Date: Tue Feb 17 22:55:14 2015 +0100 + + Reduce use of gmalloc() in GooString::appendfv() + + Bug #89096 + + goo/GooString.cc | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +commit 132ef18324f62c1f2a08dcd794b379fadaa4daf5 +Author: Petr Gajdos <pgajdos@suse.cz> +Date: Wed Feb 11 19:37:21 2015 +0100 + + Annot BG/BC: Empty Array means no color + + poppler/Annot.cc | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit bf4aae25a244b1033a2479b9a8f633224f7d5de5 +Author: William Bader <williambader@hotmail.com> +Date: Wed Feb 11 17:35:40 2015 +0100 + + Off by one fix to the previous crash fix + + fofi/FoFiTrueType.cc | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 97dd46bae5424818ca808c20506d7d96f7b85fb5 +Author: William Bader <williambader@hotmail.com> +Date: Mon Feb 9 22:30:51 2015 +0100 + + pdftops: Add aaRaster and overprint to man file + + utils/pdftops.1 | 9 +++++++++ + 1 file changed, 9 insertions(+) + +commit c114a90063d755639d2b0dbf816690a66b54bee0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 8 00:24:11 2015 +0100 + + Fix crash in fuzzed file from Bug #84988 + + poppler/TextOutputDev.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 22895623e6cd2a5923f552421d44cc80cab77dd8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 7 22:28:21 2015 +0100 + + Fix malformed file crash from bug #86854 + + poppler/PSOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cdb7ad95f7c8fbf63ade040d8a07ec96467042fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 7 22:21:16 2015 +0100 + + Fix malformed file crash in bug #85243 + + fofi/FoFiTrueType.cc | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +commit 6641b935e1fc0c4151a723b6b476d987b8324ed2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 7 21:58:23 2015 +0100 + + If ECM is around include the sanitizers module + + This way you can run + cmake -DECM_ENABLE_SANITIZERS='address' + and get an ASAN built poppler + + CMakeLists.txt | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 92e41685dcef538a7fc669ca357ce9f448a8078e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Feb 7 21:54:39 2015 +0100 + + Fix crash in malformed file from bug #85275 + + poppler/SplashOutputDev.cc | 4 ++-- + splash/Splash.cc | 10 +++++++++- + splash/SplashBitmap.cc | 4 ++-- + 3 files changed, 13 insertions(+), 5 deletions(-) + +commit 9842b3b00492eda21297d5d65f769f77a565f6ac +Author: Aleksei Volkov <Aleksei Volkov> +Date: Sat Feb 7 20:46:26 2015 +0100 + + No need to check for hmtx, freetype does for us + + Bug #88939 + + fofi/FoFiTrueType.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4849eb43892640062c485e48ba7a29b5a0cc9587 +Author: William Bader <williambader@hotmail.com> +Date: Sat Feb 7 16:41:53 2015 +0100 + + Make the colorpsace optimization and option and not the default + + Bug #88971 + + poppler/PSOutputDev.cc | 25 ++++++++++++++++--------- + poppler/PSOutputDev.h | 4 ++++ + utils/pdftops.1 | 10 +++++++++- + utils/pdftops.cc | 4 ++++ + 4 files changed, 33 insertions(+), 10 deletions(-) + +commit 8e16e423a718b92514885e771e31048f1ae2a766 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 5 20:18:13 2015 +0100 + + 0.31.0 + + And copyright updating + + CMakeLists.txt | 4 ++-- + NEWS | 17 +++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/CairoOutputDev.cc | 1 + + poppler/CairoOutputDev.h | 1 + + poppler/JBIG2Stream.cc | 1 + + poppler/JBIG2Stream.h | 1 + + poppler/Makefile.am | 2 +- + poppler/Stream.cc | 1 + + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 2 +- + qt5/src/CMakeLists.txt | 2 +- + qt5/src/Doxyfile | 2 +- + qt5/src/Makefile.am | 2 +- + 16 files changed, 33 insertions(+), 11 deletions(-) + +commit f932315e559a7857d9c5642eb04efc0d2b717789 +Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> +Date: Tue Jan 20 22:05:29 2015 +1030 + + cairo: support embedding JBIG2 image data + + http://lists.freedesktop.org/archives/poppler/2014-December/011183.html + + poppler/CairoOutputDev.cc | 117 + ++++++++++++++++++++++++++++++++++++++-------- + poppler/CairoOutputDev.h | 3 ++ + poppler/JBIG2Stream.cc | 9 +++- + poppler/JBIG2Stream.h | 4 +- + poppler/Stream.cc | 13 +++++- + 5 files changed, 121 insertions(+), 25 deletions(-) + +commit 78abf540057181b708c546aee421f81a1dd58331 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Wed Jan 21 22:30:45 2015 +0100 + + Worlds -> Words + + qt4/src/poppler-page.cc | 4 ++-- + qt4/src/poppler-qt4.h | 2 +- + qt4/tests/check_search.cpp | 4 ++-- + qt5/src/poppler-page.cc | 4 ++-- + qt5/src/poppler-qt5.h | 2 +- + qt5/tests/check_search.cpp | 4 ++-- + 6 files changed, 10 insertions(+), 10 deletions(-) + +commit 027eac4e565576ca2e7042e21426e28abd775d98 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Tue Jan 20 00:09:09 2015 +0100 + + Expose whole-words search option in Qt frontends + + qt4/src/poppler-page-private.h | 5 +- + qt4/src/poppler-page.cc | 114 + +++++++++++++++++++++++++------------ + qt4/src/poppler-qt4.h | 44 +++++++++++++- + qt4/tests/check_search.cpp | 112 +++++++++++++++++++++++++++++++----- + qt5/src/poppler-page-private.h | 5 +- + qt5/src/poppler-page.cc | 116 + +++++++++++++++++++++++++------------ + qt5/src/poppler-qt5.h | 46 +++++++++++++-- + qt5/tests/check_search.cpp | 126 + +++++++++++++++++++++++++++++++++-------- + 8 files changed, 447 insertions(+), 121 deletions(-) + +commit 30a0baa353c374165e5f411efc4203746f14a74d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 18 15:39:53 2015 +0100 + + Move more variables from GlobalParams to PSOutputDev + + poppler/CairoFontEngine.cc | 4 +- + poppler/GfxFont.cc | 15 ++--- + poppler/GfxFont.h | 7 ++- + poppler/GlobalParams.cc | 144 + --------------------------------------------- + poppler/GlobalParams.h | 28 --------- + poppler/PSOutputDev.cc | 121 +++++++++++++++++++------------------ + poppler/PSOutputDev.h | 30 +++++++++- + poppler/SplashOutputDev.cc | 2 +- + qt4/src/ArthurOutputDev.cc | 4 +- + qt5/src/ArthurOutputDev.cc | 4 +- + utils/pdftops.cc | 36 ++++-------- + 11 files changed, 116 insertions(+), 279 deletions(-) + +commit 8fed995c3457d64669ae12901450b7c811599dba +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 18 14:52:53 2015 +0100 + + Forgot to delete this in the previous commit + + poppler/GlobalParams.h | 1 - + 1 file changed, 1 deletion(-) + +commit 4992ff7fa062462507733494827fdad7eaaa95b3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 18 13:57:36 2015 +0100 + + Move raster mono and resolution from GlobalParams to PSOutputDev + + poppler/GlobalParams.cc | 32 -------------------------------- + poppler/GlobalParams.h | 7 ------- + poppler/PSOutputDev.cc | 18 +++++++----------- + poppler/PSOutputDev.h | 6 ++++++ + utils/pdftops.cc | 7 ++++--- + 5 files changed, 17 insertions(+), 53 deletions(-) + +commit 54908f675eda96c363528198e8c530921df2f45a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 18 13:34:45 2015 +0100 + + Move psUncompressPreloadedImages from GlobalParams to PSOutputDev + + It belongs there and PSOutputDev is always created by the external + user + so in case someone wants to set it, it is the same amount of work + to set it in GlobalParams than in PSOutputDev + + poppler/GlobalParams.cc | 16 ---------------- + poppler/GlobalParams.h | 3 --- + poppler/PSOutputDev.cc | 9 +++++---- + poppler/PSOutputDev.h | 2 ++ + 4 files changed, 7 insertions(+), 23 deletions(-) + +commit 136d7aa5e79f153dfcb216c58598e33a8ff16630 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 18 13:28:26 2015 +0100 + + Remove declared but not defined function + + poppler/GlobalParams.h | 1 - + 1 file changed, 1 deletion(-) + +commit fdba9154d9a176759c765180805e608d4959c34e +Author: Adam Reichold <adamreichold@myopera.com> +Date: Fri Jan 16 19:57:59 2015 +0100 + + pdftoppm: parse the flags earlier and only once + + utils/pdftoppm.cc | 42 +++++++++++++++--------------------------- + 1 file changed, 15 insertions(+), 27 deletions(-) + +commit 6b072500b5ac936631be6b29b7d5a591848a18f3 +Author: William Bader <williambader@hotmail.com> +Date: Wed Jan 14 23:28:03 2015 +0100 + + Add rasterization option to pdftops + + Also removes GlobalParams stuff \o/ + + Coded in conjuntion with Albert + + Bug #85934 + + cpp/poppler-page-renderer.cpp | 5 ++-- + poppler/GlobalParams.cc | 58 + ++----------------------------------------- + poppler/GlobalParams.h | 16 +++--------- + poppler/PSOutputDev.cc | 14 +++++------ + poppler/PSOutputDev.h | 5 +++- + poppler/SplashOutputDev.cc | 19 ++++++-------- + poppler/SplashOutputDev.h | 11 +++++--- + qt4/src/poppler-page.cc | 7 +++--- + qt5/src/poppler-page.cc | 7 +++--- + utils/pdftohtml.cc | 9 +++---- + utils/pdftoppm.cc | 49 ++++++++++++++++++++++++++---------- + utils/pdftops.cc | 14 ++++++++++- + 12 files changed, 96 insertions(+), 118 deletions(-) + +commit dc9751e6ac47a708ba6e7a68560bdce6a2e4a010 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 9 15:50:02 2015 +0100 + + Compile++ + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d91876a0c7a936b1f6f461d80131d7586a6c1a5e +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 8 20:13:06 2015 +0100 + + Accept malformed documents whose root is a Page instead of a Pages + + gs and Adobe Reader do it so it's "common" enough + + Bug #88172 + + poppler/Catalog.cc | 37 ++++++++++++++++++++++++++++++++----- + 1 file changed, 32 insertions(+), 5 deletions(-) + +commit 7ce86b9be058408eb567d8d0b9747853a66c116f +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 8 17:35:28 2015 +0100 + + Remove assert in gouraudFillTriangle + + We don't *need* the assert, an error() is fine and the malformed + document + will just get rendered wrongly instead of "crashing" + + Bugs #85274 + + poppler/Gfx.cc | 28 +++++++++++++++++----------- + 1 file changed, 17 insertions(+), 11 deletions(-) + +commit 9e9df4b20d17478996780008bc9802a857d173fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 8 17:01:52 2015 +0100 + + Fix crash on broken document + + Bug #85281 + + poppler/GfxState.cc | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 636faafcb84b856580398f7883b6406d645c85d1 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Tue Jan 6 22:57:20 2015 +0100 + + JPEG2000Stream: Inline doGetChar and doLookChar + + poppler/JPEG2000Stream.cc | 49 + +++++++++++++++++++++++++---------------------- + poppler/JPEG2000Stream.h | 7 ++----- + 2 files changed, 28 insertions(+), 28 deletions(-) + +commit c13bffe92963c4969037695992f4c2776bbe973f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 4 23:17:42 2015 +0100 + + 0.30 + + CMakeLists.txt | 4 ++-- + NEWS | 18 ++++++++++++++++++ + configure.ac | 2 +- + cpp/CMakeLists.txt | 2 +- + cpp/Doxyfile | 2 +- + cpp/Makefile.am | 2 +- + poppler/Makefile.am | 2 +- + poppler/PDFDoc.cc | 1 + + poppler/TextOutputDev.cc | 2 +- + poppler/poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 13 files changed, 31 insertions(+), 12 deletions(-) + +commit e499fdab2e96cb3069db7ac8ffa0df20ccccddc9 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sun Jan 4 20:23:39 2015 +0100 + + extended openjpeg2 support + + poppler/JPEG2000Stream.cc | 101 + +++++++++++++++++++++++++++++++++++----------- + 1 file changed, 78 insertions(+), 23 deletions(-) + +commit 2841f3c34dd6366a70e4d6d307a08b3fbc3e9897 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 4 20:22:47 2015 +0100 + + Cmake support for openjpeg2 + + With some tweaks from Albert + + CMakeLists.txt | 56 + +++++++++++++++++++++++++++++------- + cmake/modules/FindLIBOPENJPEG2.cmake | 30 +++++++++++++++++++ + 2 files changed, 76 insertions(+), 10 deletions(-) + +commit 117af9c6bbd923954ef7de63adec8c22d51da1e4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 4 19:42:34 2015 +0100 + + Initial attempt at libopenjpeg2 support + + OpenJPEG 2 has a new pkg-config name and API. + + - Update configure.ac to find openjpeg 2 and provide V1/v2 macros + - Update JPEG2000Stream to use new API depending on openjpeg v1/v2 + macros + - OpenJPEG 2.1 changed the API so provide a version macro to make + it easier + to handle the the 2.1 change and any future changes. + - Move openjpeg.h into the .cc file + + configure.ac | 80 ++++++++---- + poppler/JPEG2000Stream.cc | 313 + +++++++++++++++++++++++++++++++++++++--------- + poppler/JPEG2000Stream.h | 41 ++---- + 3 files changed, 323 insertions(+), 111 deletions(-) + +commit 9caf7525409d699c16896653528486451123b485 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 4 18:48:02 2015 +0100 + + Make PSOutputDev accept a list of pages indeces + + Instead of first, last + + Bug #84833 + + Reviewed in the mailing list, see "Can anyone have a look at my + patch?" + + glib/poppler-page.cc | 10 ++++++--- + poppler/PSOutputDev.cc | 50 + ++++++++++++++++++++++++----------------- + poppler/PSOutputDev.h | 14 +++++++----- + qt4/src/poppler-ps-converter.cc | 11 ++++++--- + qt5/src/poppler-ps-converter.cc | 11 ++++++--- + utils/pdftops.cc | 15 +++++++++---- + 6 files changed, 71 insertions(+), 40 deletions(-) + +commit 173f182fb568843f97e7d45d1b16bebbd2aa7413 +Author: Li Junling <lijunling@sina.com> +Date: Fri Jan 2 17:23:24 2015 +0100 + + Find last 'startxref' in the last 24K instead of the last 1K + + Bug #85919 + + poppler/PDFDoc.cc | 38 ++++++++++++++++++++++---------------- + 1 file changed, 22 insertions(+), 16 deletions(-) + +commit 0b1cd9403b8a240e58ec4f1832588d25f8295278 +Author: Jason Crain <jason@aquaticape.us> +Date: Sat Dec 20 03:22:23 2014 -0600 + + Free BBox object on error + + poppler/Gfx.cc | 1 + + 1 file changed, 1 insertion(+) + +commit acc33a6950031ac4a5c759d043d24df0cfa7e8b6 +Author: Jason Crain <jason@aquaticape.us> +Date: Sat Dec 20 02:24:49 2014 -0600 + + Check for invalid matrix in annotation + + Bug #84990 + + poppler/Gfx.cc | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +commit 56aff7d78658f586e3c4cd41685f189dafb3098a +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Dec 23 15:49:15 2014 +0100 + + pdfunite: Support output intents, optional content and acroform + + utils/pdfunite.cc | 116 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 116 insertions(+) + +commit 9e734063e6a6a4b9743c9aa27d3d3127b5a960d7 +Author: Jason Crain <jason@aquaticape.us> +Date: Fri Dec 19 01:56:45 2014 -0600 + + Move array reallocation from visitLine to startLine + + Fixes potential memory corruption from writing after end of lines + array. + + https://bugs.freedesktop.org/show_bug.cgi?id=84555 + + poppler/TextOutputDev.cc | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 0c47b769a77795bd866b6686b79fd20ad6f554bf +Author: Daniel Macks <dmacks@netspace.org> +Date: Sun Dec 14 18:52:48 2014 +0100 + + Only consider adding -fno-check-new if compiler supports it + + Helps compiling on old clang's + + Bug #76963 + + configure.ac | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +commit c9c90d50e3708f6fac313aa8b458aef6dba5dcfb +Author: Hans-Peter Deifel <hpdeifel@gmx.de> +Date: Fri Dec 12 13:09:51 2014 +0100 + + cpp: New API to set debug output function + + Adds the global function set_debug_error_function, that allows users + to install their own function to print internal poppler errors. + + cpp/poppler-global.cpp | 29 +++++++++++++++++++++++++++++ + cpp/poppler-global.h | 5 +++++ + cpp/poppler-private.cpp | 15 ++++++++++++--- + cpp/poppler-private.h | 3 +++ + 4 files changed, 49 insertions(+), 3 deletions(-) + +commit fa8f276a10911c97d2777fff3270771802bc3892 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 4 23:11:12 2014 +0100 + + 0.29.0 + + CMakeLists.txt | 4 ++-- + NEWS | 15 +++++++++++++++ + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 7 files changed, 23 insertions(+), 8 deletions(-) + +commit fee700cfecb9d7d5fa938704a5f457f15aaa4676 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Dec 1 20:52:42 2014 +0100 + + Run dos2unix as suggested by Volker Grabsch + + splash/SplashState.h | 278 ++++++++++---------- + test/perf-test-preview-dummy.cc | 44 ++-- + test/perf-test-preview-win.cc | 544 + ++++++++++++++++++++-------------------- + 3 files changed, 433 insertions(+), 433 deletions(-) + +commit d3fe0661c6dc6050e14cd5cb4afa089b7d7d66b0 +Author: Richard PALO <richard@netbsd.org> +Date: Sun Nov 30 22:46:22 2014 +0100 + + warning: "_FILE_OFFSET_BITS" redefined + + Bug #86870 + + test/perf-test.cc | 2559 + +++++++++++++++++++++++++++-------------------------- + 1 file changed, 1280 insertions(+), 1279 deletions(-) + +commit 18884065e11fee82506915095619107a43172ecb +Author: Richard PALO <richard@netbsd.org> +Date: Sun Nov 30 22:36:29 2014 +0100 + + The isfinite macro is defined on SunOS under c99 + + Bug #86869 + + poppler/SplashOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit bcb470064dd9f75ab0b0a0d9b7319fe8f1e558ae +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Nov 25 05:53:38 2014 +1030 + + cofigure: print "no" instead of "auto" if lcms not found + + configure.ac | 2 ++ + 1 file changed, 2 insertions(+) + +commit 832046c57ab2909d329340f1c941b29e8246ff73 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Nov 28 11:08:34 2014 +0100 + + Use correct LAB byte array for lcms input + + Bug #86388 + + poppler/GfxState.cc | 51 + ++++++++++++++++++++++++++++++++++++++------------- + poppler/GfxState.h | 4 +++- + 2 files changed, 41 insertions(+), 14 deletions(-) + +commit a604bc3a2ed9f9181aa3b12d795608fcf5e08220 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Nov 14 11:56:50 2014 +0100 + + Solve blend mode problem in CYMK and DeviceN for separable blend modes + + Fixes part of #68986 + + poppler/SplashOutputDev.cc | 277 + +++++++++++++++++++++++++-------------------- + 1 file changed, 155 insertions(+), 122 deletions(-) + +commit b7802ff39db270dda2aa20f005fb87c22ed34137 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Nov 14 11:47:38 2014 +0100 + + Use Default colorspaces if present instead of Device colorspaces + + Fixes part of #68986 + + poppler/CairoOutputDev.cc | 4 +- + poppler/Gfx.cc | 40 +++++----- + poppler/GfxState.cc | 197 + ++++++++++++++++++++++++++++++++++------------ + poppler/GfxState.h | 31 ++++---- + poppler/Page.cc | 4 +- + 5 files changed, 188 insertions(+), 88 deletions(-) + +commit 07aa6f4030418883d8d45a8dfa3d80d2dadca4e7 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu Nov 13 12:26:25 2014 +0100 + + write correct size in trailer dict + + Bug #86063 + + poppler/PDFDoc.cc | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit 51e7c29cabedc72e097023e6d8d6d68ed43fa20c +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Fri Nov 7 18:30:36 2014 +0100 + + regtest: Update references also for tests that no longer crash + + We are currently updating the refs only when we have checksums to + compare, but if a test used to crash there's no md5 file in refs. + + regtest/TestRun.py | 2 ++ + regtest/backends/__init__.py | 24 ++++++++++++++++++++++++ + 2 files changed, 26 insertions(+) + +commit d205908930d5dc4ec3a1a1a2c2b93fbb92c2c867 +Author: William Bader <williambader@hotmail.com> +Date: Wed Nov 5 20:23:49 2014 +0100 + + Make it proper C + + glib/demo/annots.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit fa1d636b00210b9c52787ab3c833fe9aa2e293fa +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 4 20:00:08 2014 +0100 + + 0.28.1 + + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 7debbb05df18afc86df8a4fd37980728ec2e5788 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 4 19:29:58 2014 +0100 + + Fix typo + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d5489ef37742227176e800390a990f2b882d9710 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 4 01:27:05 2014 +0100 + + 0.28.0 + + CMakeLists.txt | 6 +++--- + NEWS | 43 +++++++++++++++++++++++++++++++++++++++++++ + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 2 +- + qt5/src/CMakeLists.txt | 2 +- + qt5/src/Doxyfile | 2 +- + qt5/src/Makefile.am | 2 +- + 11 files changed, 56 insertions(+), 13 deletions(-) + +commit f87115a1129e4e03802769181a3392c8dce3192a +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Nov 4 01:25:18 2014 +0100 + + Don't ship the moc files + + qt4/demos/Makefile.am | 1 - + qt5/demos/Makefile.am | 1 - + 2 files changed, 2 deletions(-) + +commit 0a9c38076f1555196029372b7e08714b43c7a58d +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 3 21:43:28 2014 +0100 + + Update (C) + + fofi/FoFiType1.cc | 1 + + poppler/PDFDoc.cc | 4 ++-- + poppler/PDFDoc.h | 2 +- + poppler/XRef.cc | 2 +- + qt4/src/poppler-annotation-private.h | 2 +- + qt4/src/poppler-annotation.cc | 2 +- + qt4/src/poppler-page.cc | 2 +- + qt4/src/poppler-qt4.h | 2 +- + qt5/src/poppler-annotation-private.h | 2 +- + qt5/src/poppler-annotation.cc | 2 +- + qt5/src/poppler-page.cc | 2 +- + qt5/src/poppler-qt5.h | 2 +- + utils/pdfdetach.cc | 1 + + utils/pdftocairo-win32.cc | 12 ++++++++++++ + utils/pdftocairo-win32.h | 12 ++++++++++++ + utils/pdftocairo.cc | 3 ++- + 16 files changed, 40 insertions(+), 13 deletions(-) + +commit 73cf1e87c9803bbe4271be297b486d9932677d46 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 3 21:37:13 2014 +0100 + + Need to dist this file + + utils/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 2fd0cd652cfc03c9af35a59192729e4ed26e8146 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 3 19:20:23 2014 +0100 + + Fix memory leaks when running pdfseparate + + Bug #84768 + + poppler/PDFDoc.cc | 102 + +++++++++++++++++++++------------------------------ + poppler/PDFDoc.h | 2 +- + utils/pdfseparate.cc | 8 +++- + utils/pdfunite.cc | 4 +- + 4 files changed, 50 insertions(+), 66 deletions(-) + +commit d6ea8acbb348fdb43601a963ba5407e933565003 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Nov 3 19:11:25 2014 +0100 + + fix crash in Xref::getEntry + + Bug 85234 + + poppler/XRef.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit bd142810b9f66b017a58b3e1840d4d72794f1ef4 +Author: Jason Crain <jason@aquaticape.us> +Date: Thu May 15 02:22:44 2014 -0500 + + cairo: Use matrix to determine pattern size + + https://bugs.freedesktop.org/show_bug.cgi?id=33364 + + poppler/CairoOutputDev.cc | 22 ++++++++++++++++++---- + 1 file changed, 18 insertions(+), 4 deletions(-) + +commit 06dd7dc337c7db6122329e98783a126d59035aff +Author: Hib Eris <hib@hiberis.nl> +Date: Thu May 29 12:45:33 2014 +0200 + + Include windows.h, not Windows.h + + Fixes building on file systems that are case sensitive, e.g. when + cross compiling on Linux for win32. + + https://bugs.freedesktop.org/show_bug.cgi?id=79407 + + qt4/tests/stress-threads-qt4.cpp | 2 +- + qt5/tests/stress-threads-qt5.cpp | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 76a350b11160ac203a41b27fbc85a3264bfe4735 +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Thu Oct 30 18:25:06 2014 +0100 + + regtest: Try to fix again the paths of the resources in the generated + HTML report + + Use always relatives paths for the resources under the out directory, + and absolute paths for all other resources when no-absolute-path + command + line option is used. + + regtest/HTMLReport.py | 47 + +++++++++++++++++++++++------------------------ + 1 file changed, 23 insertions(+), 24 deletions(-) + +commit c93d6b264dc77c46c72281d966bf826274a43d15 +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Wed Oct 29 17:37:06 2014 +0100 + + regtest: respect --no-absolute-paths when creating the pretty + diff links + + regtest/HTMLReport.py | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +commit 9f953e47a6ea92d806aeea61e227af54c889c6be +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Mon Oct 27 19:53:28 2014 +0100 + + regtest: Add an option to create the HTML report without absolute + paths + + It uses the paths as received from the command line attributes. + + regtest/HTMLReport.py | 15 +++++++++++---- + regtest/commands/create-report.py | 4 ++++ + 2 files changed, 15 insertions(+), 4 deletions(-) + +commit 3d840231bc6f0714da361493ef32913af2eb78d7 +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Sun Oct 26 12:09:28 2014 +0100 + + regtest: Fix png diff generation with python-pil pillow fork + + Use from PIL import Image instead of just import Image, since pillow + only doesn't support import Image without using PIL.Image. + + regtest/backends/__init__.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 68e58ec5465efc289d85ae104941db92450a3168 +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Sun Oct 26 11:21:23 2014 +0100 + + regtest: Limit the number of worker threads to the number of documents + to test + + We are always spawning all the threads even if the documents to + test is + less than the worker threads. Also optimize the case of running + only one + test to not spwn any thread. + + regtest/TestRun.py | 27 ++++++++++++++++++--------- + 1 file changed, 18 insertions(+), 9 deletions(-) + +commit 7c21b95852e891060cd2e276949acf0945306ab7 +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Sun Oct 26 11:08:45 2014 +0100 + + regtest: Allow to run groups of tests individually + + Now it's possible to pass more than one argument to run-tests + command and + optionally the docs directory. When more than one test is passed + and the + docs directory is not provided, the common base path of all passed + tests + is used as docs directory. The tests passed can be documents or + directories, using absolute paths or paths relative to the docs + directory. + This also allows us to update the refs for a group of tests. + + regtest/TestRun.py | 26 ++++++++++++++++++++++++-- + regtest/Utils.py | 7 +++++-- + regtest/commands/run-tests.py | 29 ++++++++++++++++++++--------- + 3 files changed, 49 insertions(+), 13 deletions(-) + +commit 53be607edc18a861aeb0b6663bac3c05de46c84c +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Oct 24 11:35:17 2014 +0200 + + Fix warning on unused variable in pdftocairo.cc + + Fixes warning: + + CXX pdftocairo-pdftocairo.o + pdftocairo.cc:130:14: warning: ‘setupdlg’ defined but not used + [-Wunused-variable] + static GBool setupdlg = gFalse; + ^ + + https://bugs.freedesktop.org/show_bug.cgi?id=85400 + + utils/pdftocairo.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit f966b8766d40b2c912e69a1e17ef8cc4bd52be95 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Oct 21 16:42:27 2014 +0200 + + fofi: Fix a crash when parsing an invalid font due to a integer + overflow + + This fixes a crash rendering trust_metrics.f2495.f0.pdf. + + fofi/FoFiType1.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4963332ca4db13d8a9186b06d2aa0d59abbc10ee +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 5 21:58:37 2014 +1030 + + pdftocairo: add -printdlg output option for win32 + + when set the win32 print dialog is displayed before printing + + configure.ac | 2 +- + utils/pdftocairo-win32.cc | 303 + ++++++++++++++++++++++++++++++++++++++++++++-- + utils/pdftocairo-win32.h | 14 +-- + utils/pdftocairo.1 | 14 ++- + utils/pdftocairo.cc | 31 ++++- + 5 files changed, 337 insertions(+), 27 deletions(-) + +commit d8fe025c36f555a5438677e20df803eee216bb13 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 5 18:11:09 2014 +1030 + + pdftocairo: add a -setupdlg option that will the show printer + properties + + dialog when printing to a win32 printer. + + utils/pdftocairo-win32.cc | 22 +++++++++++++++++++--- + utils/pdftocairo-win32.h | 3 ++- + utils/pdftocairo.1 | 5 +++++ + utils/pdftocairo.cc | 24 ++++++++++++++++-------- + 4 files changed, 42 insertions(+), 12 deletions(-) + +commit c091aa14513859ab76223f5e4e6055d92082433c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 14 20:43:47 2014 +0930 + + pdftocairo: fix a number of bugs in win32 printing + + - make origPageSizes work + - make landscape pages work + - make -noshrink option work + - return actual page size in use back to main() so fit page transform + works + - hdc should be destroyed after cairo surface + - improve option parsing and rename duplex values + - Add third call to DocumentProperties as discussed in bug 79936 + - fix error messages + + utils/pdftocairo-win32.cc | 181 + ++++++++++++++++++++++++++-------------------- + utils/pdftocairo-win32.h | 2 +- + utils/pdftocairo.1 | 5 +- + utils/pdftocairo.cc | 49 ++++++------- + 4 files changed, 132 insertions(+), 105 deletions(-) + +commit cc3b39d49c656e912a7461212f3bb4e58c6444e7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Sep 12 18:17:49 2014 +0930 + + make pdftocairo-win32.cc a standalone .cc file + + instead of #including it in pdftocairo.cc + + utils/CMakeLists.txt | 1 + + utils/Makefile.am | 3 +- + utils/pdftocairo-win32.cc | 74 + +++++++++++++++++++++++------------------------ + utils/pdftocairo-win32.h | 22 ++++++++++++++ + utils/pdftocairo.cc | 24 +++++++++------ + 5 files changed, 77 insertions(+), 47 deletions(-) + +commit 700205af19ef1ae5f2c713d118ebd5dd4a0afba3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Sep 7 20:18:36 2014 +0930 + + pdftocairo: Allow an output file for win32 printing to be specified + + Can be used for testing win32 print output without wasting paper. + + utils/pdftocairo-win32.cc | 12 ++++++++---- + utils/pdftocairo.1 | 4 ++++ + utils/pdftocairo.cc | 13 +++++++------ + 3 files changed, 19 insertions(+), 10 deletions(-) + +commit 40d3ae87befad489fd8c0b38ff2561a0782cae0b +Author: Rodrigo Rivas Costa <rodrigorivascosta@gmail.com> +Date: Sat Sep 6 21:04:10 2014 +0930 + + Add support for printing to a Windows printer from pdftocairo + + Bug 79936 + + configure.ac | 2 +- + utils/pdftocairo-win32.cc | 219 + ++++++++++++++++++++++++++++++++++++++++++++++ + utils/pdftocairo.1 | 23 ++++- + utils/pdftocairo.cc | 61 ++++++++++--- + 4 files changed, 292 insertions(+), 13 deletions(-) + +commit ee4a389872d86b619c677888da8f13f1f6c54472 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 20 22:32:30 2014 +1030 + + PDFDoc: fix crash when getPage() returns NULL + + Bug 85235 + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0c3f53e34ec287dab2784e1f3411ad06b62dffc7 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 20 22:17:20 2014 +1030 + + PDFDOC: Check for EOF when reading raw stream + + Bug 85233 + + poppler/PDFDoc.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 88dbd4df0998233939b4a51cedbfc65c58a315f9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 19 22:47:15 2014 +1030 + + pdfdetach: fix crash when getPage() returns null + + Bug 85145 + + utils/pdfdetach.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit e0179304cdef615fcf639046410d214fd5b5f276 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 19 21:36:39 2014 +1030 + + cairo: fix crash when no group color space + + Bug 85137 + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 745f1241bf903969e50f0e1139641e389a9c331f +Author: Scott West <scott.gregory.west@gmail.com> +Date: Tue Oct 7 23:54:52 2014 +0200 + + Fix memory leak in Dict.remove. + + The entry was previously just overwritten now it is freed + + Small fixes by Albert oo + + Bug #84607 + + poppler/Dict.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit b8810703ca76f0bbc8185ab87679cf18eb006d52 +Author: Luigi Scarso <luigi.scarso@gmail.com> +Date: Tue Oct 7 22:45:05 2014 +0200 + + Make Attribute::getName() work when UTF-16BE is used + + Contains some ideas by me + Bug #84722 + + goo/GooString.h | 9 +++++---- + poppler/StructElement.cc | 17 +++++++++++------ + poppler/StructElement.h | 7 +++++-- + 3 files changed, 21 insertions(+), 12 deletions(-) + +commit 96a04336c7a6331727724125686a0d6f42f19f46 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Oct 6 10:21:51 2014 +1030 + + cairo: only embed mime data if image decode map is identity + + https://bugs.launchpad.net/ubuntu/+source/cairo/+bug/1317517 + + poppler/CairoOutputDev.cc | 19 ++++++++++++++++--- + poppler/CairoOutputDev.h | 3 ++- + 2 files changed, 18 insertions(+), 4 deletions(-) + +commit 18541054bebce3f9d4729629785bf140d67d2da0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Sep 24 21:20:42 2014 +0930 + + cairo: Only embed mime data for gray/rgb/cmyk colorspaces + + Bug 80719 + + poppler/CairoOutputDev.cc | 39 +++++++++++++++++++++++++++++++-------- + poppler/CairoOutputDev.h | 2 +- + 2 files changed, 32 insertions(+), 9 deletions(-) + +commit cbf2652c483d7010fc36191c8b209a57eeec93d8 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Jan 26 00:37:17 2012 +1030 + + cairo: don't render text when text matrix is not invertable + + Emulates acroread behavior. + + Bug 78042 + + poppler/CairoOutputDev.cc | 14 +++++++++----- + poppler/CairoOutputDev.h | 1 + + 2 files changed, 10 insertions(+), 5 deletions(-) + +commit 4fe17e97a4bd7873caad771c446199b282039697 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 5 11:30:43 2014 +0200 + + glib: Build introspection linking to the uninstalled libraries + + https://bugs.freedesktop.org/show_bug.cgi?id=84526 + + glib/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a2477da56a4d1c534175940d7c01a9d3db6c72d4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 1 22:33:11 2014 +0200 + + Fix 303287ebdad0de9fb2655c4d7eab627c0045ea04 + + It may happen that j is bigger than macGlyphNames size, so don't + try to access it + + fofi/FoFiTrueType.cc | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +commit ce95ecda450361496aedd5d5cd0bf47fd2c66703 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 30 19:50:20 2014 +0200 + + Fix assert in 5068.asan.0.6052.pdf + + poppler/Gfx.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 01723aa17e836e818158dbdc56df642a290be300 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 30 18:48:47 2014 +0200 + + Map Standard/Expert encoding ligatures to AGLFN names + + for use with substitute fonts that are not compatible with the + Standard 14 fonts. + + Bug 80093 + + poppler/CairoFontEngine.cc | 12 +++++++++--- + poppler/GfxFont.cc | 29 ++++++++++++++++++++++++++++- + poppler/GfxFont.h | 7 ++++++- + splash/SplashFTFontFile.cc | 8 ++++++++ + 4 files changed, 51 insertions(+), 5 deletions(-) + +commit 529db4a94607c1ad909764d26f740c601bbe896f +Author: Hib Eris <hib@hiberis.nl> +Date: Mon Sep 29 22:59:15 2014 +0200 + + Fix build with --disable-utils + + Since 21b5fd655ce45b90668d1416d21c526ab7eb3ad6, building Poppler + fails when configured + with '--disable-utils'. + + Bug #84448 + + Makefile.am | 6 +----- + utils/Makefile.am | 4 ++++ + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit c54f6aceed983a221d88ce5c21becbf8aab2931b +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Mon Sep 29 21:42:46 2014 +0200 + + use alt colorspace to get CMYK values for an ICC based CMYK colorspace + + The reason for the pale image is that GfxICCBasedColorSpace::getCMYK() + uses the cms transformation to get RGB values and the convert it + back to CMYK even for a ICC based CMYK colorspace instead of just + returning the CMYK values itself. + + Bug #79019 + + poppler/GfxState.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 21b5fd655ce45b90668d1416d21c526ab7eb3ad6 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Sep 14 11:20:23 2014 +0200 + + Refactor Makefiles to build a noinst library for parsing args + + Prevents this automake warning about possible forward-incompatibility: + + $ ./autogen.sh + ... + cpp/tests/Makefile.am:16: warning: source file + '$(top_srcdir)/utils/parseargs.cc' is in a subdirectory, + cpp/tests/Makefile.am:16: but option 'subdir-objects' is disabled + automake: warning: possible forward-incompatibility. + automake: At least a source file is in a subdirectory, but the + 'subdir-objects' + automake: automake option hasn't been enabled. For now, the + corresponding output + automake: object file(s) will be placed in the top-level directory. + However, + automake: this behaviour will change in future Automake versions: + they will + automake: unconditionally cause object files to be placed in the + same subdirectory + automake: of the corresponding sources. + automake: You are advised to start using 'subdir-objects' option + throughout your + automake: project, to avoid future incompatibilities. + cpp/tests/Makefile.am:20: warning: source file + '$(top_srcdir)/utils/parseargs.cc' is in a subdirectory, + cpp/tests/Makefile.am:20: but option 'subdir-objects' is disabled + parallel-tests: installing './test-driver' + test/Makefile.am:58: warning: source file '../utils/parseargs.cc' + is in a subdirectory, + test/Makefile.am:58: but option 'subdir-objects' is disabled + + $ automake --version + automake (GNU automake) 1.14.1 + ... + + https://bugs.freedesktop.org/show_bug.cgi?id=83839 + + cpp/tests/Makefile.am | 3 +-- + test/Makefile.am | 8 ++++---- + utils/.gitignore | 2 ++ + utils/Makefile.am | 42 ++++++++++++++++++------------------------ + 4 files changed, 25 insertions(+), 30 deletions(-) + +commit 70a851b0cc58241d1f2f6bc48af2614595326c8f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 6 21:16:04 2014 +0930 + + Update .gitignore + + .gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit d44e7e3560bdc79253df98db05385dce3e8ccbb4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 6 21:53:21 2014 +0930 + + Don't use -fPIC on mingw + + it emits a warning for every file stating that -fPIC is ignored + + configure.ac | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit 2723371b2e2f7684301ea1c5272ab49851f28c03 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 6 21:19:46 2014 +0930 + + make autogen.sh work with variables with spaces + + eg ./autogen.sh CXXFLAGS="-O0 -g3" + + autogen.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ebc814a7e31511308bbcd8856d0356f4d7cc74be +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Sep 14 11:45:12 2014 +0200 + + Add compile to .gitignore + + Automake automatically creates a wrapper script called 'compile' for + compilers which do not understand '-c -o'. + + $ automake --version + automake (GNU automake) 1.14.1 + + https://bugs.freedesktop.org/show_bug.cgi?id=83840 + + .gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 8ce31485faa26994c52f4d032cc5a8355aba23d1 +Merge: 4589ce1 303287e +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 26 00:40:43 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit 303287ebdad0de9fb2655c4d7eab627c0045ea04 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Sep 26 00:25:38 2014 +0200 + + Fix rendering of file with a wrong embedded font + + Bug #84270 + + fofi/FoFiTrueType.cc | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +commit f94ba85a736b4c90c05e7782939f32506472658e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Sep 12 19:22:20 2014 +0200 + + glib: Fix use of uninitialized members in PopplerInputStream + + https://bugs.freedesktop.org/show_bug.cgi?id=82630 + + glib/poppler-input-stream.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 4589ce17caf94e7c5fa856906d3a8cc08e999d73 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Sep 12 19:22:20 2014 +0200 + + glib: Fix use of uninitialized members in PopplerInputStream + + https://bugs.freedesktop.org/show_bug.cgi?id=82630 + + glib/poppler-input-stream.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit fe67324d450c356b7c876cf50da705156112513a +Merge: e62e18e f74a596 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 21 21:39:52 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit f74a5964078224c01bd5642aabc928d185bb0b69 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 21 20:07:54 2014 +0200 + + 0.26.4 + + CMakeLists.txt | 2 +- + NEWS | 12 ++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 17 insertions(+), 5 deletions(-) + +commit ce92e4ccefc7dad79db7f0af7a792ffa47824849 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 21 20:03:42 2014 +0200 + + Update (C) years + + poppler/Annot.cc | 1 + + poppler/CairoOutputDev.cc | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 42315c28809e62da7872add917e82853cf8c7e33 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 21 19:58:35 2014 +0200 + + Make sure e is always initialized + + goo/gfile.cc | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +commit e62e18e1b318d6fa664d236723de3c06ae43e86b +Author: Jehan Pagès <jehan@zemarmot.net> +Date: Tue Aug 12 21:05:03 2014 +0200 + + poppler: use poppler-data pkg-config for both cmake and autotools + builds + + CMakeLists.txt | 16 ++++++++++++++++ + config.h.cmake | 2 +- + configure.ac | 7 ++++++- + 3 files changed, 23 insertions(+), 2 deletions(-) + +commit 572c60764bbbd2080bfd7a926c646ad20b467aea +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Aug 12 18:12:45 2014 +0200 + + Makefile.am cleanups + + Bug #79411 + + configure.ac | 13 +++-- + cpp/Makefile.am | 66 +++++++++++++------------ + cpp/tests/Makefile.am | 13 ++--- + fofi/Makefile.am | 6 +-- + glib/Makefile.am | 29 ++++++----- + glib/demo/Makefile.am | 18 +++---- + glib/reference/Makefile.am | 3 +- + goo/Makefile.am | 38 +++++++-------- + poppler/Makefile.am | 118 + ++++++++++++++++++++++----------------------- + qt4/demos/Makefile.am | 59 +++++++++++------------ + qt4/src/Makefile.am | 31 ++++++------ + qt4/tests/Makefile.am | 97 +++++++++++++------------------------ + qt5/demos/Makefile.am | 59 +++++++++++------------ + qt5/src/Makefile.am | 27 ++++++----- + qt5/tests/Makefile.am | 98 ++++++++++++++----------------------- + splash/Makefile.am | 42 ++++++++-------- + test/Makefile.am | 68 +++++++++----------------- + utils/Makefile.am | 97 ++++++++++++++++++------------------- + 18 files changed, 405 insertions(+), 477 deletions(-) + +commit 4a4fe80d85a31b10822c7cd8eb5a0698bf306a52 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Aug 1 07:16:36 2014 +0200 + + glib-demo: Replace use of deprecated gtk stock items + + https://bugs.freedesktop.org/show_bug.cgi?id=82384 + + glib/demo/annots.c | 8 ++++---- + glib/demo/attachments.c | 4 ++-- + glib/demo/main.c | 6 +++--- + glib/demo/page.c | 6 +++--- + glib/demo/utils.c | 4 ++-- + 5 files changed, 14 insertions(+), 14 deletions(-) + +commit ec6bad36cf5e9521f35285a3295976c05a69f76a +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Aug 1 07:51:10 2014 +0200 + + glib-demo: Remove use of deprecated gtk_dialog_get_action_area() + + https://bugs.freedesktop.org/show_bug.cgi?id=82385 + + glib/demo/main.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +commit b72a534d6c7d8bc026812b68f9d9ac6bf9a2200a +Merge: f2e4154 ef3f758 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 3 01:06:57 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit ef3f7585fac086de0919aa0bb0ef91a5070ac23e +Author: Jiri Slaby <jirislaby@gmail.com> +Date: Sun Aug 3 01:05:00 2014 +0200 + + Improve non-latin characters in inline notes + + Preview commit had by mistake changes in these two files that + belong here + + Bug #65956 + + poppler/Annot.cc | 1 + + poppler/CharCodeToUnicode.cc | 1 + + 2 files changed, 2 insertions(+) + +commit 1b9c54286a4cdfaa284795933c20acf3c7e13bfc +Author: Ed Porras <ed@moto-research.com> +Date: Sun Aug 3 01:01:35 2014 +0200 + + Don't check for inlineImg twice + + Bug #82059 + + poppler/Annot.cc | 2 +- + poppler/CharCodeToUnicode.cc | 2 +- + poppler/SplashOutputDev.cc | 9 ++++----- + 3 files changed, 6 insertions(+), 7 deletions(-) + +commit f2e4154eff52b86e62490a3ccba470824c9cf436 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Jul 26 00:12:37 2014 +0200 + + pdfseparate: additonal handling for annotations + + Bug #77549 + + poppler/PDFDoc.cc | 46 ++++++++++++++++++++++++++++------------------ + poppler/PDFDoc.h | 6 +++--- + utils/pdfunite.cc | 2 +- + 3 files changed, 32 insertions(+), 22 deletions(-) + +commit e7825f7cbbe7cc9c324fcb34c2e0dcae75f4172a +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 25 15:45:55 2014 +0200 + + glib: Fix a memory leak when getting text layout and attributes + + glib/poppler-page.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit b729bf92ea1522a1eed9579e53e7580215cb9555 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 25 15:45:55 2014 +0200 + + glib: Fix a memory leak when getting text layout and attributes + + glib/poppler-page.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit a1ecff0f0ab81fe76f63244250d96e7ef275f402 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 25 11:25:42 2014 +0200 + + glib: Return NULL in poppler_annot_get_contents also for empty strings + + glib/poppler-annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ab1113d10ef712c7c44cd4b4bb6bc79f9ca3702c +Author: Anuj Khare <khareanuj18@gmail.com> +Date: Thu Jul 24 19:47:22 2014 +0200 + + annots: Fix a crash when adding annot without contents + + Having no content in an annotation results in a crash when generating + its appearance, since the contents pointer is dereferenced. + For consistency, the same has been done in Annot::initialize. + + poppler/Annot.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit f302864ed354b313ec39433f65ca3b107b55789d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Jul 25 11:25:42 2014 +0200 + + glib: Return NULL in poppler_annot_get_contents also for empty strings + + glib/poppler-annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 13a5c5f4b61d05f2d18f94ad15e210a47021a576 +Author: Anuj Khare <khareanuj18@gmail.com> +Date: Thu Jul 24 19:47:22 2014 +0200 + + annots: Fix a crash when adding annot without contents + + Having no content in an annotation results in a crash when generating + its appearance, since the contents pointer is dereferenced. + For consistency, the same has been done in Annot::initialize. + + poppler/Annot.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 94ea9d8e1631abfbb8cc078100942d46b1356970 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 24 10:46:17 2014 +0200 + + cairo: Make sure we always push a transparency group in + setSoftMaskFromImageMask() + + Because that's what unsetSoftMaskFromImageMask() assumes. + + https://bugs.freedesktop.org/show_bug.cgi?id=81624 + + poppler/CairoOutputDev.cc | 64 + +++++++++++++++++++++++------------------------ + 1 file changed, 31 insertions(+), 33 deletions(-) + +commit 02c127b355bb8a98684a5d0af063c60b8bfd09dd +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Thu Jul 24 10:46:17 2014 +0200 + + cairo: Make sure we always push a transparency group in + setSoftMaskFromImageMask() + + Because that's what unsetSoftMaskFromImageMask() assumes. + + https://bugs.freedesktop.org/show_bug.cgi?id=81624 + + poppler/CairoOutputDev.cc | 64 + +++++++++++++++++++++++------------------------ + 1 file changed, 31 insertions(+), 33 deletions(-) + +commit c841a703c4c1750fd7ac0d04c6c3e7d4af80b8fa +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 21 00:29:28 2014 +0200 + + Improve Overprintmode and shadings + + Bug #80998 + + poppler/SplashOutputDev.cc | 6 ++++-- + poppler/SplashOutputDev.h | 8 +++++++- + splash/Splash.cc | 24 ++++++++++++++++++++++-- + splash/SplashPattern.h | 6 +++++- + 4 files changed, 38 insertions(+), 6 deletions(-) + +commit ce782112746f629a8e7be6f2daf6ece6ab19917d +Merge: 2c0cb68 26372cf +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 20 20:35:13 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit 26372cfae029a1124e042855c58bf5b70f281c76 +Author: Ed Porras <ed@moto-research.com> +Date: Sun Jul 20 20:33:48 2014 +0200 + + printf -> error + + Bug #81513 + + poppler/Catalog.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 87d12c09281e3d12cda0fadcd65ab78928dff283 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 20 18:20:57 2014 +0200 + + 0.26.3 + + CMakeLists.txt | 2 +- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +commit 69e5b81640c9bb31f0876fa8eb7ba28dbf38923f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 20 18:18:29 2014 +0200 + + News for 0.26.3 + + NEWS | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +commit c368c0714d57c089057d974908295d850a1b5108 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jul 20 18:15:22 2014 +0200 + + Update Thomas' (C) + + splash/SplashXPathScanner.cc | 2 +- + splash/SplashXPathScanner.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 639179318c43a907a27e86778b720d33d481a9f9 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jul 17 07:33:10 2014 +0200 + + glib: use C90-style comments in public headers + + glib/poppler-media.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2c0cb689910e8579bf428b3999bcac0cb27b0e51 +Merge: 0b639cd 1161e72 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jul 12 17:21:07 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit 1161e728de9ca7c9a5fb0e24c4a5e4a79c65a849 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Jul 12 17:04:42 2014 +0200 + + Error out instead of exiting if allInter grows too much + + Bug #78714 + + splash/SplashXPathScanner.cc | 25 +++++++++++++++++-------- + splash/SplashXPathScanner.h | 2 +- + 2 files changed, 18 insertions(+), 9 deletions(-) + +commit e82a24a585d251f767725f61700dc1f8fe169a52 +Author: Pino Toscano <pino@kde.org> +Date: Sat Jul 12 08:35:45 2014 +0200 + + cmake: sync poppler-config.h.cmake with poppler-config.h.in + + poppler/poppler-config.h.cmake | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 0b639cd2ac1071f5b741031a78d8e2bc18d2b7d7 +Merge: bb16c71 a5ad55b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 11 00:32:46 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit a5ad55b7cb9dc4e62754954291e4ecb8e05b5d67 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 11 00:32:07 2014 +0200 + + Add Hib's (C) + + poppler/poppler-config.h.in | 1 + + 1 file changed, 1 insertion(+) + +commit 4f4ee736075d5b1d1bf4911a26c2f80a7122fe04 +Author: Aki Koskinen <freedesktop@akikoskinen.info> +Date: Fri Jul 11 00:30:52 2014 +0200 + + Fix compilation of Qt5 frontend with MinGW + + qt5/src/poppler-private.h | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit ddd91675792d9d496b06223867e05d2a190b878b +Author: Hib Eris <hib@hiberis.nl> +Date: Thu May 29 16:58:55 2014 +0200 + + Include stdio.h from poppler-config.h + + In poppler-config.h there is a check for __MINGW_PRINTF_FORMAT, + which is set by stdio.h. + + This fixes this warning when compling with the mingw-w64-compiler: + + XRef.cc: In member function 'virtual void + XRef::XRefTableWriter::writeEntry(Goffset, int, XRefEntryType)': + XRef.cc:1460:94: warning: unknown conversion type character 'l' + in format [-Wformat=] + outStr->printf("%010lli %05i %c\r\n", (long long)offset, gen, + (type==xrefEntryFree)?'f':'n'); + ^ + XRef.cc:1460:94: warning: format '%i' expects argument of type 'int', + but argument 3 has type 'Goffset {aka long long int}' [-Wformat=] + XRef.cc:1460:94: warning: too many arguments for format + [-Wformat-extra-args] + + https://bugs.freedesktop.org/show_bug.cgi?id=79762 + + poppler/poppler-config.h.in | 2 ++ + 1 file changed, 2 insertions(+) + +commit bb16c7162c73b871e26f508823c0ee259b7e5420 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 7 12:00:52 2014 +0200 + + Move automake version check from autogen.sh to configure.ac + + https://bugs.freedesktop.org/show_bug.cgi?id=79797 + + autogen.sh | 18 ------------------ + configure.ac | 2 +- + 2 files changed, 1 insertion(+), 19 deletions(-) + +commit 74c72223cf609e7c24594f95cab6f9865ad562ac +Merge: f8f7b3a 47a947f +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 11 00:23:04 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit 47a947f1dc664793a7037888a46a297a46c79d6c +Author: Hib Eris <hib@hiberis.nl> +Date: Thu Jun 19 10:11:21 2014 +0200 + + Fix moc-qt5 detection + + https://bugs.freedesktop.org/show_bug.cgi?id=80250 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f8f7b3a61bc7eb1e569c25a630b5e127b5dcae62 +Merge: 805ff76 aa6205d +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jul 9 00:23:22 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit aa6205d195c56a77e897bad125bf213aba138422 +Author: Jason Crain <jason@aquaticape.us> +Date: Mon Jul 7 23:52:39 2014 -0500 + + Increase required Qt4 version to 4.7.0 + + We use Qt::LayoutDirectionAuto, introduced in 4.7.0. + + bug #81005 + + CMakeLists.txt | 2 +- + configure.ac | 8 ++++---- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 805ff76112ebfd57276ea78f1f0891abc61a6c03 +Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net> +Date: Mon Apr 11 16:26:11 2011 -0500 + + Do not dist gir_DATA + + See https://bugzilla.gnome.org/show_bug.cgi?id=621611 for rationale. + + glib/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit e5862155b1c549b6774bb4f25c09c45857ff1734 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jun 4 20:58:56 2014 +0200 + + Add Changelog to .gitignore + + https://bugs.freedesktop.org/show_bug.cgi?id=79744 + + .gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 5f22649694d64c4170db82847b599576d5377176 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jun 4 20:56:23 2014 +0200 + + Add *.gir, *.typelib to glib/.gitignore + + https://bugs.freedesktop.org/show_bug.cgi?id=79744 + + glib/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit b63f57985719c7884b67f46fc4afd4954c44c5ab +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jun 4 20:54:30 2014 +0200 + + Add poppler-undeclared.txt to .gitignore + + https://bugs.freedesktop.org/show_bug.cgi?id=79744 + + glib/reference/.gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 5e0f4e2516d5a3997ea9c9a9927e24d4f3abe136 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jun 4 20:52:15 2014 +0200 + + Add poppler-forms, stress-threads-qt, test-render-to-file to + .gitignore + + https://bugs.freedesktop.org/show_bug.cgi?id=79744 + + qt4/tests/.gitignore | 3 +++ + qt5/tests/.gitignore | 3 +++ + 2 files changed, 6 insertions(+) + +commit 4d2400e7bb8ae9208030b9615dda7c53e571be8b +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jun 4 10:09:16 2014 +0200 + + Add test-driver to .gitignore + + https://bugs.freedesktop.org/show_bug.cgi?id=79744 + + .gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 4c35e0213be26f21b628ff8d9f170252bb0106c9 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Jun 4 10:06:20 2014 +0200 + + Add poppler-qt5.pc to .gitignore + + https://bugs.freedesktop.org/show_bug.cgi?id=79744 + + .gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit 2b455b85168d5c9d8641d9a91bfde81ccab18e54 +Author: Pino Toscano <pino@kde.org> +Date: Sun Jul 6 11:13:54 2014 +0200 + + glib: fix typo in apidox + + glib/poppler.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 266a61ab1c9f536a4fb7d68c8f285c854eb2d6e9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jun 19 20:16:19 2014 +0200 + + 0.26.2 + + CMakeLists.txt | 2 +- + NEWS | 10 ++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 15 insertions(+), 5 deletions(-) + +commit 3381ee20efca2ce27733182d0d6720c1e6936a7f +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jun 19 19:57:31 2014 +0200 + + Update (C) + + poppler/Lexer.cc | 2 +- + utils/pdftohtml.cc | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 8a5e59c6ea7ccd0ecbdb4b37bf3fe4e74e1c0e8e +Merge: 1b70533 310fbee +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 18 00:37:03 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit 310fbeec692b02d555e3e8dd6c851be11b25e26a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 18 00:31:48 2014 +0200 + + Make sure we have an xref before using + + KDE bug #335413 had this backtrace + XRef::getNumEntry (this=0x0, offset=-1) at XRef.cc:1300 + 0x00007f29aec1681e in Lexer::getObj (this=0x1648760, + obj=obj@entry=0x1bdf978, cmdA=cmdA@entry=0x7f29aeca66c8 "endstream", + objNum=objNum@entry=0) at Lexer.cc:594 + 0x00007f29aec20dfd in Parser::shift (this=this@entry=0x1bdf950, + cmdA=cmdA@entry=0x7f29aeca66c8 "endstream", objNum=objNum@entry=0) + at Parser.cc:323 + 0x00007f29aec20fde in Parser::makeStream (this=this@entry=0x1bdf950, + dict=dict@entry=0x7fff2541cad0, fileKey=fileKey@entry=0x0, + encAlgorithm=encAlgorithm@entry=cryptRC4, keyLength=keyLength@entry=0, + objNum=objNum@entry=0, objGen=objGen@entry=0, + recursion=recursion@entry=1, strict=strict@entry=false) at + Parser.cc:245 + 0x00007f29aec216b8 in Parser::getObj (this=this@entry=0x1bdf950, + obj=obj@entry=0x7fff2541cad0, simpleOnly=simpleOnly@entry=false, + fileKey=fileKey@entry=0x0, encAlgorithm=encAlgorithm@entry=cryptRC4, + keyLength=keyLength@entry=0, objNum=objNum@entry=0, + objGen=objGen@entry=0, recursion=recursion@entry=0, + strict=strict@entry=false) at Parser.cc:131 + 0x00007f29aec350fc in XRef::readXRef + (this=this@entry=0xfe43a0, pos=pos@entry=0xfe4438, + followedXRefStm=followedXRefStm@entry=0x7fff2541cb30, + xrefStreamObjsNum=xrefStreamObjsNum@entry=0x0) at XRef.cc:551 + 0x00007f29aec35319 in XRef::XRef (this=0xfe43a0, + strA=0x1c54ff0, pos=<optimized out>, mainXRefEntriesOffsetA=0, + wasReconstructed=0x7fff2541cbaf, reconstruct=<optimized out>) + at XRef.cc:342 + 0x00007f29aec2534f in PDFDoc::setup (this=this@entry=0x311e1b0, + ownerPassword=ownerPassword@entry=0x1165830, + userPassword=userPassword@entry=0x447f550) at PDFDoc.cc:262 + + poppler/Lexer.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1b705331019b155f2138d4b9f5a5bd03ec59193d +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 17:07:15 2014 +0200 + + [glib] doc: Move poppler_date_parse to utility functions section + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/reference/poppler-docs.sgml | 1 + + glib/reference/poppler-sections.txt | 7 ++++++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +commit d661553b0a13855aa5a1240e9c04a0e49dafd910 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 16:11:26 2014 +0200 + + [glib] doc: Document PopplerFindFlags:POPPLER_FIND_DEFAULT + + Fixes warning: + DOC Building XML + ../../glib/poppler.h:157: warning: Value description for + PopplerFindFlags::POPPLER_FIND_DEFAULT is missing in source code + comment + block. + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/poppler.h | 1 + + 1 file changed, 1 insertion(+) + +commit 237a1402ab836d10eb5fdc1aa6ceccabea10a316 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 16:07:14 2014 +0200 + + [glib] doc: Use <emphasis> instead of <em> + + Fixes: + DOC Building HTML + Element em in namespace '' encountered in para, but no template + matches. + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/poppler-structure-element.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 66abf3992228be2559542e9d2753f45f06ae7728 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 16:02:01 2014 +0200 + + [glib] doc: Add PopplerBackend documentation + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/poppler.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit a30ec8e4abe3875aad068c83265b47f9beea33d1 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 15:05:52 2014 +0200 + + [glib] doc: Add missing POPPLER_TYPE_POINT + + And while we are here, also move poppler_point_get_type() and + poppler_quadrilateral_get_type() to private subsection. + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/reference/poppler-sections.txt | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 6eb0537ac5163356c8e8f689d2408fa695e99423 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 14:59:15 2014 +0200 + + [glib] doc: Fix typo + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/reference/poppler-sections.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 96adcad85d76409cb8ed4266a08ae776b42661e4 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 14:53:42 2014 +0200 + + [glib] doc: Add poppler_annot_set_flags() to documentation + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/reference/poppler-sections.txt | 1 + + 1 file changed, 1 insertion(+) + +commit f3519352c70537009cc6bd660c0bd3e727db8b8a +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 14:38:13 2014 +0200 + + [glib] doc: Move PopplerFindFlags to PopplerPage section + + And also add the missing POPPLER_TYPE_FIND_FLAGS and + poppler_find_flags_get_type. + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/reference/poppler-sections.txt | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 45b0d49330d9d089b2480b91e418924a490c82ce +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 14:22:28 2014 +0200 + + [glib] doc: Move PopplerPrintFlags to PopplerPage section + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/reference/poppler-sections.txt | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit ce357147d17004a2772ca3b32d106da511bba360 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 13:22:51 2014 +0200 + + [glib] doc: Move poppler_get_{version, backend} documentation to + features section + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/reference/poppler-sections.txt | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +commit 1bfd6b69e7e98d4b3e6e891a46b58c9109b8c14c +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 8 12:57:25 2014 +0200 + + [glib] doc: Move PopplerColor documentation to it's own section + + https://bugs.freedesktop.org/show_bug.cgi?id=79798 + + glib/poppler-page.cc | 6 ++++++ + glib/reference/poppler-docs.sgml | 1 + + glib/reference/poppler-sections.txt | 21 +++++++++++++++------ + 3 files changed, 22 insertions(+), 6 deletions(-) + +commit 2dd9b95fd910023a7d9d23f2c2e41dcab91d3c31 +Merge: fed71eb b36d27b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jun 6 21:43:49 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit b36d27b42417d15866a5729409e39d6f7c2b0289 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Jun 6 21:42:10 2014 +0200 + + Fix typo in configure.ac + + Bug #79742 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fed71ebd8e43e24eace9dcebe24bd318ff3d04a6 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu May 29 13:22:05 2014 +0200 + + Change pagenum arguments in PDFDoc::markAnnotations from Guint to int + + Bug #79410 + Fixes compile warning: + + CXX PDFDoc.lo + PDFDoc.cc: In member function 'GBool PDFDoc::markAnnotations(Object*, + XRef*, XRef*, Guint, Guint, Guint)': + PDFDoc.cc:1607:40: warning: comparison between signed and unsigned + integer expressions [-Wsign-compare] + if (obj2.getRef().num == oldPageNum) { + ^ + PDFDoc.cc:1617:47: warning: comparison between signed and unsigned + integer expressions [-Wsign-compare] + } else if (obj2.getRef().num == newPageNum) { + + https://bugs.freedesktop.org/show_bug.cgi?id=79410 + + poppler/PDFDoc.cc | 4 ++-- + poppler/PDFDoc.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit f5e702060a84362bfdf75260531920d4ba8b7333 +Author: Pino Toscano <pino@kde.org> +Date: Sat May 24 15:59:42 2014 +0200 + + pdftohtml: exit with 0 with -v and -h + + utils/pdftohtml.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 700bf398ef7b20306f5035e423becfaa3d28fb10 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 23 20:05:41 2014 +0200 + + 0.26.1 + + CMakeLists.txt | 2 +- + NEWS | 12 ++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 17 insertions(+), 5 deletions(-) + +commit 93373cd113d046b65538fe983b46842d689a2112 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 11 18:31:10 2014 +0200 + + Qt: Add a new page->annotations() call that let's you specify subtypes + + This way we don't return annotations you may not be interested in + + qt4/src/poppler-annotation-private.h | 4 +-- + qt4/src/poppler-annotation.cc | 48 + ++++++++++++++++++++++++++++++++++-- + qt4/src/poppler-page.cc | 7 +++++- + qt4/src/poppler-qt4.h | 14 +++++++++++ + qt5/src/poppler-annotation-private.h | 4 +-- + qt5/src/poppler-annotation.cc | 48 + ++++++++++++++++++++++++++++++++++-- + qt5/src/poppler-page.cc | 7 +++++- + qt5/src/poppler-qt5.h | 15 +++++++++++ + 8 files changed, 137 insertions(+), 10 deletions(-) + +commit d2892cd893e4379914a08e66682ed5c423743a41 +Merge: 0844220 7e9fc61 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 7 22:27:41 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit 7e9fc61e287889eefd6b08ef5991d31fed79cafd +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 7 22:25:59 2014 +0200 + + Fix libopenjpeg 1.5 detection on some systems + + Someone somewhere decided the pc file will be called libopenjpeg1 + instead of libopenjpeg + + Bug #78389 + + configure.ac | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 0844220347f984c3d9b04fe53e690ee0e8c74afe +Merge: 84278d8 0a6c1ff +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed May 7 21:56:07 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit 0a6c1ff777aa23c7a5654b313b639e66600883b9 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed May 7 21:54:46 2014 +0200 + + Only add annotations of the current page when splitting + + Bug #77549 + + poppler/PDFDoc.cc | 153 + +++++++++++++++++++++++++++++++++++++++++++++++++++++- + poppler/PDFDoc.h | 4 +- + utils/pdfunite.cc | 9 +++- + 3 files changed, 162 insertions(+), 4 deletions(-) + +commit 84278d8adbb1f6e9a28588fcb4db30c9ef70adde +Merge: 7b94b11 5b2cdef +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 4 22:21:25 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit 5b2cdef49a8a0a92fd323fbe45841a5098a42ece +Author: Olly Betts <olly@survex.com> +Date: Sun May 4 22:20:30 2014 +0200 + + Fix extraction of text in some files + + Bug #78145 + + poppler/GfxFont.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7b94b119f07713af7b8b9f1ac3ea3f1d35c1e240 +Merge: c859d2b bae836c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun May 4 16:21:24 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.26' + +commit bae836cd3dd3511ca9cf4745626142334bafd1a6 +Author: Marek Kasik <mkasik@redhat.com> +Date: Sun May 4 16:20:33 2014 +0200 + + Use field value V for radio buttons + + Turn on radio button only if its appearance state is equal to + the value + of name object "V" of the field. + + Bug #75979 + + poppler/Annot.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit a748b3a059938e6ae98b51eb82bab7c33a5e23c7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Apr 30 09:25:31 2014 +0200 + + glib: Fix multiple definition of PopplerTextSpan + + https://bugs.freedesktop.org/show_bug.cgi?id=78103 + + glib/poppler-structure-element.h | 3 --- + 1 file changed, 3 deletions(-) + +commit c859d2b891a115c79d04db14463791dfb1c46a20 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Apr 30 09:25:31 2014 +0200 + + glib: Fix multiple definition of PopplerTextSpan + + https://bugs.freedesktop.org/show_bug.cgi?id=78103 + + glib/poppler-structure-element.h | 3 --- + 1 file changed, 3 deletions(-) + +commit 9a68daee2b3c7f8a992ee47c0e9ac78b346d4348 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Apr 25 01:01:08 2014 +0200 + + 0.26.0 + + CMakeLists.txt | 4 ++-- + NEWS | 13 +++++++++++++ + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 20 insertions(+), 7 deletions(-) + +commit 8073852c84b71257d487aa8a46e441aa82f4b42c +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Mon Apr 14 23:35:50 2014 +0200 + + qt: Fix missing ! in TextAnnotation::setInplaceIntent + + CID #16814 + + qt4/src/poppler-annotation.cc | 2 +- + qt5/src/poppler-annotation.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 1fbf98664c0879ac035a63602242a910c0c1d316 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Apr 14 11:53:59 2014 +0200 + + Initialize tmpBufLen + + CID #16957 + + It isn't really needed since locateFont always returns a fontLoc + with a non null + path if fontLoc itself is not null, but it doesn't hurt either + + qt4/src/ArthurOutputDev.cc | 4 ++-- + qt5/src/ArthurOutputDev.cc | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit b3e5c582a279b1b8d8309322ac3f4d0e51831f77 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 10 23:38:09 2014 +0200 + + Remove unused member + + cpp/poppler-font.cpp | 2 -- + 1 file changed, 2 deletions(-) + +commit b86f471c43e387cf873358cf3cbcd27470646713 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 10 22:50:56 2014 +0200 + + 0.25.3 + + CMakeLists.txt | 2 +- + NEWS | 19 +++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/CairoOutputDev.cc | 2 +- + poppler/GfxFont.cc | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/poppler-optcontent.cc | 2 +- + qt5/src/Doxyfile | 2 +- + qt5/src/poppler-optcontent.cc | 2 +- + qt5/src/poppler-private.cc | 2 +- + qt5/src/poppler-private.h | 2 +- + 12 files changed, 30 insertions(+), 11 deletions(-) + +commit 80107c72ac03bf4d00b2d71d6f947c139ea84ab5 +Author: Pino Toscano <pino@kde.org> +Date: Sun Apr 6 20:17:31 2014 +0200 + + qt5: remove m_fontInfoIterator from Document + + it was used by the deprecated scanForFonts API, which was not provided + in poppler-qt5 + + qt5/src/poppler-private.cc | 2 -- + qt5/src/poppler-private.h | 2 -- + 2 files changed, 4 deletions(-) + +commit b8325316e41fb03eb5fac5c80d6a550fe9ce9695 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 16:05:51 2014 +0200 + + Fix memory leak + + CID #16943 + + utils/pdfseparate.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ca9713118d6ce3fdd245f9ca4f595229a5be19c3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 15:59:43 2014 +0200 + + Don't check twice for the same variable ^_^ + + CID #16804 + + splash/Splash.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 0ef290a7c5a8fa54d3fe0f646abdf098443a7a67 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 15:57:38 2014 +0200 + + Fix memory leak + + CID #16852 + + splash/Splash.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8810b8917fded340b784873a91ca025b0bb49f3d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 15:49:18 2014 +0200 + + Fix Out-of-bounds read + + CID #16844 + + poppler/PageLabelInfo_p.h | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 9309907673e8557a25021dce79d9b4354640e2d0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 15:35:00 2014 +0200 + + Fix memory leak + + Don't pass new'ed GooStrings as parameters to error() + + CID #16915 + + poppler/GfxFont.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit a511005584a38217fed582ced6ce2c937526cf96 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 15:28:50 2014 +0200 + + Fix Uninitialized pointer read when nFucnsA is 0 + + CID #16965 + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 26b961a64030d91c5db2769dcd0ab8dff7b9b6a6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 15:23:35 2014 +0200 + + gfree -> delete since it was new'ed + + CID #16786 + + poppler/JBIG2Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 814ac2230b594cce3b871588804dd92f4a187e7e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 15:22:13 2014 +0200 + + delete -> gfree since it was gmaloced + + CID #16785 + + poppler/JBIG2Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b496b6665803247b10b018ae939a2a452fa4a48f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 15:17:50 2014 +0200 + + Fix memory leak + + CID #16864 + + poppler/SplashOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 1b612f355e9f29fa93c15a9de1188049a8e086b6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 6 15:14:50 2014 +0200 + + Fix memory leak + + CID #16853 + + poppler/XRef.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 07621ebbda8ab85cf4cd76a6092efc67aa14454d +Merge: 8d3a2c9 9fcd46a +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 15:49:31 2014 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 9fcd46ac4a94f138981ec5afaab3875918c6a175 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 15:48:27 2014 +0200 + + qt4/qt5: remove extra qDebug + + qt4/src/poppler-optcontent.cc | 1 - + qt5/src/poppler-optcontent.cc | 1 - + 2 files changed, 2 deletions(-) + +commit 37286ee2923de060ae463ac6b178ffd0e6096b90 +Author: Pino Toscano <pino@kde.org> +Date: Sat Apr 5 15:46:44 2014 +0200 + + qt4/qt5: fix some kinds of OCG models + + properly pass parent and child when building the tree + + qt4/src/poppler-optcontent.cc | 2 +- + qt5/src/poppler-optcontent.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 8d3a2c9d007052bcb8719200760a1abb6314f804 +Author: Peter Breitenlohner <peb@mppmu.mpg.de> +Date: Sun Mar 30 23:34:23 2014 +0200 + + Avoid MinGW/Cygwin warnings due to redefinition of NOMINMAX + + goo/GooMutex.h | 3 +++ + goo/GooTimer.h | 5 ++++- + goo/gfile.h | 5 ++++- + poppler/XpdfPluginAPI.h | 3 +++ + 4 files changed, 14 insertions(+), 2 deletions(-) + +commit 38dcaf96f308265ff6958e4683bcec2be0c254b9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Mar 28 20:49:17 2014 +1030 + + cairo: fix segv cause by bad image stream + + bug 76445 + + poppler/CairoOutputDev.cc | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +commit 07b0a038b194eb0392a1e9a4236064d37247d687 +Author: Jakub Wilk <jwilk@jwilk.net> +Date: Sun Mar 30 16:12:28 2014 +0200 + + pdftohtml: Fix typo in manpage + + utils/pdftohtml.1 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ac3c8303396a0b8de5e4ad32f480b8da5f3b396e +Author: Thomas Liebetraut <thomas@tommie-lie.de> +Date: Sun Mar 30 12:25:26 2014 +0200 + + glib: Fix the first coord of the qudrilateral in + create_poppler_quads_from_annot_quads() + + https://bugs.freedesktop.org/show_bug.cgi?id=76504 + + glib/poppler-annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 82d69da7c2f67e774c51fb7b146fdf639a6b9616 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 28 15:53:22 2014 +0100 + + Fix error reported by ASAN in 3628.asan.0.3910.pdf + + ==20743== ERROR: AddressSanitizer: heap-buffer-overflow on + address 0x60040005c6ef at pc 0x7f8912ca0c90 bp 0x7fff8509ee20 sp + 0x7fff8509ee18 + READ of size 1 at 0x60040005c6ef thread T0 + #0 0x7f8912ca0c8f in expandRow(unsigned char*, unsigned char*, + int, int, int) /home/tsdgeos/devel/poppler/splash/Splash.cc:4855 + #1 0x7f8912ca1097 in Splash::scaleImageYuXuBilinear(bool + (*)(void*, unsigned char*, unsigned char*), void*, + SplashColorMode, int, bool, int, int, int, int, SplashBitmap*) + /home/tsdgeos/devel/poppler/splash/Splash.cc:4897 + #2 0x7f8912c9d2b7 in Splash::scaleImage(bool + (*)(void*, unsigned char*, unsigned char*), void*, + SplashColorMode, int, bool, int, int, int, int, bool, bool) + /home/tsdgeos/devel/poppler/splash/Splash.cc:4127 + #3 0x7f8912c98101 in Splash::drawImage(bool + (*)(void*, unsigned char*, unsigned char*), void*, + SplashColorMode, bool, int, int, double*, bool, bool) + /home/tsdgeos/devel/poppler/splash/Splash.cc:3726 + #4 0x7f8912c7056a in + SplashOutputDev::drawSoftMaskedImage(GfxState*, + Object*, Stream*, int, int, GfxImageColorMap*, + bool, Stream*, int, int, GfxImageColorMap*, bool) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:3630 + #5 0x7f8912ac7aa7 in Gfx::doImage(Object*, Stream*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4646 + #6 0x7f8912ac4de0 in Gfx::opXObject(Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 + #7 0x7f8912a9f33a in Gfx::execOp(Object*, Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 + #8 0x7f8912a9e50f in Gfx::go(bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 + #9 0x7f8912a9e163 in Gfx::display(Object*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 + #10 0x7f8912b80e13 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:585 + #11 0x7f8912b8833f in PDFDoc::displayPageSlice(OutputDev*, + int, double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #12 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #13 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #14 0x7f89121a8ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #15 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + splash/Splash.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 38ec8cbeeaf69d96b9d7bcd662187c8916cf7903 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 28 11:18:02 2014 +0100 + + Fix error reported by ASAN in 5782.asan.0.7113.pdf + + ==32161== ERROR: AddressSanitizer: heap-buffer-overflow on + address 0x6008000e3bcf at pc 0x7f66bae0e117 bp 0x7fffcb54ea70 sp + 0x7fffcb54ea68 + READ of size 1 at 0x6008000e3bcf thread T0 + #0 0x7f66bae0e116 in GooString::getChar(int) + /home/tsdgeos/devel/poppler/goo/GooString.h:119 + #1 0x7f66bafb5dca in LinkURI::LinkURI(Object*, GooString*) + /home/tsdgeos/devel/poppler/poppler/Link.cc:562 + #2 0x7f66bafb2a05 in LinkAction::parseAction(Object*, GooString*) + /home/tsdgeos/devel/poppler/poppler/Link.cc:98 + #3 0x7f66bae69c0e in AnnotLink::initialize(PDFDoc*, Dict*) + /home/tsdgeos/devel/poppler/poppler/Annot.cc:2621 + #4 0x7f66bae698d9 in AnnotLink::AnnotLink(PDFDoc*, Dict*, Object*) + /home/tsdgeos/devel/poppler/poppler/Annot.cc:2596 + #5 0x7f66bae8d998 in Annots::createAnnot(Dict*, Object*) + /home/tsdgeos/devel/poppler/poppler/Annot.cc:6737 + #6 0x7f66bae8d269 in Annots::Annots(PDFDoc*, int, Object*) + /home/tsdgeos/devel/poppler/poppler/Annot.cc:6683 + #7 0x7f66bafc750d in Page::getAnnots(XRef*) + /home/tsdgeos/devel/poppler/poppler/Page.cc:402 + #8 0x7f66bafc8e66 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:595 + #9 0x7f66bafd02fd in PDFDoc::displayPageSlice(OutputDev*, int, + double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #10 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #11 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #12 0x7f66ba5f0ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #13 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + poppler/Link.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit 49b4eb68ee646aefe49b70f9e2831ebf93576053 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 28 11:08:18 2014 +0100 + + Fix error reported by ASAN in 590.asan.0.7288.pdf + + ==31898== ERROR: AddressSanitizer: heap-use-after-free on + address 0x60ae0007432c at pc 0x7f03483026aa bp 0x7fff6ec0c820 sp + 0x7fff6ec0c818 + READ of size 4 at 0x60ae0007432c thread T0 + #0 0x7f03483026a9 in SplashFTFont::getGlyphPath(int) + /home/tsdgeos/devel/poppler/splash/SplashFTFont.cc:414 + #1 0x7f034829f681 in SplashOutputDev::drawChar(GfxState*, + double, double, double, double, double, + double, unsigned int, int, unsigned int*, int) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:2239 + #2 0x7f0348100599 in Gfx::doShowText(GooString*) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4054 + #3 0x7f03480fddb0 in Gfx::opShowSpaceText(Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:3886 + #4 0x7f03480dc33a in Gfx::execOp(Object*, Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 + #5 0x7f03480db50f in Gfx::go(bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 + #6 0x7f03480db163 in Gfx::display(Object*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 + #7 0x7f03481bddd1 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:585 + #8 0x7f03481c52fd in PDFDoc::displayPageSlice(OutputDev*, int, + double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #9 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #10 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #11 0x7f03477e5ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #12 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + splash/SplashFTFont.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 89a64b508e5f8445798c95fcec6c87180f6c9b73 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 28 00:35:17 2014 +0100 + + Fix error reported by ASAN in 2279.asan.0.1904.pdf + + ==20507== ERROR: AddressSanitizer: heap-buffer-overflow on + address 0x60420000ff04 at pc 0x7fa1492e8012 bp 0x7fff8406d900 sp + 0x7fff8406d8f8 + READ of size 4 at 0x60420000ff04 thread T0 + #0 0x7fa1492e8011 in SplashFTFont::makeGlyph(int, int, int, + SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) + /home/tsdgeos/devel/poppler/splash/SplashFTFont.cc:284 + #1 0x7fa1492eda32 in SplashFont::getGlyph(int, int, int, + SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) + /home/tsdgeos/devel/poppler/splash/SplashFont.cc:168 + #2 0x7fa1492e7c69 in SplashFTFont::getGlyph(int, int, int, + SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) + /home/tsdgeos/devel/poppler/splash/SplashFTFont.cc:233 + #3 0x7fa1492b3368 in Splash::fillChar(double, double, int, + SplashFont*) /home/tsdgeos/devel/poppler/splash/Splash.cc:2714 + #4 0x7fa149286a20 in SplashOutputDev::drawChar(GfxState*, + double, double, double, double, double, + double, unsigned int, int, unsigned int*, int) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:2270 + #5 0x7fa1490e7599 in Gfx::doShowText(GooString*) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4054 + #6 0x7fa1490e4db0 in Gfx::opShowSpaceText(Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:3886 + #7 0x7fa1490c333a in Gfx::execOp(Object*, Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 + #8 0x7fa1490c250f in Gfx::go(bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 + #9 0x7fa1490c2163 in Gfx::display(Object*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 + #10 0x7fa1491a4dd1 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:585 + #11 0x7fa1491ac2fd in PDFDoc::displayPageSlice(OutputDev*, + int, double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #12 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #13 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #14 0x7fa1487ccec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #15 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + splash/SplashFTFont.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5055479634dc8d0cd5afb3373de600fb121357fe +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 27 23:54:20 2014 +0100 + + Fix error reported by ASAN in 2010.asan.0.1506.pdf + + ==18859== ERROR: AddressSanitizer: unknown-crash on address + 0x7f1e4a6beb50 at pc 0x7f1e5557444d bp 0x7fff6af3c340 sp + 0x7fff6af3bb00 + WRITE of size 442216446 at 0x7f1e4a6beb50 thread T0 + #0 0x7f1e5557444c (/usr/lib/x86_64-linux-gnu/libasan.so.0+0xe44c) + #1 0x7f1e550e04ff in SplashFont::getGlyph(int, int, int, + SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) + /home/tsdgeos/devel/poppler/splash/SplashFont.cc:206 + #2 0x7f1e550d9c69 in SplashFTFont::getGlyph(int, int, int, + SplashGlyphBitmap*, int, int, SplashClip*, SplashClipResult*) + /home/tsdgeos/devel/poppler/splash/SplashFTFont.cc:233 + #3 0x7f1e550a5368 in Splash::fillChar(double, double, int, + SplashFont*) /home/tsdgeos/devel/poppler/splash/Splash.cc:2714 + #4 0x7f1e55078a20 in SplashOutputDev::drawChar(GfxState*, + double, double, double, double, double, + double, unsigned int, int, unsigned int*, int) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:2270 + #5 0x7f1e54ed9599 in Gfx::doShowText(GooString*) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4054 + #6 0x7f1e54ed6db0 in Gfx::opShowSpaceText(Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:3886 + #7 0x7f1e54eb533a in Gfx::execOp(Object*, Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 + #8 0x7f1e54eb450f in Gfx::go(bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 + #9 0x7f1e54eb4163 in Gfx::display(Object*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 + #10 0x7f1e54f96dd1 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:585 + #11 0x7f1e54f9e2fd in PDFDoc::displayPageSlice(OutputDev*, + int, double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #12 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #13 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #14 0x7f1e545beec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #15 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + splash/SplashFont.cc | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 3e7779935ec2610410bc4a42e9b0174e41ca9672 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 27 16:49:57 2014 +0100 + + Fix error reported by ASAN in 139.asan.0.581.pdf + + ==15244== ERROR: AddressSanitizer: SEGV on unknown address + 0x605df000f3ee (pc 0x7f1087b3a22e sp 0x7fffec30ff20 bp 0x7fffec30ff80 + T0) + AddressSanitizer can not provide additional info. + #0 0x7f1087b3a22d + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x48f22d) + #1 0x7f1087b19d92 + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x46ed92) + #2 0x7f1087ae570b + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x43a70b) + #3 0x7f1087ae4061 + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x439061) + #4 0x7f1087ab9b38 + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x40eb38) + #5 0x7f1087900989 + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x255989) + #6 0x7f10878f733a + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x24c33a) + #7 0x7f10878f650f + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x24b50f) + #8 0x7f10878f6163 + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x24b163) + #9 0x7f10879d8dd1 + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x32ddd1) + #10 0x7f10879e02fd + (/home/tsdgeos/devel/poppler/build-debug/libpoppler.so.46.0.0+0x3352fd) + #11 0x40311e + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x40311e) + #12 0x404416 + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x404416) + #13 0x7f1087000ec4 (/lib/x86_64-linux-gnu/libc-2.19.so+0x21ec4) + #14 0x401d58 + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + splash/SplashXPathScanner.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 23ad7fa5253a4fec6543d1435827aa1b59b62ced +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Mar 27 01:14:05 2014 +0100 + + 0.25.2 + + CMakeLists.txt | 4 ++-- + NEWS | 48 + +++++++++++++++++++++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + gtk-doc.make | 33 +++++++++++++++++++--------- + m4/gtk-doc.m4 | 47 + +++++++++++++++++++++++++++------------- + poppler/CairoOutputDev.h | 2 +- + poppler/Hints.cc | 2 +- + poppler/Makefile.am | 2 +- + poppler/PSOutputDev.cc | 3 ++- + poppler/PSOutputDev.h | 2 +- + poppler/StructElement.cc | 2 +- + poppler/StructElement.h | 2 +- + poppler/StructTreeRoot.cc | 2 +- + poppler/StructTreeRoot.h | 2 +- + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 2 +- + qt4/src/poppler-ps-converter.cc | 1 + + qt5/src/CMakeLists.txt | 2 +- + qt5/src/Doxyfile | 2 +- + qt5/src/Makefile.am | 2 +- + qt5/src/poppler-ps-converter.cc | 1 + + utils/pdftocairo.cc | 2 +- + utils/pdftops.cc | 1 + + 25 files changed, 127 insertions(+), 45 deletions(-) + +commit ec2f8bca9f48935d3180dab65ef2ca455a893afd +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 18:38:13 2014 +0100 + + Fix overflow malloc + + poppler/Stream.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 322e416451b7b33cba8fb3d4702207693c3c7921 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 17:58:48 2014 +0100 + + Fix error reported by ASAN in 1195.asan.0.293.pdf + + ==31060== ERROR: AddressSanitizer: heap-buffer-overflow on + address 0x60040002a215 at pc 0x7f5614cd96c4 bp 0x7fff54a44050 sp + 0x7fff54a44048 + READ of size 1 at 0x60040002a215 thread T0 + #0 0x7f5614cd96c3 in JBIG2Stream::readGenericBitmap(bool, + int, int, int, bool, bool, JBIG2Bitmap*, int*, int*, int) + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:3389 + #1 0x7f5614cce0e7 in JBIG2Stream::readSymbolDictSeg(unsigned + int, unsigned int, unsigned int*, unsigned int) + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1867 + #2 0x7f5614ccb8fe in JBIG2Stream::readSegments() + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1408 + #3 0x7f5614cca72e in JBIG2Stream::reset() + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1248 + #4 0x7f5614d1648b in ImageStream::reset() + /home/tsdgeos/devel/poppler/poppler/Stream.cc:484 + #5 0x7f5614de6578 in SplashOutputDev::drawImage(GfxState*, + Object*, Stream*, int, int, GfxImageColorMap*, bool, int*, bool) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:3158 + #6 0x7f5614c41d64 in Gfx::doImage(Object*, Stream*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4653 + #7 0x7f5614c3ede0 in Gfx::opXObject(Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 + #8 0x7f5614c1933a in Gfx::execOp(Object*, Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 + #9 0x7f5614c1850f in Gfx::go(bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 + #10 0x7f5614c18163 in Gfx::display(Object*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 + #11 0x7f5614cfae27 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:585 + #12 0x7f5614d02353 in PDFDoc::displayPageSlice(OutputDev*, + int, double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #13 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #14 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #15 0x7f5614322ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #16 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + poppler/JBIG2Stream.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 225232f6f070d17d8570108ffe39ffd4350fc6e8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 15:00:09 2014 +0100 + + Fix error reported by ASAN in 6609.asan.0.8343.pdf + + ==8470== ERROR: AddressSanitizer: heap-buffer-overflow on + address 0x7f3b12f7b5e1 at pc 0x7f3b0f915f5e bp 0x7fff47842de0 sp + 0x7fff47842dd8 + READ of size 1 at 0x7f3b12f7b5e1 thread T0 + #0 0x7f3b0f915f5d in JBIG2Stream::readGenericBitmap(bool, + int, int, int, bool, bool, JBIG2Bitmap*, int*, int*, int) + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:3628 + #1 0x7f3b0f910558 in JBIG2Stream::readGenericRegionSeg(unsigned + int, bool, bool, unsigned int) + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:2849 + #2 0x7f3b0f906b33 in JBIG2Stream::readSegments() + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1443 + #3 0x7f3b0f90572e in JBIG2Stream::reset() + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1248 + #4 0x7f3b0f951459 in ImageStream::reset() + /home/tsdgeos/devel/poppler/poppler/Stream.cc:484 + #5 0x7f3b0fa21546 in SplashOutputDev::drawImage(GfxState*, + Object*, Stream*, int, int, GfxImageColorMap*, bool, int*, bool) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:3158 + #6 0x7f3b0f87cd64 in Gfx::doImage(Object*, Stream*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4653 + #7 0x7f3b0f879de0 in Gfx::opXObject(Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 + #8 0x7f3b0f85433a in Gfx::execOp(Object*, Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 + #9 0x7f3b0f85350f in Gfx::go(bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 + #10 0x7f3b0f853163 in Gfx::display(Object*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 + #11 0x7f3b0f935df5 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:585 + #12 0x7f3b0f93d321 in PDFDoc::displayPageSlice(OutputDev*, + int, double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #13 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #14 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #15 0x7f3b0ef5dec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #16 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + poppler/JBIG2Stream.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 216890f1f147b25643e0d6e18e361d4d34b6c332 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 12:19:42 2014 +0100 + + Fix error reported by ASAN in 6760.asan.0.8568.pdf + + ==26566== ERROR: AddressSanitizer: SEGV on unknown address + 0x7fffbc3e5ea8 (pc 0x7fe1fa858db1 sp 0x7fffc788eb30 bp 0x7fffc788eb40 + T0) + AddressSanitizer can not provide additional info. + #0 0x7fe1fa858db0 in PSStack::index(int) + /home/tsdgeos/devel/poppler/poppler/Function.cc:1067 + #1 0x7fe1fa856fd6 in PostScriptFunction::exec(PSStack*, int) + /home/tsdgeos/devel/poppler/poppler/Function.cc:1621 + #2 0x7fe1fa854c10 in PostScriptFunction::transform(double*, + double*) /home/tsdgeos/devel/poppler/poppler/Function.cc:1266 + #3 0x7fe1fa854097 in + PostScriptFunction::PostScriptFunction(Object*, Dict*) + /home/tsdgeos/devel/poppler/poppler/Function.cc:1216 + #4 0x7fe1fa84a0c2 in Function::parse(Object*, + std::set<int, std::less<int>, std::allocator<int> >*) + /home/tsdgeos/devel/poppler/poppler/Function.cc:98 + #5 0x7fe1fa849e3c in Function::parse(Object*) + /home/tsdgeos/devel/poppler/poppler/Function.cc:63 + #6 0x7fe1fa8c1d8c in GfxDeviceNColorSpace::parse(Array*, + OutputDev*, GfxState*, int) + /home/tsdgeos/devel/poppler/poppler/GfxState.cc:2978 + #7 0x7fe1fa8a6fb7 in GfxColorSpace::parse(Object*, + OutputDev*, GfxState*, int) + /home/tsdgeos/devel/poppler/poppler/GfxState.cc:328 + #8 0x7fe1fa88440f in Gfx::doImage(Object*, Stream*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4403 + #9 0x7fe1fa882d6c in Gfx::opXObject(Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 + #10 0x7fe1fa85d2c6 in Gfx::execOp(Object*, Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 + #11 0x7fe1fa85c49b in Gfx::go(bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 + #12 0x7fe1fa85c0ef in Gfx::display(Object*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 + #13 0x7fe1fa93ed81 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:585 + #14 0x7fe1fa9462ad in PDFDoc::displayPageSlice(OutputDev*, + int, double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #15 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #16 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #17 0x7fe1f9f66ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #18 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + poppler/Function.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit fb7d91435c71603697b652c70cfa76dd595ee200 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 12:08:52 2014 +0100 + + Fix ASAN in 750.asan.0.9621.pdf + + ==25876== ERROR: AddressSanitizer: heap-buffer-overflow on + address 0x60040002a10f at pc 0x7fc396c3c23e bp 0x7ffff1123d20 sp + 0x7ffff1123d18 + READ of size 1 at 0x60040002a10f thread T0 + #0 0x7fc396c3c23d in JBIG2Stream::readGenericBitmap(bool, + int, int, int, bool, bool, JBIG2Bitmap*, int*, int*, int) + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:3504 + #1 0x7fc396c30073 in JBIG2Stream::readSymbolDictSeg(unsigned + int, unsigned int, unsigned int*, unsigned int) + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1867 + #2 0x7fc396c2d88a in JBIG2Stream::readSegments() + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1408 + #3 0x7fc396c2c6ba in JBIG2Stream::reset() + /home/tsdgeos/devel/poppler/poppler/JBIG2Stream.cc:1248 + #4 0x7fc396c783f7 in ImageStream::reset() + /home/tsdgeos/devel/poppler/poppler/Stream.cc:484 + #5 0x7fc396d484e4 in SplashOutputDev::drawImage(GfxState*, + Object*, Stream*, int, int, GfxImageColorMap*, bool, int*, bool) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:3158 + #6 0x7fc396ba3cf0 in Gfx::doImage(Object*, Stream*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4653 + #7 0x7fc396ba0d6c in Gfx::opXObject(Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:4179 + #8 0x7fc396b7b2c6 in Gfx::execOp(Object*, Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 + #9 0x7fc396b7a49b in Gfx::go(bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 + #10 0x7fc396b7a0ef in Gfx::display(Object*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 + #11 0x7fc396c5cd93 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:585 + #12 0x7fc396c642bf in PDFDoc::displayPageSlice(OutputDev*, + int, double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #13 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #14 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #15 0x7fc396284ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #16 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + + poppler/JBIG2Stream.cc | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit 9002b3b7cbbbc5802abfa8383ded2093a29d1746 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 00:48:15 2014 +0100 + + Fix ASAN in 784.asan.0.9671.pdf + + ================================================================= + ==24856== ERROR: AddressSanitizer: SEGV on unknown address + 0x603bfffe5804 (pc 0x7f7aa3310c6b sp 0x7fff0e656bd0 bp 0x7fff0e656e90 + T0) + AddressSanitizer can not provide additional info. + #0 0x7f7aa3310c6a in + GfxIndexedColorSpace::mapColorToBase(GfxColor*, GfxColor*) + /home/tsdgeos/devel/poppler/poppler/GfxState.cc:2509 + #1 0x7f7aa33110d2 in GfxIndexedColorSpace::getRGB(GfxColor*, + GfxRGB*) /home/tsdgeos/devel/poppler/poppler/GfxState.cc:2529 + #2 0x7f7aa3466712 in convertGfxColor(unsigned + char*, SplashColorMode, GfxColorSpace*, GfxColor*) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:117 + #3 0x7f7aa34675a9 in SplashUnivariatePattern::getColor(int, + int, unsigned char*) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:215 + #4 0x7f7aa348d2a2 in Splash::pipeRun(SplashPipe*) + /home/tsdgeos/devel/poppler/splash/Splash.cc:363 + #5 0x7f7aa34c9c29 in Splash::drawAALine(SplashPipe*, + int, int, int, bool, unsigned char) + /home/tsdgeos/devel/poppler/splash/Splash.cc:1537 + #6 0x7f7aa34c4787 in Splash::shadedFill(SplashPath*, bool, + SplashPattern*) /home/tsdgeos/devel/poppler/splash/Splash.cc:6388 + #7 0x7f7aa348b65c in + SplashOutputDev::univariateShadedFill(GfxState*, + SplashUnivariatePattern*, double, double) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:4408 + #8 0x7f7aa348b93d in SplashOutputDev::radialShadedFill(GfxState*, + GfxRadialShading*, double, double) + /home/tsdgeos/devel/poppler/poppler/SplashOutputDev.cc:4427 + #9 0x7f7aa32c7574 in Gfx::doRadialShFill(GfxRadialShading*) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:3058 + #10 0x7f7aa32c188f in Gfx::opShFill(Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:2476 + #11 0x7f7aa32b12c6 in Gfx::execOp(Object*, Object*, int) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:903 + #12 0x7f7aa32b049b in Gfx::go(bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:762 + #13 0x7f7aa32b00ef in Gfx::display(Object*, bool) + /home/tsdgeos/devel/poppler/poppler/Gfx.cc:728 + #14 0x7f7aa3392dc9 in Page::displaySlice(OutputDev*, double, + double, int, bool, bool, int, int, int, int, bool, bool + (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/Page.cc:585 + #15 0x7f7aa339a2f5 in PDFDoc::displayPageSlice(OutputDev*, + int, double, double, int, bool, bool, bool, int, int, int, int, + bool (*)(void*), void*, bool (*)(Annot*, void*), void*, bool) + /home/tsdgeos/devel/poppler/poppler/PDFDoc.cc:503 + #16 0x40311e in savePageSlice(PDFDoc*, SplashOutputDev*, + int, int, int, int, int, double, double, char*) + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:222 + #17 0x404416 in main + /home/tsdgeos/devel/poppler/utils/pdftoppm.cc:521 + #18 0x7f7aa29baec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4) + #19 0x401d58 in _start + (/home/tsdgeos/devel/poppler/build-debug/utils/pdftoppm+0x401d58) + SUMMARY: AddressSanitizer: SEGV + /home/tsdgeos/devel/poppler/poppler/GfxState.cc:2509 + GfxIndexedColorSpace::mapColorToBase(GfxColor*, GfxColor*) + + poppler/GfxState.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8947c6bc1dcb768b9d9c03a7a5db1573abdc2e87 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 26 00:47:59 2014 +0100 + + Forgot my (C) in the last commit + + poppler/TextOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1d7095ab7bdf0f14c3bfe99d6d5985bce98abe16 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 25 22:29:07 2014 +0100 + + Fix Heap-buffer-overflow in TextPage::updateFont + + Bug #76442 + + poppler/TextOutputDev.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 37ad83d69bd1d10da6ea1eb559c4bd320917ae25 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 22 17:33:55 2014 +0100 + + Reorder the if check condition + + I think the previous condition was correct anyway because of the + extra -1 in the i check + but it really makes more sense to have the i check first + + Bug #76478 + + goo/gfile.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 3535d658095ffa49ef8615d69843afa9c5ada061 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Mar 22 17:29:46 2014 +0100 + + Make the test rect go to xMax, yMax not xMax-1,yMax-1 + + I don't understand why the -1 is there and removing + it actually fixes bug #76387 + + splash/Splash.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 1e93c3f2d1c86edd40ca283ed422089f64886d04 +Author: William Bader <williambader@hotmail.com> +Date: Sat Mar 15 17:14:21 2014 +0100 + + Fix regression when creating level1 PS + + Bug #75241 + + poppler/PreScanOutputDev.cc | 16 ++++++++++++++-- + poppler/PreScanOutputDev.h | 3 ++- + 2 files changed, 16 insertions(+), 3 deletions(-) + +commit 1ea2eb412d12d97eaf49d1e51d7fda7abd8fbf9d +Author: Jason Crain <jason@aquaticape.us> +Date: Wed Mar 12 00:34:13 2014 +0100 + + Limit numeric parsing of character names + + Bug #38456 + + poppler/GfxFont.cc | 139 + ++++++++++++++++++++++++++++++++++-------------- + poppler/GlobalParams.cc | 4 +- + 2 files changed, 102 insertions(+), 41 deletions(-) + +commit e24cbeae22d6c8630e292897bd982a87e6290ca6 +Author: Steven Lee <roc.sky@gmail.com> +Date: Tue Mar 11 21:24:59 2014 +0100 + + Fix TIFF writting in Windows + + Bug #75969 + + goo/TiffWriter.cc | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +commit b984a3b5946ebcd736e0583a10eb614cede3388a +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Wed Mar 5 11:19:48 2014 +0200 + + glib: Use flags argument in poppler_structure_element_get_text() + + Instead of accepting a boolean argument to enable recursive text + extraction, + use a flags value. Text extraction may add features in the future (for + example, allowing using alternate text as replacement for inline + figures), + and this will allow to extend the method without introducing ABI + or API + breakage. + + https://bugs.freedesktop.org/show_bug.cgi?id=75796 + + glib/poppler-structure-element.cc | 12 +++++++----- + glib/poppler-structure-element.h | 14 +++++++++++++- + glib/reference/poppler-sections.txt | 3 +++ + 3 files changed, 23 insertions(+), 6 deletions(-) + +commit 94df09de1e07d442895ec1fb5cc23cacd9826552 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu Mar 6 10:44:51 2014 +0200 + + glib: Add missing underscore in method name + + The correct name is poppler_structure_element_get_form_state(). + + https://bugs.freedesktop.org/show_bug.cgi?id=75827 + + glib/poppler-structure-element.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7ddd03f9a00dcf505921821c55bebe6817aa3605 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 5 17:48:39 2014 +0100 + + Rename getNumElements, getElement and appendElement as getNumChildren, + getChild and appendChild + + It's more consistent with other internal API and less confusing. + + glib/poppler-structure-element.cc | 16 ++++++++-------- + poppler/StructElement.cc | 6 +++--- + poppler/StructElement.h | 8 ++++---- + poppler/StructTreeRoot.cc | 4 ++-- + poppler/StructTreeRoot.h | 8 ++++---- + 5 files changed, 21 insertions(+), 21 deletions(-) + +commit 7d6a5b65f8497537248d405177ae141f3765a419 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 5 17:40:14 2014 +0100 + + glib: Update the documentation symbols after the PopplerStructureScope + rename + + glib/reference/poppler-sections.txt | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 9282b5a26e9ce81d81d42c0cbe449543c8366b7c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Mar 5 17:37:38 2014 +0100 + + glib: Rename PopplerStructureScope as PopplerStructureTableScope + + It's a table specific attribute + + glib/poppler-structure-element.cc | 14 +++++++------- + glib/poppler-structure-element.h | 12 ++++++------ + 2 files changed, 13 insertions(+), 13 deletions(-) + +commit 9888eb65c6fad0eabcf525a7e88941dec2a27e92 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu Sep 26 19:36:12 2013 +0300 + + glib: Implement accessors for element attributes + + Implement inspecting the standard attributes of + PopplerStructureElement + objects. + + https://bugs.freedesktop.org/show_bug.cgi?id=64821 + + glib/poppler-structure-element.cc | 1279 + ++++++++++++++++++++++++++++++++++- + glib/poppler-structure-element.h | 252 ++++++- + glib/reference/poppler-sections.txt | 84 +++ + 3 files changed, 1597 insertions(+), 18 deletions(-) + +commit b346df59ef0775f5bd74a9f7379b5f430ccd7b79 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Tue Mar 4 23:40:59 2014 +0100 + + Qt: Expose document-supplied text direction + + qt4/src/poppler-document.cc | 17 +++++++++++++++++ + qt4/src/poppler-qt4.h | 10 +++++++++- + qt5/src/poppler-document.cc | 17 +++++++++++++++++ + qt5/src/poppler-qt5.h | 10 +++++++++- + 4 files changed, 52 insertions(+), 2 deletions(-) + +commit 2fc38c1866243598e22be07f0177e7d9385542d5 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Fri Feb 28 19:14:36 2014 +0200 + + glib: Fixes in the API reference documentation + + - Remove the references to non-existent methods for + PopplerStructureElement, + and point to PopplerStructureElementIter instead to point out how to + obtain the structure tree. + - Remove a non-existent include in poppler-docs.sgml + - Add POPPLER_TYPE_TEXT_SPAN to the list of private symbols. + + https://bugs.freedesktop.org/show_bug.cgi?id=75615 + + glib/poppler-structure-element.cc | 6 +++--- + glib/reference/poppler-docs.sgml | 1 - + glib/reference/poppler-sections.txt | 1 + + 3 files changed, 4 insertions(+), 4 deletions(-) + +commit cfe47a655ec5e280168e000da85bbf13f5f5f8b8 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Fri Feb 28 19:17:45 2014 +0200 + + glib: Remove poppler_text_span_is_link() in header + + The method poppler_text_span_is_link() does not exist, and must + be removed from the API header. + + https://bugs.freedesktop.org/show_bug.cgi?id=75613 + + glib/poppler-structure-element.h | 1 - + 1 file changed, 1 deletion(-) + +commit 7a2db63b5f7cae4bc215baa0859c4d4f8a660951 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Wed Feb 26 20:16:29 2014 +0200 + + glib: Remove unneeded POPPLER_STRUCTURE_ELEMENT_UNKNOWN + + The enum value POPPLER_STRUCTURE_ELEMENT_UNKNOWN because Poppler does + not add invalid StructElements ("invalid" being nodes of type + StructElement::Unknown) to the Tagged-PDF structure tree. That means + that poppler-glib does not need to expose it in the API. An assertion + is left to aid in finding issues when using debug builds. + + https://bugs.freedesktop.org/show_bug.cgi?id=75541 + + glib/poppler-structure-element.cc | 12 +++++++----- + glib/poppler-structure-element.h | 1 - + 2 files changed, 7 insertions(+), 6 deletions(-) + +commit db909c2a14f962234a813ba9853535b9692cfd5a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 26 22:09:44 2014 +0100 + + Try harder to open broken files + + Bug #75232 + + poppler/PDFDoc.cc | 33 ++++++++++++++++++++++----------- + poppler/PDFDoc.h | 8 ++++---- + 2 files changed, 26 insertions(+), 15 deletions(-) + +commit b2394eee5384edf4128d598030989e66d64714ef +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Mon Feb 10 20:29:35 2014 +0200 + + Tagged-PDF: Fix parsing of attached element attributes + + The wrong object was used as attribute dictionary, which caused + a segmentation fault when parsing PDF files in which the structure + elements included attributes attached to them. This patch fixes the + issue. + + Thanks to Joanmarie Diggs <jdiggs@igalia.com> for helping in + debugging the problem. + + https://bugs.freedesktop.org/show_bug.cgi?id=74805 + + poppler/StructElement.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c549b5e9ce2dcc8beb2511ee315bfff2fdfdf6e8 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Sun Feb 9 18:31:22 2014 +0200 + + glib: Add poppler_structure_element_is_grouping() + + Implement a method to check whether a structure element is a grouping + element, wrapping the StructElement::isGrouping() method. + + https://bugs.freedesktop.org/show_bug.cgi?id=74753 + + glib/poppler-structure-element.cc | 20 ++++++++++++++++++++ + glib/poppler-structure-element.h | 1 + + glib/reference/poppler-sections.txt | 1 + + 3 files changed, 22 insertions(+) + +commit 6fbd6cb85bdd32dc5a3d4c3c719556269a4488ac +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Fri Feb 21 15:02:44 2014 +0200 + + glib: Handle missing structure element types + + Element Art (article); RB, RP, RB (Ruby text inner elements); and + WT, WP (Warichu inner elements) were not being handled. This adds + the corresponding handling in poppler-glib. Also, the "default" case + in the switch in poppler_structure_element_get_type() is removed, so + the compiler can emit warnings when enum values are not handled. + + https://bugs.freedesktop.org/show_bug.cgi?id=75323 + + glib/poppler-structure-element.cc | 25 +++++++++++++++++++------ + glib/poppler-structure-element.h | 9 +++++++-- + 2 files changed, 26 insertions(+), 8 deletions(-) + +commit 63e9c0b67fa2e64ca20258d873a849386c7eb295 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Mon Feb 17 23:58:09 2014 +0100 + + Some error() usage fixes + + poppler/Hints.cc | 3 ++- + poppler/JBIG2Stream.cc | 4 ++-- + poppler/PSOutputDev.cc | 4 ++-- + poppler/SecurityHandler.cc | 3 ++- + poppler/StructTreeRoot.cc | 3 ++- + qt4/src/poppler-annotation.cc | 6 +++--- + qt5/src/poppler-annotation.cc | 6 +++--- + utils/HtmlOutputDev.cc | 11 ++++++----- + 8 files changed, 22 insertions(+), 18 deletions(-) + +commit 8f2d847f1d0224a297e642944f8da9c1409732b6 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Mon Feb 17 23:56:49 2014 +0100 + + Clang++ plugin that checks for usage errors in GooString::format-style + calls + + goo/GooString.h | 12 +- + poppler/Error.h | 4 +- + test/goostring-format-checker/README | 16 + + .../goostring-format-checker.cc | 369 + +++++++++++++++++++++ + 4 files changed, 397 insertions(+), 4 deletions(-) + +commit d7d61dcda91910f7eb2548b19e8380d7c3232dd3 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Feb 12 21:50:38 2014 +0100 + + blend usage in PDF with spot colors casue random output + + The reason for the random colors is the uninitialized local variable + cBlend. The blend functions only fills offset 0 to 3, so offset 4 + up to 4 + SPOT_NCOMPS are left uninitialized, but all offsets are + stored in the bitmap. + So we need to initialize these offsets with 0! + + Bug #74883 + + splash/Splash.cc | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit b2905a0d299cc09fcd219afe49cb370f6db61c5a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 10 20:19:07 2014 +0100 + + increase gtk3 dependency + + gtk_tree_view_set_activate_on_single_click was introduced in 3.8 + + cmake/modules/FindGTK.cmake | 2 +- + configure.ac | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 71d4041b061c109a965e72230640cf8ee616dac3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 10 20:16:46 2014 +0100 + + Make sure number of least objects in hints table is valid + + Bug #74741 + + poppler/Hints.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit a865f13def88153fdbe8a0a054d2005e3e2bb737 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 9 23:22:07 2014 +0100 + + Fix cmake build + + glib/CMakeLists.txt | 2 ++ + glib/demo/CMakeLists.txt | 1 + + 2 files changed, 3 insertions(+) + +commit d6fde0fac0120b1622942d8344d5153d9abf3e1e +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Wed May 29 23:44:03 2013 +0300 + + glib-demo: Pane showing the document structure + + Adds a new pane in poppler-glib-demo showing the structure for + Tagged-PDF + documents. It also serves as an example on how to to use the API for + PopplerStructure and PopplerStructureElement. + + glib/demo/Makefile.am | 2 + + glib/demo/main.c | 2 + + glib/demo/taggedstruct.c | 232 + +++++++++++++++++++++++++++++++++++++++++++++++ + glib/demo/taggedstruct.h | 31 +++++++ + 4 files changed, 267 insertions(+) + +commit 0f9fa775c469c03d1613b955ee7b06b823e6e080 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu Sep 26 17:50:51 2013 +0300 + + glib: Expose inline attributes of structure elements + + Allows obtaining inline text attributes from structure elements. The + text + is divived into "spans", which are groups of consecutive glyphs + that share + their attributes. Each one of those is represented by a + PopplerTextSpan, + which gives information about the text font and color, and the + link target + for links. The list of PopplerTextSpans is created lazily when + first used. + + https://bugs.freedesktop.org/show_bug.cgi?id=64821 + + glib/poppler-structure-element.cc | 269 + ++++++++++++++++++++++++++++++++++++ + glib/poppler-structure-element.h | 16 ++- + glib/poppler.h | 1 + + glib/reference/poppler-sections.txt | 12 ++ + 4 files changed, 297 insertions(+), 1 deletion(-) + +commit 8072d4b0e3ea10b4308f8172891f769f30466133 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu May 9 12:01:59 2013 +0300 + + glib: Expose the document structure tree + + Implements a new PopplerStructureElement classe, which builds upon + StructTreeRoot and StructElement to expose the document structure of + tagged PDFs in the GLib binding. + + Navigation of the structure tree is done by an iterator-based + interface, + using PopplerStructureElementIter. + + https://bugs.freedesktop.org/show_bug.cgi?id=64821 + + glib/Makefile.am | 2 + + glib/poppler-private.h | 10 + + glib/poppler-structure-element.cc | 663 + ++++++++++++++++++++++++++++++++++++ + glib/poppler-structure-element.h | 112 ++++++ + glib/poppler.h | 3 + + glib/reference/poppler-docs.sgml | 2 + + glib/reference/poppler-sections.txt | 37 ++ + glib/reference/poppler.types | 2 + + 8 files changed, 831 insertions(+) + +commit 46b7470ae9846d7e6dbb72bbb3ff831acd954168 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Thu Jan 30 14:42:51 2014 -0800 + + glib-demo: Fix performance in text markup annotations + + Fix https://bugs.freedesktop.org/show_bug.cgi?id=51487#c45 + + glib/demo/annots.c | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +commit 8a84b45674aed8c27a1d172b07eb0531c0ec14f1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Feb 8 09:17:02 2014 +0100 + + glib: Fix gobject-introspection warnings + + glib/poppler-page.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 899799df78c00fc2ca6d2d0e612536b87a871817 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Tue Feb 4 19:26:53 2014 +0200 + + Allow properly identifying grouping elements + + Grouping elements in the Tagged-PDF structure should be identifiable + as + such (see section 14.8.4.2 "Grouping Elements" of the PDF + standard). Those + were previously reported as inline elements, which is quite not + correct. + This patch introduces a new StructElement::isGrouping() method which + correctly reports grouping elements as such. + + https://bugs.freedesktop.org/show_bug.cgi?id=74520 + + poppler/StructElement.cc | 31 +++++++++++++++++++------------ + poppler/StructElement.h | 1 + + 2 files changed, 20 insertions(+), 12 deletions(-) + +commit 27cd9a00bfebf0602e7ed29a8ee8e16ffff67bde +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Tue Feb 4 19:35:58 2014 +0200 + + Report LBody elements in Tagged-PDF structure as block elements + + According to section 14.8.4.3 "Block-Level Structure Elements" + (in particular subsection 14.8.4.3.3 "List Elements"), structure + elements of type LBody must be reported as block elements. This + patch changes the reported type from elementTypeUndefined to + elementTypeBlock accordingly. + + https://bugs.freedesktop.org/show_bug.cgi?id=74522 + + poppler/StructElement.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4cda839cb489fe5cd4726109cb9ab8b0ba2fa563 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Jan 28 06:06:09 2014 +1030 + + pdftops: ensure there is always a page size in the output + + even if the PDF file as badly broken. + + poppler/PSOutputDev.cc | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 45a87afdf1372911aa1ba840557e61627cdc7b4f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Dec 29 15:16:37 2013 +1030 + + cairo: clip to crop box + + when printing the cairo surface may larger than the crop box + + fixes https://bugzilla.gnome.org/show_bug.cgi?id=649886 + + poppler/CairoOutputDev.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 6d39a1d7b348329dd057a8e7c77bfd47921fc495 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Dec 30 17:59:09 2013 +1030 + + pdftocairo: ensure page size and crop box works the same as pdftops + + Bug 72312 + + utils/pdftocairo.1 | 26 +++++++++----------------- + utils/pdftocairo.cc | 20 +++++++++++++++----- + 2 files changed, 24 insertions(+), 22 deletions(-) + +commit b1da7e20dcef78ef6036418b37a47ba3f8818453 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Dec 19 22:18:26 2013 +1030 + + pdftops: Only change paper size when different to previous size + + Previously this check was done in the code (removed in previous + commit). + Moving this check into the pdfSetupPaper macro preserves page + independence. + + Bug 72312 + + poppler/PSOutputDev.cc | 30 +++++++++++++++++++++++++----- + 1 file changed, 25 insertions(+), 5 deletions(-) + +commit 7ac7d3bad4b868950ee96fd9c5ece88632f8827c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Dec 20 07:19:21 2013 +1030 + + pdftops: Remove origpagesizes mode and make -origpagesizes an alias + for -paper match + + Bug 72312 + + poppler/PSOutputDev.cc | 9 ++------- + poppler/PSOutputDev.h | 4 ++-- + utils/pdftops.1 | 30 ++++++++++-------------------- + utils/pdftops.cc | 23 ++++++++++++++--------- + 4 files changed, 28 insertions(+), 38 deletions(-) + +commit 31fc5181bc491ff2e4aee0ae05c0f611a36e585c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Dec 20 07:16:37 2013 +1030 + + pdftops: Use crop box as page size + + unless -nocrop is used. The fontends use the crop box as the page + size and + acroread uses the cropbox as the page size for display and printing. + + Bug 72312 + + poppler/PSOutputDev.cc | 28 +++++++--------------------- + 1 file changed, 7 insertions(+), 21 deletions(-) + +commit bf2049b17ac4706f472c59e50266f4eaf0ffaa32 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Dec 15 18:00:41 2013 +1030 + + pdftps: fix DocumentMedia/Page/Media/PageBBox DSC comments + + Bug 72312 + + poppler/PSOutputDev.cc | 167 + ++++++++++++++++++++++++++-------------- + poppler/PSOutputDev.h | 6 +- + qt4/src/poppler-ps-converter.cc | 1 + + qt5/src/poppler-ps-converter.cc | 1 + + utils/pdftops.cc | 1 + + 5 files changed, 119 insertions(+), 57 deletions(-) + +commit fe49033c9bd2103c13d4eb59983e06fdcdd33a8d +Author: Till Kamppeter <till.kamppeter@gmail.com> +Date: Sat Dec 14 16:05:09 2013 +1030 + + pdftops: ensure paper size takes into account rotation + + Bug 72312 + + poppler/PSOutputDev.cc | 48 + ++++++++++++++++++++---------------------------- + 1 file changed, 20 insertions(+), 28 deletions(-) + +commit 31edf585e62f4e91b7b64295cc8b978ac466ce58 +Author: Bogdan Cristea <cristeab@gmail.com> +Date: Mon Jan 27 20:06:11 2014 +0100 + + [qt] Improve compilation under Win 8 with Visual Studio 2012 + + Bug #73111 + + goo/GooMutex.h | 3 ++- + goo/GooTimer.h | 2 ++ + goo/gfile.h | 2 ++ + poppler/PDFDoc.cc | 4 +--- + poppler/XpdfPluginAPI.h | 2 ++ + poppler/poppler-config.h.cmake | 18 ++++++++++++++++-- + poppler/poppler-config.h.in | 18 ++++++++++++++++-- + qt4/tests/stress-threads-qt4.cpp | 5 +++++ + qt5/src/poppler-private.h | 6 ++++-- + qt5/tests/stress-threads-qt5.cpp | 5 +++++ + test/perf-test.cc | 1 - + 11 files changed, 55 insertions(+), 11 deletions(-) + +commit 834cd18e3ddfda44a11316290f7eee98cd871305 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jan 26 16:10:20 2014 +0100 + + Use c99 for the c compiler + + cmake/modules/PopplerMacros.cmake | 1 + + 1 file changed, 1 insertion(+) + +commit 03674a141a96806e5e1a134dc3dec2ee61b68713 +Author: Pino Toscano <pino@kde.org> +Date: Sun Jan 26 12:43:13 2014 +0100 + + qt4/qt5: add GCC visibility export attributes + + this does no actual changes to the exported symbols, but can help in + hiding symbols if the right GCC flags for symbols visibility are + specified + + qt4/src/poppler-export.h | 3 +++ + qt5/src/poppler-export.h | 3 +++ + 2 files changed, 6 insertions(+) + +commit 52b46d05219cf9898ee4adae7c8c2702adb1ba23 +Author: Pino Toscano <pino@kde.org> +Date: Sun Jan 26 12:38:03 2014 +0100 + + qt4/qt5: improve naming of internal export/import macros + + use something less generic than LIB_EXPORT/LIB_IMPORT + + qt4/src/poppler-export.h | 12 ++++++------ + qt5/src/poppler-export.h | 12 ++++++------ + 2 files changed, 12 insertions(+), 12 deletions(-) + +commit 7a8bcea11ad71fccbbba2787fc442f6ba4bf7100 +Author: Pino Toscano <pino@kde.org> +Date: Thu Jan 23 22:34:07 2014 +0100 + + cmake: install JpegWriter.h depending on libjpeg + + ... and not libopenjpeg + + CMakeLists.txt | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 57f34f525fa2c2e62ebc7383ceba48ebc80ebba6 +Author: Andres Gomez <agomez@igalia.com> +Date: Wed Jan 8 12:26:14 2014 +0200 + + glib-demo: Fix conding style issue in render.c + + glib/demo/render.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3fac919eeb1ca1abfdbb4f9923a454e532256f5c +Author: Andres Gomez <agomez@igalia.com> +Date: Wed Jan 8 12:25:52 2014 +0200 + + glib-demo: Fix trailing whitespaces in render.c + + glib/demo/render.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 92ea15642a6d3fe65d66d5c59fb6bed54e060e5d +Author: Christian Persch <chpe@gnome.org> +Date: Fri Jan 3 23:31:56 2014 +0100 + + glib: Install error callback + + Install an error callback so that poppler error messages can be + redirected + to the GLib logging API. + + https://bugs.freedesktop.org/show_bug.cgi?id=73269 + + glib/poppler.cc | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 47 insertions(+) + +commit f99128e38bbff43623d5cd1c1bc27fd789d0bc0c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jan 19 16:03:35 2014 +0100 + + glib: Make vertices a constructor parameter of line annotations + + It's a required field in the line annotation. + + glib/demo/annots.c | 4 +--- + glib/poppler-annot.cc | 12 ++++++++++-- + glib/poppler-annot.h | 4 +++- + 3 files changed, 14 insertions(+), 6 deletions(-) + +commit 587a40f90e4ac5a1b6ab9044495a1ae403bc8c58 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jan 19 15:58:43 2014 +0100 + + annots: Fix memory leak when setting AnnotTextMarkup quads twice + + poppler/Annot.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 69e73da1fbab9bf3365b40dced1008b0283ac931 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Wed Nov 20 11:53:30 2013 -0800 + + glib-demo: Add support for PopplerTextAnnotMarkup + + * The subtypes are: Highlihght, Squiggly, StrikeOut and Underline. + * Use ScrolledWindow for annotation properties to make room to + show the Quadrilaterals of TextMarkup annotations. + + https://bugs.freedesktop.org/show_bug.cgi?id=51487 + + glib/demo/annots.c | 232 + +++++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 206 insertions(+), 26 deletions(-) + +commit 9a7699ebe3e644ba845ef75d9295c88d321cb934 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Mon Nov 18 16:42:08 2013 -0800 + + glib: Add PopplerAnnotTextMarkup class and subtypes + + The subtypes are: Highlihght, Squiggly, StrikeOut and Underline. + It adds convenient methods to set/get/free quadrilaterals + necessaries for TextMarkup annotations. + + https://bugs.freedesktop.org/show_bug.cgi?id=51487 + + glib/poppler-annot.cc | 264 + ++++++++++++++++++++++++++++++++++++ + glib/poppler-annot.h | 23 ++++ + glib/poppler-page.cc | 6 + + glib/poppler-private.h | 1 + + glib/poppler.h | 1 + + glib/reference/poppler-sections.txt | 11 ++ + 6 files changed, 306 insertions(+) + +commit 40040b41216a3dcc833fc224f1c6f15517a88aed +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Mon Nov 18 16:26:27 2013 -0800 + + glib: Add PopplerQuadrilateral boxed type + + https://bugs.freedesktop.org/show_bug.cgi?id=51487 + + glib/poppler-page.cc | 53 + +++++++++++++++++++++++++++++++++++++ + glib/poppler-page.h | 33 +++++++++++++++++++++++ + glib/poppler.h | 1 + + glib/reference/poppler-sections.txt | 6 +++++ + 4 files changed, 93 insertions(+) + +commit c8a845cf7c7752d3b7dad06013d3154812c66c92 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jan 14 20:26:59 2014 +0100 + + Do not define -ansi + + We are using long long that is not defined in ansi, so forcing ansi + strictness does + not make any sense. Bug #72499 + + cmake/modules/PopplerMacros.cmake | 5 ----- + configure.ac | 15 --------------- + 2 files changed, 20 deletions(-) + +commit f0c13ee72e8a7df17bdf847f5e922c01acee1f0d +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 6 21:55:07 2014 +0100 + + C for last commit + + poppler/Parser.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1e1b9991a911fb610e74119979b20b179f3f2a67 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 6 21:51:25 2014 +0100 + + Fix rendering of pdf file from KDE bug 329600 + + It used to work and regressed with large file support (used to work + because stuff just overflowed) + + lexer->getPos needs lexer to be a stream, if it is not, just resort + to the +5000 kludge + + poppler/Parser.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 4cd5c349cfbc745688c0c38fc50d364092bc3718 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 6 21:48:25 2014 +0100 + + Update popplers (C) + + poppler/poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 7ca2f42b06757587dfd9521fb1c6c7d657545553 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jan 6 15:48:22 2014 +0100 + + Learn about automake 1.14 + + autogen.sh | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +commit de9643b6f76774ebe131c4787df82dd213181c71 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 3 00:53:37 2014 +0100 + + 0.25.1 + + CMakeLists.txt | 2 +- + NEWS | 19 +++++++++++++++++++ + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 5 files changed, 23 insertions(+), 4 deletions(-) + +commit e238c1f83fd5f667336bfbb0e9a59569ff638ecc +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 3 00:29:28 2014 +0100 + + Fix qt5 moc detection fix + + configure.ac | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit 381ae2877acace4e8908b07ee5fb442bc19bf814 +Merge: 64100e7 a2f0e4b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 3 00:04:29 2014 +0100 + + Merge remote-tracking branch 'origin/poppler-0.24' + + Conflicts: + CMakeLists.txt + NEWS + configure.ac + cpp/Doxyfile + qt4/src/Doxyfile + qt5/src/Doxyfile + +commit a2f0e4b1fd8b3d9675cc00a561094bd78a63d048 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 2 23:48:29 2014 +0100 + + 0.24.5 + + CMakeLists.txt | 2 +- + NEWS | 4 ++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 9 insertions(+), 5 deletions(-) + +commit 523b2731e0489bab58e66b21016bd6f010e616ea +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 2 22:54:42 2014 +0100 + + Update copyrights + + poppler/JBIG2Stream.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 64100e7f1f6b550e952838fce38615ec3788e17c +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Dec 28 12:11:47 2013 +0100 + + Simplify some calls to GooString::format-family functions + + poppler/Object.h | 4 ++-- + utils/pdftocairo.cc | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 0abde34d0f7ba0fc04a30dbfd78373ec9d9d0695 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Dec 28 12:11:05 2013 +0100 + + Fixed some GooString format markers + + poppler/CMap.cc | 3 ++- + poppler/Function.cc | 3 ++- + poppler/StructElement.cc | 2 +- + 3 files changed, 5 insertions(+), 3 deletions(-) + +commit a7da4c6ac2b13308803806009c3437332b140586 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Fri Dec 27 17:09:39 2013 +0100 + + GooString format: fixed bug with printing LLONG_MIN + + ( -LLONG_MIN doesn't fit in a signed long long ) + + goo/GooString.cc | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +commit fe88f20cc565b4cf4765fed56c821989148ef454 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Fri Dec 27 17:08:50 2013 +0100 + + GooString format: Added some tests + improved documentation + + goo/GooString.h | 10 +++++-- + qt4/tests/check_goostring.cpp | 66 + +++++++++++++++++++++++++++++++++++++++++++ + qt5/tests/check_goostring.cpp | 66 + +++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 139 insertions(+), 3 deletions(-) + +commit 5234a349adb678d267a3d8ca13176ac8abb7afd2 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Dec 20 20:25:26 2013 +0100 + + pdfunite: do not lose fonts when merging some files + + utils/pdfunite.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 8e24fcc0d296e07327e9cbe297f627bfc6471ee3 +Merge: 85efba3 b02f873 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Dec 18 21:51:57 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.24' + + Conflicts: + poppler/GfxState.cc + +commit b02f873174865837fed3a9544b70b8b21747a3dd +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Dec 18 21:46:12 2013 +0100 + + Fixed some GooString format markers + + poppler/GfxState.cc | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +commit 85efba38c02b5daf7d3fc46bc85850e6842a085d +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Dec 18 00:46:00 2013 +0100 + + Make pdfunite work even if there's a single file given + + Bug #72720 + + utils/pdfunite.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a766c55f68db38feed91cf003a0d5710e2f925a8 +Author: Tuomas Jormola <tj@solitudo.net> +Date: Mon Dec 16 20:43:28 2013 +0100 + + Fix detection of moc for Qt5 + + Bug #72744 + + On my Mac OS X 10.9 Mavericks system with Qt 5.2.0 installed using + Homebrew, the output of the moc command doesn't include the string + "Qt 5" which is expected by the moc version detection logic in + configure.ac of poppler 0.24.4. This patch updates the grep pattern so + that the current expected moc version output and the version output of + this installation of Qt5 are both detected as a valid moc for + Qt5. With + this patch applied, I was able to build and test poppler with Qt5 + support successfully. + + (09:26:05)(tj@gauri)(~)$ uname -a + Darwin gauri.ad.local.domain 13.0.0 Darwin Kernel Version 13.0.0: + Thu Sep 19 22:22:27 PDT 2013; root:xnu-2422.1.72~6/RELEASE_X86_64 + x86_64 i386 MacBookPro3,1 Darwin + (09:26:08)(tj@gauri)(~)$ /usr/local/opt/qt5/bin/moc -v + moc 5.2.0 + (09:26:24)(tj@gauri)(~)$ + + configure.ac | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit a43b4bf84fe4bde6649049685bf4ed6a682e8286 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 15 11:59:57 2013 +0100 + + regtest: Add a command line option to create-report command to not + launch the browser + + regtest/HTMLReport.py | 5 +++-- + regtest/commands/create-report.py | 5 ++++- + 2 files changed, 7 insertions(+), 3 deletions(-) + +commit 113958276b96d7f1aab7042e1807a9970425d234 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Dec 15 11:48:51 2013 +0100 + + regtest: Return an exist status code depending on whether the + command succeeded + + regtest/TestRun.py | 2 ++ + regtest/commands/__init__.py | 4 ++-- + regtest/commands/create-refs.py | 2 ++ + regtest/commands/create-report.py | 2 ++ + regtest/commands/find-regression.py | 4 +++- + regtest/commands/run-tests.py | 6 ++++-- + regtest/main.py | 8 ++++---- + regtest/poppler-regtest | 2 +- + 8 files changed, 20 insertions(+), 10 deletions(-) + +commit 44cf2de0df351d5948893f6a4e2bca1168d16b70 +Author: Dominik Haumann <dhaumann@kde.org> +Date: Thu Dec 12 23:12:35 2013 +0100 + + Arthur font rendering improvements + + The patch does does the following: + - use NoPen to fill the glyphs + - since SplashPath seems to bitwise OR stop and start of path, + closing a subpath needs to happen before starting a path. + + Arthur needs serious work but this is a definite improvement in all + the files i've tried it on + + qt4/src/ArthurOutputDev.cc | 18 +++++++++--------- + qt5/src/ArthurOutputDev.cc | 18 +++++++++--------- + 2 files changed, 18 insertions(+), 18 deletions(-) + +commit 02863f683be4543a2af6c26d53be93785d2b836a +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 12 23:09:43 2013 +0100 + + qt: Simple silly test program to save to file + + Allows us to do some quick arthur testing + + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/Makefile.am | 8 ++++- + qt4/tests/test-render-to-file.cpp | 69 + +++++++++++++++++++++++++++++++++++++++ + qt5/tests/CMakeLists.txt | 1 + + qt5/tests/Makefile.am | 8 ++++- + qt5/tests/test-render-to-file.cpp | 69 + +++++++++++++++++++++++++++++++++++++++ + 6 files changed, 154 insertions(+), 2 deletions(-) + +commit 018892d4ceccd5e2994cdb74cd2d401293fc929d +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Dec 11 23:05:53 2013 +0100 + + 0.25.0 + + CMakeLists.txt | 6 +++--- + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 9 insertions(+), 9 deletions(-) + +commit a1b99b26da9124fa55f773af55ae7382bd911d47 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Dec 11 23:00:00 2013 +0100 + + NEWS + + NEWS | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +commit 10a0c45676ef56bee5924e889a7e7c21244b4339 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Dec 10 20:48:36 2013 +0100 + + Update copyrights + + cpp/poppler-image.cpp | 1 + + goo/PNGWriter.cc | 2 +- + poppler/MarkedContentOutputDev.cc | 2 ++ + poppler/MarkedContentOutputDev.h | 2 ++ + poppler/Object.h | 1 + + poppler/PDFDoc.h | 1 + + utils/ImageOutputDev.h | 2 +- + 7 files changed, 9 insertions(+), 2 deletions(-) + +commit 6c0e7d35f273583acc2aa818860e3120b0cab64f +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Dec 10 20:14:39 2013 +0100 + + correction for knockout transparency groups + + Fixes test "G" in eci_altona-test-suite-v2_technical2_x4.pdf + + poppler/SplashOutputDev.cc | 18 ++++++++++--- + splash/Splash.cc | 63 + +++++++++++++++++++++++++++++++++------------ + splash/SplashFTFontEngine.h | 3 +++ + splash/SplashFontEngine.cc | 13 ++++++++++ + splash/SplashFontEngine.h | 5 ++++ + 5 files changed, 82 insertions(+), 20 deletions(-) + +commit f77bc21813ae7234ec4ce94ce4e92230fe5c174a +Merge: 06e9dc9 58e04a0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 7 16:56:11 2013 +0000 + + Merge remote-tracking branch 'origin/poppler-0.24' + + Conflicts: + utils/pdfimages.cc + utils/pdfinfo.cc + utils/pdfseparate.cc + +commit 06e9dc917650f562cd6f6666190a8c25756514a3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 7 16:39:02 2013 +0000 + + Compile++ + + CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit 58e04a08afee39370283c494ee2e4e392fd3b684 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Dec 7 16:33:09 2013 +0000 + + segExtraBytes is a goffset not an int so use lld + + Fixes KDE bug #328511 + + poppler/JBIG2Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3335d5e52fd7527bba7368ad6e87f1188808582f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 6 17:28:13 2013 +0100 + + regtest: Limit the stderr files to ~1MB + + Some tests send a lot of information to stderr, usually due to parsing + errors in buggy documents. More than 1MB of stderr output is + diffcult to + hanlde and in most cases it's redundant with a lot of duplicated + messages. + This patch reduced the size of the refs dir for the complete test + suite + by 1GB. + + regtest/backends/__init__.py | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 24107ac47625438837d7c29053bff795f986a6bb +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 6 13:24:47 2013 +0100 + + regtest: Save checksum results sorted in md5 files + + We are using os.listdir() to get the list of test results that returns + files in arbitrary order. + + regtest/backends/__init__.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f1c9993d58fb9d191a7b3e26bfcaf7b5eec5323d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 6 13:03:24 2013 +0100 + + regtest: Show also the tests expected to crash/fail to run but + don't fail + + regtest/TestRun.py | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit 64d1e79c863d12b12b87ed0e3139d364f503e026 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 6 12:51:48 2013 +0100 + + regtest: Improve readability of test results + + Show a summary of tests failed per backend with the percentages and + use a + new line for every test in the result instead of using a comma + separated + line. + + regtest/TestRun.py | 67 + ++++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 47 insertions(+), 20 deletions(-) + +commit c35bc1da9402896c88999f9cffed6962a265f32e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Dec 6 10:04:48 2013 +0100 + + glib-demo: Increase the default size of the main window + + Some demos like annots that show a document view use more space than + they used to, requiring to manually resize the window everytime. + + glib/demo/main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ab7da0bf62bb5032c4683d9cd841075d26045aae +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Mon Oct 28 22:52:22 2013 -0700 + + glib-demo: Add Square and Circle annotations demo + + https://bugs.freedesktop.org/show_bug.cgi?id=70983 + + glib/demo/annots.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +commit 2ec450567f27bba3ee4a08b5e69b7c9605bea4bb +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Mon Oct 28 22:48:39 2013 -0700 + + glib: Add implementation of Square and Circle annotations + + Square and Circle only differ in the constructor which defines + the subtype. Therefore, it uses the same name than Poppler's + Geometry class. + + https://bugs.freedesktop.org/show_bug.cgi?id=70983 + + glib/poppler-annot.cc | 263 + ++++++++++++++++++++++++++++++++---- + glib/poppler-annot.h | 23 ++++ + glib/poppler-page.cc | 6 + + glib/poppler-private.h | 2 + + glib/poppler.h | 2 + + glib/reference/poppler-sections.txt | 16 +++ + 6 files changed, 286 insertions(+), 26 deletions(-) + +commit e109cf2461d5be93d004593123d875a28fd79b61 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Nov 26 20:12:22 2013 +0100 + + annots: Make Annot::setBorder receive an AnnotBorder object + + Instead of receiving AnnotBorderArray. Also implement writeToObject in + both AnnotBorderArray and AnnotBorderBS to make sure that + Annot::setBorder will work for both cases. + + poppler/Annot.cc | 51 +++++++++++++++++++++++++++++++++++++++++++++------ + poppler/Annot.h | 10 +++++++--- + 2 files changed, 52 insertions(+), 9 deletions(-) + +commit 3979b82982e84107d93fbbe95350bf25ce47398d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Nov 26 14:44:57 2013 +0100 + + annots: Use a default border for annots that can have a BS entry + + According to the spec if neither the Border nor the BS entry is + present, + the border shall be drawn as a solid line with a width of 1 point. + However, acroread seems to ignore the Border entry for annots + that can't + have a BS entry. + + poppler/Annot.cc | 223 + ++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 132 insertions(+), 91 deletions(-) + +commit 36c07c82bdff010695c5d615b67506922522d0e8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Nov 26 14:07:21 2013 +0100 + + annots: Add helper function Annot::setLineStyleForBorder + + It sets the line dash and width based on the given AnnotBorder. Use it + only when the border width is greater than 0 for FreeText annotations + and always for annotations that use the border to set the line + width and + dash, but don't draw a border. + + poppler/Annot.cc | 110 + ++++++++++++++++--------------------------------------- + poppler/Annot.h | 1 + + 2 files changed, 32 insertions(+), 79 deletions(-) + +commit e7b1ff97318fd6c3a8fed3a33d45f1cb55208b28 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Nov 26 11:40:57 2013 +0100 + + annots: Remove unused typeUnknown AnnotBorderType from AnnotBorder + + Also make the AnnotBorder constructor protected to make sure it's not + possible to create AnnotBorder instances. + + poppler/Annot.cc | 3 --- + poppler/Annot.h | 12 ++++++++---- + 2 files changed, 8 insertions(+), 7 deletions(-) + +commit 17b2623360ed8917e94a8e5b880e92e6db70335e +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Tue Jun 18 00:35:51 2013 +0300 + + Tagged-PDF: Text content extraction from structure elements + + Implement StructElement::getText(), by using MCOutputDev. This + output device + captures pieces of text (aka "spans") which have the same attributes + into + a list of TextSpan objects. + + https://bugs.freedesktop.org/show_bug.cgi?id=64815 + + poppler/Makefile.am | 2 + + poppler/MarkedContentOutputDev.cc | 210 + ++++++++++++++++++++++++++++++++++++++ + poppler/MarkedContentOutputDev.h | 128 +++++++++++++++++++++++ + poppler/StructElement.cc | 50 +++++++++ + poppler/StructElement.h | 28 +++++ + 5 files changed, 418 insertions(+) + +commit 2c4320c26744ea28be10eac7cc54980c9eb4fc27 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Dec 3 19:07:09 2013 +0100 + + glib-demo: Show number of charcters and text layout units in text demo + + It helps to easily detect the cases where these values mismatch. + + glib/demo/text.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 98d75dcdb9b73feb6f35d8ad76f5d0c428289f91 +Author: Jason Crain <jason@aquaticape.us> +Date: Sat Nov 30 17:29:50 2013 +0100 + + Limit use of ZapfDingbats character names + + Some PDFs use names from ZapfDingbats (a1-a206) without intending for + them to be used for text extraction. Only use these character names + to locate glyphs or for text extraction with ZapfDingbats fonts. + + Bug #60243 + + goo/GooString.cc | 10 ++ + goo/GooString.h | 4 + + poppler/GfxFont.cc | 15 +- + poppler/GlobalParams.cc | 33 +++- + poppler/GlobalParams.h | 16 +- + poppler/NameToUnicodeTable.h | 415 + ++++++++++++++++++++++--------------------- + 6 files changed, 274 insertions(+), 219 deletions(-) + +commit 817cc333ca8009998f2099583fd0a2fc703f3db3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Nov 29 10:07:16 2013 +0100 + + regtest: Do not buffer stderr output + + Some buggy documents can produce a huge stderr output because + of parsing + errors or whatever. We could give a file directly to Popen to + write the + stderr file, but we only want to create the file when there's output, + because it's what we use to know whether the command produced + output or + not. So, instead of buffering the whole output and then write it + to the + file, now we read from the pipe while the command is running, writing + the output in chunks to the file. This improves a lot the memory + consumption when running some tests. + + regtest/backends/__init__.py | 40 + ++++++++++++++++++++++++++++++---------- + 1 file changed, 30 insertions(+), 10 deletions(-) + +commit f8f82f1cc3a948239a05d7762210a3f244299db6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Nov 29 10:03:24 2013 +0100 + + regtest: Read test results in chunks to get the md5 digest + + Some backends can generate huge results, like huge postscript + files that + we don't want to load in memory to get the md5. So, instead of + creating + thr md5 object with the entire file, we feed it with chunks of data + using the update method. This improves a lot the memory consumption + and + performance as well. + + regtest/backends/__init__.py | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +commit 3444a44397a890dbeb1bd10357dbc8246fd21ad0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Nov 29 10:01:20 2013 +0100 + + regtest: Remove unused method _check_exit_status2 + + It was used when the backends ran in parallel odd and even pages, but + it's no longer used since threads support was added. + + regtest/backends/__init__.py | 20 -------------------- + 1 file changed, 20 deletions(-) + +commit 5f825df417947c51943f1db327e1aa6c3faa15b0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Fri Nov 29 09:57:57 2013 +0100 + + regtest: Do not store the current line in Printer but only its length + + We are not using the line text anymore, but only the length. + + regtest/Printer.py | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +commit 1486d93f0f6418b37ccc57568717d9349a79935b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Nov 27 18:29:36 2013 +0100 + + regtest: Do not consider docs with no refs as skipped + + Handle them differently as new docs, and show them in the summary + suggesting to use create-refs command to include them in the test + suite. + + regtest/TestRun.py | 40 +++++++++++++++++++++++----------------- + 1 file changed, 23 insertions(+), 17 deletions(-) + +commit 5241c0cc730c380dc44c3a081e1de675e1915861 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Wed Nov 27 17:18:37 2013 +0100 + + regtest: Use number of tests run to show the progress + + Instead of using the number of document tested. We don't really + need to + set a number to a particular document, we only want to know the + progress + of the whole process. This ensures that the progress is shown in the + correct order. It also simplifies the code a bit. + Also improved the output formatting to make it easier to read. + + regtest/Printer.py | 44 ++++----------- + regtest/TestReferences.py | 50 +++++++++++------ + regtest/TestRun.py | 136 + +++++++++++++++++++++++++--------------------- + 3 files changed, 118 insertions(+), 112 deletions(-) + +commit 0af3e009a702d0c6ca716565ab87b386baa0a1ed +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 27 00:53:16 2013 +0100 + + 0.24.4 + + CMakeLists.txt | 4 ++-- + NEWS | 18 ++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 7 files changed, 25 insertions(+), 7 deletions(-) + +commit a42a13be0a0cda71dc230a73f7b16eb4eb066251 +Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> +Date: Wed Nov 27 00:05:57 2013 +0100 + + Warn the user if he provides a wrong range + + utils/pdffonts.cc | 7 +++++++ + utils/pdfimages.cc | 7 +++++++ + utils/pdfinfo.cc | 7 +++++++ + utils/pdfseparate.cc | 7 +++++++ + utils/pdftocairo.cc | 7 +++++++ + utils/pdftohtml.cc | 8 +++++++- + utils/pdftoppm.cc | 7 +++++++ + utils/pdftops.cc | 7 +++++++ + utils/pdftotext.cc | 6 ++++++ + 9 files changed, 62 insertions(+), 1 deletion(-) + +commit 45552cafaeef6b883078db269437586add1dc32c +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 26 23:36:12 2013 +0100 + + Update copyrights + + utils/pdftotext.cc | 1 + + 1 file changed, 1 insertion(+) + +commit f20fe89d4f5a8f768e2019f25cecf40cd0e4f5f8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Nov 25 09:05:41 2013 +0100 + + glib-demo: Add an area selector to text demo + + And use the for_area variants of the API to get the text, text layout + and text attributes. + + glib/demo/text.c | 114 + +++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 110 insertions(+), 4 deletions(-) + +commit bb2b7fb491fb72f0ea024d80df89680ede3457b4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Nov 25 09:04:30 2013 +0100 + + glib: Add API to get text, text layout and text attributes for a + given area + + glib/poppler-page.cc | 107 + ++++++++++++++++++++++++++++++++++-- + glib/poppler-page.h | 8 +++ + glib/reference/poppler-sections.txt | 3 + + 3 files changed, 113 insertions(+), 5 deletions(-) + +commit f662973b0da52da84acc3668a0e037ee72498193 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Nov 2 14:07:07 2013 +0100 + + TextOutputDev: Honor the selection rectangle passed to + TextPage::getSelectionWords() + + Make TextPage::getSelectionWords() return a list of TextWordSelection + instead of a list of TextWord so that it's possible to know which + characters of the word are inside the given selection rectangle. + Adapt the glib frontend to the new API and use the selection bounds + instead of the whole word to build the list of characters in + poppler_page_get_text_layout() and poppler_page_get_text_attributes(), + which ensures the number of glyphs returned is in sync with the number + of characters returned by poppler_page_get_text(). + + https://bugs.freedesktop.org/show_bug.cgi?id=71160 + + glib/poppler-page.cc | 22 ++++++++++++++-------- + poppler/TextOutputDev.cc | 40 ++++++++-------------------------------- + poppler/TextOutputDev.h | 20 ++++++++++++++++++++ + 3 files changed, 42 insertions(+), 40 deletions(-) + +commit 18fab454c59b1c77c691617aaef99245eacd83b5 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Mon Oct 28 22:41:41 2013 -0700 + + glib-demo: Simplify annotations list and its properties + + * Move the annotation's rectangle to properties to make the + list view of annotations cleaner. + * Remove duplicated information: flags and page are already + present in the UI. + + https://bugs.freedesktop.org/show_bug.cgi?id=70982 + + glib/demo/annots.c | 70 + ++++++++++++------------------------------------------ + 1 file changed, 15 insertions(+), 55 deletions(-) + +commit 770a7ac9833a3c4f4f0399093272d4d0bdc7923b +Merge: e7a0f2b 9ae29c7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Nov 21 23:58:29 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 9ae29c7a07d0f372dbfc4aca17bbb646126aedb5 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu Nov 21 23:53:53 2013 +0100 + + Don't end loop if reading from GooFile fails + + Bug #71835 + + poppler/Stream.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit e7a0f2b942fe621304275175324f7809d1c83d80 +Author: Hib Eris <hib@hiberis.nl> +Date: Wed Nov 20 00:43:27 2013 +0100 + + Fix warning on signed/unsigned comparison in GfxState.cc + + Bug #71641 + + poppler/GfxState.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit c784c4c3a582aaa4e10c223665cb876e12b7c16f +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Mon Nov 18 00:57:53 2013 -0800 + + glib-demo: Add support for simple line annotations + + https://bugs.freedesktop.org/show_bug.cgi?id=70981 + + glib/demo/annots.c | 99 + +++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 91 insertions(+), 8 deletions(-) + +commit 2d164e06b8a84ade6689d85bba2d606c66bf62a9 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Mon Nov 18 00:48:13 2013 -0800 + + glib-demo: add color selection for new annotations + + https://bugs.freedesktop.org/show_bug.cgi?id=71727 + + glib/demo/annots.c | 34 ++++++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +commit 7127a2c705787f6f44b0852efeabe9fdeae7e2c0 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Sun Nov 17 23:38:32 2013 -0800 + + glib: Add support for simple line annotations + + https://bugs.freedesktop.org/show_bug.cgi?id=70981 + + glib/poppler-annot.cc | 79 + +++++++++++++++++++++++++++++++++++++ + glib/poppler-annot.h | 12 ++++++ + glib/poppler-page.cc | 3 ++ + glib/poppler-private.h | 1 + + glib/poppler.h | 1 + + glib/reference/poppler-sections.txt | 7 ++++ + 6 files changed, 103 insertions(+) + +commit 451bac9f05bab18f3aa0392ddf6eb6b569004cb8 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Sun Nov 17 23:30:14 2013 -0800 + + glib: Add PopplerPoint boxed type + + https://bugs.freedesktop.org/show_bug.cgi?id=70981 + + glib/poppler-page.cc | 54 + +++++++++++++++++++++++++++++++++++++ + glib/poppler-page.h | 20 ++++++++++++++ + glib/poppler.h | 1 + + glib/reference/poppler-sections.txt | 5 ++++ + 4 files changed, 80 insertions(+) + +commit c01cee165392ba8297e4168111a66d2acb272a99 +Merge: 07c2554 47605a8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 18 22:58:28 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.24' + + Conflicts: + poppler/Catalog.cc + poppler/Catalog.h + +commit 47605a8aaf85bee21601219b04c0c8e6cf982507 +Author: José Aliste <jaliste@src.gnome.org> +Date: Mon Nov 18 22:52:08 2013 +0100 + + Catalog: sort entries of NameTrees to make sure lookup works + + Bug #26049 + + poppler/Catalog.cc | 12 ++++++++++++ + poppler/Catalog.h | 2 ++ + 2 files changed, 14 insertions(+) + +commit 07c255482f7ec8a8cfd4eaeaf7b07de317bbcc7a +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Sun Oct 27 13:30:22 2013 -0700 + + glib-demo: Add annotations interactively + + * Prepare UI to add multiple annotations type. + * Remove dialog and button add annotations. + + https://bugs.freedesktop.org/show_bug.cgi?id=69978 + + glib/demo/annots.c | 348 + ++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 213 insertions(+), 135 deletions(-) + +commit 4b7c91ea697359751f9abe9ec5e63021c90a60ed +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Sat Sep 28 23:18:07 2013 -0700 + + glib: Add getter and setter for annotation's rectangle + + Annotation objects contain at least two keys, Rect and Subtype. + The former has the coordinates where the annotation is placed. + The getter and setter allows to obtain and modify the position + of a given annotation. + + https://bugs.freedesktop.org/show_bug.cgi?id=70901 + + glib/poppler-annot.cc | 48 + +++++++++++++++++++++++++++++++++++++ + glib/poppler-annot.h | 4 ++++ + glib/reference/poppler-sections.txt | 2 ++ + 3 files changed, 54 insertions(+) + +commit 491f0a170c72271a7a9ce049fbcfe81f08cff162 +Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> +Date: Fri Nov 15 20:35:12 2013 +0100 + + pdftotext: Escape the text of the xml headers + + utils/pdftotext.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 4da94680d4d2d6b1bd3351d476a20f9c7ae565bc +Merge: 3ea3d7c 78c407a +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 15 20:27:00 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 3ea3d7c6c7a0ede76428204ec11aec3a844117fc +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Nov 15 19:59:52 2013 +0100 + + pdftotext: Silence warning for may be used uninitialized variable + + Bug #71640 + + utils/pdftotext.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 97910b9eb92df49757915bde02e0d54de04552d4 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Nov 15 19:55:19 2013 +0100 + + Do not close stdout in pdftotext + + Bug #71639 + + utils/pdftotext.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 78c407ac7e8f48ae2d2c75ad0f5960390190d2e3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 15 20:25:52 2013 +0100 + + destionation -> destination + + And this is why the xml based api has to die + + Bug #71643 + Found by Hib + + qt4/src/poppler-annotation.cc | 5 +++-- + qt5/src/poppler-annotation.cc | 3 ++- + 2 files changed, 5 insertions(+), 3 deletions(-) + +commit a23c9ad4c0536d680bedc563444ce3adf6e1ee9e +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Nov 15 11:38:45 2013 +0100 + + Silence warning for may be used uninitialized variable in + ImageOutputDec.cc + + Fixes warning: + + CXX ImageOutputDev.lo + ImageOutputDev.cc: In member function 'void + ImageOutputDev::writeImageFile(ImgWriter*, + ImageOutputDev::ImageFormat, const char*, Stream*, int, int, + GfxImageColorMap*)': + ImageOutputDev.cc:409:28: warning: 'imgStr' may be used uninitialized + in this function [-Wmaybe-uninitialized] + + Bug #71642 + + utils/ImageOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit c43a80e65fc570a8017892ba111a8c48ac33d9ad +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Nov 15 19:59:52 2013 +0100 + + pdftotext: Silence warning for may be used uninitialized variable + + Bug #71640 + + utils/pdftotext.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f905d804c0d1c715d8423938f41b5a002c0ef15d +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Nov 15 19:55:19 2013 +0100 + + Do not close stdout in pdftotext + + Bug #71639 + + utils/pdftotext.cc | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 33e703ac9bb6cf69664d6c6fddd3bebd56336074 +Merge: 8294d18 7c74bcc +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 15 19:50:10 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 7c74bccdf514cce05987dde7fb1cce4ac65ff025 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 15 19:48:07 2013 +0100 + + Forgot to update the copyrights + + poppler/Lexer.cc | 2 +- + poppler/Lexer.h | 2 +- + poppler/Parser.cc | 2 +- + poppler/Parser.h | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit ebe49d597a62aa94601c2e4595dbad1895ea7ef0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 15 19:33:00 2013 +0100 + + Fix regression in broken endstream detection + + Rregression was caused by e1ffa9100cf6b4a444be7ed76b11698a5c5bb441 + Fixes bug #70854 + + poppler/Lexer.cc | 4 ++-- + poppler/Lexer.h | 2 +- + poppler/Parser.cc | 11 ++++------- + poppler/Parser.h | 2 +- + 4 files changed, 8 insertions(+), 11 deletions(-) + +commit 8294d18ea96bd18be076bccbdbdaa015fc48aa12 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu Sep 26 20:46:34 2013 +0300 + + Tagged-PDF: Parsing of StructElem standard types and attributes + + Parse attributes and standard types of StructElem nodes of the + document structure tree. Type name aliases are resolved via the + RoleMap (and cycles detected). Both standard attributes and user + properties are mapped to instances of the Attribute class. + Attributes are parsed both via ClassMap references and directly + referenced from the StructElem objects. + + https://bugs.freedesktop.org/show_bug.cgi?id=64815 + + poppler/StructElement.cc | 1018 + +++++++++++++++++++++++++++++++++++++++++++++- + poppler/StructElement.h | 113 ++++- + 2 files changed, 1126 insertions(+), 5 deletions(-) + +commit 4e0cbd37b964107c0fb531d48876a33ae843bf27 +Author: suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> +Date: Mon Nov 11 22:46:07 2013 +0100 + + pdftohtml: Add -? and --help + + utils/pdftohtml.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 4dbd36f5b35dd0964e59d942242aecdc6b474c89 +Author: Andres Gomez <agomez@igalia.com> +Date: Tue Nov 5 09:52:23 2013 +0200 + + glib-demo: Fix conding style issue in main.c + + https://bugs.freedesktop.org/show_bug.cgi?id=71245 + + glib/demo/main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 02f3c235eaf60350c98e88dbe266378fccef59d7 +Author: Andres Gomez <agomez@igalia.com> +Date: Tue Nov 5 09:52:23 2013 +0200 + + glib-demo: Fix a typo in function name + + https://bugs.freedesktop.org/show_bug.cgi?id=71245 + + glib/demo/main.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 5620b82e69335b7f12d877a24f1a463604f0e515 +Author: Andres Gomez <agomez@igalia.com> +Date: Tue Nov 5 09:52:23 2013 +0200 + + glib-demo: Fix trailing whitespaces in main.c + + https://bugs.freedesktop.org/show_bug.cgi?id=71245 + + glib/demo/main.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 43309d92d327b4ae8e89edb15482247045d726a4 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Sat Sep 28 20:45:32 2013 -0700 + + glib-demo: Make the Remove annotation button prominent in demo + + Move out from Annotation properties to the top. This make better + use of the space. + Make the remove button active only if there is an annotation + selected. + + https://bugs.freedesktop.org/show_bug.cgi?id=69978 + + glib/demo/annots.c | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +commit f4a72fd3c61091d6b455af9a881c2390da19b506 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 26 19:06:34 2013 +0200 + + 0.24.3 + + CMakeLists.txt | 2 +- + NEWS | 14 ++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 19 insertions(+), 5 deletions(-) + +commit 33a5af32cd5769cf1b6c6344077ac4a3f407ba21 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Oct 26 18:48:50 2013 +0200 + + Update copyrights + + qt4/src/poppler-document.cc | 2 +- + utils/pdfseparate.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 9f09b9596f1fc52481914019d68c8f9b85b5c438 +Merge: bd893d4 61f79b8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 24 01:03:02 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 61f79b8447c3ac8ab5a26e79e0c28053ffdccf75 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 24 00:54:56 2013 +0200 + + Allow only one %d in the filename + + Fixes crashes if you had %s and similar in the filename + + Inspired from patch by Pedro Ribeiro <pedrib@gmail.com> + + Bug #69434 + + utils/pdfseparate.cc | 31 ++++++++++++++++++++++++++++++- + 1 file changed, 30 insertions(+), 1 deletion(-) + +commit bd893d4a543a6cc3a525655f37def38440944f28 +Merge: 93e8b05 daa0990 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 10 02:19:34 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit daa0990a7baf17d00d12574a4de815e070727a86 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 10 02:16:25 2013 +0200 + + Return empty if getXRef()->copy() fails + + Seems this can happen by looking at the backtrace in + https://bugs.kde.org/show_bug.cgi?id=325810 + + qt4/src/poppler-document.cc | 6 ++++++ + qt5/src/poppler-document.cc | 6 ++++++ + 2 files changed, 12 insertions(+) + +commit f4bfa940aa40a82a1080cdaf765da1d1615ccfb1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Oct 5 11:20:04 2013 +0200 + + cairo: Do not set an invalid matrix in drawImage() + + https://bugs.freedesktop.org/show_bug.cgi?id=70085 + + poppler/CairoOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 93e8b05fb2a6d225f048db6a3a735717433a5a13 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Oct 5 11:20:04 2013 +0200 + + cairo: Do not set an invalid matrix in drawImage() + + https://bugs.freedesktop.org/show_bug.cgi?id=70085 + + poppler/CairoOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 3084f8f4a5ad55937094b14e30169dccf1fa4ec9 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Sat Sep 21 11:59:32 2013 -0700 + + glib-demo: Expand short names for annotations used in demo + + https://bugs.freedesktop.org/show_bug.cgi?id=69978 + + glib/demo/annots.c | 10 +++++----- + glib/demo/main.c | 2 +- + 2 files changed, 6 insertions(+), 6 deletions(-) + +commit ff674f57a3587142165fd56aec089d9840ceda36 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Fri Sep 27 22:33:42 2013 -0700 + + glib-demo: Merge columns Type and Color in annotations demo + + Reduce the space used by both columns, makes the color + pixbuf smaller enough to give a clue of the annotation + color. + + https://bugs.freedesktop.org/show_bug.cgi?id=69978 + + glib/demo/annots.c | 28 ++++++++++++++++------------ + 1 file changed, 16 insertions(+), 12 deletions(-) + +commit 76d6e2d385e2cbad7f44bc8aee05147efd3970a4 +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Fri Sep 20 23:27:20 2013 -0700 + + glib-demo: Rearrange layout for annotations in demo + + Add render area to visualize the annotations per page. + + https://bugs.freedesktop.org/show_bug.cgi?id=69978 + + glib/demo/annots.c | 130 + ++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 118 insertions(+), 12 deletions(-) + +commit a6b1fc1a2ca83b3e4c52bcaa95b99d0289354f4b +Author: Germán Poo-Caamaño <gpoo@gnome.org> +Date: Sun Sep 29 22:50:42 2013 -0700 + + glib-demo: Fix rectangle calculation for new annotations in demo + + https://bugs.freedesktop.org/show_bug.cgi?id=69978 + + glib/demo/annots.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit bd49b3c0c6f2adccc5bda561edbaf9f00ed2917a +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Oct 2 23:32:09 2013 +0200 + + Use icc profile in OutputIntents + + Bug #34053 + + poppler/Gfx.cc | 114 +++++++++++--- + poppler/Gfx.h | 8 +- + poppler/GfxState.cc | 429 + +++++++++++++++++++++++++++++++++++++++++----------- + poppler/GfxState.h | 72 ++++++--- + poppler/Page.cc | 2 +- + 5 files changed, 490 insertions(+), 135 deletions(-) + +commit df947a0641082f530200880d46e20cd3e1fd962f +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 2 20:53:32 2013 +0200 + + Compile++ + + CMakeLists.txt | 4 ++++ + 1 file changed, 4 insertions(+) + +commit fa83d7e4f36cfc11c7b4f81f5f5e8ed69eb6dbbe +Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net> +Date: Wed Oct 2 20:35:58 2013 +0200 + + pdfseparate: allow zero-padded pagespecs + + Bug #50914 + + utils/pdfseparate.cc | 22 +++++++++++++++++++--- + 1 file changed, 19 insertions(+), 3 deletions(-) + +commit e04cabd878a0fd84faa5178f423fd828d010b664 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Mon Jun 17 17:00:27 2013 +0300 + + Tagged-PDF: Implement parsing of StructTreeRoot + + Implement parsing of the StructTreeRoot entry of the Catalog. Also, + the + Catalog::getStructTreeRoot() and PDFDoc::getStructTreeRoot() + methods are + modified to return an instance of StructTreeRoot instead of an Object. + + All elements from the StructTreeRoot are parsed except for: + + - IDTree: it is a lookup tree to locate items by their ID, which would + be barely useful because the whole structure tree is to be kept in + memory, which should be fast enough to traverse. + - ParentTreeNextKey: This is needed only when the ParentTree object is + to be modified. For the moment the implementation deals only with + reading, so this has been deliberately left out. + + StructElem tree nodes from the document structure tree are parsed as a + StructElement instance. Attributes and extraction of content out from + elements are not yet handled. + + https://bugs.freedesktop.org/show_bug.cgi?id=64815 + + poppler/Catalog.cc | 36 +++--- + poppler/Catalog.h | 5 +- + poppler/Makefile.am | 4 + + poppler/PDFDoc.h | 3 +- + poppler/StructElement.cc | 322 + ++++++++++++++++++++++++++++++++++++++++++++++ + poppler/StructElement.h | 167 ++++++++++++++++++++++++ + poppler/StructTreeRoot.cc | 174 +++++++++++++++++++++++++ + poppler/StructTreeRoot.h | 83 ++++++++++++ + 8 files changed, 776 insertions(+), 18 deletions(-) + +commit 45e0fe56985f34e695c99a2f6ec1ffe14e239b9e +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu Sep 26 20:56:52 2013 +0300 + + Implement Object::takeString() method + + Object::takeString() behaves like Object::getString(), but transfers + ownership of the returned string to the caller. Also, it makes + sure that + calling Object::free() afterwards won't free the string that the + Object + is holding. + + poppler/Object.h | 4 ++++ + 1 file changed, 4 insertions(+) + +commit d80eb4a34c218de34633ee2f1b9dfd65504a0ad9 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Oct 1 22:57:55 2013 +0200 + + cache cms values in getGray(), getRGB() and getCMYK() + + Bug #68420 + + poppler/GfxState.cc | 111 + ++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/GfxState.h | 2 + + 2 files changed, 113 insertions(+) + +commit 9bc8f3240698d5a8ae4c0129e768840664d28c22 +Merge: a2742c8 e2fe851 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Oct 1 19:19:32 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit e2fe85137ecb59eb0d177682c552febc64cda643 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Oct 1 19:15:08 2013 +0200 + + Fix PFB font embedding + + Bug #69717 + + poppler/PSOutputDev.cc | 52 + ++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 46 insertions(+), 6 deletions(-) + +commit a2742c8fce0594ccbdb036dd0c29c6e15d2229f3 +Merge: 6b30a52 06dabe1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 30 19:32:41 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 06dabe1eed912e5f5c96fe9f371ab459516e5a99 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 27 12:41:23 2013 +0200 + + 0.24.2 + + CMakeLists.txt | 2 +- + NEWS | 8 ++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 13 insertions(+), 5 deletions(-) + +commit 78141da189c42a04b6a303767284de755a4a2d4d +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 27 12:39:00 2013 +0200 + + Update copyrights + + utils/pdfseparate.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 6b30a5214e39993025cf2fb9f221e1360de7fa9c +Merge: 4966b6f dc344b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 21 10:38:45 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit dc344b410f49410174ee902b7649ebd8c2cb0fa2 +Author: Lu Wang <coolwanglu@gmail.com> +Date: Sat Sep 21 10:37:30 2013 +0200 + + pdftocairo: check file opening failure in beginDocument() + + utils/pdftocairo.cc | 7 +++++++ + 1 file changed, 7 insertions(+) + +commit 4966b6f4193cc9d13f63e92bdc2aac0c8b78298d +Merge: 0f074b1 1e612d3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 21 10:15:28 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 1e612d331b79dabec66ad241d7ffe66674a10bc4 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Sep 21 10:10:16 2013 +0200 + + Windows: Fix CreateFile fails with ERROR_SHARING_VIOLATION + + Bug #69597 + + goo/gfile.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 0f074b16317d874fe58d7042f8434282786ca757 +Merge: d277432 b8682d8 +Author: Pino Toscano <pino@kde.org> +Date: Mon Sep 16 19:53:10 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + + Conflicts: + utils/pdfimages.1 + +commit b8682d868ddf7f741e93b791588af0932893f95c +Author: Pino Toscano <pino@kde.org> +Date: Mon Sep 16 19:46:55 2013 +0200 + + pdfseparate: improve the path building + + Make use of snprintf to limit the output to the pathName buffer; + while I'm there, expand its size to 4096 (might help longer paths), + although a better fix would be dynamically allocate its length + (and/or using GooString, maybe). + + utils/pdfseparate.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit d2774325f5248018977d3ab8f8dd7155ed972668 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 14 14:08:11 2013 +0930 + + pdfimages.1: fix typo + + utils/pdfimages.1 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9b5957278c7f249fa1010e61a0ed79f0eb20e26d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Aug 31 17:33:25 2013 +0930 + + pdfimages: ensure dump* variables are intialized + + utils/ImageOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit e116ef32504b589001814f0f579309ecf7ec89d9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Aug 28 08:05:23 2013 +0930 + + Make cpp/poppler-image.cc use goo/NetPBMWriter + + cpp/CMakeLists.txt | 1 - + cpp/Makefile.am | 2 - + cpp/PNMWriter.cc | 119 + -------------------------------------------------- + cpp/PNMWriter.h | 43 ------------------ + cpp/poppler-image.cpp | 14 +++--- + 5 files changed, 6 insertions(+), 173 deletions(-) + +commit a87a11ee6bbd0f5707a3ac34ac2b9cc79f4e92d0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Aug 29 22:42:34 2013 +0930 + + pdfimages: support cmyk tiff output + + If -tiff is specified, CMYK images will be written as CMYK TIFF files + instead of converting to RGB. If both -png and -tiff are specified (as + is the case with the -all option), CMYK images are written as TIFF and + all other types as PNG. + + utils/ImageOutputDev.cc | 32 +++++++++++++++++++++++++++++++- + utils/ImageOutputDev.h | 3 ++- + utils/pdfimages.1 | 13 ++++++++----- + utils/pdfimages.cc | 3 ++- + 4 files changed, 43 insertions(+), 8 deletions(-) + +commit 63da26f8fb0b2b5ffaa127762d4e36d995c482ee +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Aug 27 20:40:29 2013 +0200 + + resolve copy&paste error + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 563da2d375c003478d398897796ecbf45ce03482 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 26 22:33:10 2013 +0200 + + 0.24.1 + + CMakeLists.txt | 2 +- + NEWS | 23 +++++++++++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 6 files changed, 28 insertions(+), 5 deletions(-) + +commit 2c73f1ea9116172692d8350cb7adf1b5376f795c +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 26 21:50:51 2013 +0200 + + Fix typo + + qt5/src/poppler-qt5.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f58e9b64d5cf62906876c5c0f8da0f3c2c6c2bac +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 26 00:27:59 2013 +0200 + + Some more files Adrian has changed + + goo/PNGWriter.h | 2 +- + utils/HtmlOutputDev.cc | 2 +- + utils/pdftocairo.cc | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit 16da389c61c495111a5a49f62539a423a0655c28 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 26 07:50:51 2013 +0930 + + fix typo in pdfimages.1 + + utils/pdfimages.1 | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 56c0d4f3a231dca141c06493b50ab25959b5b15c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Aug 26 07:47:46 2013 +0930 + + fix typo in pdfimages.1 + + utils/pdfimages.1 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit af4f2b775946815b572622bf4c4d42ad3aea1141 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Aug 24 21:25:51 2013 +0930 + + pdfimages: Add -all option to write all image in their native format + + utils/pdfimages.1 | 4 ++++ + utils/pdfimages.cc | 23 +++++++++++++++++------ + 2 files changed, 21 insertions(+), 6 deletions(-) + +commit 25e96b6ddbbe54a75ddb97d2e235c1bd6033fe79 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Aug 21 22:22:28 2013 +0930 + + pdfimages: support ccitt output + + poppler/Stream.h | 5 +++++ + utils/ImageOutputDev.cc | 35 +++++++++++++++++++++++++++++++++++ + utils/ImageOutputDev.h | 4 ++++ + utils/pdfimages.1 | 39 ++++++++++++++++++++++++++++++++++++++- + utils/pdfimages.cc | 4 ++++ + 5 files changed, 86 insertions(+), 1 deletion(-) + +commit 086413263cb63a24d9492fbe534fdcc34b45951a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 18 20:37:01 2013 +0930 + + pdfimages: support JBIG2 output + + poppler/JBIG2Stream.h | 1 + + utils/ImageOutputDev.cc | 25 +++++++++++++++++++++++++ + utils/ImageOutputDev.h | 4 ++++ + utils/pdfimages.1 | 13 ++++++++----- + utils/pdfimages.cc | 4 ++++ + 5 files changed, 42 insertions(+), 5 deletions(-) + +commit 2845ebabd00a2755549b8db436e78a3e0e0c0713 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 18 20:07:31 2013 +0930 + + pdfimages: add support for writing JPEG2000 files + + utils/ImageOutputDev.cc | 4 ++++ + utils/ImageOutputDev.h | 4 ++++ + utils/pdfimages.1 | 12 ++++++++---- + utils/pdfimages.cc | 4 ++++ + 4 files changed, 20 insertions(+), 4 deletions(-) + +commit 2021c8ffcb36432049c4305e85ced2ae139086f3 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 18 17:29:00 2013 +0930 + + pdfimages: add support for png and tiff output + + utils/ImageOutputDev.cc | 67 + ++++++++++++++++++++++++++++++++++++++++++++++--- + utils/ImageOutputDev.h | 17 +++++++++++-- + utils/pdfimages.1 | 22 ++++++++++------ + utils/pdfimages.cc | 19 +++++++++++--- + 4 files changed, 110 insertions(+), 15 deletions(-) + +commit 8f466775c77b09a7114c688004317e6db05bcd3f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 18 16:08:02 2013 +0930 + + Change PNGWriter monochrome format to be 8 pixels/byte + + to be consistent with TiffWriter and NetPBMWriter + + goo/PNGWriter.cc | 4 ---- + goo/PNGWriter.h | 2 +- + utils/HtmlOutputDev.cc | 31 +++++++++++++++++++------------ + utils/ImageOutputDev.cc | 9 ++++++--- + utils/pdftocairo.cc | 2 +- + 5 files changed, 27 insertions(+), 21 deletions(-) + +commit e53aec2c61ba42cf0635dc05f8e27e3503c1eaac +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Aug 18 15:50:39 2013 +0930 + + Refactor ImageOutputDev to facilitate adding more output formats + + - Move PPM/PBM code into a NetPBMWriter class so PNGWriter and + TiffWritersupport be added. + + - Create generic WriteRawIMage function for writing jpeg files so + support for jpeg2000/jbig2 can be added. + + CMakeLists.txt | 1 + + goo/Makefile.am | 2 + + goo/NetPBMWriter.cc | 84 ++++++++++++++++ + goo/NetPBMWriter.h | 52 ++++++++++ + utils/ImageOutputDev.cc | 261 + +++++++++++++++++++++--------------------------- + utils/ImageOutputDev.h | 15 +-- + 6 files changed, 262 insertions(+), 153 deletions(-) + +commit 0ca0fcc9f536a57365048914cd8a8cc3eb5ed4fd +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Aug 17 15:24:43 2013 +0930 + + pdfimages: fix bug in -list output + + Images of type /ImageMask should have type 'stencil'. + + utils/ImageOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f8ee5a931c795013d17f73f083b6e6f9a683d061 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Aug 17 15:17:11 2013 +0930 + + pdfimages: print size, ratio, and ppi + + utils/ImageOutputDev.cc | 100 + ++++++++++++++++++++++++++++++++++++++++++++---- + utils/pdfimages.1 | 12 ++++++ + utils/pdfimages.cc | 2 +- + 3 files changed, 106 insertions(+), 8 deletions(-) + +commit b5321c4f40fb56b10f75c14c5c955c5775cf2ef9 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sun Aug 25 20:13:12 2013 +0200 + + use getCMYK/DeviceNLine in CMYK mode if available + + Second part of bug 66928 + + poppler/GfxState.cc | 310 + ++++++++++++++++++++++++++++++++++++++++++++- + poppler/GfxState.h | 32 ++++- + poppler/SplashOutputDev.cc | 28 ++-- + splash/SplashTypes.h | 2 - + 4 files changed, 355 insertions(+), 17 deletions(-) + +commit d006ac567e59e82c4c6cb42c5e429a4aa516ac0b +Merge: d391af7 ed3585e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 25 19:36:33 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit ed3585efc8b259cb065eac361a6a499f9f26851f +Author: William Bader <williambader@hotmail.com> +Date: Sun Aug 25 19:31:11 2013 +0200 + + Fix pdftops -eps -level1sep rendering of a file + + Since 8fb243bf11a979af8bfa36427436940706c9f71d we have + case splashModeXBGR8: + + cSrcNonIso[3] = 255; + and that means splashModeDeviceN8 and splashModeCMYK8 can't + skip their breaks anymore otherwise the cSrcNonIso[3] gets + overwritten + + Bug #68321 + + splash/Splash.cc | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +commit d391af7ea63c4bc884bb81895aea0cdd8f8b282a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 24 14:03:49 2013 +0200 + + Update copyrights + + poppler/Annot.cc | 1 + + poppler/Annot.h | 1 + + poppler/Catalog.cc | 2 ++ + poppler/Catalog.h | 2 ++ + poppler/Form.cc | 2 +- + poppler/Form.h | 1 + + poppler/Page.cc | 1 + + poppler/Page.h | 1 + + utils/pdfinfo.cc | 1 + + 9 files changed, 11 insertions(+), 1 deletion(-) + +commit a47b7f853174d6101f2b882a2db1a7dc95b33293 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Aug 3 10:28:20 2013 +0930 + + Add pdfinfo option to print out javascript + + poppler/Catalog.h | 1 + + utils/JSInfo.cc | 164 + +++++++++++++++++++++++++++++++++++++++++------------- + utils/JSInfo.h | 12 +++- + utils/pdfinfo.1 | 3 + + utils/pdfinfo.cc | 10 ++++ + 5 files changed, 151 insertions(+), 39 deletions(-) + +commit 8f7155e7e3180bb1966a5e7df6af6acdd479939b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Aug 3 09:05:21 2013 +0930 + + pdfinfo: indicate if pdf contains javascript + + poppler/Annot.cc | 27 ++++++++++ + poppler/Annot.h | 8 +++ + poppler/Catalog.cc | 26 +++++++++ + poppler/Catalog.h | 12 +++++ + poppler/Form.cc | 4 ++ + poppler/Form.h | 2 + + poppler/Page.cc | 20 +++++++ + poppler/Page.h | 10 +++- + utils/CMakeLists.txt | 4 ++ + utils/JSInfo.cc | 145 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + utils/JSInfo.h | 50 ++++++++++++++++++ + utils/Makefile.am | 4 ++ + utils/pdfinfo.1 | 3 ++ + utils/pdfinfo.cc | 8 +++ + 14 files changed, 322 insertions(+), 1 deletion(-) + +commit c2453fc1307ebb222747f976e1311ecc5e99abfa +Merge: 3bb8c2e 70298a0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 20 19:53:17 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 70298a021657a72ae80389687a86247144e6d6b6 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Aug 20 19:46:01 2013 +0200 + + Don't copy not needed bitmap + + Speeds up rendering of fixes from bug 67105 + As example one file is down from 130s to 6.5s + + poppler/SplashOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3bb8c2e34039cf473bf72ed9dab55664deab3ab7 +Merge: 71c1d16 fc78330 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 20 00:41:13 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit fc78330072b9771fa39d21896703adb4836e5398 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Aug 20 00:37:56 2013 +0200 + + use getRGBLine images if available + + Speeds up greatly files from bug #66928 + + E.g. some file went from 21s to 2s in my computer + + poppler/SplashOutputDev.cc | 30 +++++++++++++++++++----------- + 1 file changed, 19 insertions(+), 11 deletions(-) + +commit 71c1d162477a243db07b62ef3c056a2946f8986e +Merge: 7d1de78 678c767 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 18 16:41:20 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 7d1de78ad79162217ee0ca6c2e99ce51017a327d +Merge: 7e0d969 fbea224 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 18 16:40:34 2013 +0200 + + Merge commit 'origin/poppler-0.24~1' + + This is merging the revert commits with the "ours" strategy, so + it's virtually + doing nothing other than making the stable branch mergeable again + to master + +commit 678c767584fa80620cc58a1d8a913cb3473209d4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Aug 18 16:19:27 2013 +0200 + + Fix crash in 1026.asan.0.42.pdf + + We were not checking that bitmapOff was in bounds + + splash/Splash.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit fbea2241cccdde0106d2c34592b6ddda28a8d848 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 17 01:32:51 2013 +0200 + + Revert "Tagged-PDF: Accessors in Catalog for the MarkInfo dictionary" + + This reverts commit 402ee8b4e31630a42a0a38db1d39164cc5789f3c. + + No clue how this ended up in the stable branch + + poppler/Catalog.cc | 45 --------------------------------------------- + poppler/Catalog.h | 10 ---------- + 2 files changed, 55 deletions(-) + +commit 6d2771b8a8c0cb0f2288d0900fea3c9edc3dd172 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 17 01:32:38 2013 +0200 + + Revert "pdfinfo: Use Catalog::getMarkInfo() to show mark info + properties" + + This reverts commit 73cca518c479594e26605196d54b429fbf42dcdc. + + No clue how this ended up in the stable branch + + utils/pdfinfo.cc | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit 7e0d969dc2439637ab16e609df8223504316f87d +Merge: 6efc0c7 ef64206 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 17 01:13:30 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit ef6420656c7b88eb22a63ec2cb3e504e0bda0384 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Aug 17 01:11:37 2013 +0200 + + Fix jpeg image export + + Use same logic than the one used in ImageOutputDev + Bug #48270 + + utils/HtmlOutputDev.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 681f52a572b08c068cb376e5b2dc8a31676aad07 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 16 23:58:44 2013 +0200 + + Fix exit(1) in 1026.asan.0.42.pdf + + The main crash in discussion with Thomas + + splash/Splash.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 9f4d7796589e4c9c1645fbbcf0cfabd79a71bde9 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu Aug 8 20:33:54 2013 +0200 + + use copyString where memory is freed with gfree + + Bug #67666 + + poppler/Annot.cc | 2 +- + poppler/Dict.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 73cca518c479594e26605196d54b429fbf42dcdc +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu Apr 25 09:52:56 2013 +0300 + + pdfinfo: Use Catalog::getMarkInfo() to show mark info properties + + utils/pdfinfo.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 402ee8b4e31630a42a0a38db1d39164cc5789f3c +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu Apr 25 09:52:56 2013 +0300 + + Tagged-PDF: Accessors in Catalog for the MarkInfo dictionary + + poppler/Catalog.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ + poppler/Catalog.h | 10 ++++++++++ + 2 files changed, 55 insertions(+) + +commit 6efc0c7ad97a82064a1e2c47e0b063b606e56bb7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 16 23:31:54 2013 +0200 + + Remove unused xref member + + poppler/OptionalContent.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cb5160aa74f64b78a20aaed4b89fead850b42e9b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 16 23:31:17 2013 +0200 + + Remove usnused objectNumberFirst member + + poppler/Hints.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit a642aad68733c25f4055c268d691eedcf4e14a22 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Aug 16 23:30:50 2013 +0200 + + PNGWriterPrivate is actually a struct not a class + + goo/PNGWriter.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 31947d413eae115acc147c33fc55b8ab4adccd91 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Aug 13 19:39:30 2013 +0200 + + pdftoppm: Add thinlinemode option setting + + utils/pdftoppm.1 | 12 ++++++++++++ + utils/pdftoppm.cc | 17 +++++++++++++++-- + 2 files changed, 27 insertions(+), 2 deletions(-) + +commit 8a1740b0b6ee4b217ecbe9d0046e4afa491e9f17 +Merge: b27588c c3f953d +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Aug 12 22:47:44 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit c3f953dc87f83ac726f99cb8f1f959c486098391 +Author: Yury G. Kudryashov <urkud.urkud@gmail.com> +Date: Sat Aug 10 21:43:57 2013 +0300 + + Fix a typo + + qt4/src/poppler-qt4.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b27588c4c946ef4f9a62248fbead4dffcb60b4d1 +Author: Yury G. Kudryashov <urkud.urkud@gmail.com> +Date: Mon Aug 12 22:42:13 2013 +0200 + + Fix indentation + + utils/pdftotext.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit b8b5773386ee4f57e72c2b867421cdff8a2eab5a +Merge: 5f9d385 62d079b +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 8 20:47:05 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 62d079b40a2f816f59cc533b1624ea57458331f3 +Author: Yury G. Kudryashov <urkud.urkud@gmail.com> +Date: Thu Aug 8 20:45:08 2013 +0200 + + Fix `pdftotext -bbox in.pdf -` + + Print body text to stdout if invoked as above. + + Bug #45163 + + utils/pdftotext.cc | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +commit 5f9d385dbec3148614b84ae24cae47177e18dbfc +Merge: af450a8 86dbc5f +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 8 20:41:25 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.24' + +commit 86dbc5f6f850ba3919bed9979386e5a4d0e7dba3 +Author: Yury G. Kudryashov <urkud.urkud@gmail.com> +Date: Thu Aug 8 20:39:30 2013 +0200 + + pdfdetach: don't mention xpdfrc + + - drop -cfg command line argument; the old code passed its value to + GlobalParams constructor which is the data dir, not a cfg file + - remove corresponding lines from pdfdetach.1 + - fix '-enc' documentation in pdfdetach.1 + + utils/pdfdetach.1 | 23 +++-------------------- + utils/pdfdetach.cc | 6 ++---- + 2 files changed, 5 insertions(+), 24 deletions(-) + +commit af450a885ede5a3eac1a12734310722963764d83 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu Aug 8 20:33:54 2013 +0200 + + use copyString where memory is freed with gfree + + Bug #67666 + + poppler/Annot.cc | 2 +- + poppler/Dict.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 030ee12875a562f5976c5569d5c76783aadf89bd +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu Apr 25 09:52:56 2013 +0300 + + pdfinfo: Use Catalog::getMarkInfo() to show mark info properties + + utils/pdfinfo.cc | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +commit 9a232273988c0d2fd752dc2016e5111227ae6646 +Author: Adrian Perez de Castro <aperez@igalia.com> +Date: Thu Apr 25 09:52:56 2013 +0300 + + Tagged-PDF: Accessors in Catalog for the MarkInfo dictionary + + poppler/Catalog.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ + poppler/Catalog.h | 10 ++++++++++ + 2 files changed, 55 insertions(+) + +commit 2724a7b9f723789491b4991ce7fe0cfa3e5488c3 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 30 09:36:44 2013 +0200 + + glib-demo: Remove GTK_DISABLE_DEPRECATED compilation flag + + Deprecations are now compile warnings, there's no reason to make them + fatal. + + glib/demo/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit ef9d861486d54fb3dcf7b8bca01bd44c3b3361a9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jul 30 09:36:44 2013 +0200 + + glib-demo: Remove GTK_DISABLE_DEPRECATED compilation flag + + Deprecations are now compile warnings, there's no reason to make them + fatal. + + glib/demo/Makefile.am | 1 - + 1 file changed, 1 deletion(-) + +commit eac752dc25942439de3e1c7a4ff815500a41dd2a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 29 19:11:55 2013 +0200 + + 0.24.0 + + CMakeLists.txt | 6 +++--- + NEWS | 7 +++++++ + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 7 files changed, 16 insertions(+), 9 deletions(-) + +commit 892433a068a8a11c09a7c4f57c5fc941747c4453 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 29 19:08:10 2013 +0200 + + Update Ed's copyright + + poppler/TextOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 4637b1581286381c3d1c6963828d9cd8afc5b9e0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 29 01:08:06 2013 +0200 + + Make some pdftops conversions *much* faster + + For example: http://ev.kde.org/resources/expense_report.pdf + + Without this patch it seems "infinite", which this patch it's a + few seconds + + The change: Instead of just remembering in xobjStack the set of + XObjects (and Patterns, + the variable name was 'wrong') we are currently setting up (i.e. the + current chain), we + remember all of them. + + This has passed the pdf->ps regression test without a single issue + + poppler/PSOutputDev.cc | 42 ++++++++++-------------------------------- + poppler/PSOutputDev.h | 6 +++--- + 2 files changed, 13 insertions(+), 35 deletions(-) + +commit e04287f2682e46831c04e0ef8d60411f521a2572 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 29 00:55:43 2013 +0200 + + Fallback to 1x1 bitmap If we fail to create the corrent one + + poppler/SplashOutputDev.cc | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +commit fe5ff20cb93a70fa1650ef5e00b67e35de20f0ca +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 29 00:54:07 2013 +0200 + + Initialize t3FillColorOnly + + poppler/PSOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 19930d9f104b63070dcd7636758eb8b90a86fc0d +Author: Ed Catmur <ed@catmur.co.uk> +Date: Sun Jul 21 11:07:00 2013 +0200 + + TextOutputDev: Do not draw ligatures more than once when selected + + When the selection covers a ligature presentation form where a single + character code corresponds to multiple Unicode codepoints, the + glyph for + the ligature is drawn multiple times, once for each Unicode character. + + https://bugs.freedesktop.org/show_bug.cgi?id=9001 + + poppler/TextOutputDev.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 6b451b2d3f785c28d98907ae338d58380db518d2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jul 19 02:55:29 2013 +0200 + + 0.23.4 + + CMakeLists.txt | 4 +-- + NEWS | 8 ++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + gtk-doc.make | 70 + +++++++++++++++++++++++++++++++----------------- + m4/gtk-doc.m4 | 6 ++++- + poppler/CairoOutputDev.h | 2 +- + poppler/Makefile.am | 2 +- + poppler/TextOutputDev.cc | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 11 files changed, 67 insertions(+), 35 deletions(-) + +commit 6cf43442e38c501b49293a28f38e06ab143852c6 +Author: Ed Catmur <ed@catmur.co.uk> +Date: Thu Jul 18 10:34:29 2013 +0200 + + TextOutputDev: clip the selected text rendering to the selection box + + Sometimes with italic text or text containing ligatures, part of the + glyph falls outside the selection box. By clipping to the selection + box + we avoid drawing the whole glyph with the selection color. + + https://bugs.freedesktop.org/show_bug.cgi?id=66983 + + poppler/TextOutputDev.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 269b3f3d572a15f1007f8cc84f758b1a293ef8af +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jul 8 20:19:30 2013 +0200 + + build: Make -lpthread take preference over -pthread + + This makes libpoppler link to pthreads and fixes runtime error due to + unresolved pthread symbols when running some of the utils and tests. + + m4/ax_pthread.m4 | 2 +- + test/Makefile.am | 6 ++++-- + utils/Makefile.am | 4 +++- + 3 files changed, 8 insertions(+), 4 deletions(-) + +commit 40f857d27930aa002a99c96f3892c5e240e7ecb5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jul 8 19:55:10 2013 +0200 + + m4: Replace old acx_pthread.m4 with new one ax_pthread.m4 + + configure.ac | 2 +- + m4/acx_pthread.m4 | 280 ----------------------------------------------- + m4/ax_pthread.m4 | 317 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 318 insertions(+), 281 deletions(-) + +commit 44b7070aa713b2e20eb97b868000d432e2f8504e +Author: Pino Toscano <pino@kde.org> +Date: Mon Jul 8 19:42:15 2013 +0200 + + cmake: improve linking with pthreads + + Use the CMake-provided variable instead of hardcoding -lpthread. + + CMakeLists.txt | 6 +++--- + utils/CMakeLists.txt | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit 69c281fdcf23520151c0eb5471a4259c73fa1273 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jul 7 11:51:27 2013 +0200 + + cairo: Fix the bounding box of images saved in CairoImageOutputDev + + We were using the size of the original image instead of the rendered + size and asuming the scales were always positive. + + poppler/CairoOutputDev.cc | 145 + ++++++++++++++++++---------------------------- + poppler/CairoOutputDev.h | 5 +- + 2 files changed, 59 insertions(+), 91 deletions(-) + +commit 759e0266b36c4ea9f66912f1e53ed6392dbfd6da +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 2 00:47:13 2013 +0200 + + News for 0.23.3 + + forgot to add them to the tarball, oh well + + NEWS | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit df1fe9dc7ade5228e37c16c6f0c9a2d4890fdc90 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jul 2 00:33:04 2013 +0200 + + 0.23.3 + + CMakeLists.txt | 4 ++-- + Makefile.am | 2 +- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + qt5/src/Doxyfile | 2 +- + 7 files changed, 8 insertions(+), 8 deletions(-) + +commit df9d4fee17adfe003c822175b6921a3cd93675f6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 1 21:04:10 2013 +0200 + + Update copyrights + + poppler/Annot.cc | 2 +- + poppler/Annot.h | 2 +- + poppler/Page.cc | 2 +- + poppler/TextOutputDev.cc | 2 +- + poppler/TextOutputDev.h | 2 +- + qt5/src/poppler-annotation.cc | 2 +- + qt5/src/poppler-annotation.h | 2 +- + qt5/src/poppler-document.cc | 2 +- + qt5/src/poppler-link.cc | 2 +- + qt5/src/poppler-qt5.h | 2 +- + 10 files changed, 10 insertions(+), 10 deletions(-) + +commit 67129e9db88e8332907407f14d3e09ee5c49e274 +Author: Jason Crain <jason@aquaticape.us> +Date: Mon Jul 1 02:24:47 2013 -0500 + + Check for NULL in Page::getResourceDictCopy + + poppler/Page.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit c376559bc412e90204162bb4b2d20cd586db70c1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jun 30 13:14:07 2013 +0200 + + annots: Invalidate the appearance stream when annot properties change + + Make invalidateAppearance() protected and only call it when properties + that affect the appearance stream are updated. Remove all calls to + invalidateAppearance() from qt frontend, this is now handled by + the core + and fixes the appearance stream regeneration in the glib frontend too. + + poppler/Annot.cc | 36 ++++++++++++++++++++++++++++++++++++ + poppler/Annot.h | 10 ++++++---- + qt4/src/poppler-annotation.cc | 34 ---------------------------------- + qt5/src/poppler-annotation.cc | 34 ---------------------------------- + 4 files changed, 42 insertions(+), 72 deletions(-) + +commit c746e8b38e821d1ebeaf52c4c816515bc3ddaaf6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jun 30 11:44:59 2013 +0200 + + annots: Remove unused variable + + poppler/Annot.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 7d9d5d2518f7760e6a4317a358040ddd9164fdef +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jun 30 11:40:15 2013 +0200 + + annots: Do not update AP and AS entries if they are not present when + invaliding the appaearance stream + + poppler/Annot.cc | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +commit 347b53f7fca644564724c230fe6c0dcbffa0d6f9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jun 30 11:23:54 2013 +0200 + + annots: do not set the default appearance state when invalidating + appearances + + We are setting the default appareance state to Off and then we are + updating AS dictionary to NULL in the XRef. The appearance state + is only + required when there's more than once appearance stream, but when + invalidating the apperance we remove all streams. + + poppler/Annot.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b5e9941c145fc99e03a28d92a50840638895908d +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jul 1 00:32:51 2013 +0200 + + Fix crash on malformed doc + + Where the Colorants dictionary values are not arrays + Document can be found on KDE bug #319925 + + poppler/GfxState.cc | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +commit 19f8a88bba6022b8172477e6f52dfd36b2fc5e92 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Mar 7 00:20:15 2013 +0100 + + qt5: Free some temporary memory in + TextAnnotationPrivate::createNativeAnnot + + There's no need to keep this buffer around after it has been flushed + + qt5/src/poppler-annotation.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 8bac4d1e43ce9a4c66fddc8430d7bed2d9aabba1 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Tue Jun 25 20:09:00 2013 +0200 + + qt5: Some documentation about annotations + + * Removed incorrect hint "Use uniqueName to test for Annotation + equality": uniqueNames are optional and we don't actually guarantee + uniqueness + * Added "How to add annotations" and "FixedRotation flag specifics" + sections in the Annotation class page + * Added links from enum Annotation::SubType items to actual subclasses + * Added documentation for annotation flags that are known to work + * Added "see also" links between annotation flag and boundary + setters/getters + * Added warning on Annotation::setPopup to tell that it's currently + not + implemented + + qt5/src/poppler-annotation.h | 143 + ++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 135 insertions(+), 8 deletions(-) + +commit 1d5fe3f20189fd3928121e954bcc8fa7278b39fb +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Mar 2 19:06:49 2013 +0100 + + qt5: FixedRotation annotations' coordinate conversion + + FixedRotation(=flagNoRotate) annotations use a different coordinate + system than regular annotations. This patch implements transparent + conversion so that qt5 clients don't notice the difference. + + Important! When dealing with FixedRotation annotations, poppler-qt5 + clients will need to set geometry-related annotation properties in + the following order: + 1) flags (because we need to know if this is a FixedRotation + annotation or not) + 2) boundary (because we need to know what the topleft corner is, + so that we can construct the conversion matrix) + 3) anything else + + This requirement will be documented in the next patch + + qt5/src/poppler-annotation-private.h | 7 ++- + qt5/src/poppler-annotation.cc | 111 + +++++++++++++++++++++++++++-------- + 2 files changed, 92 insertions(+), 26 deletions(-) + +commit ab130c91492765f8be29ed112dd2e2e6f665641b +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Mar 2 00:55:58 2013 +0100 + + core: Remove geometry-related arguments from annotation constructors + + Removed arguments from annotation constructors related to the geometry + of the annotation. This change will make it easier to support creating + annotations with flag NoRotate in the next patch (because no special + cases will be needed: coordinate conversion code will be able + to always + assume that the underlying annotation object already exists). + + Data that used to be taken from these arguments is now replaced + by dummy + values, which can be modified using appropriate setter methods after + the annotation object is created. + + Affected annotation types: + - AnnotLine + - AnnotTextMarkup + - AnnotPolygon + - AnnotInk + + qt5/src/poppler-annotation.cc | 34 ++++++++++++++++++---------------- + 1 file changed, 18 insertions(+), 16 deletions(-) + +commit 35cfb6914e1be4c5eda2f355900b1a0a1fa69d19 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Fri Feb 15 12:24:18 2013 +0100 + + poppler_qt5viewer: Add combobox to select rotation + + qt5/demos/navigationtoolbar.cpp | 15 +++++++++++++++ + qt5/demos/navigationtoolbar.h | 4 ++++ + qt5/demos/pageview.cpp | 24 +++++++++++++++++++++++- + qt5/demos/pageview.h | 3 +++ + qt5/demos/viewer.cpp | 2 ++ + 5 files changed, 47 insertions(+), 1 deletion(-) + +commit de2a93c0bc6e92a95c687796f59780c998b90ca4 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Mar 7 00:20:15 2013 +0100 + + qt4: Free some temporary memory in + TextAnnotationPrivate::createNativeAnnot + + There's no need to keep this buffer around after it has been flushed + + qt4/src/poppler-annotation.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 738b0b4fedaa2b2b28ea1c11622dfd880180d1c9 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Mar 7 20:50:52 2013 +0100 + + qt4: Some documentation about annotations + + * Removed incorrect hint "Use uniqueName to test for Annotation + equality": uniqueNames are optional and we don't actually guarantee + uniqueness + * Added "How to add annotations" and "FixedRotation flag specifics" + sections in the Annotation class page + * Added links from enum Annotation::SubType items to actual subclasses + * Added documentation for annotation flags that are known to work + * Added "see also" links between annotation flag and boundary + setters/getters + * Added warning on Annotation::setPopup to tell that it's currently + not + implemented + + qt4/src/poppler-annotation.h | 143 + ++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 135 insertions(+), 8 deletions(-) + +commit cf950a2b7e8278e70719c67b441b0d324ffd0399 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Mar 2 19:06:49 2013 +0100 + + qt4: FixedRotation annotations' coordinate conversion + + FixedRotation(=flagNoRotate) annotations use a different coordinate + system than regular annotations. This patch implements transparent + conversion so that qt4 clients don't notice the difference. + + Important! When dealing with FixedRotation annotations, poppler-qt4 + clients will need to set geometry-related annotation properties in + the following order: + 1) flags (because we need to know if this is a FixedRotation + annotation or not) + 2) boundary (because we need to know what the topleft corner is, + so that we can construct the conversion matrix) + 3) anything else + + This requirement will be documented in the next patch + + poppler/Annot.cc | 8 +++ + poppler/Annot.h | 2 + + qt4/src/poppler-annotation-private.h | 7 ++- + qt4/src/poppler-annotation.cc | 111 + +++++++++++++++++++++++++++-------- + 4 files changed, 102 insertions(+), 26 deletions(-) + +commit 4b13085568df09d8b75099f6a5438f025a028fd5 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Mar 2 00:55:58 2013 +0100 + + core: Remove geometry-related arguments from annotation constructors + + Removed arguments from annotation constructors related to the geometry + of the annotation. This change will make it easier to support creating + annotations with flag NoRotate in the next patch (because no special + cases will be needed: coordinate conversion code will be able + to always + assume that the underlying annotation object already exists). + + Data that used to be taken from these arguments is now replaced + by dummy + values, which can be modified using appropriate setter methods after + the annotation object is created. + + Affected annotation types: + - AnnotLine + - AnnotTextMarkup + - AnnotPolygon + - AnnotInk + + poppler/Annot.cc | 56 + +++++++++++++------------------------------ + poppler/Annot.h | 9 ++++--- + qt4/src/poppler-annotation.cc | 34 +++++++++++++------------- + 3 files changed, 39 insertions(+), 60 deletions(-) + +commit 5923cfb5f7e3a0703de17e21f4952f92a44f3c14 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Fri Feb 15 12:24:18 2013 +0100 + + poppler_qt4viewer: Add combobox to select rotation + + qt4/demos/navigationtoolbar.cpp | 15 +++++++++++++++ + qt4/demos/navigationtoolbar.h | 4 ++++ + qt4/demos/pageview.cpp | 24 +++++++++++++++++++++++- + qt4/demos/pageview.h | 3 +++ + qt4/demos/viewer.cpp | 2 ++ + 5 files changed, 47 insertions(+), 1 deletion(-) + +commit 74ea15cc454f31b772e71b3525b71045dbfa5527 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Tue Jun 25 19:56:20 2013 +0200 + + core: Support for rendering annotations with flagNoRotate + + Gfx::drawAnnot now makes a counter-rotation if flagNoRotate is set + + poppler/Annot.cc | 55 + ++++++++++++++++++++++++++++++++++++------------------- + poppler/Annot.h | 3 ++- + poppler/Gfx.cc | 41 +++++++++++++++++++++++++++++++++++++---- + poppler/Gfx.h | 3 ++- + 4 files changed, 77 insertions(+), 25 deletions(-) + +commit 2639957ba78defd2ab6282679375fb7969bad21f +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Jun 26 23:12:40 2013 +0200 + + Do not crash in page::removeAnnot if there are non-Ref entries + in /Annots + + poppler/Page.cc | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +commit ae016aa263c218fbfbd607cc92feac1013348c7e +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jun 26 11:33:55 2013 +0200 + + Fix qt5 found/not found logic + + CMakeLists.txt | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit e27c1057caf4d878a0dc43c92c9e0b565db8fe40 +Merge: c55b577 ee8cfbc +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 25 19:17:13 2013 +0200 + + Merge remote-tracking branch 'origin/qt5' + +commit c55b577ce69ad4bb69f5261b3e120e92c9fdb3d0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 25 10:01:38 2013 +0200 + + glib: Use TextPage::getSelectionWords to build text layout and + attributes + + This way we can make sure that the list of words used in + poppler_page_get_text_layout and poppler_page_get_text_attributes + is the + same that the one used in poppler_page_get_text. This fixes the + mismatch + between the number of characters in the text returned by + poppler_page_get_text and the number of characters returned by + poppler_page_get_text_layout in some documents. + + glib/poppler-page.cc | 168 + +++++++++++++++++++++++++++------------------------ + 1 file changed, 90 insertions(+), 78 deletions(-) + +commit fc534f571315c064005515c19d7d70ad3af1563e +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 25 10:05:01 2013 +0200 + + TextOutputDev: add a method to TextPage to get the selection as a + list of words + + Returns a list of lines of words. + + poppler/TextOutputDev.cc | 36 ++++++++++++++++++++++++++++++++++++ + poppler/TextOutputDev.h | 4 ++++ + 2 files changed, 40 insertions(+) + +commit a924246b7534e86165f8e9ab6c60d56b73a17b94 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Tue Jun 25 09:57:48 2013 +0200 + + TextOutputDev: simplify the text selection dumper + + Build a list of lines of words and don't try to format the text when + detecting tables, simply add the words and lines in the right order. + + poppler/TextOutputDev.cc | 200 + ++++++++++++++++++++++------------------------- + 1 file changed, 92 insertions(+), 108 deletions(-) + +commit c849094a2daf896d085937adff1f7659a09da062 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Mon Jun 24 18:29:11 2013 +0200 + + TextOutputDev: Move TextSelection class from TextSelectionPainter + to TextSelectionVisitor + + So that it can be used by other TextSelectionVisitor implementations. + Also renamed it as TextWordSelection since it contains a word + selection. + + poppler/TextOutputDev.cc | 35 ++++++++++++++++++----------------- + 1 file changed, 18 insertions(+), 17 deletions(-) + +commit b3ff3f2c3e131556d2b27cbe52f0ddbbb4820c19 +Author: Jason Crain <jason@aquaticape.us> +Date: Thu Jun 20 21:47:13 2013 -0500 + + Draw glyphs after selection background + + When multiple lines of text are selected, TextSelectionPainter will + draw selections over each other, hiding the previous line with the + selection background of the current line. This patch changes + TextSelectionPainter so that glyphs are drawn only after the entire + background is drawn. + + https://bugs.freedesktop.org/show_bug.cgi?id=65989 + + poppler/TextOutputDev.cc | 109 + ++++++++++++++++++++++++++++++----------------- + 1 file changed, 69 insertions(+), 40 deletions(-) + +commit ee8cfbc78fe9de109abbe0727a738870f6027a73 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 18 23:20:01 2013 +0200 + + Fix indent + + qt5/src/poppler-optcontent.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9d0a5b6afb25a1273504383e108bdb95ca82f099 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 18 23:19:30 2013 +0200 + + Bring changes from the qt4 dir + + qt5/src/Doxyfile | 2 +- + qt5/src/poppler-private.h | 2 +- + qt5/tests/CMakeLists.txt | 1 + + qt5/tests/Makefile.am | 13 +- + qt5/tests/stress-threads-qt5.cpp | 304 + +++++++++++++++++++++++++++++++++++++++ + qt5/tests/test-poppler-qt5.cpp | 2 +- + 6 files changed, 320 insertions(+), 4 deletions(-) + +commit 1adb1ab7aee026e227d25716a4b7be22b19b5b84 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 18 20:50:49 2013 +0200 + + Make it build with autotools + + poppler/ArthurOutputDev.cc | 816 + ------------------------------------------ + poppler/ArthurOutputDev.h | 170 --------- + poppler/Makefile.am | 23 +- + qt4/src/ArthurOutputDev.cc | 816 + ++++++++++++++++++++++++++++++++++++++++++ + qt4/src/ArthurOutputDev.h | 170 +++++++++ + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Makefile.am | 5 +- + qt5/src/ArthurOutputDev.cc | 816 + ++++++++++++++++++++++++++++++++++++++++++ + qt5/src/ArthurOutputDev.h | 170 +++++++++ + qt5/src/CMakeLists.txt | 2 +- + qt5/src/Makefile.am | 5 +- + qt5/src/poppler-optcontent.cc | 2 + + 12 files changed, 1983 insertions(+), 1014 deletions(-) + +commit 93a1c2b768cc419c5bf9b3033bf85fb21326a65a +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 18 00:33:38 2013 +0200 + + If qmake gives us a Qt5 qmake try with qmake4 and qmake-qt4 + + cmake/modules/FindQt4.cmake | 62 + ++++++++++++++++++++++++++++----------------- + 1 file changed, 39 insertions(+), 23 deletions(-) + +commit 7cc33a752ef864b595748ce7724ba553a8e3ba8e +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 22:57:56 2013 +0200 + + We are not compiling an executable + + qt5/src/CMakeLists.txt | 1 - + 1 file changed, 1 deletion(-) + +commit 87cfcd41e8e970186c6ce753aa660ef86aca8878 +Author: Granger Anthony <grangeranthony@gmail.com> +Date: Mon Jun 17 09:17:51 2013 +0200 + + Allow to enable Qt5 support only with CMake >= 2.8.8 + + CMakeLists.txt | 26 ++++++++++++++++---------- + qt5/tests/CMakeLists.txt | 1 - + 2 files changed, 16 insertions(+), 11 deletions(-) + +commit b44c70f04758000cf0e049b06cc7864287570f7b +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 22:10:05 2013 +0200 + + Bring PIC back to the toplevel, still have linking errors tohugh :-/ + + configure.ac | 1 + + 1 file changed, 1 insertion(+) + +commit be49073f5ce79f56b38197758a5cf1253b972306 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 21:50:31 2013 +0200 + + Use qtchooser if available + + configure.ac | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +commit b1958228d4bc6793a3606b5e31c61a57b9fac9f5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 20:21:08 2013 +0200 + + No distro ships moc-qt5 but make it work in case someone would + + configure.ac | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit 06f45c7177afc67e02985be1a97cd976c530c4ae +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 20:04:49 2013 +0200 + + Build fixes + + Fix moc when moc-qt4 is qt4 moc but moc is qt5 one + Do not add -fPIE everywhere, just -fPIC to qt5 + + configure.ac | 10 ++++++---- + qt5/src/Makefile.am | 2 +- + 2 files changed, 7 insertions(+), 5 deletions(-) + +commit cb617c21fba727781f46278f5475b91d528a488b +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 18:12:18 2013 +0200 + + Files i forgot + + poppler-qt5-uninstalled.pc.in | 7 +++++++ + poppler-qt5.pc.cmake | 13 +++++++++++++ + poppler-qt5.pc.in | 13 +++++++++++++ + 3 files changed, 33 insertions(+) + +commit 5c521bba427eb163e4b77d936865fbdd0e07faf3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 18:12:07 2013 +0200 + + soversion 1 + + qt5/src/CMakeLists.txt | 2 +- + qt5/src/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 43786964946b4f4c005a0526e16fead3ffa6ba4a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 00:23:31 2013 +0200 + + harmonize spaces + + CMakeLists.txt | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +commit 2e2ea27fe3dc688c87003d170b82451a6a872b0d +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 00:22:18 2013 +0200 + + Remove qt4 mentions + + qt5/src/poppler-converter-private.h | 6 +++--- + qt5/src/poppler-embeddedfile-private.h | 2 +- + qt5/src/poppler-form.cc | 2 +- + qt5/src/poppler-form.h | 6 +++--- + qt5/src/poppler-pdf-converter.cc | 2 +- + qt5/src/poppler-private.cc | 4 ++-- + qt5/src/poppler-private.h | 2 +- + qt5/src/poppler-qt5.h | 2 +- + 8 files changed, 13 insertions(+), 13 deletions(-) + +commit e2264ce82af3e971e34930f5307b7c9b43a1e346 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 00:19:27 2013 +0200 + + remove deprecated stuff + + qt5/src/poppler-annotation.cc | 19 ++------ + qt5/src/poppler-annotation.h | 18 ------- + qt5/src/poppler-document.cc | 19 -------- + qt5/src/poppler-link.cc | 5 -- + qt5/src/poppler-link.h | 10 ---- + qt5/src/poppler-page.cc | 18 ------- + qt5/src/poppler-qt5.h | 41 ---------------- + qt5/tests/check_fonts.cpp | 21 ++------- + qt5/tests/check_metadata.cpp | 1 - + qt5/tests/check_search.cpp | 107 + ++++++++++++++++++++++-------------------- + 10 files changed, 65 insertions(+), 194 deletions(-) + +commit 21808e203eed46e379954b58b7014998b3836573 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 00:03:45 2013 +0200 + + remove commented stuff + + qt5/src/CMakeLists.txt | 1 - + 1 file changed, 1 deletion(-) + +commit 16e7033f18a8da8e27aaed6f63cce156abf8837a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 17 00:01:27 2013 +0200 + + Initial Qt5 port + + CMakeLists.txt | 20 + + Makefile.am | 18 +- + configure.ac | 66 +- + qt5/.gitignore | 4 + + qt5/CMakeLists.txt | 3 + + qt5/Makefile.am | 1 + + qt5/demos/.gitignore | 4 + + qt5/demos/CMakeLists.txt | 38 + + qt5/demos/Makefile.am | 67 + + qt5/demos/abstractinfodock.cpp | 57 + + qt5/demos/abstractinfodock.h | 48 + + qt5/demos/documentobserver.cpp | 50 + + qt5/demos/documentobserver.h | 50 + + qt5/demos/embeddedfiles.cpp | 82 + + qt5/demos/embeddedfiles.h | 44 + + qt5/demos/fonts.cpp | 72 + + qt5/demos/fonts.h | 43 + + qt5/demos/info.cpp | 72 + + qt5/demos/info.h | 43 + + qt5/demos/main_viewer.cpp | 33 + + qt5/demos/metadata.cpp | 50 + + qt5/demos/metadata.h | 43 + + qt5/demos/navigationtoolbar.cpp | 129 + + qt5/demos/navigationtoolbar.h | 61 + + qt5/demos/optcontent.cpp | 69 + + qt5/demos/optcontent.h | 47 + + qt5/demos/pageview.cpp | 79 + + qt5/demos/pageview.h | 50 + + qt5/demos/permissions.cpp | 66 + + qt5/demos/permissions.h | 43 + + qt5/demos/thumbnails.cpp | 84 + + qt5/demos/thumbnails.h | 48 + + qt5/demos/toc.cpp | 88 + + qt5/demos/toc.h | 43 + + qt5/demos/viewer.cpp | 317 ++ + qt5/demos/viewer.h | 73 + + qt5/src/.gitignore | 9 + + qt5/src/CMakeLists.txt | 54 + + qt5/src/Doxyfile | 1637 ++++++++++ + qt5/src/Mainpage.dox | 85 + + qt5/src/Makefile.am | 73 + + qt5/src/poppler-annotation-helper.h | 198 ++ + qt5/src/poppler-annotation-private.h | 111 + + qt5/src/poppler-annotation.cc | 4394 + ++++++++++++++++++++++++++ + qt5/src/poppler-annotation.h | 921 ++++++ + qt5/src/poppler-base-converter.cc | 105 + + qt5/src/poppler-converter-private.h | 49 + + qt5/src/poppler-document.cc | 679 ++++ + qt5/src/poppler-embeddedfile-private.h | 42 + + qt5/src/poppler-embeddedfile.cc | 135 + + qt5/src/poppler-export.h | 17 + + qt5/src/poppler-fontinfo.cc | 149 + + qt5/src/poppler-form.cc | 416 +++ + qt5/src/poppler-form.h | 343 ++ + qt5/src/poppler-link-extractor-private.h | 57 + + qt5/src/poppler-link-extractor.cc | 84 + + qt5/src/poppler-link.cc | 711 +++++ + qt5/src/poppler-link.h | 612 ++++ + qt5/src/poppler-media.cc | 168 + + qt5/src/poppler-media.h | 100 + + qt5/src/poppler-movie.cc | 110 + + qt5/src/poppler-optcontent-private.h | 121 + + qt5/src/poppler-optcontent.cc | 427 +++ + qt5/src/poppler-optcontent.h | 77 + + qt5/src/poppler-page-private.h | 54 + + qt5/src/poppler-page-transition-private.h | 28 + + qt5/src/poppler-page-transition.cc | 95 + + qt5/src/poppler-page-transition.h | 148 + + qt5/src/poppler-page.cc | 744 +++++ + qt5/src/poppler-pdf-converter.cc | 115 + + qt5/src/poppler-private.cc | 292 ++ + qt5/src/poppler-private.h | 240 ++ + qt5/src/poppler-ps-converter.cc | 273 ++ + qt5/src/poppler-qiodeviceoutstream-private.h | 47 + + qt5/src/poppler-qiodeviceoutstream.cc | 64 + + qt5/src/poppler-qt5.h | 1812 +++++++++++ + qt5/src/poppler-sound.cc | 132 + + qt5/src/poppler-textbox.cc | 63 + + qt5/tests/.gitignore | 30 + + qt5/tests/CMakeLists.txt | 75 + + qt5/tests/Makefile.am | 152 + + qt5/tests/README.unittest | 23 + + qt5/tests/check_actualtext.cpp | 33 + + qt5/tests/check_attachments.cpp | 157 + + qt5/tests/check_dateConversion.cpp | 142 + + qt5/tests/check_fonts.cpp | 248 ++ + qt5/tests/check_goostring.cpp | 61 + + qt5/tests/check_lexer.cpp | 128 + + qt5/tests/check_links.cpp | 96 + + qt5/tests/check_metadata.cpp | 275 ++ + qt5/tests/check_optcontent.cpp | 484 +++ + qt5/tests/check_pagelabelinfo.cpp | 43 + + qt5/tests/check_pagelayout.cpp | 49 + + qt5/tests/check_pagemode.cpp | 73 + + qt5/tests/check_password.cpp | 88 + + qt5/tests/check_permissions.cpp | 44 + + qt5/tests/check_search.cpp | 91 + + qt5/tests/check_strings.cpp | 250 ++ + qt5/tests/poppler-attachments.cpp | 39 + + qt5/tests/poppler-fonts.cpp | 89 + + qt5/tests/poppler-forms.cpp | 166 + + qt5/tests/poppler-texts.cpp | 40 + + qt5/tests/stress-poppler-dir.cpp | 67 + + qt5/tests/stress-poppler-qt5.cpp | 74 + + qt5/tests/test-password-qt5.cpp | 136 + + qt5/tests/test-poppler-qt5.cpp | 235 ++ + 106 files changed, 21480 insertions(+), 4 deletions(-) + +commit 714ee1e61d853394818dca7155b1b882408ffc6a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 16 19:00:01 2013 +0200 + + Pass down the recursion param + + Fixes heap smashing in 168.pdf.SIGSEGV.598.462 + + poppler/Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1f3e3828b9a57e044b86640b9bf9ad2437cc5656 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 15 17:21:36 2013 +0200 + + Add quotes since use_cairo can have spaces + + BUG #65709 + + configure.ac | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit fe3ffab19d54326052fd0ff8ee3ee1feb9fa928c +Author: Adam Reichold <adamreichold@myopera.com> +Date: Tue Jun 11 23:08:07 2013 +0200 + + Windows compile fixes + + qt4/tests/stress-threads-qt4.cpp | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +commit 99908cb0c8a784791ffa0682c8f105acdef0d5ab +Author: Peter Breitenlohner <peb@mppmu.mpg.de> +Date: Tue Jun 11 10:02:01 2013 +0200 + + MinGW32 may or may not define __MINGW_PRINTF_FORMAT + + Moreover __USE_MINGW_ANSI_STDIO might be defined as 0 + + poppler/poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 0673f3d8024554c414f578e0770086f475e6a605 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 11 00:19:19 2013 +0200 + + 0.23.2 + + 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 7f1bf8d94302c15a2ff68debfb6fba49df526d16 +Author: Christoph Duelli <duelli@melosgmbh.de> +Date: Thu May 16 16:16:32 2013 +0200 + + Do not pollute global namespace with internal classes + + Bug #64680 + + fofi/FoFiIdentifier.cc | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit 07992075a6d1d29db57f997f67d5a4a6deacbbb4 +Merge: 4a0bd6f 25f453e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 9 12:17:53 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + + Conflicts: + poppler/Catalog.cc + qt4/src/poppler-private.h + utils/HtmlOutputDev.cc + +commit 25f453ef49004452ac4c201d59d9ce2ef52ffeee +Author: Julien Nabet <serval2412@yahoo.fr> +Date: Sun Jun 9 12:12:06 2013 +0200 + + Prefer prefix ++/-- operators for non-primitive types + + Part of bug #80537 + + poppler/CachedFile.cc | 3 ++- + poppler/Catalog.cc | 5 +++-- + utils/HtmlFonts.cc | 3 ++- + utils/HtmlLinks.cc | 3 ++- + 4 files changed, 9 insertions(+), 5 deletions(-) + +commit ed01688a899c5e7560a93ca2424ca302ff3452f1 +Author: Julien Nabet <serval2412@yahoo.fr> +Date: Sun Jun 9 12:10:01 2013 +0200 + + Fix mismatched allocation and deallocation + + Part of bug #65551 + + qt4/src/poppler-private.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a27890ac441fbd613ddfe6fcf404b92be371e554 +Author: Julien Nabet <serval2412@yahoo.fr> +Date: Sun Jun 9 12:08:06 2013 +0200 + + Fix memory leak + + utils/HtmlOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 4a0bd6fdb2e9e3c589e1bdb282e7c2bfca8567b1 +Merge: bbd27c9 17a16a2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 9 12:06:10 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 17a16a2731b1110a12c7163c139d85bccee04492 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Jun 9 12:04:40 2013 +0200 + + Fix mismatched free/delete + + Bug #65553 + + poppler/UTF.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit bbd27c92b5e5034dc2899ea26b47fcb983209f82 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu Jun 6 23:52:36 2013 +0200 + + Speed-up some tiling on a 10x factor + + Bug #64892 + + poppler/SplashOutputDev.cc | 15 ++++++++++++++- + splash/Splash.cc | 15 +++++++++++---- + splash/Splash.h | 3 ++- + 3 files changed, 27 insertions(+), 6 deletions(-) + +commit 7847769a24bd3ccf863f653bc2215e84157ccfb6 +Author: Peter Breitenlohner <peb@mppmu.mpg.de> +Date: Tue Jun 4 15:31:06 2013 +0200 + + Use fseeko64/ftello64 for MinGW32 + + goo/gfile.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 0c3548087b379dd6ffa2291d03f0ea1c7e6a69d1 +Author: Peter Breitenlohner <peb@mppmu.mpg.de> +Date: Tue Jun 4 15:31:05 2013 +0200 + + Allow to build without multithreading + + poppler/Annot.cc | 7 +++++++ + poppler/XRef.cc | 4 ++++ + 2 files changed, 11 insertions(+) + +commit 1e74ac4589daf80dcac54b094145d32c90069738 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Thu Jun 6 01:03:48 2013 +0200 + + [qt4] fix autotools + + qt4/tests/Makefile.am | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 342cc0d8a101e99199d447d632a1cd5ba7beb5b2 +Author: Li Junling <lijunling@sina.com> +Date: Tue Jun 4 22:39:35 2013 +0200 + + Fix memory leak + + poppler/SplashOutputDev.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 52945a072b6f864e80485cc4321a27530a76c452 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Jun 4 22:35:32 2013 +0200 + + Move the iccColorSpaceCache from Gfx to OutputDev + + This way it's shared when doing tiling. Page 35 of + bug-poppler64963.pdf + goes down from 150 to 133 seconds + + poppler/Gfx.cc | 61 ++++++++++++++-------------------- + poppler/Gfx.h | 12 ++----- + poppler/GfxState.cc | 93 + ++++++++++++++++++++++++++-------------------------- + poppler/GfxState.h | 33 ++++++++++--------- + poppler/OutputDev.cc | 8 ++++- + poppler/OutputDev.h | 19 +++++++++-- + 6 files changed, 114 insertions(+), 112 deletions(-) + +commit 7d4bda198b8ac767bdf4e0a4fdcaae5541113f92 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 3 23:34:11 2013 +0200 + + Compile + + qt4/tests/stress-threads-qt4.cpp | 1 + + 1 file changed, 1 insertion(+) + +commit 395b3fa021850225e1fea66736f3a3f00571571f +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Jun 3 23:31:52 2013 +0200 + + Fix #end -> #endif + + poppler/poppler-config.h.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 425d1b4835389e2031631ce54cee157af39f1cb6 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Mon Jun 3 20:04:21 2013 +0200 + + Check for the correct number of arguments + + qt4/tests/stress-threads-qt4.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 9d3eb07a1ea01b98aabe4f32481dd4a83bc8f2a5 +Author: Hib Eris <hib@hiberis.nl> +Date: Mon Jun 3 08:49:37 2013 +0200 + + Fix cmake build to use ansi stdio extensions when using a mingw + compiler + + https://bugs.freedesktop.org/show_bug.cgi?id=65238 + + poppler/poppler-config.h.cmake | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 287afe2290d64ca63cdb75fef8f3fbdc20997970 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Sun Jun 2 23:29:00 2013 +0200 + + Add a thread stresser in qt4 + + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/Makefile.am | 9 +- + qt4/tests/stress-threads-qt4.cpp | 298 + +++++++++++++++++++++++++++++++++++++++ + 3 files changed, 307 insertions(+), 1 deletion(-) + +commit 77ecb3823c2db4a6cca5af5889c07c73f90de7f0 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Sat Jun 1 19:04:10 2013 +0200 + + Add a pthread option to pdftoppm + + It's mostly a developer tool only to test thread support + Not end user oriented (hence no buildsystem) + + Parts also by Thomas + + utils/pdftoppm.cc | 130 + ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 126 insertions(+), 4 deletions(-) + +commit caa19f4961146915f51be6c72f60c3aa43037235 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 1 17:22:54 2013 +0200 + + qt4: Fix test binary name in help + + qt4/tests/test-poppler-qt4.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a0b48b1d05f08605bca5e1a2e2518e16578f6055 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 1 14:42:42 2013 +0200 + + Fix printf format warning for size_t + + Fixes: + + CXX pdfunite.o + pdfunite.cc: In function ‘int main(int, char**)’: + pdfunite.cc:142:59: warning: format ‘%d’ expects argument of type + ‘int’, but argument 3 has type ‘std::vector<Object>::size_type + {aka long unsigned int}’ [-Wformat] + + https://bugs.freedesktop.org/show_bug.cgi?id=65242 + + utils/pdfunite.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 860737c2a19c734a0c5b65ad506ba229ba439985 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 1 12:05:17 2013 +0200 + + Use ansi stdio extensions when using a mingw compiler + + In the C runtime used by mingw compilers (msvcrt.dll) the printf + function does not support the C99 format-width specifier "%ll". + + Defining __USE_MINGW_ANSI_STDIO enables mingw's ansi stdio extensions + that implement a C99 compliant printf function. + + https://bugs.freedesktop.org/show_bug.cgi?id=65238 + + CMakeLists.txt | 4 ++++ + configure.ac | 3 +++ + poppler/poppler-config.h.in | 5 +++++ + 3 files changed, 12 insertions(+) + +commit dd30ce39252a3820254b43f90699849ab5a1ca58 +Author: Hib Eris <hib@hiberis.nl> +Date: Fri May 31 12:24:55 2013 +0200 + + Fix warning on narrowing conversion from int to DWORD + + Fixes warning when compiling for Windows: + + gfile.cc: In member function 'Goffset GooFile::size() const': + gfile.cc:609:30: warning: narrowing conversion of '-1' from 'int' + to 'DWORD {aka long unsigned int}' inside { } is ill-formed in C++11 + [-Wnarrowing] + LARGE_INTEGER size = {-1,-1}; + + https://bugs.freedesktop.org/show_bug.cgi?id=65239 + + goo/gfile.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 01a825f3f9f5dcf686fc123d2cf80b9c525d0d89 +Merge: a57f937 b4b1310 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 1 13:47:29 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit b4b13102716cd33636a94fd99c49487924761670 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 1 13:45:53 2013 +0200 + + Fix crash on malformed file + + Also remove outdated comment + + Bug #65221 + + poppler/Stream.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit a57f93780de12732875e0195127a92bff835ff61 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 28 00:11:10 2013 +0200 + + 0.23.1 + + CMakeLists.txt | 4 ++-- + NEWS | 11 +++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 17 insertions(+), 6 deletions(-) + +commit 299a1447e3d9a845b5e964f29e698046abdb63f2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 28 00:10:43 2013 +0200 + + Build poppler-forms in the autotools buildsystem + + qt4/tests/Makefile.am | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit dcfaf20503868d0956ee81208265a975b480fb52 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 27 23:40:49 2013 +0200 + + Dist these two files too + + Makefile.am | 2 ++ + 1 file changed, 2 insertions(+) + +commit de7a3fb715811be6be9ed51b1c5ab1a63c523403 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 27 23:40:07 2013 +0200 + + Add missing copyright + + poppler/Hints.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 30282d3fdbbb3029d9a0f838b2cd979bb962235c +Merge: 61f6658 56044ef +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 27 00:20:12 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 56044ef482c26f10a8a1371dace049c144659dc7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 27 00:18:22 2013 +0200 + + Fix infinite loop while feeding wrong data in stdin + + Take into account that CachedFile::read might not always return + the number of elems we asked it to read + + Bug #64967 + + poppler/Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 61f665885daeb0009ecac2cc85188f23d6addb60 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 27 00:01:24 2013 +0200 + + Fix big file support in cmake + + Tested by Fabio + + CMakeLists.txt | 2 ++ + cmake/modules/CheckFileOffsetBits.c | 14 +++++++++++ + cmake/modules/CheckFileOffsetBits.cmake | 44 + +++++++++++++++++++++++++++++++++ + config.h.cmake | 6 ++--- + 4 files changed, 63 insertions(+), 3 deletions(-) + +commit f536a4ec37246e10f03fe4de309bd31deb6a4727 +Author: Hib Eris <hib@hiberis.nl> +Date: Thu May 16 21:06:56 2013 +0200 + + Do not use deprecated gtk_scrolled_window_add_with_viewport() + + https://bugs.freedesktop.org/show_bug.cgi?id=64683 + + glib/demo/find.c | 4 ++++ + glib/demo/images.c | 4 ++++ + glib/demo/layers.c | 4 ++++ + glib/demo/render.c | 4 ++++ + glib/demo/selections.c | 4 ++++ + test/gtk-test.cc | 4 ++++ + 6 files changed, 24 insertions(+) + +commit c10f2f8777927d8cfe547941ea2f70fcce14da7a +Author: Pino Toscano <pino@kde.org> +Date: Mon May 20 00:09:45 2013 +0200 + + fix typo in error message + + poppler/Hints.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 71d327194293cb3d1a0e274eaf4451c7afe81e8a +Merge: 7b2df1f 6a98b56 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 17 23:04:12 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 6a98b56f6ded957477ddcccd4ff849a870020395 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 17 23:01:20 2013 +0200 + + Make an invalid nSharedGroupsFirst a real error + + Instead trying to recover + Fixes bug #46703 + + poppler/Hints.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 7b2df1f935192c89eacddd98c4bf92f38013c8e0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri May 17 20:56:51 2013 +0200 + + A simple form dumper + + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/poppler-forms.cpp | 166 + ++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 167 insertions(+) + +commit 54f539b4436a1a3e0eab2ef0904c302865082982 +Merge: b3d8f51 3a6e2de +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 16 21:27:47 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 3a6e2de1d35e3ee4fd86f71713c49bec8e09e41d +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 16 21:27:02 2013 +0200 + + Make sure that Title: doesn't contain \n or \n + + Bug #63862 + + poppler/PSOutputDev.cc | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit b3d8f510e30fb4d8da9069390d5e9bd8a283fbd6 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu May 16 20:52:09 2013 +0200 + + Fix splashModeBGR8 rendering + + Also make SplashBitmap able to write splashModeBGR8 images + + Bug #64381 + + splash/Splash.cc | 4 ++-- + splash/SplashBitmap.cc | 24 ++++++++++++++++++++++-- + 2 files changed, 24 insertions(+), 4 deletions(-) + +commit 8640933a3aa7dbafa21765d029e97b4bba76716c +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Apr 25 19:18:30 2013 +0200 + + Fix printf format specifiers (Goffset is a long long, not a int) + + poppler/PDFDoc.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit f8e8805bbce3e94b16b77fece0072645c66f6a31 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Apr 25 19:06:09 2013 +0200 + + Re-enable commented-out printf-format attribute on OutStream::printf + + The answer to the question "2,3 because the first arg is class + instance ?" is yes. It's documented behavior: + Since non-static C++ methods have an implicit this argument, the + arguments of such methods should be counted from two, not one. + from + http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Function-Attributes.html + + poppler/Stream.h | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +commit 013b2b247268f9b8dcd8e0461580e0bbcf7554c1 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Apr 25 17:58:25 2013 +0200 + + XRef stream writing: Write 32-bit offsets when possible + + For compatibility reasons: some pdf readers don't support 64-bit + offsets + yet (for example, poppler 0.22 doesn't) + + poppler/XRef.cc | 38 ++++++++++++++++++++++++++++---------- + poppler/XRef.h | 17 +++++++++++++++-- + 2 files changed, 43 insertions(+), 12 deletions(-) + +commit ea61a9dc012fbffd9bc9fe8a09264ba8744635fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 13 23:15:55 2013 +0200 + + 0.23.0 + + Includes news, soversions, updated copyrights, etc + + CMakeLists.txt | 6 +++--- + NEWS | 12 ++++++++++++ + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + goo/gfile.cc | 1 + + goo/gfile.h | 1 + + poppler/CairoOutputDev.h | 2 +- + poppler/Makefile.am | 2 +- + poppler/Stream.cc | 1 + + poppler/Stream.h | 1 + + poppler/XRef.cc | 1 + + qt4/src/CMakeLists.txt | 2 +- + qt4/src/Doxyfile | 2 +- + qt4/src/Makefile.am | 2 +- + 14 files changed, 28 insertions(+), 11 deletions(-) + +commit 7a5eee1cbebe241b8bd44027fc07682944686910 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 13 23:00:40 2013 +0200 + + Add check_pagelabelinfo test + + qt4/tests/Makefile.am | 1 + + 1 file changed, 1 insertion(+) + +commit 30a519f21dd5df8d41a43a58b2cbd95fe657df73 +Merge: 998a9e7 0c0aef2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 13 20:40:04 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 0c0aef20d9cecaee1de0badc6cd56dd6e5b5bf12 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 13 19:57:02 2013 +0200 + + 0.22.4 version + + Also increase soversion since Gfx.h got a new member + + 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 4d6662d05f6b652af97ac6e0eb1f1c1dca8e9550 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 13 19:55:21 2013 +0200 + + 0.22.4 NEWS + + NEWS | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +commit 93e08d96867d636a70ab04ee4ad22c2214ae4b6a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 13 19:51:52 2013 +0200 + + Update copyright years + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 998a9e7c982a72b0e931304b719de40f30094d12 +Merge: 5e73cb0 73d09cd +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 13 19:30:26 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + + Conflicts: + splash/Splash.cc + +commit 73d09cd55f3bd307450c2dd095e039ea39c69cea +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 13 19:28:40 2013 +0200 + + Fix compilation with fixed point mode enabled + + Thanks to Andreas Müller for the tip + + splash/Splash.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5e73cb059e27f68b329513de609d52e84d73f8af +Merge: 5e9654a b3e44fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 7 22:00:02 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit b3e44fc59a9258ad701bc67132dea0646fd8b61a +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue May 7 21:53:31 2013 +0200 + + We need UnicodeParsedString here too + + Fixes KDE bug #307786 + + qt4/src/poppler-embeddedfile.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 5e9654a3eb28b2c8b0985545778dd0e45829f8e1 +Merge: eeecd97 a107428 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 25 20:45:34 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + + Conflicts: + poppler/Gfx.h + +commit a107428e7db0c420b60418a33b9f815909ac9a33 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 25 20:44:36 2013 +0200 + + Update my C of the last two previous commits + + poppler/Gfx.cc | 2 +- + poppler/Gfx.h | 2 +- + utils/HtmlOutputDev.cc | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +commit eeecd9718f201dc795b2cb8469c43860aec6e07d +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 25 20:29:24 2013 +0200 + + Do not start drawing a form we are already drawing + + Bug #63190 + + poppler/Gfx.cc | 23 +++++++++++++++++++---- + poppler/Gfx.h | 2 ++ + 2 files changed, 21 insertions(+), 4 deletions(-) + +commit 43d66e11aa9e692c1c6b3a237e7e972d317e5c4d +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 25 20:27:43 2013 +0200 + + Make sure getKids returns != 0 before using it + + Fixes crash in bug #63909 + + utils/HtmlOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit ec298b3b780f885464aa00880150eaa2b9b50b08 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 25 20:29:24 2013 +0200 + + Do not start drawing a form we are already drawing + + Bug #63190 + + poppler/Gfx.cc | 23 +++++++++++++++++++---- + poppler/Gfx.h | 2 ++ + 2 files changed, 21 insertions(+), 4 deletions(-) + +commit 11ab42e7e90099d0cebf8f02197413fd5dee044b +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 25 20:27:43 2013 +0200 + + Make sure getKids returns != 0 before using it + + Fixes crash in bug #63909 + + utils/HtmlOutputDev.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 4ee78e77f7d6cadc8e150ceff96b546ddca329d4 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Apr 20 16:41:56 2013 +0200 + + cairo: Always use the trasnfer function if present in setSoftMask + + "If the subtype is Alpha, the transparency group XObject G shall be + evaluated to compute a group alpha only. The colours of the + constituent + objects shall be ignored and the colour compositing computations shall + not be performed. The transfer function TR shall then be applied + to the + computed group alpha to produce the mask values." + + We were using the transfer function only for luminosity soft masks. + + https://bugs.freedesktop.org/show_bug.cgi?id=63587 + + poppler/CairoOutputDev.cc | 37 +++++++++++++++++++------------------ + 1 file changed, 19 insertions(+), 18 deletions(-) + +commit 3c2a92b06a6541071bd1e555606bb2096de17ef6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Apr 20 16:41:56 2013 +0200 + + cairo: Always use the trasnfer function if present in setSoftMask + + "If the subtype is Alpha, the transparency group XObject G shall be + evaluated to compute a group alpha only. The colours of the + constituent + objects shall be ignored and the colour compositing computations shall + not be performed. The transfer function TR shall then be applied + to the + computed group alpha to produce the mask values." + + We were using the transfer function only for luminosity soft masks. + + https://bugs.freedesktop.org/show_bug.cgi?id=63587 + + poppler/CairoOutputDev.cc | 37 +++++++++++++++++++------------------ + 1 file changed, 19 insertions(+), 18 deletions(-) + +commit fd648e83e60db7157b7273ffddc02308b0c5813b +Merge: 970e9f6 53b9cec +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 21 23:30:16 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 53b9cec6c1334020f90b885cff6fc30293437e5f +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sun Apr 21 23:28:40 2013 +0200 + + Splash: Always consider a softmask transfer function + + Fixes bug 63587 in splash + + poppler/SplashOutputDev.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 970e9f6304c3b59ac3e44495b90a5cfe7c7ceb8b +Author: Hib Eris <hib@hiberis.nl> +Date: Fri Apr 12 13:26:55 2013 +0200 + + Remove unused variables from Lexer::getObj() + + https://bugs.freedesktop.org/show_bug.cgi?id=63467 + + poppler/Lexer.cc | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +commit f8bf602620b3c7570f483ac66fc4d6a76a81a882 +Merge: bbd27dc 62a5b4d +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 14 16:40:51 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 62a5b4d5c6d5c368d190b86eab63ccb07d642c01 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Apr 14 16:37:14 2013 +0200 + + Check for strcpy_s() and strcat_s() at configure time + + It is better to test for functions than to hardcode exceptions for + specific compilers. + + This fixes compiling poppler with the latest mingw-w64 compiler which + has strcpy_s() and strcat_s() build in. + + Bug #63459 + + ConfigureChecks.cmake | 2 ++ + configure.ac | 1 + + test/perf-test.cc | 6 ++++-- + 3 files changed, 7 insertions(+), 2 deletions(-) + +commit bbd27dc4ce7b24af890d80f597f74e5d7ee0215a +Merge: ea3698c 5bc0080 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Apr 12 00:10:27 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + + Conflicts: + poppler/TextOutputDev.h + +commit 5bc00809ebe560a180d5df93eb50bdf0ff0e97e6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 11 23:29:00 2013 +0200 + + Increase poppler core soname + + CMakeLists.txt | 2 +- + poppler/Makefile.am | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 115d4c1465291adde86c3c905f265ac03374441f +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 11 23:28:17 2013 +0200 + + Increase version number to 0.22.3 + + CMakeLists.txt | 2 +- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit ae1a3553b85e2616a339aacb6efecd15db373858 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 11 23:26:44 2013 +0200 + + News file + + NEWS | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 1fefe98fc86cf8449346bdc230dff5758b1bb7a3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Apr 11 23:22:20 2013 +0200 + + Update copyrgihts + + poppler/CairoOutputDev.cc | 2 +- + poppler/PDFDoc.cc | 2 +- + poppler/TextOutputDev.cc | 2 +- + poppler/TextOutputDev.h | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit ea3698cfffc9c132081f5691287ef1fd17911b2a +Merge: fcc1468 aaaea5d +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Apr 10 20:42:01 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit aaaea5d0f2f427e82625a04f90c178e24892e539 +Author: Marek Kasik <mkasik@redhat.com> +Date: Wed Apr 10 16:41:48 2013 +0200 + + man pages: Fix typos + + Fix several typos in manual pages of pdftops and pdfseparate. + + utils/pdfseparate.1 | 2 +- + utils/pdftops.1 | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +commit fcc14682899ff4981bfece74dbc8c290a625b05c +Merge: f11e216 e6559a0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 7 17:44:12 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit e6559a0d836df127ed5061794dc737d435ef534c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Apr 7 17:42:23 2013 +0200 + + Fix crash in KDE bug #317710 + + It is not guaranteed that the ::LinkAction passed to + PageData::convertLinkActionToLink + will be always around (e.g. Page::action deletes it) so make a copy + of the ::MediaRendition object + + qt4/src/poppler-link.h | 6 +++--- + qt4/src/poppler-media.cc | 6 ++++++ + qt4/src/poppler-media.h | 5 ++++- + qt4/src/poppler-page.cc | 4 ++-- + 4 files changed, 15 insertions(+), 6 deletions(-) + +commit f11e21627121c3ff81c0ec7f4d71936a2dd590c3 +Merge: e1ffa91 b9fdb0c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 6 23:26:54 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit e1ffa9100cf6b4a444be7ed76b11698a5c5bb441 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Apr 6 23:21:58 2013 +0200 + + Fix endstream detection + + Part 1 of bug #62985 + + the endstream search, and at least with bug-poppler16579.pdf this + doesn't work correctly: the shift(-1) with the used token mechanism + in Lexer isn't correct for a binary data stream. If there is i.e. a + "(" without corresponding ")" in the binary data, which of course can + happen and happens in that pdf, shift(-1) skips the searched endstream + and can therefore in worst case reach the end-of-file. Therefore I + implemented a shift("endstream") in Java, which I now port back to + C++, or in other words "There and Back Again" :-) + + You can test it with bug-poppler16579.pdf if You just change temporary + + if (longNumber <= INT_MAX && longNumber >= INT_MIN && + *end_ptr == '\0') { + + in XRef.cc to + + if (gFalse && longNumber <= INT_MAX && longNumber >= + INT_MIN && *end_ptr == '\0') { + + poppler/Lexer.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++ + poppler/Lexer.h | 2 ++ + poppler/Parser.cc | 28 ++++++++++++++++++++++++++-- + poppler/Parser.h | 2 ++ + 4 files changed, 75 insertions(+), 2 deletions(-) + +commit b9fdb0cb767a228c56f3f0635a7f78e3e0a8c7b6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 6 23:20:48 2013 +0200 + + Last commit was Thomas' forgot his (C) + + poppler/XRef.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 94bee4601cbbda0e7c6205a04650e0510f198aee +Merge: 42368fb b312210 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 6 23:19:25 2013 +0200 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit b312210b630f96baeb8b2f3b49b0b79779609d98 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 6 23:18:18 2013 +0200 + + Fix for complete rewrites in repaired files + + Part 2 of bug #62985 + if You save a PDF with defect xref offsets, the + + readXRefUntil(-1 /* read all xref sections */, &xrefStreamObjNums) + + in XRef::scanSpecialFlags() will destroy the already reconstructed + entries table, but this means that any modification which the user did + in the meantime get lost. This can be tested i.e. with bug168518.pdf. + + poppler/XRef.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 42368fb9452c3719a7bbd159f1c1421068f40653 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 6 18:28:35 2013 +0200 + + Add missing free() + + poppler/PDFDoc.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 2264e7a95e5dc252de1b5736a1edd6bf5de3ad1f +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Apr 6 18:27:57 2013 +0200 + + implement Crypt filter + + Bug #62800 + + poppler/Decrypt.h | 3 ++- + poppler/PDFDoc.cc | 37 ++++++++++++++++++++++++++++++++++--- + poppler/Stream.cc | 6 ++++++ + poppler/Stream.h | 3 ++- + 4 files changed, 44 insertions(+), 5 deletions(-) + +commit a65a4e6f878ff033b780b2f1e3362f2918c93b6b +Author: Adam Reichold <adamreichold@myopera.com> +Date: Sat Apr 6 18:25:21 2013 +0200 + + No need to keep the mutex attributes around all the time + + goo/GooMutex.h | 27 ++++++++++----------------- + 1 file changed, 10 insertions(+), 17 deletions(-) + +commit 73ff5ad58cfe7ec9415cc1459b6ca083fee608f4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 6 18:19:28 2013 +0200 + + Pass the recursion flag + + poppler/DCTStream.cc | 6 +++--- + poppler/DCTStream.h | 2 +- + poppler/Stream.cc | 4 ++-- + poppler/Stream.h | 2 +- + 4 files changed, 7 insertions(+), 7 deletions(-) + +commit 837e3704e76ea857b3de45503840e9b855096fef +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Apr 6 17:01:08 2013 +0200 + + Make our mutexes recursive + + Fixes a deadlock problem found with a pdf i can't share + (411klaralv.pdf) + Reviewed by Thomas and Adam on the mailing list + + CMakeLists.txt | 3 +++ + glib/CMakeLists.txt | 3 +++ + goo/GooMutex.h | 36 ++++++++++++++++++++++-------------- + poppler/Annot.cc | 34 +++++++++++++++++----------------- + poppler/Annot.h | 4 ++-- + poppler/Catalog.cc | 24 +++++++++++------------- + poppler/Catalog.h | 8 ++++---- + poppler/XRef.cc | 2 +- + utils/CMakeLists.txt | 3 +++ + 9 files changed, 66 insertions(+), 51 deletions(-) + +commit 0a243c8c14d09a40f25338999c3ca06273277b45 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Fri Apr 5 00:00:07 2013 +0200 + + Add a GooFile class to encapsulate file read access using offsets + + Bug #62735 + + ConfigureChecks.cmake | 2 ++ + config.h.cmake | 6 ++++ + configure.ac | 1 + + goo/gfile.cc | 80 + ++++++++++++++++++++++++++++++++++++++++++++++ + goo/gfile.h | 30 +++++++++++++++++ + poppler/GlobalParamsWin.cc | 19 ++++------- + poppler/PDFDoc.cc | 37 ++++++--------------- + poppler/PDFDoc.h | 4 ++- + poppler/Stream.cc | 46 +++++++++----------------- + poppler/Stream.h | 17 +++------- + 10 files changed, 158 insertions(+), 84 deletions(-) + +commit 70e6af4739d2eea58e6f3200a8c9467597a12ae5 +Author: Rodrigo Rivas Costa <rodrigorivascosta@gmail.com> +Date: Thu Apr 4 23:10:09 2013 +0200 + + Be pedantic about setjmp use + + Bug #63067 + + poppler/DCTStream.cc | 57 + +++++++++++++++++++++++++++------------------------- + 1 file changed, 30 insertions(+), 27 deletions(-) + +commit c7e28e3d672654f31f1a0f95245a1fba3bc9c28f +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 25 22:55:58 2013 +0100 + + Only write the file once when saving + + Bug #62739 + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 09ddb34f202be2111c70901724d64d3b61483c7a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 25 22:55:58 2013 +0100 + + Only write the file once when saving + + Bug #62739 + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 75378557f409a5a2305ea0fb42c56184c74ba887 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 24 12:53:29 2013 +0100 + + glib: Always start from the beginning when starting a new search on + a page + + And start from previous match when searching the next one on the same + page. This allows to search for the same string multiple times on the + same page. + + https://bugs.freedesktop.org/show_bug.cgi?id=59972 + + glib/poppler-page.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 4ee6757dd7de9211faf8601531342a199225a06d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Mar 24 12:53:29 2013 +0100 + + glib: Always start from the beginning when starting a new search on + a page + + And start from previous match when searching the next one on the same + page. This allows to search for the same string multiple times on the + same page. + + https://bugs.freedesktop.org/show_bug.cgi?id=59972 + + glib/poppler-page.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 83cf2d3d3ecce6340d858a2ee037cd5120ac1db5 +Author: Jason Crain <jason@aquaticape.us> +Date: Sat Mar 9 08:44:36 2013 -0600 + + TextOutputDev: Set text matrix when painting selection + + https://bugs.freedesktop.org/show_bug.cgi?id=61042 + + poppler/TextOutputDev.cc | 30 +++++++++++++++++++++++------- + poppler/TextOutputDev.h | 3 ++- + 2 files changed, 25 insertions(+), 8 deletions(-) + +commit a3bc584fdd7f74a7dab701c743df0bb0bf74a03e +Author: Jason Crain <jason@aquaticape.us> +Date: Sat Mar 9 08:44:36 2013 -0600 + + TextOutputDev: Set text matrix when painting selection + + https://bugs.freedesktop.org/show_bug.cgi?id=61042 + + poppler/TextOutputDev.cc | 30 +++++++++++++++++++++++------- + poppler/TextOutputDev.h | 3 ++- + 2 files changed, 25 insertions(+), 8 deletions(-) + +commit 8cbdbc64897a34beb226d4dc4c58095f10013f29 +Merge: 2bce2cf a01e2d4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Mar 20 22:37:06 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit a01e2d41fcb638fe340bd3d4d22bd13db245e0fd +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Mar 20 22:35:08 2013 +0100 + + check order bounding box values in tiling pattern + + Bug #62369 + + poppler/Gfx.cc | 20 +++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +commit 2bce2cf2a523f9b8db7f5e255384044b8dfe1a24 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 19 22:53:47 2013 +0100 + + Avoid blackboxes on weird files using the thin line mode + + Bug #61719 + + splash/Splash.cc | 35 +++++++++++++++++++++++++++++++++++ + splash/Splash.h | 1 + + 2 files changed, 36 insertions(+) + +commit b2d07cbf0c2f94bd25e1422e366ff78031815867 +Merge: 80cf78f 3206950 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 18 21:06:59 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 3206950658521009b52f638cc5e712e0cef42706 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 18 21:06:09 2013 +0100 + + Spec says Zoom -> 0 means no zoom change + + poppler/Link.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 13ee9f8b7d42ed7d7bc0f9dbf190ff66e6ab5a81 +Author: Pino Toscano <pino@kde.org> +Date: Mon Mar 18 18:15:57 2013 +0100 + + cmake: drop search of gthread-2.0 and gio-2.0 from GTK + + this matches what is done in the autoconf counterpart + + cmake/modules/FindGTK.cmake | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 47e869e60fb147caca825380eeaa2a0851d502b9 +Author: Michael Weiser <michael@weiser.dinsnail.net> +Date: Mon Mar 18 18:15:14 2013 +0100 + + cmake: search also for gio-2.0 as GLIB library + + cmake/modules/FindGLIB.cmake | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 80cf78f2020e2f4cf33ed49fe522c6861d710588 +Merge: b21780e 72c8312 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Mar 18 20:02:08 2013 +1030 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 72c8312d77704211f55c8de35b47bd811c792878 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Mar 17 19:39:14 2013 +1030 + + cairo: Don't change image interpolation when printing + + Bug 62418 + + poppler/CairoOutputDev.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit b21780e69dd92f3f2bcb7851608d3e0557dc81f8 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Mar 16 23:20:35 2013 +0100 + + Fix typo + + poppler/XRef.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 75849a0d7c205c048714b90883695b6bebd2298c +Merge: ec7140b 5a51812 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Mar 12 20:27:59 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + + Conflicts: + poppler/Stream.h + +commit 5a51812b7c1457feb8acaa106f43d7d5252b3980 +Author: Peter Breitenlohner <peb@mppmu.mpg.de> +Date: Tue Mar 12 20:25:50 2013 +0100 + + Fix compile when not using libjpeg + + poppler/Stream.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 341e863d65fdd5619a071e4fd903fa82bf33c757 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 11 19:20:06 2013 +0100 + + 0.22.2 + + 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 ec7140b3f56b034fbbc53cb8066ba01fe9f60f47 +Merge: c86062f 5db6585 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 8 16:41:21 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + + Conflicts: + poppler/Stream.cc + poppler/Stream.h + +commit 5db6585c2b02dd4071f1adabd53509506333dcf8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 8 16:38:49 2013 +0100 + + Make the non jpeglib based DCTStream compile + + poppler/Stream.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6402e291e1f9374fbaf4de3b97b21f43d38d6ab8 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Mar 8 16:37:11 2013 +0100 + + Workaround broken jpeg stream definitions + + Bug #61994 + + poppler/DCTStream.cc | 22 +++++++++++++++++++--- + poppler/DCTStream.h | 6 +++++- + poppler/Stream.cc | 8 ++++---- + poppler/Stream.h | 4 ++-- + 4 files changed, 30 insertions(+), 10 deletions(-) + +commit c86062f982d6eb08cb27b654b6317c71ab77c692 +Merge: 677e5b2 4e142b6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 4 20:13:36 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 4e142b60790638e4495b4fd6551702470cf4c38f +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Mar 4 20:12:01 2013 +0100 + + Make sure we don't try to paint in x < 0 + + Fixes crash in KDE bug #315432 + + splash/Splash.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit 677e5b265a0d39a988f65d642a4f964a279fad28 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Mar 3 19:07:32 2013 +0100 + + Small improvements over locker class + + * Remove the namespace (we don't use much/any namespaces in + poppler core) + * Rename the class and defines from lock to locker since lock and be + either the action "to lock" or the "thing that locks", with locker + it is more clear (i think) that is "the thing" than "the action" + * Make Annot::decRefCnt use gLockMutex since we the object itself + is being deleted in the if and not sure the locker would be happy + with that + * change the getNumPages() param to be DoNotLockMutex since + previously it was a gFalse (i guess Thomas made a c&p typo here) + * Have only one constructor like Adam suggested. + + goo/GooMutex.h | 33 +++++++++-------- + poppler/Annot.cc | 92 + +++++++++++++++++++++++----------------------- + poppler/Annot.h | 6 +-- + poppler/Array.cc | 15 ++++---- + poppler/CairoFontEngine.cc | 8 ++-- + poppler/Catalog.cc | 52 +++++++++++++------------- + poppler/Catalog.h | 10 ++--- + poppler/Dict.cc | 20 +++++----- + poppler/PDFDoc.cc | 12 +++--- + poppler/Page.cc | 16 ++++---- + poppler/Stream.cc | 8 ++-- + poppler/XRef.cc | 18 ++++----- + 12 files changed, 147 insertions(+), 143 deletions(-) + +commit d5c929fc253c2748bb8fa3642d9b5383c5fe96f8 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sun Mar 3 18:00:11 2013 +0100 + + Add a locker helper and a bool -> enum changes + + Bug #59933 + + goo/GooMutex.h | 16 +++++++ + poppler/Annot.cc | 114 + +++++++++++++++++---------------------------- + poppler/Annot.h | 4 +- + poppler/Array.cc | 22 +++------ + poppler/CairoFontEngine.cc | 10 ++-- + poppler/Catalog.cc | 79 ++++++++++--------------------- + poppler/Catalog.h | 9 ++-- + poppler/Dict.cc | 29 ++++-------- + poppler/FontInfo.cc | 2 +- + poppler/PDFDoc.cc | 21 ++------- + poppler/Page.cc | 32 ++++++------- + poppler/Page.h | 3 +- + poppler/Stream.cc | 12 ++--- + poppler/XRef.cc | 29 ++++-------- + 14 files changed, 145 insertions(+), 237 deletions(-) + +commit 1f4a012f7570ffd2120e3e8c2236de5408f3dda3 +Merge: 15d4039 a766740 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Mar 1 19:16:52 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit a766740cf5a5a7580935a026bf15fbd668aa0fdf +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Mar 1 19:12:22 2013 +0100 + + Restore CTM on early exits + + Bug #61413 + + poppler/SplashOutputDev.cc | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 15d40392a29dded8a29c2dc9d7c15b402515e033 +Merge: be5d9af 39882df +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Feb 28 19:46:59 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 39882dfecdccc00db353946a31d395582ee37022 +Author: José Aliste <jaliste@src.gnome.org> +Date: Wed Feb 27 01:33:38 2013 +0100 + + Correct rendering of underline and strike out annotations + + Current code assumes that the text to underline or strike out is + horizontal. + Fixes bug #61518 + + poppler/Annot.cc | 27 ++++++++++++++++----------- + 1 file changed, 16 insertions(+), 11 deletions(-) + +commit be5d9af38655496a2eaa4eb12cea84461c5aeb3f +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Feb 23 23:41:46 2013 +0100 + + expose thin line modes in qt frontend + + qt4/src/poppler-page.cc | 5 ++++- + qt4/src/poppler-qt4.h | 6 ++++-- + 2 files changed, 8 insertions(+), 3 deletions(-) + +commit f96cbacfdbc97ace35f843854992f06e9322f485 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Feb 23 23:39:52 2013 +0100 + + Refine splashThinLineShape support + + splash/Splash.cc | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +commit 47453a78e52aa43edd148aef53b67306603161f5 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Feb 20 23:12:17 2013 +0100 + + More threading safety + + poppler/Annot.cc | 97 + +++++++++++++++++++++++++++++++++++------ + poppler/Annot.h | 8 +++- + poppler/FontInfo.cc | 29 ++++++------ + poppler/FontInfo.h | 5 ++- + poppler/Page.cc | 11 ++++- + poppler/Page.h | 6 +-- + poppler/SplashOutputDev.cc | 7 ++- + poppler/SplashOutputDev.h | 5 ++- + poppler/XRef.cc | 4 +- + qt4/src/poppler-page.cc | 9 ++-- + qt4/src/poppler-ps-converter.cc | 3 +- + 11 files changed, 139 insertions(+), 45 deletions(-) + +commit 60c5e072d4b930507469e6e8c234971725a4aa26 +Merge: 0d42a6d 8d62625 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 20 21:08:53 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 8d62625610746ad70ffb88d845791fa03f5e35cc +Author: Thomas Fischer <fischer@unix-ag.uni-kl.de> +Date: Wed Feb 20 21:07:10 2013 +0100 + + height -> maskHeight + + Bug #61168 + + utils/ImageOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 0d42a6dab479d27de1ecb2b47ad3f7568b1ee638 +Merge: 7eb7880 8fb243b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Feb 20 00:00:09 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 8fb243bf11a979af8bfa36427436940706c9f71d +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 19 23:59:17 2013 +0100 + + Initialize cSrcNonIso[3] in splashModeXBGR8 + + Fixes valgrind warning + + splash/Splash.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 8a0199a0247c1a03a4d64375ca8bc900570d1817 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 19 23:11:46 2013 +0100 + + Fix indent + + splash/Splash.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 7eb7880907cb7b6bd1032013d6ce4c49aa3525c4 +Merge: 2c84acb 1389aa4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 19 22:26:37 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 1389aa41b2984de9da7bb66c11485f6c6aeaea41 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 19 22:25:56 2013 +0100 + + fix indent + + splash/Splash.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 2c84acbfd02eeeaf0d20542798e907cb011c1e57 +Merge: 401c35b ffd33e7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 19 11:32:11 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit ffd33e7b5aea44bc54a74f433f6bfff859b913dd +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 19 11:31:22 2013 +0100 + + Fix missing ) here too + + README.contributors | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 14466ecc320387c9b6568280614a96e6f56309b4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 19 11:31:02 2013 +0100 + + Forgot my C here + + poppler/PageLabelInfo.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 401c35b797d3c25c734fbfb5b95be16a666a6012 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 18 22:33:07 2013 +0100 + + Fix closing ) as suggested by William Bader + + README.contributors | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 94364adade4dc27e5d80bc14511d4f2b7ea4ab0d +Merge: 164805b 47f30fa +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 18 20:34:34 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 47f30fa96e62fc215c0e80f42517908760ef8065 +Author: Brad Hards <bradh@frogmouth.net> +Date: Mon Feb 18 20:38:10 2013 +1100 + + Minor rewording of contributor README + + README.contributors | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit 164805b4471256d3915c5e49fff28c9cdcbf89e6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 18 20:05:12 2013 +0100 + + Move the commented test to a proper one + + poppler/Makefile.am | 3 +- + poppler/PageLabelInfo.cc | 160 + +------------------------------------- + poppler/PageLabelInfo_p.h | 147 + ++++++++++++++++++++++++++++++++++ + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/Makefile.am | 4 + + qt4/tests/check_pagelabelinfo.cpp | 43 ++++++++++ + 6 files changed, 198 insertions(+), 160 deletions(-) + +commit 527b91a0ef97906041ffe57e88f0d26e1c407af0 +Merge: df35562 95609be +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 18 19:49:14 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 95609be551fc4413874b8980010be70fbbab112a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Feb 18 19:47:19 2013 +0100 + + Use the toLatin function in PageLabelInfo::indexToLabel + + Wonder why Kristian never enabled it? + Fixes bug #61034 + + poppler/PageLabelInfo.cc | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +commit df3556240d5e4b4546b3c42b29be6d2be83a2802 +Merge: 4dacd7c 5c7057c +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 12 23:55:24 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 5c7057c61ed6e270e001c1f86632f265bebb6890 +Author: Nuno Araujo <nuno.araujo@russo79.com> +Date: Tue Feb 12 23:54:47 2013 +0100 + + Fix the build with automake-1.13 + + autogen.sh | 17 +++++++++-------- + configure.ac | 3 +-- + 2 files changed, 10 insertions(+), 10 deletions(-) + +commit 4dacd7cdeb19d16fe7737c71e34904c7363c6b63 +Merge: 7f2c255 9fc4b9f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Feb 12 22:59:56 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + +commit 9fc4b9f7a7e6105a6fd85aed9c21b78742e89ddd +Author: Peter Breitenlohner <peb@mppmu.mpg.de> +Date: Tue Feb 12 22:58:17 2013 +0100 + + true->TRUE + + Fixes compilation with jpeglib9 + + goo/JpegWriter.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 7f2c255ff28386ba992717f729f25a979f240375 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Feb 12 22:48:40 2013 +0100 + + Introduce option SplashThinLineMode + + More info at bug #37347 + + poppler/SplashOutputDev.cc | 9 ++++++++- + poppler/SplashOutputDev.h | 3 ++- + splash/Splash.cc | 37 ++++++++++++++++++++++++++++++------- + splash/Splash.h | 9 +++++++-- + splash/SplashClip.cc | 7 ++++--- + splash/SplashClip.h | 4 +++- + splash/SplashTypes.h | 8 +++++++- + splash/SplashXPath.cc | 14 ++++++++++++-- + splash/SplashXPath.h | 17 ++++++++++++++++- + splash/SplashXPathScanner.cc | 9 +++++---- + splash/SplashXPathScanner.h | 17 ++++++++++++++++- + 11 files changed, 110 insertions(+), 24 deletions(-) + +commit c2ebcbea2267f861c491c0cd6c1fbf2dc2aff7d2 +Merge: 48ed05d dca21f8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 10 12:01:13 2013 +0100 + + Merge remote-tracking branch 'origin/poppler-0.22' + + Conflicts: + poppler/Parser.cc + +commit dca21f86359b6b2a925f7b05a2f36ab854cefbce +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 10 11:47:21 2013 +0100 + + 0.22.1 + + CMakeLists.txt | 2 +- + NEWS | 9 +++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 13 insertions(+), 4 deletions(-) + +commit e8e9245f6a4884da3940fc281b7ff1a42d7f5964 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 10 11:43:14 2013 +0100 + + Update C year here too + + poppler/poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit ebbacd897e2b529d1c3637b6af438b8dcc1d7ce8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Feb 10 11:42:21 2013 +0100 + + Update C + + poppler/Parser.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 48ed05d95598b642a57456a843baf9f246502bb6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Feb 6 21:56:01 2013 +1030 + + Make Goffset long long and factor out all fseek/ftell into gfile.cc + + This fixes build problems on 32-bit machines due to off_t being + defined differently depending on whether source files included + condig.h. + + Bug 60095 + + goo/gfile.cc | 38 ++++++++++++++++++++++++ + goo/gfile.h | 7 +++++ + goo/gtypes.h | 19 +----------- + poppler/Stream.cc | 67 + ++++++------------------------------------ + poppler/XRef.cc | 4 +-- + poppler/poppler-config.h.cmake | 6 ---- + poppler/poppler-config.h.in | 6 ---- + utils/pdfinfo.cc | 16 ++-------- + 8 files changed, 60 insertions(+), 103 deletions(-) + +commit fbcd64386c1b189db6e06234577261973bdc88cc +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 25 22:24:50 2013 +1030 + + cairo: support uncolored tiling patterns + + Bug 59179 + + poppler/CairoOutputDev.cc | 20 ++++++++++++++++++++ + poppler/CairoOutputDev.h | 1 + + 2 files changed, 21 insertions(+) + +commit c60ad119363c65d097dff56a68c1ab3fb2933f0b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 27 15:50:26 2013 +1030 + + A few more missing Goffsets + + glib/poppler-input-stream.h | 2 +- + poppler/PDFDoc.cc | 16 ++++++++-------- + poppler/PDFDoc.h | 6 +++--- + poppler/Stream.cc | 4 ++-- + poppler/Stream.h | 4 ++-- + 5 files changed, 16 insertions(+), 16 deletions(-) + +commit 9b113dc86a27085693ac4bcad061780c881ea7f9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Jan 27 11:32:34 2013 +1030 + + Use sys/types.h instead of stdio.h for the off_t type + + Bug 44085 + + goo/gtypes.h | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit f3aa5236361dca3db64f110520ebe721ba1c9464 +Author: Pino Toscano <pino@kde.org> +Date: Sun Jan 27 18:50:10 2013 +0100 + + use Goffset also for length in MemStream ctor + + poppler/Stream.cc | 2 +- + poppler/Stream.h | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit eb5ce6990522bac91d8f5d0d3636c46178386d25 +Author: Pino Toscano <pino@kde.org> +Date: Sun Jan 27 15:20:42 2013 +0100 + + avoid max() macro expansion + + protect against compilers defining max as macro + + poppler/XRef.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6b716b1ab60b573b5770d8636992247387bc3513 +Author: Pino Toscano <pino@kde.org> +Date: Sun Jan 27 15:18:04 2013 +0100 + + cmake: provide HAVE_FSEEK64 and HAVE_FSEEKO in poppler-config + + followup of a3cee0e7e9dd292c70fe1fa19a92e70bbc1e1b41 also for the + cmake-generated poppler-config.h + + poppler/poppler-config.h.cmake | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit fe59ac914230b80aa82b314398a8a038ef083e06 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Jan 26 16:44:49 2013 +1030 + + Read 8 byte xref offsets when sizeof(Goffset) < 8 + + and print an error if the offset read is too large for Goffset. + + Bug 56318 + + poppler/XRef.cc | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +commit 098d98dfc3846150098f5b20f3f5a07cb565c465 +Author: Lu Wang <coolwanglu@gmail.com> +Date: Sat Jan 26 19:31:20 2013 +0100 + + Rename function + + Makes it say more what it does + + poppler/GfxState.cc | 3 ++- + poppler/GfxState.h | 3 ++- + poppler/SplashOutputDev.cc | 5 +++-- + 3 files changed, 7 insertions(+), 4 deletions(-) + +commit 97e93d7583f2a6a5b1c8b51474744ca05277dc28 +Author: Lu Wang <coolwanglu@gmail.com> +Date: Sat Jan 26 16:56:00 2013 +0100 + + Remove unused deviceHasTextClip + + poppler/CairoOutputDev.h | 1 - + poppler/OutputDev.h | 1 - + poppler/PSOutputDev.h | 1 - + poppler/SplashOutputDev.h | 1 - + utils/pdftohtml.cc | 1 - + 5 files changed, 5 deletions(-) + +commit 1bb3ddc2264cb65dffd553a952ee4518344df0de +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 25 19:37:24 2013 +0100 + + A few Goffsets we missed + + charactersRead is returned in BaseCryptStream::getPos thus should + be a Goffset + Gfx::getPos returns Parser::getPos and thus should be a Goffset too + + poppler/Decrypt.h | 3 ++- + poppler/Gfx.cc | 4 ++-- + poppler/Gfx.h | 4 ++-- + 3 files changed, 6 insertions(+), 5 deletions(-) + +commit 5f8b1275a19b2036c6e9323a744d8bc64af31c36 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 25 19:32:58 2013 +0100 + + New year! + + poppler/poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 574907e6a74e62a5ee6d7f17c43fdd9bcb07e069 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Jan 25 19:31:59 2013 +0100 + + Adrian C for 2013 because of the big files support + + cpp/poppler-private.cpp | 1 + + cpp/poppler-private.h | 1 + + goo/gtypes.h | 1 + + poppler/Decrypt.cc | 1 + + poppler/Decrypt.h | 1 + + poppler/Error.cc | 1 + + poppler/Error.h | 1 + + poppler/Hints.cc | 1 + + poppler/Hints.h | 1 + + poppler/JBIG2Stream.cc | 1 + + poppler/JBIG2Stream.h | 1 + + poppler/JPEG2000Stream.cc | 1 + + poppler/JPEG2000Stream.h | 1 + + poppler/Lexer.cc | 2 +- + poppler/Lexer.h | 1 + + poppler/Object.cc | 1 + + poppler/Object.h | 1 + + poppler/PDFDoc.cc | 1 + + poppler/PDFDoc.h | 1 + + poppler/PageTransition.cc | 1 + + poppler/Parser.cc | 1 + + poppler/Parser.h | 1 + + poppler/SecurityHandler.cc | 1 + + poppler/Stream.cc | 1 + + poppler/Stream.h | 1 + + poppler/XRef.cc | 1 + + poppler/XRef.h | 1 + + qt4/src/poppler-private.cc | 1 + + qt4/src/poppler-qiodeviceoutstream-private.h | 1 + + qt4/src/poppler-qiodeviceoutstream.cc | 1 + + utils/pdfinfo.cc | 2 +- + utils/pdfunite.cc | 1 + + 32 files changed, 32 insertions(+), 2 deletions(-) + +commit 95b81ae9b5a345c9caa3d658b9b543d1937c6c02 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 25 21:37:51 2013 +1030 + + gitignore + + qt4/tests/.gitignore | 2 ++ + 1 file changed, 2 insertions(+) + +commit 576dc53c857d99bb5d81fe7c9c52fe314a6e58ee +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Jan 25 21:27:13 2013 +1030 + + splash: fix uninitialized memory + + Bug 44085 + + poppler/SplashOutputDev.cc | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +commit a9768588cd6086f4ca4e6906db038cfdbfd551d5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 25 21:24:29 2013 +1030 + + win32 large file support + + Bug 44085 + + goo/gtypes.h | 2 ++ + poppler/Stream.cc | 13 +++++++++++++ + utils/pdfinfo.cc | 3 +++ + 3 files changed, 18 insertions(+) + +commit a3cee0e7e9dd292c70fe1fa19a92e70bbc1e1b41 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 25 21:23:43 2013 +1030 + + Large file support + + Create a Goffset type and use this type for all file offsets and file + sizes. + + Bug 44085 + + cpp/poppler-private.cpp | 2 +- + cpp/poppler-private.h | 2 +- + glib/poppler-input-stream.cc | 10 +- + glib/poppler-input-stream.h | 16 +-- + goo/gtypes.h | 15 +++ + poppler/Decrypt.cc | 2 +- + poppler/Decrypt.h | 2 +- + poppler/Error.cc | 10 +- + poppler/Error.h | 5 +- + poppler/Hints.cc | 4 +- + poppler/Hints.h | 6 +- + poppler/JBIG2Stream.cc | 8 +- + poppler/JBIG2Stream.h | 2 +- + poppler/JPEG2000Stream.cc | 2 +- + poppler/JPEG2000Stream.h | 2 +- + poppler/Lexer.h | 8 +- + poppler/Object.h | 8 +- + poppler/PDFDoc.cc | 54 +++++----- + poppler/PDFDoc.h | 14 +-- + poppler/Parser.cc | 10 +- + poppler/Parser.h | 2 +- + poppler/Stream.cc | 88 ++++++++--------- + poppler/Stream.h | 102 +++++++++---------- + poppler/XRef.cc | 141 + +++++++++++++++++---------- + poppler/XRef.h | 34 +++---- + poppler/poppler-config.h.in | 6 ++ + qt4/src/poppler-private.cc | 2 +- + qt4/src/poppler-qiodeviceoutstream-private.h | 2 +- + qt4/src/poppler-qiodeviceoutstream.cc | 4 +- + test/perf-test.cc | 6 +- + utils/pdfinfo.cc | 6 +- + utils/pdfunite.cc | 2 +- + 32 files changed, 320 insertions(+), 257 deletions(-) + +commit 6eebbb9c015f98b713205e56ab2f1d4d430e9206 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 25 21:22:51 2013 +1030 + + Add Int64 object type + + Bug 44085 + + poppler/Lexer.cc | 46 + ++++++++++++++++++++-------------------------- + poppler/Object.cc | 6 +++--- + poppler/Object.h | 26 +++++++++++++++----------- + poppler/PDFDoc.cc | 4 ++-- + poppler/SecurityHandler.cc | 4 ++-- + qt4/tests/check_lexer.cpp | 24 +++++++++++++++++------- + test/pdf-fullrewrite.cc | 9 +-------- + 7 files changed, 60 insertions(+), 59 deletions(-) + +commit be495d73ce7324963a979cffc149330f5512288b +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Jan 25 21:14:21 2013 +1030 + + use getNum instead of getReal + + poppler/PageTransition.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit a5adb6738e1e191c64457e0c07ee2e3422a042dd +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jan 19 18:13:33 2013 +0100 + + Don't use config.h but poppler-config.h + + That was already included but i forgot to kill the other one + + poppler/XRef.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 8eb489c355d734a72e140ce7e32470d048362499 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sat Jan 19 17:43:08 2013 +0100 + + Make rendering thread-safe + + Bug #50992 + + glib/poppler-input-stream.cc | 4 ++ + glib/poppler-input-stream.h | 1 + + poppler/Annot.cc | 52 +++++++++---------- + poppler/Array.cc | 48 +++++++++++++++++- + poppler/Array.h | 15 ++++-- + poppler/ArthurOutputDev.cc | 3 +- + poppler/ArthurOutputDev.h | 3 +- + poppler/CairoFontEngine.cc | 33 +++++++++--- + poppler/CairoFontEngine.h | 11 ++-- + poppler/CairoOutputDev.cc | 15 ++++-- + poppler/CairoOutputDev.h | 5 +- + poppler/Catalog.cc | 84 +++++++++++++++++++++++++++---- + poppler/Catalog.h | 15 ++++-- + poppler/Dict.cc | 67 ++++++++++++++++++++++++- + poppler/Dict.h | 11 +++- + poppler/Gfx.cc | 18 ++++--- + poppler/Gfx.h | 8 +-- + poppler/GlobalParamsWin.cc | 4 +- + poppler/Object.h | 7 +-- + poppler/OutputDev.h | 4 +- + poppler/PDFDoc.cc | 66 ++++++++++++++++++------ + poppler/PDFDoc.h | 11 ++-- + poppler/PSOutputDev.cc | 12 ++--- + poppler/PSOutputDev.h | 4 +- + poppler/Page.cc | 75 ++++++++++++++++++++++++--- + poppler/Page.h | 18 +++++-- + poppler/Parser.cc | 3 +- + poppler/PreScanOutputDev.cc | 4 +- + poppler/PreScanOutputDev.h | 4 +- + poppler/SplashOutputDev.cc | 16 +++--- + poppler/SplashOutputDev.h | 5 +- + poppler/Stream.cc | 117 + ++++++++++++++++++++++++++++++++----------- + poppler/Stream.h | 35 +++++++++---- + poppler/TextOutputDev.cc | 5 +- + poppler/TextOutputDev.h | 3 +- + poppler/XRef.cc | 99 +++++++++++++++++++++++++++++++++--- + poppler/XRef.h | 16 +++++- + qt4/src/poppler-document.cc | 23 ++++----- + qt4/src/poppler-page.cc | 64 ++++++++++++++++++++--- + qt4/src/poppler-private.cc | 3 +- + qt4/src/poppler-private.h | 74 +-------------------------- + test/gtk-test.cc | 2 +- + utils/HtmlOutputDev.cc | 3 +- + utils/HtmlOutputDev.h | 3 +- + utils/ImageOutputDev.h | 3 +- + 45 files changed, 793 insertions(+), 283 deletions(-) + +commit 3db9472e2b016f1b411174273f27848193ab18e5 +Author: José Aliste <jaliste@src.gnome.org> +Date: Fri Jan 18 15:22:03 2013 +0100 + + Add a null check for gfxFont + + Bug #59561 + + poppler/TextOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 4b69217f72f3fd313f73df059eb1e6294878a95e +Author: Peter Dyballa <Peter_Dyballa@Freenet.DE> +Date: Fri Jan 11 00:32:46 2013 +0100 + + Use CPPFLAGS for CPPFLAGS not CFLAGS + + Bug #59186 + + m4/libjpeg.m4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 8b6dc55e530b2f5ede6b9dfb64aafdd1d5836492 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 10 22:31:52 2013 +0100 + + Fix invalid memory access in 1150.pdf.asan.8.69 + + splash/Splash.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit e14b6e9c13d35c9bd1e0c50906ace8e707816888 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 10 20:52:02 2013 +0100 + + Fix invalid memory access in 2030.pdf.asan.69.463 + + poppler/Function.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 0388837f01bc467045164f9ddaff787000a8caaa +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 10 20:29:06 2013 +0100 + + Fix another invalid memory access in 1091.pdf.asan.72.42 + + poppler/Stream.cc | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 957aa252912cde85d76c41e9710b33425a82b696 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 10 19:16:19 2013 +0100 + + Fix invalid memory accesses in 1091.pdf.asan.72.42 + + splash/Splash.cc | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit bbc2d8918fe234b7ef2c480eb148943922cc0959 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Jan 10 19:07:48 2013 +0100 + + Fix invalid memory accesses in 1036.pdf.asan.23.17 + + splash/Splash.cc | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +commit a9b8ab4657dec65b8b86c225d12c533ad7e984e2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 9 22:56:45 2013 +0100 + + Fix crash in broken file 1031.pdf.asan.48.15 + + splash/Splash.cc | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 7266a634e01e20648cc877371edc95651d30d4fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 9 22:52:45 2013 +0100 + + Forgot the C of the last commit + + splash/Splash.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a205e71a2dbe0c8d4f4905a76a3f79ec522eacec +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 9 22:47:28 2013 +0100 + + Do not crash in broken documents like 1007.pdf.asan.48.4 + + splash/Splash.cc | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +commit b1026b5978c385328f2a15a2185c599a563edf91 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Jan 9 22:17:09 2013 +0100 + + Initialize refLine totally + + Fixes uninitialized memory read in 1004.pdf.asan.7.3 + + poppler/Stream.cc | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +commit bef2c42f381c74fdb8bbb43babe1a93a0e229fb0 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Jan 3 15:27:36 2013 +1030 + + Parser: return error if stream encountered when allowStreams = false + + Opening a PDF file where the first object is a stream prints a + "Command token too long" error message. This is caused by the + Linearization check in Linearization::Linearization reading objects + with allowStreams = false. The Parser ignores the "stream" token and + tries reading the next token which is usually binary data. Setting + allowStreams to true will not work since the stream length is often an + indirect object and at this point the XRef has not been created. + + Fix this by making Parser return an error object if the "stream" token + is encountered when allowStreams is false. + + Bug 58966 + + poppler/Parser.cc | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +commit 801f7feea79e5bc3b5417566552e4df1e6b8a51c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 29 19:22:54 2012 +0100 + + 0.22.0 + + CMakeLists.txt | 6 +++--- + NEWS | 14 ++++++++++++++ + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + poppler/Makefile.am | 2 +- + qt4/src/Doxyfile | 2 +- + 6 files changed, 22 insertions(+), 8 deletions(-) + +commit bf5ef68c89d4189b18458b764f807cfc6599bad7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Dec 29 19:43:11 2012 +0100 + + regtest: Print test results when the test has finished + + To make sure the result corresponds to the test now that we are using + multiple threads. + + regtest/Printer.py | 25 +++++++++++++++++++------ + regtest/TestRun.py | 18 +++++++++--------- + 2 files changed, 28 insertions(+), 15 deletions(-) + +commit 80c7f6aa3fa83175fafc71fa8c834350d513a48f +Author: Jason Crain <jason@aquaticape.us> +Date: Fri Nov 23 23:31:01 2012 -0600 + + TextOutputDev: Use page size for max value in TextPage::visitSelection + + https://bugs.freedesktop.org/show_bug.cgi?id=50138 + + poppler/TextOutputDev.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 0d31edfa5617f4fecb04d5476de54a63b6146686 +Author: Ross Lagerwall <rosslagerwall@gmail.com> +Date: Fri Nov 30 09:23:55 2012 +0000 + + pdf-inspector Change from the deprecated GtkTable to GtkGrid + + This fixes the problem of the description_label height changing after + its text changes which was introduced since the port to Gtk3. + + https://bugs.freedesktop.org/show_bug.cgi?id=57727 + + test/pdf-inspector.ui | 39 +++++++++++++++------------------------ + 1 file changed, 15 insertions(+), 24 deletions(-) + +commit 9977a4f26b5698b0b85ca911e7392013941944e0 +Author: Ross Lagerwall <rosslagerwall@gmail.com> +Date: Tue Nov 13 15:49:44 2012 +0000 + + pdf-inspector: Remove deprectated has-separator property + + https://bugs.freedesktop.org/show_bug.cgi?id=57727 + + test/pdf-inspector.ui | 1 - + 1 file changed, 1 deletion(-) + +commit 806d116a38c2a6552c9bcee2c6f753d7059c17aa +Author: Ross Lagerwall <rosslagerwall@gmail.com> +Date: Tue Nov 13 15:44:15 2012 +0000 + + pdf-inspector: Add correct title and copyright + + https://bugs.freedesktop.org/show_bug.cgi?id=57727 + + test/pdf-inspector.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 7d5bf74c19768fa3447819a4debff06d5d83900a +Author: Ross Lagerwall <rosslagerwall@gmail.com> +Date: Tue Nov 13 15:23:36 2012 +0000 + + pdf-inspector: Fix crash by not freeing filename_g + + It is not necessary because PDFDoc takes over filename_g and destroys + it in its deconstructor. + + https://bugs.freedesktop.org/show_bug.cgi?id=57727 + + test/pdf-inspector.cc | 1 - + 1 file changed, 1 deletion(-) + +commit d61c6d4944d6f7c9e8b517dd28958124f4923d08 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Dec 28 01:18:48 2012 +0100 + + Repair pdfunite + + Sorry, when I implemented the support encrypted pdf files in + pdfseparate I + missed that writePageObjects of course is also used in pdfunite + for combining + pages, and even more that encrypted files are still not supported + by pdfunite, + I removed the numoffset from writing the objects itself. Therefore + there are + still all objects in the combined pdf file, but the references + missing the + numoffset and therefore were no more reachable. + The patch repairs it. + + Bug #58569 + + poppler/PDFDoc.cc | 6 ++++-- + poppler/PDFDoc.h | 4 ++-- + utils/pdfunite.cc | 4 ++-- + 3 files changed, 8 insertions(+), 6 deletions(-) + +commit be4804bff2b722ceac180da52ad436fee548f9ee +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Dec 28 01:17:14 2012 +0100 + + dos2unix + + poppler/PDFDoc.cc | 36 ++++++++++++++++++------------------ + 1 file changed, 18 insertions(+), 18 deletions(-) + +commit 703c77eb59aa22ab6372d56a20ee81dc7dfa6e4a +Author: Even Rouault <even.rouault@mines-paris.org> +Date: Fri Dec 28 00:57:17 2012 +0100 + + Fix very long loop in JPXStream::getImageParams() + + poppler/JPXStream.cc | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +commit 7e0be7854adc49e4e00c0badb0dc470fbdf6d612 +Author: Even Rouault <even.rouault@mines-paris.org> +Date: Fri Dec 28 00:44:29 2012 +0100 + + Avoid DoS due to huge number of JPX tiles in a stream + + poppler/JPXStream.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 2017dbebd9afd4f172242ff8462fce739d911e64 +Author: Even Rouault <even.rouault@mines-paris.org> +Date: Fri Dec 28 00:30:13 2012 +0100 + + Do not crash on 0 or negative nBits values + + poppler/Stream.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 858df0dc04e2f306e806fe0fc4fb5c8ec804e263 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 27 23:30:27 2012 +0100 + + Fix arg typo + + poppler/PDFDoc.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1dd6280d79ad22461208702b3c929377887c99ff +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 15 16:39:23 2012 +0100 + + 0.21.4 soversion increases + + CMakeLists.txt | 2 +- + glib/CMakeLists.txt | 2 +- + glib/Makefile.am | 2 +- + poppler/Makefile.am | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 99d0288bb0b6879ae5414d174939bbd9c1e90bd3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 15 16:37:19 2012 +0100 + + 0.21.4 version increase + + CMakeLists.txt | 2 +- + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +commit 2bc48d5369f1dbecfc4db2878f33bdeb80d8d90f +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 15 16:36:38 2012 +0100 + + 0.21.4 NEWS + + NEWS | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +commit b3423d54b1254597d7ca953872211fa3aa83e29c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 15 16:29:54 2012 +0100 + + Updated copyrights + + goo/JpegWriter.h | 2 +- + goo/PNGWriter.cc | 1 + + goo/PNGWriter.h | 1 + + goo/TiffWriter.cc | 1 + + goo/TiffWriter.h | 1 + + poppler/GlobalParams.cc | 2 +- + poppler/TextOutputDev.cc | 1 + + splash/Splash.cc | 1 + + utils/HtmlOutputDev.cc | 1 + + 9 files changed, 9 insertions(+), 2 deletions(-) + +commit 487f20d24830a97cad4773ae27f0c2cc58df2ed0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 13 20:40:39 2012 +0100 + + Check obj1 is a dict before using it + + Fixes bug #58257 + + poppler/Gfx.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 03045469206adbd797e3a38fee3a16cdd1716812 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Dec 13 19:24:54 2012 +0100 + + Fix crop on EPS conversion + + Bug #30692 + Patch is half William Bader's and half mine + + poppler/OutputDev.h | 5 +++++ + poppler/PSOutputDev.h | 4 +++- + poppler/Page.cc | 3 +++ + poppler/Page.h | 2 ++ + 4 files changed, 13 insertions(+), 1 deletion(-) + +commit 5d50b2765428e5a417967be2f41452ab05917db7 +Author: Peter Breitenlohner <peb@mppmu.mpg.de> +Date: Tue Dec 11 18:54:30 2012 +0100 + + Correct bad semantics + + Negation has higher precedence than comparison + Confirmed by Marek Kasik that wrote the code originally + + poppler/TextOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e306bad391a3ff49593f1f3bac0717d62599bd13 +Author: Pino Toscano <pino@kde.org> +Date: Sun Dec 9 22:40:27 2012 +0100 + + pngwriter: move #include <png.h> into .cc file + + Move all the private data (including the libpng types) to a private + class. + + This requires HtmlOutputDev.cc to include <png.h> on its own (which + is correct, since it uses the libpng API directly). + + goo/PNGWriter.cc | 98 + +++++++++++++++++++++++++++++--------------------- + goo/PNGWriter.h | 12 ++----- + utils/HtmlOutputDev.cc | 4 +++ + 3 files changed, 64 insertions(+), 50 deletions(-) + +commit cf338551e9d031cc00d56cea0d258ec5fd96e79a +Author: Pino Toscano <pino@kde.org> +Date: Sun Dec 9 22:22:03 2012 +0100 + + tiffwriter: move #include <tiffio.h> into .cc file + + Move all the private data (including the libtiff types) to a private + class. + + goo/TiffWriter.cc | 94 + ++++++++++++++++++++++++++++++++----------------------- + goo/TiffWriter.h | 12 ++----- + 2 files changed, 56 insertions(+), 50 deletions(-) + +commit 0dfa51f0bfa787ee9c865fd4f05e4bd964c260fc +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Dec 9 22:31:50 2012 +0100 + + Having a look at the log Marek has (C) in this file + + poppler/TextOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit f1b2e29e1d5f420903085318f06c4dc83ebb24f3 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Sun Dec 9 20:59:26 2012 +0100 + + Fix crash when rendering on mono1 + + poppler/SplashOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 71bad47ed6a36d825b0d08992c8db56845c71e40 +Author: Marek Kasik <mkasik@redhat.com> +Date: Sun Dec 9 20:20:00 2012 +0100 + + Filter stuff that might end up in the shell + + Since it seems shells don't know how to filter stuff and might + causing bad things to happen + + poppler/Error.cc | 21 +++++++++++++++++---- + 1 file changed, 17 insertions(+), 4 deletions(-) + +commit c35d030472e6cb140c3dff30b91541772c992eb0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 8 23:51:59 2012 +0100 + + Add private copy constructor and operator= to make sure we don't + use the default ones + + Since using them would results in bad things happening + + goo/GooHash.h | 16 ++++++++++++++++ + goo/GooList.h | 16 ++++++++++++++++ + goo/PNGWriter.h | 5 ++++- + goo/TiffWriter.h | 5 ++++- + goo/gfile.h | 4 ++++ + 5 files changed, 44 insertions(+), 2 deletions(-) + +commit f6741d9242bf2d9c13c8d534c50c8e4d404afc7f +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Dec 2 09:34:35 2012 +1030 + + jpegwriter: move #include "jpeglib.h" into .cc file + + On cygwin pdftocairo -v shows the wrong version due to + jpeglib.h defining PACKAGE_VERSION. + + Avoid polluting our header files by moving libjpeg.h and + libjpeg types into JpegWriter.cc + + Bug 57687 + + goo/JpegWriter.cc | 120 + ++++++++++++++++++++++++++++++++----------------- + goo/JpegWriter.h | 25 ++++++----- + splash/SplashBitmap.cc | 2 +- + utils/pdftocairo.cc | 4 +- + 4 files changed, 95 insertions(+), 56 deletions(-) + +commit e78dbb1b7dbd20c3ae547b02270ab0648c1bfc61 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Dec 2 09:10:32 2012 +1030 + + Reformat goo/*Writer files to poppler style + + goo/ImgWriter.h | 20 ++--- + goo/JpegWriter.cc | 184 ++++++++++++++++++++++---------------------- + goo/JpegWriter.h | 38 ++++----- + goo/PNGWriter.cc | 224 + +++++++++++++++++++++++++++--------------------------- + goo/PNGWriter.h | 62 +++++++-------- + goo/TiffWriter.cc | 40 +++++----- + goo/TiffWriter.h | 58 +++++++------- + 7 files changed, 313 insertions(+), 313 deletions(-) + +commit 1bfe4b22cf893dd498d6f306ee9cf942c72fe3ed +Author: Matthias Kramm <kramm@quiss.org> +Date: Mon Nov 19 12:39:56 2012 -0800 + + Fix linewidths in monochrome mode. + + For zoom levels that scale the page below sqrt(2) of the original + resolution, monochrome line widths were wrong (snapped back to 1 pixel + wide.) This patch fixes that issue. + + splash/Splash.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit e5008bdb26df0135edfbd30a811df2332f4e036c +Author: José Aliste <jaliste@src.gnome.org> +Date: Sat Dec 8 10:33:21 2012 -0300 + + glib-demo: Update the demo to modify flags of annotations + + https://bugs.freedesktop.org/show_bug.cgi?id=58015 + + glib/demo/annots.c | 65 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 65 insertions(+) + +commit 8cd5cae953de374276c11711dc106de15c8dcad0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Dec 8 18:57:07 2012 +0100 + + regtest: Use the number of cpus as default number of worker threads + + regtest/main.py | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit 605c363b04ba3853883010c0a413054fe246d9aa +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Dec 8 18:45:22 2012 +0100 + + regtest: Remove trailing whitespaces + + regtest/TestReferences.py | 10 +++++----- + regtest/TestRun.py | 10 +++++----- + regtest/main.py | 6 +++--- + 3 files changed, 13 insertions(+), 13 deletions(-) + +commit 787a8438708397f0a1bf26e93726f544c91533e6 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 2 08:03:10 2012 +0100 + + Fix compile warning on deprecated conversion from string constant + + Fixes (for win32): + + CXX GlobalParams.lo + GlobalParams.cc: In function 'char* get_poppler_datadir()': + GlobalParams.cc:181:12: warning: deprecated conversion from string + constant to 'char*' [-Wwrite-strings] + + poppler/GlobalParams.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit cb3a10417ae659fdb7b77132c569c93ec00bc95e +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sun Dec 2 01:41:05 2012 +0100 + + Fixed check_lexer on 32-bit systems + + qt4/tests/check_lexer.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 8550576bdf74180b62f54f9fd59213fbcd0a1be1 +Author: José Aliste <jaliste@src.gnome.org> +Date: Sat Dec 8 10:33:04 2012 -0300 + + glib: Add poppler_annot_set_flags + + https://bugs.freedesktop.org/show_bug.cgi?id=58015 + + glib/poppler-annot.cc | 22 ++++++++++++++++++++++ + glib/poppler-annot.h | 2 ++ + 2 files changed, 24 insertions(+) + +commit 15dcc5426ce319429e1a2c518902effb2ddf06cf +Author: Adam Reichold <adamreichold@myopera.com> +Date: Thu Dec 6 18:45:46 2012 +0100 + + implement parallel testing using Python's Queue class + + regtest/Printer.py | 36 +++++++++++++++++----------- + regtest/TestReferences.py | 23 +++++++++++++++++- + regtest/TestRun.py | 58 + ++++++++++++++++++++++++++++++++++++---------- + regtest/backends/cairo.py | 5 ++-- + regtest/backends/splash.py | 5 ++-- + regtest/main.py | 11 ++++++++- + 6 files changed, 104 insertions(+), 34 deletions(-) + +commit c46646020826136b403e9aae8e2ded24c7165522 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Dec 2 10:04:28 2012 +0100 + + glib-demo: Do not use deprecated gtk_color_button_{get,set}_rgba() + + Since Gtk 3.4, gtk_color_button_get_rgba() and + gtk_color_button_set_rgba() have been deprecated. + + https://bugs.freedesktop.org/show_bug.cgi?id=57798 + + glib/demo/selections.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +commit f8c1b55e764a6e79b0530fb1be9ee11917f4237e +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 1 22:19:17 2012 +0100 + + 0.21.3 + + 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 e3716d9d735a1093399a3c5c33ea5471a6adc405 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 1 22:34:00 2012 +0100 + + Build on make check correctly + + qt4/tests/check_goostring.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c7ae96b162e8a05269a54c31f8e7c411edc84553 +Merge: 1f279c3 b1dacd1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 1 21:26:24 2012 +0100 + + Merge commit 'b1dacd1e6ab00eb1976491eb2b45c76671011b38' + +commit 1f279c32dcdc899b509fc00aaa57382bc8af90f3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 1 20:37:52 2012 +0100 + + Update copyrights + + poppler/CairoOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 5daa17c013be8ebe180ff48207e189bd9bd50a84 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 1 20:06:17 2012 +0100 + + Initialize to NULL, fixes crash + + Since the TextStringToUCS4 not always assigns to second param, + initialize uni to NULL + + poppler/TextOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit f673be852e6564e039b5ec24e5bf583149b1d5a4 +Author: Jason Crain <jason@aquaticape.us> +Date: Sat Dec 1 20:03:00 2012 +0100 + + Allow large chars in TextPage + + poppler/TextOutputDev.cc | 1 - + 1 file changed, 1 deletion(-) + +commit aca122432951c4c0a2a5dbaba046d848f2153b84 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 18:27:55 2012 +0200 + + Fix compile warning on unused variable filename_g + + glib/poppler-document.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c702066961b1cc2a9c0fb16546e9db93c312813b +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 18:23:59 2012 +0200 + + Do not use 'size' uninitialized + + poppler/PDFDoc.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 14bdeacb0eb8e4a1d3995f310a1b526e4dcc96dc +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 18:09:01 2012 +0200 + + Fix compile warnings on deprecated conversion from string constant to + 'char*' + + poppler/FileSpec.cc | 3 ++- + poppler/GlobalParamsWin.cc | 4 ++-- + 2 files changed, 4 insertions(+), 3 deletions(-) + +commit 72d4a1ba998218de876e2a0e939bbec4b7795299 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 17:52:13 2012 +0200 + + Fix compile warning on signed/unsigned comparison + + goo/gfile.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1262111e70ff161e495505bd6a262cc0357a943c +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 17:46:54 2012 +0200 + + Remove unused variable + + goo/gfile.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit 85572b85950ed4e4421f1e61e704e5c250ca27d9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Dec 1 01:50:25 2012 +0100 + + Silence gcc warning + + Bug #57572 + + goo/TiffWriter.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit a97aead193a927b91a4e33d7b5d2ba7179e664df +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Fri Nov 30 21:30:19 2012 +0100 + + Splash: Implement bilinear image scaling + + Bug #22138 + + poppler/SplashOutputDev.cc | 10 +-- + splash/Splash.cc | 183 + ++++++++++++++++++++++++++++++++++++++++++--- + splash/Splash.h | 13 +++- + 3 files changed, 188 insertions(+), 18 deletions(-) + +commit e6806d893a9a104e3f23d69d0245ad0e4948a409 +Author: Pino Toscano <pino@kde.org> +Date: Wed Nov 28 17:59:36 2012 +0100 + + cmake: Enable compiler warnings for C code + + Compilation of glib/demo uses a C compiler, thus compiler warnings + should be enabled in the CFLAGS variable. + + followup of 5c5945d163fe406960ccc2e3a71882722b9e69d1 + + CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit bdb17da35de49b9fd1a549c3afd5e36004552080 +Author: Hib Eris <hib@hiberis.nl> +Date: Mon Nov 26 20:38:03 2012 +0100 + + cairo: Fix uninitaliazed warning in CairoOutputDev + + Fix warning: + + CXX CairoOutputDev.lo + ../../poppler/poppler/CairoOutputDev.cc: In member function 'virtual + void RescaleDrawImage::getRow(int, uint32_t*)': + ../../poppler/poppler/CairoOutputDev.cc:2813:25: warning: 'pix' + may be used uninitialized in this function [-Wuninitialized] + + https://bugs.freedesktop.org/show_bug.cgi?id=57571 + + poppler/CairoOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit beff044e4fdf44e80ad7c75255cb71a83e70a293 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Nov 27 22:19:01 2012 +0100 + + glib-demo: Fix warning on signedness + + Fixes: + + CC attachments.o + ../../../poppler/glib/demo/attachments.c: In function + ‘attachment_save_callback’: + ../../../poppler/glib/demo/attachments.c:190:2: warning: pointer + targets in passing argument 2 of ‘g_checksum_update’ differ in + signedness [-Wpointer-sign] + /usr/include/glib-2.0/glib/gchecksum.h:69:23: note: expected ‘const + guchar *’ but argument is of type ‘const gchar *’ + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/attachments.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit b484749ffa58315e4b61738d652347d7a77da982 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Nov 27 19:38:59 2012 +0100 + + glib-demo: Fix set but unused warning + + Fixes: + + CC print.o + ../../../poppler/glib/demo/print.c: In function + ‘pgd_print_draw_page’: + ../../../poppler/glib/demo/print.c:68:27: warning: variable + ‘settings’ set but not used [-Wunused-but-set-variable] + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/print.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +commit 8438daf7bf7ab1b96c6899baab7e47d9c634cb3d +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Jun 24 14:54:31 2012 +0200 + + glib-demo: pgd_text_view_query_tooltip(): return a gboolean + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/text.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit ff9e211cfb60eb820b9b046da546352fa59d7df9 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 22:56:02 2012 +0200 + + glib-demo: Remove set but unused variable textinfo + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/text.c | 2 -- + 1 file changed, 2 deletions(-) + +commit 8e5ae33bc63eca5297dea12fc281ba223f5be09a +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 22:44:22 2012 +0200 + + glib-demo: Fix warning "operation on 'page' may be undefined + [-Wsequence-point]" + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/text.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c6f98d62b885e1d7f6ce1f265d4a87dca36494de +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 22:38:35 2012 +0200 + + glib-demo: Remove unused variable slice_selector + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/render.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit da56d280e2a51229c93117d8b537897ba63296cf +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 22:36:29 2012 +0200 + + glib-demo: Remove unused variable region + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/selections.c | 1 - + 1 file changed, 1 deletion(-) + +commit c792e59064018e0fd899f32080489419517f2bbe +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 22:34:44 2012 +0200 + + glib-demo: Do not use 'text' uninitialized + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/utils.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c5a8f7eda14030436e6905dd826e72cabbcf0e5f +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 22:26:53 2012 +0200 + + glib-demo: Fix warning on unused variable selection + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/layers.c | 1 - + 1 file changed, 1 deletion(-) + +commit 4ceb3f4f4ca0092e79bb36723a7332b071491666 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Jun 23 18:36:12 2012 +0200 + + glib-demo: Fix warnings on unused variables + + https://bugs.freedesktop.org/show_bug.cgi?id=57620 + + glib/demo/annots.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +commit 5c5945d163fe406960ccc2e3a71882722b9e69d1 +Author: Hib Eris <hib@hiberis.nl> +Date: Tue Nov 27 19:21:34 2012 +0100 + + Enable compiler warnings for C code + + Compilation of glib/demo uses a C compiler, thus compiler warnings + should be enabled in the CFLAGS variable. + + configure.ac | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 55940e989701eb9118015e30f4f48eb654fa34c4 +Author: Pino Toscano <pino@kde.org> +Date: Tue Nov 27 16:05:15 2012 +0100 + + fix my previous GooString::insert fix + + we need only to move the characters after the specified position, + not all of them + + extend qt4's check_goostring with few more checks covering this + (and the previous) fix + + goo/GooString.cc | 2 +- + qt4/tests/check_goostring.cpp | 39 + +++++++++++++++++++++++++++++++++++++++ + 2 files changed, 40 insertions(+), 1 deletion(-) + +commit dcbc9686d97f4f6596c43d1f701207278c25f8eb +Author: Pino Toscano <pino@kde.org> +Date: Mon Nov 26 14:44:21 2012 +0100 + + glib/cmake: Include Gio-2.0 for introspection + + Fixes g-ir-scanner warnings: + poppler-document.cc:257: Warning: Poppler: + poppler_document_new_from_stream: argument stream: Unresolved type: + 'GInputStream*' + poppler-document.cc:257: Warning: Poppler: + poppler_document_new_from_stream: argument cancellable: Unresolved + type: 'GCancellable*' + poppler-document.cc:315: Warning: Poppler: + poppler_document_new_from_gfile: argument file: Unresolved type: + 'GFile*' + poppler-document.cc:315: Warning: Poppler: + poppler_document_new_from_gfile: argument cancellable: Unresolved + type: 'GCancellable*' + + https://bugs.freedesktop.org/show_bug.cgi?id=56218 + + folloup of c84753e12029fcc6113f80dedc9a943ce1deb214 + + glib/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 169e4cb001fa235ca608d3d0b42ea4214161fc2d +Author: Pino Toscano <pino@kde.org> +Date: Mon Nov 26 14:42:59 2012 +0100 + + glib/cmake: Show all suppressed introspection scanner warnings + + https://bugs.freedesktop.org/show_bug.cgi?id=56218 + + followup of 11a1f6f512a7d7b86defeb5963fa16bc08e3ba1c + + glib/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 62c0dbbe9f1987c78eeb87f248d35e7fd73e968a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 26 00:40:57 2012 +0100 + + Check GooString::insert + + Checks we don't break what we just fixed with Pino's patch + + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/Makefile.am | 7 ++++++- + qt4/tests/check_goostring.cpp | 22 ++++++++++++++++++++++ + 3 files changed, 29 insertions(+), 1 deletion(-) + +commit 01e438ca47776075c8171bda090e7d859fd9f620 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Mon Nov 26 00:39:05 2012 +0100 + + Don't use memcpy to copy classes + + poppler/Function.cc | 63 + +++++++++++++++++++++++++++++++++++++++++++---------- + poppler/Function.h | 11 ++++++---- + 2 files changed, 59 insertions(+), 15 deletions(-) + +commit 7ba15d11e56175601104d125d5e4a47619c224bf +Author: Pino Toscano <pino@kde.org> +Date: Mon Nov 26 00:29:35 2012 +0100 + + fix GooString::insert() + + Hi, + + as reported in a Debian bug [1], it seems GooString::insert could lead + to using uninitialized memory. + The case is a simple: + GooString goo; + goo.insert(0, "."); + goo.insert(0, "This is a very long long test string"); + i.e. basically first insert a single character at position 0, and + then a + string longer than STR_STATIC_SIZE always at position 0. + + [1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=693817 + + goo/GooString.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit 703f85a10cf7ad61d2f2d3a5faf347fdddcb4738 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Nov 25 12:36:33 2012 +0100 + + glib: Fix returns tag in PopplerAttachmentSaveFunc api doc + + glib/poppler-attachment.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 52896031783b28cee350ea92c8736e2c2e4e9d33 +Author: José Aliste <jaliste@src.gnome.org> +Date: Mon Nov 19 23:47:19 2012 +0100 + + glib: Add missing ":" at the end of some functions documentation + + New versions of gir-scanner emit a warning when the : at + the end of the function documentation is not found. + + https://bugs.freedesktop.org/show_bug.cgi?id=56218 + + glib/poppler-annot.cc | 2 +- + glib/poppler-form-field.cc | 10 +++++----- + glib/poppler-layer.cc | 12 ++++++------ + 3 files changed, 12 insertions(+), 12 deletions(-) + +commit 60dfc1a3471f824f40b0bef5b97a7b04bd78e72b +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Oct 20 10:17:01 2012 +0200 + + glib: Exclude poppler-input-stream.h from introspection files + + Fixes warning: + + poppler-input-stream.h:28: Warning: Poppler: + symbol='inputStreamBufSize': Unknown namespace for symbol + 'inputStreamBufSize' + + https://bugs.freedesktop.org/show_bug.cgi?id=56218 + + glib/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit c84753e12029fcc6113f80dedc9a943ce1deb214 +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Oct 20 09:40:09 2012 +0200 + + glib: Include Gio-2.0 for introspection + + Fixes g-ir-scanner warnings: + poppler-document.cc:257: Warning: Poppler: + poppler_document_new_from_stream: argument stream: Unresolved type: + 'GInputStream*' + poppler-document.cc:257: Warning: Poppler: + poppler_document_new_from_stream: argument cancellable: Unresolved + type: 'GCancellable*' + poppler-document.cc:315: Warning: Poppler: + poppler_document_new_from_gfile: argument file: Unresolved type: + 'GFile*' + poppler-document.cc:315: Warning: Poppler: + poppler_document_new_from_gfile: argument cancellable: Unresolved + type: 'GCancellable*' + + https://bugs.freedesktop.org/show_bug.cgi?id=56218 + + glib/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 11a1f6f512a7d7b86defeb5963fa16bc08e3ba1c +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Oct 20 09:30:05 2012 +0200 + + glib: Show all suppressed introspection scanner warnings + + https://bugs.freedesktop.org/show_bug.cgi?id=56218 + + glib/Makefile.am | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 16812829a7d4816717731318b1aa1bc3ab5e3935 +Author: Jason Crain <jason@aquaticape.us> +Date: Mon Aug 27 22:42:11 2012 -0500 + + Update fill and stroke color in CairoOutputDev::startPage + + Keep fill_color and stroke_color from falling out of sync with + fill_pattern and stroke_pattern. + + https://bugs.freedesktop.org/show_bug.cgi?id=54526 + + glib/poppler-page.cc | 2 +- + poppler/CairoOutputDev.cc | 2 ++ + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit c93702bea0718d67660f2255344dcf9b0f502d57 +Author: José Aliste <jaliste@src.gnome.org> +Date: Tue Nov 20 11:25:41 2012 +0100 + + glib: Ensure text is only computed on first render + + Getting the text on a page could be quite slow on + complex pages without structured text. Before this patch, + poppler_page_render would reprocess the text each time + is called. + + glib/poppler-page.cc | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +commit b0297110c455eb18096268b59d6095d428380de5 +Author: Jason Crain <jason@aquaticape.us> +Date: Wed Nov 21 14:15:59 2012 -0600 + + glib: check if words end with spaces + + poppler_page_get_text_layout and poppler_page_get_text_attributes + assume that each word ends with a space or newline, causing them to + become mismatched from the text. This adds a check to + TextWord::getSpaceAfter. + + https://bugs.freedesktop.org/show_bug.cgi?id=54504 + + glib/poppler-page.cc | 62 + +++++++++++++++++++++++++++++----------------------- + 1 file changed, 35 insertions(+), 27 deletions(-) + +commit b1dacd1e6ab00eb1976491eb2b45c76671011b38 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 23 00:12:24 2012 +0100 + + 0.21.2 + + 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 2d2a3af7159945c3fd54f22878e2eb09e019bbc6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 23 00:06:39 2012 +0100 + + Update copyrights + + goo/TiffWriter.cc | 1 + + goo/TiffWriter.h | 1 + + poppler/CairoRescaleBox.cc | 1 + + poppler/CairoRescaleBox.h | 38 ++++++++++++++++++++++++++++++++++++++ + splash/SplashBitmap.cc | 2 +- + 5 files changed, 42 insertions(+), 1 deletion(-) + +commit e0d0177562ff546b59b3bc8eb68a08dc740d6f6c +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Nov 14 22:44:20 2012 +1030 + + cairo: Fix crash in CairoImageOutputDev with setSoftMaskFromImageMask + + Bug 57067 + + poppler/CairoOutputDev.cc | 46 + ++++++++++++++++++++++++++++++++++++++++++++++ + poppler/CairoOutputDev.h | 5 +++++ + 2 files changed, 51 insertions(+) + +commit f050717f986a6c2833876d14083363a540fa849a +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Nov 14 23:50:10 2012 +1030 + + cairo: fix soft mask when image resolution != smask resolution + + Both image and mask are drawn the same size (unit square) regardless + of the size of the image data. + + Bug 57070 + + poppler/CairoOutputDev.cc | 12 +++--------- + 1 file changed, 3 insertions(+), 9 deletions(-) + +commit 87fd5275514b63f13622b79a8fcfe443ccc4f45d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Nov 11 18:53:12 2012 +1030 + + cairo: make drawImage work with images > 32767 in width/height + + Cairo images are limited to 32767 in width and height due to the + 16.16 format used by pixman. Make drawImage work with large images + by scaling down the image before a cairo image is created. + + CairoRescaleBox.cc has been turned into a class with a virtual + function to get the next row of the source image. This allows the + rescale code to access the source data one row at a time to avoid + needing to allocate an image the size of the source image. + + A RescaleDrawImage class derived from CairoRescaleBox has been + written to create the cairo source image to be used by drawImage. The + code from drawImage that created the cairo source image has been moved + into RescaleDrawImage::getSourceImage and RescaleDrawImage::getRow. + + Bug 56858 + + poppler/CairoOutputDev.cc | 278 + ++++++++++++++++++++++++--------------------- + poppler/CairoRescaleBox.cc | 177 +++++++++++++++-------------- + poppler/CairoRescaleBox.h | 21 +++- + 3 files changed, 258 insertions(+), 218 deletions(-) + +commit d1c509c48fc422649d0c2c2d70af5e13e3472874 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 17 10:04:55 2012 +1030 + + pdftocairo: add tiff support + + Bug 57006 + + utils/pdftocairo.1 | 23 ++++++++------ + utils/pdftocairo.cc | 88 + +++++++++++++++++++++++++++++++++++++++++------------ + 2 files changed, 83 insertions(+), 28 deletions(-) + +commit 6d3fe48cf30b298b4436462904d781ea441c1f3d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Nov 17 10:03:22 2012 +1030 + + tiff: remove splash dependency and add RGBA support + + Bug 57006 + + goo/TiffWriter.cc | 47 + +++++++++++++++++++---------------------------- + goo/TiffWriter.h | 13 ++++++++++--- + splash/SplashBitmap.cc | 23 +++++++++++++++++++++-- + 3 files changed, 50 insertions(+), 33 deletions(-) + +commit 15f600a5702788f7e5b91cd67bc2438179921939 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Nov 15 22:17:27 2012 +0100 + + Don't do a check for sanity that then we don't use + + Fixes bugs 56753 and 51684 + + fofi/FoFiTrueType.cc | 26 -------------------------- + 1 file changed, 26 deletions(-) + +commit c7e3c2d7087e4fc36564ba7bd55e27e100e0a5e5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Nov 14 14:58:45 2012 +0100 + + Remove unused code + + fofi/FoFiTrueType.cc | 658 + ------------------------------------------- + fofi/FoFiTrueType.h | 11 +- + splash/SplashFTFontEngine.cc | 42 +-- + 3 files changed, 2 insertions(+), 709 deletions(-) + +commit 06951f529e6514a0c26d6d821ab5fab0920a7cf3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 13 23:37:22 2012 +0100 + + Simplify >= 0 ifs for unsigned + + cpp/poppler-global.cpp | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +commit fa813adc3f7b7ee3cc819f1e0cb85e01f13c2c01 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 13 23:37:01 2012 +0100 + + Remove < 0 ifs for unsigned + + splash/SplashFTFont.cc | 8 -------- + 1 file changed, 8 deletions(-) + +commit 1969bcd693289eba1138fcaa74a684cb3ff2aefc +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 13 23:36:40 2012 +0100 + + Remove unused members + + poppler/Gfx.cc | 3 --- + poppler/Gfx.h | 5 +---- + 2 files changed, 1 insertion(+), 7 deletions(-) + +commit 3a6e5ed5e28b6113696a7ae60b0b85d7097eb731 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 13 23:35:53 2012 +0100 + + Remove >= 0 checks for unsigned variables + + utils/HtmlFonts.cc | 6 +++--- + utils/HtmlFonts.h | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +commit 0dcc2d711810dd64aa8d8721ce53a6b72e12c47c +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 13 23:35:10 2012 +0100 + + Remove unused var + + utils/pdfinfo.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1fc97862d30bf723135310bfc8701e6788bfd284 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 13 23:24:19 2012 +0100 + + size can't be smaller than 0 because it's a size_t + + goo/gmem.cc | 22 +--------------------- + 1 file changed, 1 insertion(+), 21 deletions(-) + +commit bb801a9b889bc0e62cf8b853c26cc6636b4af9a1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Nov 13 22:51:17 2012 +0100 + + Removed unused var + + utils/pdfinfo.cc | 1 - + 1 file changed, 1 deletion(-) + +commit fd651fb49653e89d96b032e010a7d8e891536bb0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Nov 12 00:42:49 2012 +0100 + + Parse the args (so that -v says vesion only) + + Fixes bug #56817 + + utils/pdfunite.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit 7e2e9567f51d01be9a88848e1141c6d4f0f768a1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 9 20:02:25 2012 +0100 + + 0.21.1 + + CMakeLists.txt | 4 ++-- + NEWS | 14 ++++++++++++++ + 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, 22 insertions(+), 8 deletions(-) + +commit 98b7cfd289abb53a745a88d6ec99e95df477fc8f +Merge: 40efa72 d254174 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Nov 9 00:38:19 2012 +0100 + + Merge remote-tracking branch 'origin/poppler-0.20' + + Conflicts: + poppler/Form.cc + +commit 40efa72987ebf62cbf2c761c10a209e2e6be612e +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sun Nov 4 11:20:29 2012 +0100 + + Replaced forward declaration of enum CryptAlgorithm with a proper + #include + + Forward-declaring enums is illegal. It hasn't caused problems so far + because XRef.h includes Object.h, which in turn includes Stream.h, + where + the enum is defined. + Therefore, enum is alreadly defined when the compiler reaches + that line. + + To avoid future issues, I've replaced it with a proper #include + "Stream.h" + (which expands to nothing as Stream.h has already been included + at that + point). + + I've also added a #include in XRef.h because it references enum + CryptAlgorithm too. Also in this case, it expands to nothing. + + poppler/PDFDoc.h | 2 +- + poppler/XRef.h | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +commit 0f7c17d7f92d4cdfbd8816dba666aeed924d8bc2 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Fri Nov 2 10:54:17 2012 +0100 + + qt4: Export information about the document form type + + This patch also wraps the code that checks the form type and moves it + from pdfinfo to the Catalog class. + + poppler/Catalog.cc | 19 +++++++++++++++++++ + poppler/Catalog.h | 9 +++++++++ + qt4/src/poppler-document.cc | 16 ++++++++++++++++ + qt4/src/poppler-qt4.h | 18 ++++++++++++++++++ + utils/pdfinfo.cc | 19 ++++++++++--------- + 5 files changed, 72 insertions(+), 9 deletions(-) + +commit f3f5a166bcd16b6f2cb516cceb2b3f41b6faf0b4 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Fri Nov 2 01:53:24 2012 +0100 + + Editable FormFieldChoice: Clear editedChoice when one of the + predefined option is selected + + This patch clears the user-entered text when the user interacts with + predefined options. + + poppler/Form.cc | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +commit ddcd5dc0ceecc02f0d4f740cb6c9b557dfd33c74 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Nov 1 00:58:51 2012 +0100 + + FormFieldChoice ctor: Added support to recognize user strings as + /V value + + Fixes + http://lists.freedesktop.org/archives/poppler/2012-October/009688.html + + poppler/Form.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit 1302bf52bba7e6446f01358240a4b5b583e196a9 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Oct 31 19:56:37 2012 +0100 + + FormFieldChoice ctor: Stop scanning if /V is a string and the + corresponding option has been identified + + poppler/Form.cc | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +commit d254174e08146115ad04ac1f1bf82bb26e56c684 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Oct 31 16:57:56 2012 +0100 + + FormFieldChoice::updateSelection: Fixed wrong loop condition + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 401de95f5ab42ab0f5d8fd92d76b5def50f84a2b +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Oct 31 19:43:51 2012 +0100 + + FormFieldChoice ctor: Look for selected options in /I instead of /V + if /I is available + + Since /I stores the indices of the selected options, it can + distinguish + duplicate option (i.e. options with the same name/export value). + + poppler/Form.cc | 71 + ++++++++++++++++++++++++++++++++++----------------------- + 1 file changed, 42 insertions(+), 29 deletions(-) + +commit cfd3a46a857100cb634e18192b762e7342165348 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Oct 31 15:44:32 2012 +0100 + + FormFieldChoice: Handle /V values containing the export value instead + of the option name + + According to the PDF spec, /V should always contain an "option + name" and + never an "export value" if /Opt is an array of couples. However, it + seems that acroread works the other way round: it is able to identify + selected options only if they are referred by their export value + instead of the option name. + With this patch, we mimic this behavior. + + poppler/Form.cc | 49 ++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 34 insertions(+), 15 deletions(-) + +commit ce99940bcac0447f32ee2ad46efb09af93989c12 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Oct 13 00:13:33 2012 +0200 + + FormFieldChoice::updateSelection: Write /I too + + This improves handling of choice fields containing two or more entries + with the same name, and also makes sure that the previous value of /I + gets updated (failing to update it results in acroread still showing + the old selection). + + poppler/Form.cc | 50 ++++++++++++++++++++++++++++++++++++-------------- + 1 file changed, 36 insertions(+), 14 deletions(-) + +commit 102553e2104a1b223c8ac924aa6702829adebbdb +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Oct 31 16:57:56 2012 +0100 + + FormFieldChoice::updateSelection: Fixed wrong loop condition + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit d7522ea1d2e66beef64f705e8986142f15fcf613 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Oct 31 15:26:37 2012 +0100 + + FormFieldChoice ctor: Don't convert "human-readable" option names + to unicode + + Despite that comment, they're not meant to be read by humans only, + but they + are also used as option identifiers. + + This patch stops poppler from forcing them to be unicode. Instead, + they now stay the same encoding as their corresponding /Opt entry. + + This fixes poppler not being able to recognize selected entries + in documents produced by poppler itself: previously, the /V value was + always written in Unicode encoding, and therefore it was very + often not + binary-equal to the corresponding /Opt entry. + Now the /V value is always binary-equal to the corresponding /Opt + entry. + + poppler/Form.cc | 16 +--------------- + 1 file changed, 1 insertion(+), 15 deletions(-) + +commit da08ebeee241198907378c6461721fddb5106875 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sun Oct 28 12:13:22 2012 +1030 + + Don't allow invalid unicode to be passed to backends + + poppler/CharCodeToUnicode.cc | 11 +++++++++-- + poppler/UTF.cc | 11 +++++++++++ + poppler/UTF.h | 4 ++++ + 3 files changed, 24 insertions(+), 2 deletions(-) + +commit 9f92feda5eff9b2542c64349f33ae3cf250e7f4b +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Nov 2 23:05:55 2012 +0100 + + Memory leak in CharCodeToUnicode + + Bug #54702 + + poppler/CharCodeToUnicode.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit ef11b4f0e642dff0be02bf3327eb56bf0b364847 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Fri Nov 2 22:44:27 2012 +0100 + + Implement overprint in qt interface + + With minor api fixes by me (Albert Astals Cid) + + qt4/src/poppler-document.cc | 23 ++++++++++++--- + qt4/src/poppler-page.cc | 38 +++++++++++++----------- + qt4/src/poppler-private.h | 69 + ++++++++++++++++++++++++++++---------------- + qt4/src/poppler-qt4.h | 11 ++++++- + splash/SplashBitmap.cc | 70 + +++++++++++++++++++++++++++++++++++++++++++++ + splash/SplashBitmap.h | 5 +++- + 6 files changed, 169 insertions(+), 47 deletions(-) + +commit ae8fc0cbfc6123189e17b3cf1286e0540f181646 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Oct 30 21:22:04 2012 +1030 + + cairo: support parameterized Gouraud shading + + Bug 56463 + + poppler/CairoOutputDev.cc | 19 +++++++++++++++---- + 1 file changed, 15 insertions(+), 4 deletions(-) + +commit 3be4e835d765f2f060e2a2e07dd23905c3212cdd +Author: Pino Toscano <pino@kde.org> +Date: Wed Oct 24 18:37:06 2012 +0200 + + dos2unix + + utils/pdftoppm.cc | 876 + +++++++++++++++++++++++++++--------------------------- + 1 file changed, 438 insertions(+), 438 deletions(-) + +commit 77a980472e76b568346a49057b0217111a14a4cd +Merge: 74d6217 46fb365 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Oct 23 00:23:53 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit 46fb3653c7ae44c34d12d799df8f70d649eaa995 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Oct 23 00:22:55 2012 +0200 + + Fix the or-ing of flags + + qt4/src/poppler-document.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 74d6217ba164fdfe263b4edac8047b60506e39a6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 21 17:48:57 2012 +0200 + + regstest: Add print_test_result_ln() and use it for failed test + results + + To make sure they are always shown. + + regtest/Printer.py | 3 +++ + regtest/TestRun.py | 10 +++++----- + 2 files changed, 8 insertions(+), 5 deletions(-) + +commit 4e9b8d2cca44241a501bb8095b3980d17fcda6c5 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Oct 21 17:48:22 2012 +0200 + + regtest: Do not rewrite lines in verbose mode + + regtest/Printer.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2a25264afe3c59931f6a3638e2d6c6c2e0e5dfba +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 19 17:22:56 2012 +0200 + + make static + + because i can + + qt4/tests/check_fonts.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit bc4a54c0a4430216c9aeaf2c3bddbaeef5a004e4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 19 17:22:13 2012 +0200 + + Compile with clang + + qt4/tests/check_fonts.cpp | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +commit f38194cfae8f8690bc3767cbdcf140519564366c +Merge: 80cf434 5312984 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 19 00:02:02 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit 5312984b40355b067001704e9c688ea0a72b1159 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Oct 19 00:00:53 2012 +0200 + + Define the numbers a bit better so gcc in i386 understands them better + + qt4/tests/check_lexer.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 80cf43472e5913f5f64bf73cb4a8ac5a53063f2e +Author: Adam Reichold <adamreichold@myopera.com> +Date: Wed Oct 17 08:27:13 2012 +0200 + + added accessors for FormWidgetChoice::editChoice property to qt4 + frontend + + qt4/src/poppler-form.cc | 23 +++++++++++++++++++++++ + qt4/src/poppler-form.h | 15 +++++++++++++++ + 2 files changed, 38 insertions(+) + +commit 0b3ff2dc4e1ba37dd66f5913b10a9d69e31c40ce +Merge: fb5cb0f 528b64b +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 17 00:28:40 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + + Conflicts: + CMakeLists.txt + NEWS + configure.ac + cpp/Doxyfile + poppler/Annot.cc + poppler/Form.h + qt4/src/Doxyfile + +commit 528b64bb077ed37c0d8fc7ae2ef3dc2c0dbb26ca +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Tue Sep 4 23:10:17 2012 +0200 + + Free entries in the xref form a linked list: terminate it properly + when writing the XRef + + The last entry must point back to object 0. Previously it was left + unitialized and resulted in "-000000001 00000 f" being written in the + XRef table. + + poppler/XRef.cc | 1 + + 1 file changed, 1 insertion(+) + +commit fb5cb0fbdfcd06556661b38b0c598922fff2d759 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Oct 4 11:20:42 2012 +0200 + + Create the 24x24 rectangle for text annotation icons from the top-left + corner instead of bottom-left + + poppler/Annot.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 35c07fe40d7b18e19f6ef0f5615f9f5ac8195cf7 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Tue Oct 9 15:24:02 2012 +0200 + + AnnotWidget: Avoid repeatedly deleting and creating xref entries + for appearance streams + + Previously updating the appearance stream always involved deleting + the old + stream's xref entry and creating a new one. + Since xref entry deletion causes the generation number to be + incremented, this + behavior caused the generation number to quickly rise during user + input. + + This patch stops it by reusing the same entry as the old appearance + stream in + case of repeated modifications. + + poppler/Annot.cc | 40 ++++++++++++++++++++++++++++------------ + poppler/Annot.h | 1 + + 2 files changed, 29 insertions(+), 12 deletions(-) + +commit 2127a977bbe9985aa58561116508ad4f08430a2c +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Tue Oct 9 12:49:26 2012 +0200 + + Generate and write the appearance stream in + AnnotWidget::updateWidgetApperance() + + Note: At the moment the old appearance is deleted and a *new* xref + entry is + created every time AnnotWidget::updateWidgetApperance() is called. + + poppler/Annot.cc | 30 +++++++++++++++++++++++++----- + 1 file changed, 25 insertions(+), 5 deletions(-) + +commit 0446e2cc1073f4579a90284d28bc5872e46e0536 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Tue Oct 9 10:47:40 2012 +0200 + + Killed FormField::isModified() in favor of a new AnnotWidget callback + + Instead of having to ask FormField from AnnotWidget::draw if the + widget's appearance needs to be rebuilt, now AnnotWidget gets notified + of changes via the new AnnotWidget::updateAppearanceStream() callback. + + poppler/Annot.cc | 16 ++++++++++------ + poppler/Annot.h | 1 + + poppler/Form.cc | 52 + ++++++++++++++++++++++++++++++++++++++-------------- + poppler/Form.h | 12 +++++++++--- + 4 files changed, 58 insertions(+), 23 deletions(-) + +commit 68d732ab2d55ae15e194ececfffa753977fae84c +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Tue Oct 9 15:24:02 2012 +0200 + + AnnotWidget: Avoid repeatedly deleting and creating xref entries + for appearance streams + + Previously updating the appearance stream always involved deleting + the old + stream's xref entry and creating a new one. + Since xref entry deletion causes the generation number to be + incremented, this + behavior caused the generation number to quickly rise during user + input. + + This patch stops it by reusing the same entry as the old appearance + stream in + case of repeated modifications. + + poppler/Annot.cc | 40 ++++++++++++++++++++++++++++------------ + poppler/Annot.h | 1 + + 2 files changed, 29 insertions(+), 12 deletions(-) + +commit e2993cc9551dc7521528904646f941c9747473f7 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Tue Oct 9 12:49:26 2012 +0200 + + Generate and write the appearance stream in + AnnotWidget::updateWidgetApperance() + + Note: At the moment the old appearance is deleted and a *new* xref + entry is + created every time AnnotWidget::updateWidgetApperance() is called. + + poppler/Annot.cc | 30 +++++++++++++++++++++++++----- + 1 file changed, 25 insertions(+), 5 deletions(-) + +commit df924493922e8c0f7b1e19c2847d33b28a098913 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Tue Oct 9 10:47:40 2012 +0200 + + Killed FormField::isModified() in favor of a new AnnotWidget callback + + Instead of having to ask FormField from AnnotWidget::draw if the + widget's appearance needs to be rebuilt, now AnnotWidget gets notified + of changes via the new AnnotWidget::updateAppearanceStream() callback. + + poppler/Annot.cc | 16 ++++++++++------ + poppler/Annot.h | 1 + + poppler/Form.cc | 52 + ++++++++++++++++++++++++++++++++++++++-------------- + poppler/Form.h | 12 +++++++++--- + 4 files changed, 58 insertions(+), 23 deletions(-) + +commit 0a5bda01ace9f8576d687c5a28feb5cf09b48a92 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Oct 14 23:05:27 2012 +0200 + + New/old header for cmake buildsystem + + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 6d46f0b477143eb0df09f718e96dd2ff2a7dd61b +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Sep 22 20:50:07 2012 +0200 + + Split our UTF.h into xpdf based UTF8.h and a poppler specific UTF.h + + poppler/GlobalParams.cc | 2 +- + poppler/Makefile.am | 1 + + poppler/UTF.h | 79 + +--------------------------------------------- + poppler/UTF8.h | 84 + +++++++++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 87 insertions(+), 79 deletions(-) + +commit 03cbba935c90ce9a6d9ad44f7cda4901c2f81f2e +Author: Hib Eris <hib@hiberis.nl> +Date: Sat Sep 22 19:58:40 2012 +0200 + + Do not use mapUTF8() directly in CairoOutputDev + + poppler/CairoOutputDev.cc | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit f219bdbcadcb0334d595bbd9afd01f00c37d1978 +Author: Hib Eris <hib@hiberis.nl> +Date: Sun Oct 14 22:59:55 2012 +0200 + + Make sure array index is >= 0 + + Fixes this warning on array subscript type: + UTF.cc: In function 'int TextStringToUCS4(GooString*, Unicode**)': + UTF.cc:99:33: warning: array subscript has type 'char' + [-Wchar-subscripts] + + poppler/UTF.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 65a2555607e03c94d77ae9ebdb34ab6d4f8844b6 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Fri Oct 12 23:54:57 2012 +0200 + + FormFieldChoice ctor: Fixed wrong index variable + + It caused a crash if multiple items are initially selected. + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 710bb3383306a9aa6debbfe1364029ee12a15576 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Fri Oct 12 23:54:57 2012 +0200 + + FormFieldChoice ctor: Fixed wrong index variable + + It caused a crash if multiple items are initially selected. + + poppler/Form.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit ce18c9b3d5251305eb76d294fdf4b4de9382b3a4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 10 19:54:57 2012 +0200 + + 0.20.5 + + CMakeLists.txt | 2 +- + NEWS | 15 +++++++++++++++ + configure.ac | 2 +- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 5 files changed, 19 insertions(+), 4 deletions(-) + +commit b112602334a5de84ae30c2e90d9bc6d4609f7f96 +Author: Tobias Koening <tobias.koenig@kdab.com> +Date: Mon Oct 8 22:32:34 2012 +0200 + + [qt4] make LinkRendition properties available + + Bug #55378 + + poppler/Link.cc | 34 +++++++++++++++++++----- + poppler/Link.h | 17 +++++++++--- + qt4/src/poppler-annotation.cc | 2 -- + qt4/src/poppler-annotation.h | 1 + + qt4/src/poppler-link.cc | 60 + ++++++++++++++++++++++++++++++++++++++++--- + qt4/src/poppler-link.h | 57 + +++++++++++++++++++++++++++++++++++++--- + qt4/src/poppler-page.cc | 8 +++++- + 7 files changed, 158 insertions(+), 21 deletions(-) + +commit 6d6bd660dbb652f2f3e87c81c55a87d1fc11ec70 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Oct 6 10:26:55 2012 +0200 + + glib: chain up finalize to the parent class + + This was missing in some of the classes. + + https://bugs.freedesktop.org/show_bug.cgi?id=55521 + + glib/poppler-document.cc | 6 ++++++ + glib/poppler-page.cc | 2 ++ + 2 files changed, 8 insertions(+) + +commit ac3875a9e7f2f4f31881d3d1b3081f2adaef65a1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Oct 6 10:26:55 2012 +0200 + + glib: chain up finalize to the parent class + + This was missing in some of the classes. + + https://bugs.freedesktop.org/show_bug.cgi?id=55521 + + glib/poppler-document.cc | 6 ++++++ + glib/poppler-page.cc | 2 ++ + 2 files changed, 8 insertions(+) + +commit 042d332c1c9f628e3bfaabf3da9e04436a8677b5 +Merge: 7b9a9f8 e044814 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Oct 4 00:53:01 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit e044814c0657a6c5b44939a01dcbdc8d83396d43 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Thu Oct 4 00:51:04 2012 +0200 + + Do not render invalid outlines + + Bug #55573 + + splash/SplashFTFont.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +commit 7b9a9f809d07303fe5adff9210731613df8b2adf +Merge: 3b0962c 9451b7a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 3 01:24:04 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit 9451b7a61b6dcaa6c4a76f3efda82f1ebd408654 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Oct 3 01:21:45 2012 +0200 + + Fix crash when parsing some unknown colorspaces + + Can't do csObj->getName if csObj is a dict + + poppler/GfxState.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 3b0962cd14b15ce92c0916f58ed5ba00aebe80b0 +Merge: a9d7ea2 42908e6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Oct 2 19:51:48 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit 42908e6e72d95cec0f70b202c4b1c23f7e47c2a4 +Author: Lu Wang <coolwanglu@gmail.com> +Date: Tue Oct 2 19:31:04 2012 +0200 + + support automake-1.12 in autogen.sh + + Bug #55541 + + autogen.sh | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +commit a9d7ea2eb549acbf6ca7e2a299ffed46ff3d8758 +Merge: 397d7b4 9bb6845 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 26 15:31:29 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + + Conflicts: + poppler/XRef.cc + +commit 9bb68456de41d24db7acf61204bc3f4e36e98505 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 26 15:13:47 2012 +0200 + + Initilize rootNum + + Fixes valgrind warnings about uninitialized uses + + poppler/XRef.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 397d7b4597ad4bc8ab41fd7a99078473a3c93eb0 +Merge: 6013d49 2c0f70a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 26 15:00:04 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit 2c0f70afff03798165c2b609e115dc7e9c034c57 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Sep 26 14:58:05 2012 +0200 + + More crash fixes for broken documents + + poppler/JPXStream.cc | 97 + ++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 82 insertions(+), 15 deletions(-) + +commit 78558d24692c68212da35a88deb68069c5a06d81 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Sep 26 14:32:05 2012 +0200 + + Fix more crashes in broken files + + solves 1258.pdf.SIGSEGV.dee.288 and 1255.pdf.asan.38.285, extends + 1043.pdf.asan.47.50 and 557.pdf.asan.47.894 + + poppler/GfxState.cc | 26 +++++++++++++++++++++++--- + 1 file changed, 23 insertions(+), 3 deletions(-) + +commit e8822c0f3a46195ec7c6e55c556dd0c5716be742 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 26 14:21:46 2012 +0200 + + Add unlikelys + + poppler/Stream.cc | 32 ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +commit 31874f2e065b0d68f726ef404de98f42489c80c7 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Sep 26 14:17:00 2012 +0200 + + Less crashes in broken files + + rebased patch for 1001.pdf.asan.2a.4, extends patch for + 100.pdf.asan.38.2 + + poppler/Stream.cc | 100 + ++++++++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 98 insertions(+), 2 deletions(-) + +commit 81b1d9207840ec1e66eef469b29a36a8556b7265 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 26 13:38:54 2012 +0200 + + Add some unlikelys + + poppler/JBIG2Stream.cc | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +commit 9ae1184e3049cabc695c8645a10eaef748b6e641 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Sep 26 12:32:26 2012 +0200 + + More fixes against broken files + + solves 121.pdf.asan.6f.235, extends 682.pdf.SIGFPE.f3.1033 and + 569.pdf.SIGSEGV.c1.907, extends Patch for 829. and 839. asan and + sigsegv series + + poppler/JBIG2Stream.cc | 105 + +++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 93 insertions(+), 12 deletions(-) + +commit 1d72c14b3877ae730ac0aa92f36923269e8a2004 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Sep 26 11:48:14 2012 +0200 + + Fix crash in 158.pdf.asan.d.451 + + poppler/SplashOutputDev.cc | 8 ++++++++ + 1 file changed, 8 insertions(+) + +commit 6013d49d852c58c4c23f787fd7dd64731c0918f1 +Merge: b97c28c 671df5d +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 26 00:53:28 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit 671df5dad0732882ceb9e053c3f947dfe0597f3d +Author: Lu Wang <coolwanglu@gmail.com> +Date: Wed Sep 26 00:52:32 2012 +0200 + + Don't close the stream if it's not a stream + + poppler/PSOutputDev.cc | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +commit b97c28c42a18d1c2a8fabea52c092d948811d582 +Merge: 32bb874 f8c116f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 25 23:22:23 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + + Conflicts: + qt4/src/Makefile.am + +commit f8c116f1e0fbf3516ce228fbb34c33d6b618bed0 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 25 23:07:55 2012 +0200 + + Add LCMS_FLAGS + + Fixes compilation when lcms is on non standard locations + Bug #55326 + + qt4/src/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 32bb87419c360a3b14c717c0f385198b70a1b2e7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Sep 23 18:15:13 2012 +0200 + + regtest: Reduce the noise of the default output when running tests + + Show permanent information only about failed tests, without the + details + about the failing pages. Previous verbose output is available passing + --verbose command line output. + + regtest/Printer.py | 96 + +++++++++++++++++++++++++++++++++++++ + regtest/TestReferences.py | 8 ++-- + regtest/TestRun.py | 35 +++++++------- + regtest/backends/__init__.py | 13 +++-- + regtest/commands/create-refs.py | 3 +- + regtest/commands/find-regression.py | 5 +- + regtest/commands/run-tests.py | 3 +- + regtest/main.py | 3 ++ + 8 files changed, 137 insertions(+), 29 deletions(-) + +commit ca6afce24aac2ef9d88e215177b11760f7468a6d +Author: Lu Wang <coolwanglu@gmail.com> +Date: Fri Sep 21 21:33:05 2012 +0200 + + Do not call drawing routines if we don't need non text + + Bug #54617 + + poppler/Gfx.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 70030b91ce2280f23c3e5adf863f1d336c9c5faf +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 21 08:18:29 2012 +0200 + + 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 2323e38f1a54cb58ec31b4cf15e6c2b1db742ca5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 21 08:12:52 2012 +0200 + + Version increase + + CMakeLists.txt | 4 ++-- + configure.ac | 4 ++-- + cpp/Doxyfile | 2 +- + qt4/src/Doxyfile | 2 +- + 4 files changed, 6 insertions(+), 6 deletions(-) + +commit 11a9a620276d199701be5811eb63687ace85ace1 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 21 08:10:15 2012 +0200 + + Drop the s from AdditionalActionsType + + qt4/src/poppler-annotation-private.h | 5 +++-- + qt4/src/poppler-annotation.cc | 6 +++--- + qt4/src/poppler-annotation.h | 6 +++--- + 3 files changed, 9 insertions(+), 8 deletions(-) + +commit 028e0e7ddf8c30d311feb937385ef21acd34a52d +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 20 18:13:08 2012 +0200 + + 0.21.0 news + + NEWS | 39 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 39 insertions(+) + +commit 2f2d053352e04e434d83dd93dfdbd08ab5b23f2e +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 20 18:12:57 2012 +0200 + + Update copyrights + + poppler/Annot.cc | 3 ++- + poppler/Annot.h | 1 + + poppler/TextOutputDev.cc | 2 +- + poppler/UTF.h | 1 + + 4 files changed, 5 insertions(+), 2 deletions(-) + +commit 9fad83913791478b63fc76360f1a13e955cdcf4a +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 17 23:15:10 2012 +0200 + + Move to init + + poppler/XRef.cc | 11 +++-------- + 1 file changed, 3 insertions(+), 8 deletions(-) + +commit c470a3929c0a02b8a543fcada22138ab1fc18176 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Mon Sep 17 23:13:48 2012 +0200 + + Support encrypted pdf files in pdfseparate + + poppler/PDFDoc.cc | 35 ++++++++++++++++++++++++++++++++--- + poppler/XRef.cc | 15 +++++++++++++++ + poppler/XRef.h | 2 ++ + utils/pdfseparate.cc | 4 ---- + 4 files changed, 49 insertions(+), 7 deletions(-) + +commit 9b613dcf3c77bc2801d1125dc9bbc5a4dd04e16b +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 17 23:12:43 2012 +0200 + + Compile + + goo/TiffWriter.cc | 5 +++++ + 1 file changed, 5 insertions(+) + +commit fb5c383bd5be7090fc78380b4bb3244c3316c0cd +Author: William Bader <williambader@hotmail.com> +Date: Mon Sep 17 00:03:49 2012 +0200 + + Make pdftoppm -tiff -overprint work + + Bug #54896 + + goo/TiffWriter.cc | 13 ++++++++++++- + goo/TiffWriter.h | 4 +++- + 2 files changed, 15 insertions(+), 2 deletions(-) + +commit 3794916572a0531b10ee57c9f189497489b90bc8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 16 17:53:47 2012 +0200 + + Fix the siblings field correctly + + Fixes KDE bug #302334 + + poppler/Form.cc | 45 + +++++++++++++++++++++++++-------------------- + poppler/Form.h | 24 +++++++++++++----------- + qt4/src/poppler-form.cc | 13 ++++++++++--- + 3 files changed, 48 insertions(+), 34 deletions(-) + +commit e8b6d2ac3a874dd5de166b52625fa628004ea5fe +Merge: 7cb4072 9f51baa +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 16 14:08:34 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit 9f51baaf7a86680f2195ecdb978f1eb59a8aa734 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 16 14:07:45 2012 +0200 + + Rework the #ifdef so that i don't get a gcc warning + + poppler/strtok_r.cpp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit b63049f97629a93ec346033e0ec56fc11f34c4fe +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 16 14:05:01 2012 +0200 + + Forgot to add the new test to autotools + + qt4/tests/Makefile.am | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +commit 7cb40726f9e80ee2b2f27ca6ce151b46c6ec091d +Merge: e980d11 c6d7084 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 16 13:50:19 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit c6d7084d316e94b5b042b086f5440f8543ff5947 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 16 13:48:51 2012 +0200 + + Fix parsing of numbers + + -2147483648 is an integer + -2147483649 is a real + + poppler/Lexer.cc | 14 +++++- + qt4/tests/CMakeLists.txt | 1 + + qt4/tests/check_lexer.cpp | 118 + ++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 131 insertions(+), 2 deletions(-) + +commit e980d11061c19f13c75f93506e07903b4d1c7f97 +Merge: b72c02d 3658088 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 15 20:41:50 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit 365808837080574080b4f8da079124c172fb2123 +Author: Alexey Pavlov <alexpux@gmail.com> +Date: Sat Sep 15 20:38:10 2012 +0200 + + Fix build using mingw64 with winpthread + + strtok_r in winpthread is declared as a macro, that is why + the error happens. Therefore, it is necessary to check whether + the macro + __WINPTHREADS_VERSION is declared. + + Bug #54851 + + poppler/poppler-config.h.cmake | 2 +- + poppler/poppler-config.h.in | 2 +- + poppler/strtok_r.cpp | 16 +++++++++++++++- + 3 files changed, 17 insertions(+), 3 deletions(-) + +commit b72c02d1a2ec8180b3ddfd2bb2b462c0189377d5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 13 19:56:45 2012 +0200 + + Remove the fonts loop + + sometimes it's very slow and doesn't really add much + + qt4/tests/test-poppler-qt4.cpp | 4 ---- + 1 file changed, 4 deletions(-) + +commit cb93d51ccb6b1f6938946ae5d38fb9817005fd7a +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 12 00:12:07 2012 +0200 + + Make gcc happy + + It is stupid and can't see that we only use them when we init them + and complains + they might be used un-initialized + + poppler/TextOutputDev.cc | 1 + + 1 file changed, 1 insertion(+) + +commit 3349a8dd7e0469cc5b5aaa8dd929c6078183ef86 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Wed Sep 12 00:04:45 2012 +0200 + + Splash: Avoid bogus memory error for tilingPattern + + just return gFalse if the resulting + tiling pattern bitmap reaches a memory limit and so the Gfx + implemention of + tiling patterns will be used. I think that this is an acceptable + approach also + concerning performance, because it would take also a while to paint + such a huge + bitmap and then draw it to splash. + + poppler/SplashOutputDev.cc | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +commit 2e77799a1668f949612f551425d0665c59ff1d93 +Author: Thomas Freitag <Thomas.Freitag@alfa.de> +Date: Tue Sep 11 23:33:25 2012 +0200 + + Splash: Implement DeviceN support + + Bug #53140 + + Some copying from the bug tracker + + To explain + it a little bit more I copy a few lines from "Patch 8.01 — DeviceN + Support (6 + colors)" of the Ghent PDF workgroup: + "This patch tests the DeviceN capabilities of a workflow. If DeviceN + is not + handled correctly the colors are converted to CMYK. Instead of the + check marks + an X will appear in the lower left corner of each image and in + the gradient. + In addition you could inspect the color separations. The objects + should appear + only in the Black, Pantone 265C and GWG Green separations as indicated + in the + captions." + Without the patch all DeviceN colors are immediately converted to CMYK + (with + SPLASH_CMYK). This leads especially to problems, if overprint is + used: in + overprint mode a CMYK color will knockout the underlying CMYK + components, BUT + neither any spot colors. But if underlying spot colors are immediately + converted to CMYK colors, they will be kocked out then, too! + The patch now spends up to four (or up to SPOT_NCOMPS) additional + spot colors + in the splash bitmap, so the order in the bitmap will be + CMYKSTUVCMYKSTUVCMYKSTUV... where S, T, U, V are spot colors (I + would use + S1,S2, S3, S4 if it's possible to use indexes), and all painting + operations are + done now in this new device. Only at the end, when we want to store + the bitmap + in a CMYK or RGB color, the spot colors are converted and their + alternate CMYK + components are added to the normal CMYK components. + According to the PDF spec are PDF writer should use different spot + color names + if they have a different appearance in their alternate CMYK + colorspace. + "hasDifferntResultSet" (sorry for the typo) proofs that: if the same + spot color + name is reused BUT has a different appearance in the alternate + colorspace, it + will be converted immediately to its alternate colorspace. + "createMapping" is used so that getDeviceN (color) returns the + components in + the correct order according their appearance in the splash bitmap, + i.e. the + fourth detected spot color must be placed in index 7 of the color + array. + updateFill- and updateStrokeColorspace are needed to create this + mapping at the + appropriate place. And they are not called once but everytime the + colorspace + changed in the PDF (but of course only once in Gfx). + The GooList *getSeparationList() is used to store the functions + for converting + the spot colors to their alternate colorspace in order of their + appearance in + the splash bitmap. The functions are needed to compare if a spot + color with the + same name has really the same appearance and at the end when the + splash bitmap + has to be converted to a CMYK or RGB bitmap (s. ahead). + deviceNTransfer is needed simular to rgbTransferX or cmykTransferX + if a + transfer function is specified in the ExtGState and splash uses + the DeviceN8. + "Do we really need splashModeDeviceN8?": Do we really need + splashModeXBGR8? But + kidding aside: splashModeDeviceN8 needs four more components than + splashModeCMYK8, so the bitmap size in memory doubles the size of + a pure CMYK + bitmap, and it is only needed if the PDF uses spot colors. So I + think it's a + good idea to spend an additional mode and let it up to the calling + application + and the cirumstances if it wants to use this new mode or not. + + poppler/Function.cc | 14 + + poppler/Function.h | 4 + + poppler/GfxState.cc | 341 +++++++++++++++++- + poppler/GfxState.h | 41 ++- + poppler/SplashOutputDev.cc | 173 ++++++++- + poppler/SplashOutputDev.h | 3 + + splash/Splash.cc | 255 ++++++++++++- + splash/Splash.h | 7 +- + splash/SplashBitmap.cc | 115 +++++- + splash/SplashBitmap.h | 8 +- + splash/SplashState.cc | 30 +- + splash/SplashState.h | 3 + + splash/SplashTypes.h | 30 +- + utils/pdftoppm.cc | 878 + ++++++++++++++++++++++----------------------- + 14 files changed, 1415 insertions(+), 487 deletions(-) + +commit cb2ed646c4ef4161e443ee0a377d1111b3be28ff +Merge: f3a1b76 3ce4d21 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 11 19:29:19 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +commit f3a1b765bd6a58d327a80feedbe30e1c0792076e +Author: Jason Crain <jason@aquaticape.us> +Date: Tue Sep 11 19:28:28 2012 +0200 + + Allow multiple fonts in a TextWord + + Bug #6923 + + glib/poppler-page.cc | 49 ++++++----- + poppler/TextOutputDev.cc | 224 + ++++++++++++++++++++++------------------------- + poppler/TextOutputDev.h | 21 ++--- + 3 files changed, 145 insertions(+), 149 deletions(-) + +commit 3ce4d213480471dfd8e307c24c99bf3c6308cd6f +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 11 19:24:58 2012 +0200 + + Do not use isnan as it is C99 + + poppler/TextOutputDev.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 4d7a64a23fd4b4b5ee0d47ead8677f374aaaf6c9 +Author: Jason Crain <jason@aquaticape.us> +Date: Tue Sep 11 19:24:11 2012 +0200 + + Check for NaN in TextPage::addChar + + poppler/TextOutputDev.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit e79b70ec13ab4d2cce8f245d150fa9329b436658 +Author: Tobias Koenig <tokoe@kdab.com> +Date: Tue Sep 11 16:39:55 2012 +0200 + + Make 'additional actions' available in Annotation API of Qt4 frontend + + Bug #53589 + + qt4/src/poppler-annotation-private.h | 3 ++ + qt4/src/poppler-annotation.cc | 99 + +++++++++++++++++++++++++++++++++++- + qt4/src/poppler-annotation.h | 68 ++++++++++++++++++++++++- + 3 files changed, 168 insertions(+), 2 deletions(-) + +commit 5f338ea7d01cabc0f8c50690d0bc262d85baa0ed +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 10 19:47:20 2012 +0200 + + Fix typo + + NEWS | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +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 1b40cdd9f863cd3868db85b5ccfa77a8350c56d6 +Merge: 6c40a55 b3e86db +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 10 18:49:52 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +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 6c40a553a3c8825931c59797059392fd110531cc +Merge: 17fc1bf 558a7d9 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 9 23:27:40 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +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 17fc1bfa8013cafe3b348f0cc07ef08bf9c7dd9a +Merge: e0118be a4f5911 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 9 12:52:49 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + +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 e0118be3ba38bd00fa2a9c20c5b4cd82e820ba0b +Merge: 2c41430 ccd3db5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 8 18:15:43 2012 +0200 + + Merge remote-tracking branch 'origin/poppler-0.20' + + Conflicts: + glib/poppler-document.cc + poppler/PDFDoc.cc + poppler/XRef.h + utils/HtmlFonts.cc + +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 2c41430732f517d4d57e914a315ba315a2545541 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 6 22:12:38 2012 +0200 + + Add missing licenses + + goo/grandom.cc | 2 ++ + goo/grandom.h | 2 ++ + splash/SplashScreen.cc | 1 + + utils/pdfinfo.cc | 1 + + 4 files changed, 6 insertions(+) + +commit be88963a5955ac033e7a7d224bdcc4049085a9dc +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Aug 9 13:18:22 2012 +0200 + + pdf-fullrewrite: Added support for encrypted documents, checks on + output documents, incremental update mode + + test/CMakeLists.txt | 1 + + test/Makefile.am | 3 +- + test/pdf-fullrewrite.cc | 354 + ++++++++++++++++++++++++++++++++++++++++++++++-- + 3 files changed, 342 insertions(+), 16 deletions(-) + +commit 381be58e9e0d0e323acbd975a2334eca6d9018fd +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Aug 4 13:00:06 2012 +0200 + + pdfinfo: Show info about the encryption algorithm + + utils/pdfinfo.cc | 24 ++++++++++++++++++++++-- + 1 file changed, 22 insertions(+), 2 deletions(-) + +commit 273e8c896e95b548093159dc8bb14d48ce447053 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Aug 15 18:09:02 2012 +0200 + + Mark object streams as DontRewrite + + So that they don't get copied in full rewrite mode, because they're + not referenced from the XRef table we build, and we already + individually write each object they contain. + + poppler/XRef.cc | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +commit 59db8deaa7b1907831b526de3011dc22d0ffb333 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Aug 9 20:08:44 2012 +0200 + + Mark XRef streams as Unencrypted and DontRewrite + + - Unencrypted because they are stored in unencrypted form + - DontRewrite because they must not be copied in full rewrite mode, + because we always build a new XRef table, and existing XRef streams + are not referenced any more (ie they become "leaked" objects). + Furthermore, since readers know that XRef streams' objects are + unencrypted from the fact that they are XRef streams, but these + leaked objects are no longer referred as XRef streams, readers would + think that they are regularly encrypted objects, resulting in + currupt objects. + + poppler/PDFDoc.cc | 5 +++ + poppler/XRef.cc | 126 + +++++++++++++++++++++++++++++++++++------------------- + poppler/XRef.h | 9 ++-- + 3 files changed, 94 insertions(+), 46 deletions(-) + +commit 116722cc74e267ac44dd5a70924557cdf6f25d02 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Aug 4 12:47:22 2012 +0200 + + Encrypt strWeird streams before writing them in PDFDoc::writeObject + + poppler/Decrypt.cc | 9 ++++++++- + poppler/Decrypt.h | 2 ++ + poppler/PDFDoc.cc | 10 ++++++++++ + 3 files changed, 20 insertions(+), 1 deletion(-) + +commit 695889c1330ca5b37338b8363dbf233fce936bc6 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Aug 4 12:24:25 2012 +0200 + + Encrypt strings before writing them in PDFDoc::writeString + + poppler/PDFDoc.cc | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +commit 4ab8e7be536db40db8a1a4af50dad3ba59c49f14 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Aug 4 02:06:11 2012 +0200 + + Propagate encryption parameters to PDFDoc's write functions + + poppler/PDFDoc.cc | 54 + ++++++++++++++++++++++++++++++++++++------------------ + poppler/PDFDoc.h | 20 +++++++++++++------- + poppler/XRef.cc | 14 ++++++++++++++ + poppler/XRef.h | 2 ++ + utils/pdfunite.cc | 2 +- + 5 files changed, 66 insertions(+), 26 deletions(-) + +commit 9e43f9a8bcbee9060309b9679dbcc6b501a79cfb +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Aug 1 16:14:22 2012 +0200 + + Separated header and footer write commands from the rest of + PDFDoc::writeObject + + Because in next patch I'll need to pass the object's num and gen + always, + not only if the object's header and footer need to be written. + + poppler/PDFDoc.cc | 51 + +++++++++++++++++++++++++++++++++------------------ + poppler/PDFDoc.h | 11 +++++++---- + utils/pdfunite.cc | 2 +- + 3 files changed, 41 insertions(+), 23 deletions(-) + +commit 4d19a002801531b07f11382daaf9880e4691a10e +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Aug 4 01:36:06 2012 +0200 + + Do not change encrypted documents' ID, not even in case of full + rewrite + + Because we will raw-copy encrypted streams, and the ID is part of the + decryption key. + + poppler/PDFDoc.cc | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +commit 800b2e37d3c4c73147bf9e11d9f38afe2183ab9d +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed Aug 1 14:07:10 2012 +0200 + + Initial support for saving encrypted documents + + - Do not refuse to save encrypted documents + - Copy the /Encrypt value in the new document's trailer dictionary + - Mark indirect objects referred from /Encrypt as not encrypted + in XRef::scanSpecialFlags + + poppler/PDFDoc.cc | 49 ++++++++++++++++++------------------------- + poppler/XRef.cc | 62 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++- + poppler/XRef.h | 16 +++++++++++++- + 3 files changed, 96 insertions(+), 31 deletions(-) + +commit 6647153d47b1d67d2a4d6b90dce2184ab6c7dda6 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Aug 9 12:26:53 2012 +0200 + + Added field XRefEntry::flags, and turned XRefEntry::updated into + a flag + + In next patches I'll add other flags + + poppler/PDFDoc.cc | 4 ++-- + poppler/XRef.cc | 18 +++++++++--------- + poppler/XRef.h | 20 +++++++++++++++++++- + 3 files changed, 30 insertions(+), 12 deletions(-) + +commit a284c6c6623587abb7da7e4c171c42e006ea477b +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Aug 4 01:57:41 2012 +0200 + + Be able to output overflown integers back + + Because Lexer.cc:241 can read them, and we must be able to write them + back (especially in full rewrite mode). + + poppler/PDFDoc.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 53baea19658a27f15c7ed870a24be82b8219ddfe +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Sat Aug 4 01:32:08 2012 +0200 + + FlateStream::unfilteredReset should call str->unfilteredReset() + + Just like any other FilterStream-derived class does + + poppler/Stream.cc | 14 +++++++++++--- + poppler/Stream.h | 2 ++ + 2 files changed, 13 insertions(+), 3 deletions(-) + +commit 4e5fee4e9156480173f05e7b3d0bdf604127d481 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Mon Aug 6 02:08:27 2012 +0200 + + Initialize AES encryption with random CBC IV data + + poppler/Decrypt.cc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +commit 1b008f273359b8df6b64ffa94bb2828e42ffa63e +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Mon Aug 6 02:08:40 2012 +0200 + + Replaced srand/rand calls in SplashScreen with grandom calls + + splash/SplashScreen.cc | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +commit faff947d8106048b19ba74dd483b90b8cebb16c7 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Mon Aug 6 02:06:47 2012 +0200 + + Added goo/grandom.[cc|h] with POSIX implementation + + CMakeLists.txt | 2 ++ + ConfigureChecks.cmake | 1 + + config.h.cmake | 3 +++ + configure.ac | 1 + + goo/Makefile.am | 6 +++-- + goo/grandom.cc | 68 + +++++++++++++++++++++++++++++++++++++++++++++++++++ + goo/grandom.h | 32 ++++++++++++++++++++++++ + 7 files changed, 111 insertions(+), 2 deletions(-) + +commit af8d05d1ab89b74e307e90aaf19c750528f5f561 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Fri Aug 3 12:46:06 2012 +0200 + + Added encryption support in Decrypt.cc/.h + + poppler/Decrypt.cc | 222 + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Decrypt.h | 21 ++++- + 2 files changed, 242 insertions(+), 1 deletion(-) + +commit ba6ff179aa78a42a384166ace2df80101cfbe7b9 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Thu Aug 2 18:56:29 2012 +0200 + + Refactoring of Decrypt.cc/.h in preparation for encryption support + + poppler/Decrypt.cc | 219 + +++++++++++++++++++++++++++-------------------------- + poppler/Decrypt.h | 35 ++++++--- + 2 files changed, 133 insertions(+), 121 deletions(-) + +commit cd1ab1e34032d5620140bd0b6b6ec4b74f89ae19 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Aug 30 22:36:14 2012 +0200 + + Update Adrian's copyrights + + goo/GooString.cc | 1 + + poppler/CharCodeToUnicode.cc | 1 + + poppler/TextOutputDev.cc | 2 +- + poppler/UTF.cc | 23 +++++++++++++++++++++++ + utils/HtmlOutputDev.cc | 2 +- + 5 files changed, 27 insertions(+), 2 deletions(-) + +commit ce8a579f339507da3fd7802e1531fbf6849c0c98 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 28 22:16:34 2012 +0930 + + Move text to unicode conversion into a separate function + + This also ensures UTF-16 ActualText strings are converted to UCS-4 + before calling addChar. + + goo/GooString.cc | 2 +- + poppler/TextOutputDev.cc | 32 ++++---------------------------- + poppler/UTF.cc | 34 ++++++++++++++++++++++++++++++++++ + poppler/UTF.h | 8 ++++++++ + utils/pdfinfo.cc | 37 ++++++------------------------------- + 5 files changed, 53 insertions(+), 60 deletions(-) + +commit cac13e782cf4413703cfd1fa23e76133dfbe5ef9 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Aug 28 21:48:16 2012 +0930 + + text: increase the tolerance for overlapping glyphs + + TextOutputDev will start a new line when encountering consecutive + glyphs with overlapping bounding boxes. This can occur when drawing + diacritics with a separate glyph. In this case, due to the diacritic + having a different baseline, the lines may be output in the wrong + order. + + This patch increases the tolerance for overlapping bounding boxes to + prevent diacritics from splitting lines. + + poppler/TextOutputDev.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 6f6386219449e70c2c3bc3559fdde3df4a57a809 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Thu Mar 8 20:52:28 2012 +1030 + + Convert UTF-16 to UCS-4 when reading toUnicode cmap + + to ensure only UCS-4 values are used with the "Unicode" type. + + CMakeLists.txt | 3 +- + poppler/CairoOutputDev.cc | 2 +- + poppler/CharCodeToUnicode.cc | 12 ++--- + poppler/GlobalParams.cc | 2 +- + poppler/Makefile.am | 3 +- + poppler/TextOutputDev.cc | 19 +------- + poppler/UTF.cc | 47 ++++++++++++++++++++ + poppler/UTF.h | 103 + +++++++++++++++++++++++++++++++++++++++++++ + poppler/UTF8.h | 84 ----------------------------------- + utils/HtmlOutputDev.cc | 14 +----- + 10 files changed, 165 insertions(+), 124 deletions(-) + +commit b3b0f5abe4fdcc39d884670e4a998d39324659f6 +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 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 9264b375eec19e639c524b677f770ad750b1cb43 +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 01528eaedc77d5559f6dc4229b66f1a819678fb7 +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 c1fba45be106dc30a5136efe41493b1cf6d2a1b5 +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 1881486e9817304d0817ce24b177c1bc79587138 +Author: Tobias Koenig <tobias.koenig@kdab.com> +Date: Fri Aug 24 19:12:20 2012 +0200 + + annots: Unify parsing of additional actions entries + + https://bugs.freedesktop.org/show_bug.cgi?id=53586 + + poppler/Annot.cc | 58 + ++++++++++++++++++++++++++++++++++++++++++++------------ + poppler/Annot.h | 24 +++++++++++++++++++---- + 2 files changed, 66 insertions(+), 16 deletions(-) + +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 0b3259c1d5679cb8d59d770e5fbe7e1bc141a025 +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 5fd2a35227c22dbddedfb397eff0e0a09c3d1b03 +Author: Pino Toscano <pino@kde.org> +Date: Wed Aug 15 19:51:43 2012 +0200 + + poppler-config.h: remove WITH_FONTCONFIGURATION_* macros + + no public header uses them anymore, so need to expose them + + poppler/poppler-config.h.cmake | 10 ---------- + poppler/poppler-config.h.in | 10 ---------- + 2 files changed, 20 deletions(-) + +commit edd0ea4847c143adb1d15a57b42b0ce2b2c80b0e +Author: Pino Toscano <pino@kde.org> +Date: Wed Aug 15 19:31:50 2012 +0200 + + ignore more qt4 tests + + qt4/tests/.gitignore | 3 +++ + 1 file changed, 3 insertions(+) + +commit 2df57857000c5adbee6b029ff7a79acc707786a0 +Author: Pino Toscano <pino@kde.org> +Date: Wed Aug 15 18:59:15 2012 +0200 + + build: remove extra fontconfig CFLAGS and LIBS + + fontconfig is used only in .cpp sources inside the 'poppler' + subdirectory, so there is no need to add the include paths for it + in other directories; + likewise, do not to link to it if not needed + + glib/Makefile.am | 4 +--- + qt4/demos/Makefile.am | 2 -- + qt4/src/Makefile.am | 2 -- + qt4/tests/Makefile.am | 2 -- + test/Makefile.am | 6 ++---- + utils/CMakeLists.txt | 3 --- + utils/Makefile.am | 4 +--- + 7 files changed, 4 insertions(+), 19 deletions(-) + +commit 3e802949264d9310df057daff891a3fccb2eb8d3 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Aug 15 00:02:23 2012 +0200 + + PSOutputDev: Always write HiResBoundingBox + + Makes some people happier and it doesn't hurt us much + Bug #53159 + + poppler/PSOutputDev.cc | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +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) + + goo/GooTimer.h | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +commit 9a5a19ee2f9cd536c3527b30c0256ca9dce3638c +Author: Pino Toscano <pino@kde.org> +Date: Sat Aug 11 01:38:08 2012 +0200 + + remove extra execution permissions + + goo/GooTimer.h | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +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 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 + + 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 31fe12c63f0133d124e2115aba607857aaff0978 +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 d3c339017857cd762d8419260e33e1cc4e197743 +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 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 d0e55aa49484263882345fa648e1e907d2b172f2 +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 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 78c6a5615013d26b8a2babb13b3c4f7d6a1d70a4 +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 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 36481939e3064de920e49d9d1742a85473a50963 +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 6b567565b7b9d591fbd7441592096960a303bd39 +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 34327b2c201392f96e3449941411b7ad4b3e8bcb +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 8fe700217ab6ce786a8272f2c338e3dab434c56e +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 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 dc8833a36b514c13cfd6b1fd4665d2fddd71f357 +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 31ef967033407de91109ff46db9c60cb8748bc55 +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 f9f5238d32615f93d07afa3aa7384a8b30737203 +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 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 31837201cf5b3db735c89ef4969105b7a6ab465d +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 262203bd86403e43034fbfbbeef5a5894a62ecb2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Jun 30 14:36:28 2012 +0200 + + [qt4] Refactor part of ::search() functions + + qt4/src/poppler-page-private.h | 7 ++++- + qt4/src/poppler-page.cc | 61 + +++++++++++++++++++----------------------- + 2 files changed, 34 insertions(+), 34 deletions(-) + +commit bd71f80c409dbb47231088c3c6661946ccde6e67 +Author: Adam Reichold <adamreichold@myopera.com> +Date: Thu Jun 28 17:42:17 2012 +0200 + + [qt4] add whole-page search method to Poppler::Page + + qt4/src/poppler-page.cc | 39 +++++++++++++++++++++++++++++++++++++++ + qt4/src/poppler-qt4.h | 14 ++++++++++++++ + 2 files changed, 53 insertions(+) + +commit 46ebe7dc84b14ce8dda7b3b1da516b9d99ac3344 +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 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 2b8d95aeede56c75699bb83ca3b23ea199b81c2c +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 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 f48eb669ae5c729c026554802e666e64399c0900 +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 ff48a5d67a130211fbbb98aa0011bca0c1185114 +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 bd1dab39a857b852c09d21f64254ffc1f24c2df0 +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 31db47d077825045edd1a2d229e873a6f8e09fb1 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Jun 17 12:00:43 2012 +0200 + + Simplify AnnotAppearance::getAppearanceStream() + + - Use a switch instead of if to get the stream object + - Use the return value of dictLookupNF to check whether the object is + null + - Don't fetch the stream to check the reference is valid, this is + already done when used + + poppler/Annot.cc | 50 ++++++++++++++++++-------------------------------- + 1 file changed, 18 insertions(+), 32 deletions(-) + +commit b15d02b92aca1348564e70d0245064bc27eefce8 +Author: Maciej Mrozowski <reavertm@gmail.com> +Date: Fri May 18 01:47:55 2012 +0200 + + Add the possibility of using lcms1 even if lcms2 is installed + + CMakeLists.txt | 20 +++++++++++++------- + configure.ac | 31 +++++++++++++++---------------- + 2 files changed, 28 insertions(+), 23 deletions(-) + +commit 0cc2738737ed411159c8c8045eff5d1a4463ed16 +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 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 2e1410ea62fe99e52c94f878d02181f0b59f1cd5 +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 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 6a76d21661add4f84ee0859c4e7a4c23e7a63bc4 +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 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 d483436517c5d9679fd6f4ec5544128ffcc2188e +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 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 d791101fbdebf7a3b3f333939f9bbff6bbecf45f +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 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 8b3fa65f293804dab7ae2fd069132d0d6f44bbb2 +Author: Tobias Koenig <tobias.koenig@kdab.com> +Date: Sun Jun 10 17:48:08 2012 +0200 + + [qt4] Add accessor methods for poster information + + qt4/src/poppler-movie.cc | 15 +++++++++++++++ + qt4/src/poppler-qt4.h | 15 +++++++++++++++ + 2 files changed, 30 insertions(+) + +commit e8aa8266254bfd2189d5b5105e3d76caa4cc6713 +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 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 6e3503b5591b105fa92e6cc6568b8819f6acd625 +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 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 4f2ac544f36aa11747c3e13ff69fc19bdd0136dc +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 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 0df0aa439eed1d9838a80942e00af08e9acabb8d +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jun 2 17:33:23 2012 +0200 + + glib-demo: Add find options to find demo + + glib/demo/find.c | 61 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 60 insertions(+), 1 deletion(-) + +commit 52b3ede4bfd1e2288a0efca34da5d6239d3563e9 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jun 2 16:25:06 2012 +0200 + + glib-demo: Show search matches in a document view + + glib/demo/find.c | 253 + +++++++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 218 insertions(+), 35 deletions(-) + +commit ed0c761c2190a3c1959a60ae9b7961f58a43c939 +Author: Thomas Schenker <mail.thomas.schenker@googlemail.com> +Date: Sat Jun 2 11:54:21 2012 +0200 + + glib: Add poppler_page_find_text_with_options + + To be able to search text with options like case sensitive, search + backwards and whole words only. + + https://bugs.freedesktop.org/show_bug.cgi?id=2951 + + glib/poppler-page.cc | 52 + +++++++++++++++++++++++++++---------- + glib/poppler-page.h | 3 +++ + glib/poppler.h | 18 +++++++++++++ + glib/reference/poppler-sections.txt | 2 ++ + 4 files changed, 62 insertions(+), 13 deletions(-) + +commit 126b55c9a44ccb0dba55e758843e9ee4aa43ee2b +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat Jun 2 17:19:30 2012 +0200 + + Implement whole words only option to search text + + It seems we missed it in the xpdf303 merge. + + poppler/TextOutputDev.cc | 144 + ++++++++++++++++++++++++----------------------- + 1 file changed, 74 insertions(+), 70 deletions(-) + +commit 20210fbb6117649b20f6930031f24b8fc97b773d +Author: Luis Parravicini <lparravi@gmail.com> +Date: Mon May 28 23:44:17 2012 +0200 + + pdftohtml: Add -fontfullname + + Outputs the font name without any substitutions. Bug #49872 + + utils/HtmlFonts.cc | 4 +++- + utils/pdftohtml.1 | 3 +++ + utils/pdftohtml.cc | 4 ++++ + 3 files changed, 10 insertions(+), 1 deletion(-) + +commit 03f979a7e59c4eb5ecb8acc324c7faf700144589 +Author: Gerald Schmidt <solahcin@gmail.com> +Date: Sat May 26 17:46:59 2012 +0200 + + Make the output more xhtml compliant + + utils/HtmlOutputDev.cc | 105 + +++++++++++++++++++++++++------------------------ + 1 file changed, 53 insertions(+), 52 deletions(-) + +commit ba6406222f828e354323223fc4bdb01c1726fb49 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Mon May 21 18:16:06 2012 +0200 + + Added Annot::removeReferencedObjects + Always set annotations' + page field + + - Now Page::removeAnnot calls Annot::removeReferencedObjects, which + takes care of + removing referenced objects (such as the annot popup and the + appearance streams). + - Previously, Annot's page field was set only if the annotation + dictionary + contained /P + + poppler/Annot.cc | 40 + ++++++++++++++++++++++++++++++++++------ + poppler/Annot.h | 13 +++++++++---- + poppler/Page.cc | 7 ++++--- + poppler/Page.h | 2 +- + qt4/src/poppler-annotation.cc | 8 -------- + 5 files changed, 48 insertions(+), 22 deletions(-) + +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 b47d38e2ccd8563394df89765e277bde95730052 +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 14a29dbff585cbe55247431a346c2ac3e12473fe +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 7436b2c8a853f5121eb7dd13168ab997f1cf7d80 +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 fe28614e7aab6e029f4b420353b67a7eea24de36 +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 918456372548810c9efbf0533fa155034dd081f2 +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 892e486addcbcad619613c7be1ca692a0d36d6e5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 21 20:28:42 2012 +0200 + + Compile++ + + cmake/modules/FindGTK.cmake | 8 ++++---- + glib/demo/CMakeLists.txt | 6 +++--- + test/CMakeLists.txt | 6 +++--- + 3 files changed, 10 insertions(+), 10 deletions(-) + +commit 794e89ed41d03997778fc4c59b7f1ba557b5e6b7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon May 21 20:18:42 2012 +0200 + + Compile + + glib/CMakeLists.txt | 2 ++ + 1 file changed, 2 insertions(+) + +commit 78e6c9905a52c0cd4bfc1e56874f50689f04a1c6 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 20 12:11:27 2012 +0200 + + glib-demo: Make text characters list fill and expand in text demo + + glib/demo/text.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 610eb24426d9b36ac7da40a2fceb3dbeeec19a5c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 20 12:08:09 2012 +0200 + + glib-demo: Add a button to remove annots from the annot view + + glib/demo/annots.c | 48 +++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 41 insertions(+), 7 deletions(-) + +commit 11a3093e093319e88f14af0ab6c15009104d17ee +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 20 11:22:49 2012 +0200 + + glib: Add poppler_page_remove_annot() + + https://bugs.freedesktop.org/show_bug.cgi?id=40473 + + glib/poppler-page.cc | 19 +++++++++++++++++++ + glib/poppler-page.h | 2 ++ + glib/reference/poppler-sections.txt | 1 + + 3 files changed, 22 insertions(+) + +commit 0dd157ae7f19cd91ea425a607b968f08addc3a40 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 20 10:37:47 2012 +0200 + + glib: Take a reference of the core annotation when creating a + PopplerAnnot + + This way if the annotation is removed from the page, the core + annotation + object is not destroyed. Also, a new PopplerAnnot that is never + added to + a page doesn't leak the core annotation anymore. + + glib/poppler-annot.cc | 53 + +++++++++++++++++++++------------------------------ + 1 file changed, 22 insertions(+), 31 deletions(-) + +commit f818b842f54d6860920b39778228e8b247b4e761 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat May 19 12:32:33 2012 +0200 + + glib-demo: Fix runtime warning + + glib/demo/selections.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a24e326425e198eeb70c4d9205bb7a0a3a9db297 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sat May 19 12:09:45 2012 +0200 + + gtk-tests: Port to GTK+ 3.0 + + configure.ac | 4 +- + glib/demo/annots.c | 74 +++++++------- + glib/demo/attachments.c | 4 +- + glib/demo/find.c | 4 +- + glib/demo/fonts.c | 4 +- + glib/demo/forms.c | 64 ++++++------ + glib/demo/images.c | 21 ++-- + glib/demo/info.cc | 67 ++++++------ + glib/demo/layers.c | 22 ++-- + glib/demo/links.c | 6 +- + glib/demo/main.c | 31 ++---- + glib/demo/outline.c | 2 +- + glib/demo/page.c | 23 ++--- + glib/demo/print.c | 14 +-- + glib/demo/render.c | 263 + ++++++++++++++---------------------------------- + glib/demo/selections.c | 77 ++++++-------- + glib/demo/text.c | 22 ++-- + glib/demo/transitions.c | 4 +- + glib/demo/utils.c | 101 +++++++++---------- + glib/demo/utils.h | 6 +- + test/gtk-test.cc | 48 +++++---- + 21 files changed, 350 insertions(+), 511 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 87093d1250807f660042295747a012032f84c034 +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 3a249aa8ad5e9f7511bcafd0416ce51c7efe5f4d +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 ff2c251dbaef9b964af48f51ebb517626ac3145c +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 13 20:13:32 2012 +0200 + + glib-demo: Use poppler_document_new_from_gfile to load the given uri + + glib/demo/main.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +commit a7629331ab4ba5b256213af1f1b2954a49953c34 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 13 20:13:03 2012 +0200 + + glib: Add poppler_document_new_from_gfile + + glib/poppler-document.cc | 46 + +++++++++++++++++++++++++++++++++++++ + glib/poppler-document.h | 4 ++++ + glib/reference/poppler-sections.txt | 1 + + 3 files changed, 51 insertions(+) + +commit 95277b1f481e274ab0ce22ffb44b40437bffa3c8 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 13 20:11:12 2012 +0200 + + glib Add missing cancellable param in poppler_document_new_from_stream + doc + + glib/poppler-document.cc | 1 + + 1 file changed, 1 insertion(+) + +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 c4bf7b162028a2f9ffcd2baba2759bdb14fae51f +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 | 43 ++++++++++++++++++++----------------------- + 1 file changed, 20 insertions(+), 23 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 4d0786a97e061a752686968bd7976bdda01b1f84 +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 1d1c8175c57ebe6518f4252ab92a20286b7d4c6f +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun May 13 18:41:25 2012 +0200 + + glib: Add poppler_document_new_from_stream + + A PopplerInputStream has been added to handle GMemoryInputStream and + GLocalFileInputStream, since we don't want to cache the contents in + those cases. A PopplerCachedFileLoader has been added to handle all + other cases. + + configure.ac | 10 +-- + glib/Makefile.am | 4 + + glib/poppler-cached-file-loader.cc | 108 +++++++++++++++++++++++++++ + glib/poppler-cached-file-loader.h | 44 +++++++++++ + glib/poppler-document.cc | 69 ++++++++++++++++++ + glib/poppler-document.h | 6 ++ + glib/poppler-input-stream.cc | 141 + ++++++++++++++++++++++++++++++++++++ + glib/poppler-input-stream.h | 74 +++++++++++++++++++ + glib/reference/poppler-docs.sgml | 4 + + glib/reference/poppler-sections.txt | 1 + + poppler-glib-uninstalled.pc.in | 2 +- + poppler-glib.pc.in | 2 +- + 12 files changed, 458 insertions(+), 7 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 b477443e8a4c52500529aaf3be76f01a61e85f28 +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 8f040dec2ce2eae24dd1eb15900d4d284e4b3848 +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 7f47630a7fc19214cd48dbd164ecf577ba35cc46 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 10 23:12:04 2012 +0200 + + Compile with the unsupported ENABLE_PLUGINS defined + + poppler/GlobalParams.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 22264cb230fc5902aea14ab43fa013a8ebdbf812 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 10 23:04:33 2012 +0200 + + Make it compile + + Sorry :-/ + + goo/gfile.cc | 82 + -------------------------------------------------- + goo/gfile.h | 4 --- + poppler/GlobalParams.h | 2 +- + 3 files changed, 1 insertion(+), 87 deletions(-) + +commit 44bf99a7b8683a077f2a5db50541099c109aa069 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 10 22:59:18 2012 +0200 + + Kill the concept of "base dir" + + We are a library so having a "common configuration folder" does + not really + make much sense at a library level, and even less if it's called + .xpdf :D + + Fixes bug 49448 + + goo/gfile.cc | 46 + ---------------------------------------------- + goo/gfile.h | 3 --- + poppler/GfxState.cc | 16 ++-------------- + poppler/GlobalParams.cc | 21 --------------------- + poppler/GlobalParams.h | 3 --- + test/perf-test.cc | 1 - + 6 files changed, 2 insertions(+), 88 deletions(-) + +commit bb091e38a1c0248ba24b0711b4afc0b0524cce10 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 10 22:38:41 2012 +0200 + + Make it be something closer to real english + + utils/pdftohtml.1 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 67f3c3e0d03ec63df7c6028cbd626e384d231c2b +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed May 9 16:48:15 2012 +0200 + + GooString formatting: add support for uppercase hexadecimal + Use + it in Annot::layoutText + + goo/GooString.cc | 61 + ++++++++++++++++++++++++++++++++++++++++++++++---------- + goo/GooString.h | 17 ++++++++-------- + poppler/Annot.cc | 2 +- + 3 files changed, 61 insertions(+), 19 deletions(-) + +commit 1f7f8a78409e6bcc90bd32ea2aaa75ed3a7b6218 +Author: Fabio D'Urso <fabiodurso@hotmail.it> +Date: Wed May 9 16:18:05 2012 +0200 + + Use error() instead of fprintf(stderr, ...) in Annot::layoutText + + poppler/Annot.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +commit a7a2e72f9ba43816a81278e0565d31807ac5ceb5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 10 22:31:24 2012 +0200 + + More gs cleanup and forgot the (C) on modification + + goo/gfile.cc | 2 +- + goo/gfile.h | 2 +- + utils/pdftohtml.cc | 4 ---- + 3 files changed, 2 insertions(+), 6 deletions(-) + +commit ad36d22d1f11339be90403534b921cce120fdbad +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu May 10 22:24:40 2012 +0200 + + pdftohtml: Remove the option to invoke gs + + goo/gfile.cc | 8 --- + goo/gfile.h | 3 -- + utils/pdftohtml.1 | 8 +-- + utils/pdftohtml.cc | 149 + ++++++++++++----------------------------------------- + 4 files changed, 36 insertions(+), 132 deletions(-) + +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   + + 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. + + poppler/CairoFontEngine.cc | 0 + poppler/CairoOutputDev.cc | 0 + 2 files changed, 0 insertions(+), 0 deletions(-) + +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 + + msvc/poppler/poppler-config.h | 0 + poppler/Annot.cc | 0 + poppler/CairoFontEngine.cc | 0 + poppler/CairoOutputDev.cc | 0 + poppler/Catalog.cc | 0 + poppler/Form.cc | 0 + poppler/GfxFont.cc | 0 + poppler/GfxState.cc | 0 + poppler/Page.cc | 0 + poppler/SplashOutputDev.cc | 0 + poppler/TextOutputDev.cc | 0 + splash/Splash.cc | 0 + splash/SplashFTFontEngine.cc | 0 + test/perf-test-preview-dummy.cc | 0 + test/perf-test-preview-win.cc | 0 + test/perf-test.cc | 0 + 16 files changed, 0 insertions(+), 0 deletions(-) + +commit 6c69473f2f4a49757614ddd249e65bb7a13c63c1 +Author: Krzysztof Kowalczyk <kkowalczyk@tlapx60ubu.(none)> +Date: Fri Sep 21 08:09:53 2007 -0700 + + undo accidental mode change + + makefile.vc | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + +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-overrides.txt | 0 + 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-unused.sgml | 0 + glib/reference/tmpl/poppler.sgml | 216 ++++++++++++++++ + glib/reference/tmpl/stamp-poppler-enums.sgml | 19 ++ + 16 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/Build/source/libs/poppler/poppler-0.36.0/ConfigureChecks.cmake b/Build/source/libs/poppler/poppler-0.36.0/ConfigureChecks.cmake new file mode 100644 index 00000000000..d3f57325720 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/ConfigureChecks.cmake @@ -0,0 +1,61 @@ +# 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(pread64 HAVE_PREAD64) +check_function_exists(lseek64 HAVE_LSEEK64) +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) +check_function_exists(rand_r HAVE_RAND_R) +check_function_exists(strcpy_s HAVE_STRCPY_S) +check_function_exists(strcat_s HAVE_STRCAT_S) + +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/Build/source/libs/poppler/poppler-0.36.0/INSTALL b/Build/source/libs/poppler/poppler-0.36.0/INSTALL new file mode 100644 index 00000000000..56b077d6a0b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/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/Build/source/libs/poppler/poppler-0.36.0/Makefile.am b/Build/source/libs/poppler/poppler-0.36.0/Makefile.am new file mode 100644 index 00000000000..691512f4e3a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/Makefile.am @@ -0,0 +1,131 @@ +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_QT5 +qt5_subdir = qt5 +qt5_pc_file = poppler-qt5.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 + +SUBDIRS = goo fofi $(splash_subdir) poppler utils $(glib_subdir) test $(qt4_subdir) $(qt5_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-qt5.pc.in \ + poppler-qt5-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) \ + $(qt5_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 \ + qt5/src/CMakeLists.txt \ + qt5/tests/CMakeLists.txt \ + qt5/CMakeLists.txt \ + qt5/demos/CMakeLists.txt \ + test/CMakeLists.txt \ + utils/CMakeLists.txt \ + CMakeLists.txt \ + ConfigureChecks.cmake \ + cmake/modules/CheckFileOffsetBits.c \ + cmake/modules/CheckFileOffsetBits.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-qt5.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/Build/source/libs/poppler/poppler-0.36.0/NEWS b/Build/source/libs/poppler/poppler-0.36.0/NEWS new file mode 100644 index 00000000000..5326eed5f60 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/NEWS @@ -0,0 +1,2399 @@ +Release 0.36.0 + core: + * Patch to support RichMedia annotations + * Splash: Fix wrong memory access. Bug #91686 + * Cairo: fix size of transparency group surface. Bug #66229 + * Fix bounds check in Linearization::getPageFirst. Bug #91200 + * File Saving improvements + * Add premultiplied alpha channel to SplashBitmap + * Fix for xref table creation. Bug #90790 + * Fix JBIG2Decode infinite loop and stack overflow. Bug #91186 + * Minor optimization in text extraction + + qt4: + * Basic support for RichMedia annotations + * Change default image format + * Minor optimizations + + qt5: + * Basic support for RichMedia annotations + * Change default image format + * Minor optimizationsHEADmaster + + cpp: + * Fix utf8/utf16 conversion. Bug #91644 + + build system: + * Do not hardcode -fPIC in Makefile.am + * cmake: Allow configuring SHARE_INSTALL_DIR. Bug #90293 + + glib: + * + + utils: + * pdfunite: Insert embedded files in result pdf. Bug #90066 + * pdftotext: Add -bbox-layout option. Bug #89941 + +Release 0.35.0 + core: + * Fix assert in broken file. Bug #91344 + * Adjust memory layout computation of GooString + * Make SplashBitmap XBGR transfer alpha channel + * Splash: Fix wrong writes on non rgb outputs. Bug #90570 + * Splash: remove ifndef in Windows code + * GlobalParamsWin bugfixes. Bug #91053 + + qt4: + * Switch default image format + * Add IgnorePaperColor render flag + + qt5: + * Improve efficiency of Poppler::Page::renderToImage + * Switch default image format + * Add IgnorePaperColor render flag + + build system: + * Allow configuring SPLASH_CMYK support + * Add configure --enable-build-type. Bug #90796 + + glib: + * Explicitly link against pthread + * Deprecation fixes + + utils: + * pdftocairo: Fix cast to pointer from integer of different size on win64 + +Release 0.34.0 + core: + * Splash: Fix crash in PDF with nested softmasks. Bug #91240 + * Splash: Speed up of rendering icc based images. Bug #90171 + * PSOutputDev: Embed Type1 fonts to PostScript files correctly. Bug #19747 + * Fix pedantic memory leak + + glib: + * update new symbols section + + build system: + * cmake: Make sure ENABLE_LIBOPENJPEG is either 0 or 1 + +Release 0.33.0 + core: + * Fix regression in pdftops parameter passing. Bug #89827 + * Combine base characters and diacritical marks. Bug #87215 + * Use width from W array for WMode positioning. Bug #89621 + * Fixed adding annotation of Subtype Popup to pdf page. Bug #89136 + * CairoOutputDev: Fix memory leak in CairoFreeTypeFont::create + * SplashOutputDev: memset on error to have reproducible outputs + + qt4: + * Fix PDF Text String -> QString conversion. KDE Bug #344849 + + qt5: + * Fix PDF Text String -> QString conversion. KDE Bug #344849 + + glib: + * Add poppler_annot_markup_set_popup_rectangle() + * Fix segfault when creating PopplerAction. Bug #90093 + + utils: + * pdftohtml: Set exit status adecuately. Bug #83609 + + build system: + * configure: Fix invalid shell comparaison in libtiff test + +Release 0.32.0 + core: + * Annotations: Fix rendering of empty BG/BC arrays + * Splash: Fix wrong colour shown when GouraudTriangleShFill uses a DeviceN colorspace. Bug #89182 + * Splash: Fix use of uninitialized variable in Splash::pipeRun + * Remove unnecesary check for font validity. Bug #88939 + * Small optimization in GooString::appendfv(). Bug #89096 + * Fix crashes in malformed files + + utils: + * pdftops: Make colorpsace optimization an option instead of default + * pdfseparate: use always an unique instance for PDFDoc for savePageAs + + build system: + * cmake: If extra-cmake-modules is around include the Sanitizers module + +Release 0.31.0 + core: + * CairoOutputDev: support embedding JBIG2 image data + * Accept malformed documents whose root is a Page instead of a Pages. Bug #88172 + * Fix crash on broken documents + * JPEG2000Stream: Inline doGetChar and doLookChar + * GlobalParams cleaning + + utils: + * pdftops: Add rasterization option. Bug #85934 + + qt4: + * Expose whole-words search option + + qt5: + * Expose whole-words search option + +Release 0.30.0 + core: + * Openjpeg2 support (openjpeg 1 is preferred). Bug #58906 + * Fix potential memory corruption on TextSelectionDumper. Bug #84555 + * Check for invalid matrix in annotation. Bug #84990 + * Open some not conforming files. Bug #85919 + * PSOutputDev: Accept a list of pages indeces instead of first, last. Bug #84833 + * Fix memory leak on error condition + + cpp: + * New API to set debug output function + + build system: + * configure: Improve support with older clang versions. Bug #76963 + + utils: + * pdfunite: Support output intents, optional content and acroform + +Release 0.29.0 + core: + * Use correct LAB byte array for lcms input. Bug #86388 + * Write correct size in trailer dict. Bug #86063 + * Use Default colorspaces if present instead of Device colorspaces + * Solve blend mode problem in CYMK and DeviceN for separable blend modes + * Compilation/warning fixes on SunOS + * Regression test improvements + + glib: + * demo: Compilation fixlets + + build system: + * cofigure: print "no" instead of "auto" if lcms not found + +Release 0.28.0 + core: + * Fix rendering of file with a wrong embedded font. Bug #84270 + * Use alt colorspace to get CMYK values for an ICC based CMYK colorspace. Bug #79019 + * Map Standard/Expert encoding ligatures to AGLFN names. Bug #80093 + * Make Attribute::getName() work when UTF-16BE is used. Bug #84722 + * Fix memory leak in Dict::remove. Bug #84607 + * Fix crashes in broken files + * SplashOutputDev: Improve Overprintmode and shadings. Bug #80998 + * CairoOutputDev: fix crash when no group color space. Bug #85137 + * CairoOutputDev: Don't render text when text matrix is not invertable. Bug #78042 + * CairoOutputDev: Only embed mime data for gray/rgb/cmyk colorspaces. Bug #80719 + * CairoOutputDev: Only embed mime data if image decode map is identity + * cairo: Use matrix to determine pattern size. Bug #33364 + * Fix compile warnings + * regression test improvements + + glib: + * Fix use of uninitialized members in PopplerInputStream. Bug #82630 + * Documentation improvements + * Do not dist gir_DATA + * Remove use of GTK deprecated functions. Bug #82384. Bug #82385 + * Build introspection linking to the uninstalled libraries. Big #84526 + + qt4: + * Add a new Page::annotations() that let's you specify subtypes + + qt5: + * Add a new Page::annotations() that let's you specify subtypes + + utils: + * pdfseparate: additonal handling for annotations. Bug #77549 + * pdfdetach: fix crash when getPage() returns null. Bug #85145 + * pdftocairo: Add support for printing to a Windows printer. Bug #79936 + + build system: + * Move automake version check from autogen.sh to configure.ac. Bug #79797 + * Makefile.am cleanups. Bug #79411 + * Use poppler-data pkg-config + * Make autogen.sh work with variables with spaces + * Don't use -fPIC on mingw + * Fix build with --disable-utils. Bug #84448 + +Release 0.26.4 + core: + * CairoOutputDev: Make sure we always push a transparency group in setSoftMaskFromImageMask(). Bug #81624 + * Fix a crash when adding Annotation without contents + * Improve non-latin characters in inline notes. Bug #65956 + * Don't check for inlineImg twice. Bug #82059 + * printf() -> error() + + glib: + * Return NULL in poppler_annot_get_contents also for empty strings + * Fix a memory leak when getting text layout and attributes + +Release 0.26.3 + qt5: + * autoconf: Improve moc-qt5 detection + * Fix compilation with MinGW + + glib: + * Fix typo in api docs + * use C90-style comments in public headers + + core: + * Error out instead of exiting if allInter grows too much. Bug #78714 + + qt4: + * Update required version to Qt 4.7.0 + + build system: + * Include stdio.h from poppler-config.h + + misc: + * Update .gitignore files + +Release 0.26.2 + core: + * Make sure we have an xref before using. KDE Bug #335413 + + build system: + * autoconf: Fix typo in configure.ac + + utils: + * pdftohtml: exit with 0 with -v and -h + +Release 0.26.1 + core: + * Use field value V for radio buttons. Bug #75979 + * Fix extraction of text in some files. Bug #78145 + * Only add annotations of the current page when splitting. Bug #77549 + + build system: + * autoconf: Fix libopenjpeg 1.5 detection on some systems. Bug #78389 + + glib: + * Fix multiple definition of PopplerTextSpan + +Release 0.26.0 + qt4: + * Fix mismatched boolean logic in TextAnnotation::setInplaceIntent + + qt5: + * Fix mismatched boolean logic in TextAnnotation::setInplaceIntent + + core: + * Very small code cleanup + + cpp: + * Very small code cleanup + +Release 0.25.3 + core: + * Fix crashes on broken files + * Avoid MinGW/Cygwin warnings due to redefinition of NOMINMAX + * Fix some small memory leaks + + qt5: + * Fix some kinds of OCG models + * Cleanup some deprecated methods + + glib: + * Fix the first coord of the quadrilateral in create_poppler_quads_from_annot_quads(). Bug #76504 + + utils: + * pdftohtml: Fix typo in manpage + + qt4: + * Fix some kinds of OCG models + +Release 0.25.2 + core: + * Tagged-PDF support + * Open some broken files. Bug #75232 + * Fix crashes on broken files + * Fix regression parsing some broken files. KDE Bug #329600 + * Improve compilation under Win 8 with Visual Studio 2012. Bug #73111 + * PSOutputDev: Ensure paper size takes into account rotation. Bug #72312 + * PSOutputDev: Fix DocumentMedia/Page/Media/PageBBox DSC comments + * PSOutputDev: Use crop box as page size + * PSOutputDev: Remove origpagesizes mode and make -origpagesizes an alias for -paper match + * PSOutputDev: Only change paper size when different to previous size + * PSOutputDev: Ensure there is always a page size in the output + * PSOutputDev: Fix regression when creating level1 PS. Bug #75241 + * CairoOutputDev: Clip to crop box. Gnome Bug #649886 + * Splash: Blend usage in PDF with spot colors casue random output. Bug #74883 + * Splash: Fix off by one that caused crash in a file. Bug #76387 + * Make sure number of least objects in hints table is valid. Bug #74741 + * Limit numeric parsing of character names. Bug #38456 + + glib: + * Tagged-PDF support + * Annotation improvements + * Install error callback. Bug #73269 + * Fix gobject-introspection warnings + * demo: Fix performance in text markup annotations + * Increase gtk3 dependency + + qt4: + * Improve naming of internal export/import macros + * Add GCC visibility export attributes + * Expose document-supplied text direction + + qt5: + * Improve naming of internal export/import macros + * Add GCC visibility export attributes + * Expose document-supplied text direction + + utils: + * pdftocairo: Ensure page size and crop box works the same as pdftops + * Fix TIFF writting in Windows. Bug #75969 + + buildsystem: + * Learn about automake 1.14 + * Do not define -ansi. Bug #72499 + * cmake: Install JpegWriter.h depending on libjpeg + * cmake: Use c99 for the c compiler + +Release 0.25.1 + core: + * GooString format: Added some tests + improved documentation + * GooString format: fixed bug with printing LLONG_MIN + * regression test improvements + + qt4: + * Arthur backend font rendering improvements + * test program to save to file + + qt5: + * Arthur backend font rendering improvements + * Improve detection of Qt5 moc. Bug #72744 + * test program to save to file + + utils: + * pdfunite: Work even if there's a single file given + * pdfunite: do not lose fonts when merging some files + +Release 0.25.0 + core: + * Annotation improvements + * Tagged PDF work + * Improve speed on some files using ICC color space + * Use ICC profile in OutputIntents. Bug #34053 + * Limit use of ZapfDingbats character names. Bug #60243 + * Splash: correction for knockout transparency groups + * regression test improvements + + utils: + * pdftoppm: Added thinlinemode option setting + * pdfinfo: Indicate if pdf contains javascript + * pdfinfo: Add option to print out javascript + * pdfimages: Print size, ratio, and ppi + * pdfimages: More image output format support + * pdfseparate: allow zero-padded pagespecs + + glib: + * Annotation improvements + * Add API to get text, text layout and text attributes for a given area + * demo improvements + +Release 0.24.5 + core: + * Fix crash due to wrong formatting of error message. KDE Bug #328511 + +Release 0.24.4 + core: + * Fix regression in broken endstream detection. Bug #70854 + * Catalog: sort entries of NameTrees to make sure lookup works. Bug #26049 + * Don't infinite loop if reading from GooFile::read fails. Bug #71835 + + utils: + * pdftotext: Do not close stdout. Bug #71639 + * pdftotext: Silence warning for may be used uninitialized variable. Bug #71640 + * pdftotext: Escape the text of the xml headers + * Warn the user if he provides a wrong range + + qt4: + * Fix typo in xml API. Bug #71643 + + qt5: + * Fix typo in xml API. Bug #71643 + +Release 0.24.3 + core: + * PSOutputDev: Fix PFB font embedding. Bug #69717 + * CairoOutputDev: Do not set an invalid matrix in drawImage(). Bug #70085 + + qt4: + * Don't crash if getXRef()->copy() fails + + qt5: + * Don't crash if getXRef()->copy() fails + + utils: + * pdfseparate: Allow only one %d in the filename. Bug #69434 + +Release 0.24.2 + core: + * Windows: Fix CreateFile fails with ERROR_SHARING_VIOLATION. Bug #69597 + + utils: + * pdfseparate: improve the path building + * pdftocairo: check file opening failure in beginDocument() + +Release 0.24.1 + core: + * SplashOutputDev: use getRGBLine images if available. Bug #66928 + * SplashOutputDev: Don't copy bitmap if we don't need to. + * PSOutputDev: Fix regression in -eps -level1sep rendering. Bug #68321 + * Fix crash in malformed file 1026.asan.0.42.pdf + * use copyString instead of strdup where memory is freed with gfree. Bug #67666 + + utils: + * pdfdetach: don't mention xpdfrc + * pdftotext: Fix -bbox with stdin as input. Bug #45163 + * pdftohtml: Fix jpeg image export. Bug #48270 + * pdfimages: Fix typos in man page + + glib: + * demo: Remove GTK_DISABLE_DEPRECATED compilation flag + + qt4: + * Fix small typo in documentation + + qt5: + * Fix small typo in documentation + +Release 0.24.0 + core: + * TextOutputDev: Do not draw ligatures more than once when selected. Bug #9001 + * PSOutputDev: Make some pdftops conversions much faster + * PSOutputDev: Initialize t3FillColorOnly + * SplashOutputDev: Fallback to 1x1 bitmap if we fail to create the real size + +Release 0.23.4 + core: + * TextOutputDev: clip the selected text rendering to the selection box. Bug #66983 + * CairoImageOutputDev: Fix the bounding box of saved images + + build system: + * Improve linking against pthreads + +Release 0.23.3 + core: + * Annotation improvements + * Fix crashes on malformed files + * TextSelectionPainter: Draw glyphs after selection background + * TextOutputDev: add a method to TextPage to get the selection as a list of words + + qt5: + * Initial Qt5 port + + qt4: + * Windows compile fixes + * Demo: Allow the choose the page rotation + + build system: + * Fix mingw build + * Minor autotools fixes + +Release 0.23.2 + core: + * SplashOutputDev: Speed-up some tiling on a 10x factor + * Improve caching of lcms2 ICC color profiles + * Put some private classes in an anonymous namespace + + qt4: + * Add a thread stresser tool + + build system: + * Fix mingw build + +Release 0.23.1 + core: + * XRef stream writing: Write 32-bit offsets when possible + * Fix splashModeBGR8 rendering (Bug #64381) + + glib: + * Do not use deprecated gtk_scrolled_window_add_with_viewport() (Bug #64683) + + build system: + * Fix Large file support when using cmake + +Release 0.23.0 + core: + * Make rendering thread safe + * Large file support + * Implement Crypt filter (Bug #62800) + * Fix endstream detection (Bug #62985) + * CairoOutputDev: support uncolored tiling patterns (Bug #59179) + * SplashOutputDev: Introduce Thin Line mode support (Bug #37347) + + qt4: + * Expose Thin Line mode support + +Release 0.22.4 + core: + * Always consider a softmask transfer function (Bug #63587) + * Fix crash on malformed files (Bug #63190) + * Splash: Fix compilation with fixed point mode enabled + + utils: + * Fix crash on some files (Bug #63909) + + qt4: + * Fix name decoding of some attachments (KDE Bug #307786) + + build system: + * Fix compilation with mingw-w64 compiler + +Release 0.22.3 + core: + * Check order bounding box values in tiling pattern (Bug #62369) + * CairoImageOutputDev: Don't change image interpolation when printing (Bug #62418) + * TextOutputDev: Set text matrix when painting selection (Bug #61042) + * Only write the file once when saving (Bug #62739) + * Fix for complete rewrites in repaired files + * Fixlet regarding spec interpretation for Link Zoom value + * Fix typos in man pages + * Fix compile when not using libjpeg + + glib: + * Always start from the beginning when starting a new search on a page (Bug #59972) + + qt4: + * Fix crash in files with LinkRendition (KDE Bug #317710) + + build system: + * Small cmake improvements + +Release 0.22.2 + core: + * Correct rendering of underline and strike out annotations (Bug #61518) + * Workaround broken jpeg stream definitions (Bug #61994) + * SplashOutputDev: Restore CTM on early exits (Bug #61413) + * SplashOutputDev: Make sure we don't try to paint in x < 0 (KDE Bug #315432) + * Fix latin page labels. (Bug #61034) + * Fix compilation with jpeglib9 + * Fix minor valgrind warning + + utils: + * pdfimages: Fix extraction of some images (Bug #61168) + + build system: + * Fix the build with automake-1.13 + +Release 0.22.1 + core: + * Fix crash in some pdf files when extracting text (Bug #59561) + * Fix crashes in wrongly formed files + * Fix wrong warning when opening some files (Bug #58966) + + build system: + * Improve autoconf jpeglib.h detection (Bug #59186) + +Release 0.22.0 + core: + * Fix crash in invalid files that define a <= 0 bits per image value + * Fix a few issues in JPX decoding when not using OpenJPEG + * TextOutputDev: Use page size for max value in TextPage::visitSelection + * Fix typo in error message + + utils: + * Fix pdfunite regression (Bug #58569) + * Demo fixes and improvements + + misc: + * pdf-inspector improvements + +Release 0.21.4 + core: + * SplashOutputDev: Fix crash when rendering in monochrome mode + * SplashOutputDev: Fix line widths in monochrome mode (Bug #57294) + * PSOutputDev: Fix crop on EPS conversion (Bug #30692) + * TextOutputDev: Fix minor logic mistake + * Fix assert on some malformed files (Bug #58257) + * Move #include "jpeglib.h" into .cc file (Bug #57687) + * Filter text that may end up being written to the shell + * Fix windows compile warnings + + glib: + * Add poppler_annot_set_flags (Bug #58015) + * Demo fixes and improvements + + qt4: + * Fix check_lexer on 32-bit systems + +Release 0.21.3 + core: + * Splash: Implement bilinear image scaling (Bug #22138) + * CairoOutputDev: Update fill and stroke color in startPage (Bug #54526) + * Fix GooString::insert() + * Allow large chars in TextPage + * Fix crash on ActualText::end + * Don't use memcpy to copy classes + * Fix warnings + + glib: + * Check if words end with spaces (Bug #54504) + * Ensure text is only computed on first render + * Fix warnings while generating introspection file + * Fix returns tag in PopplerAttachmentSaveFunc api doc + * Minor demo fixes + +Release 0.21.2 + core: + * CairoOutputDev: make drawImage work with images > 32767 in width/height (Bug #56858) + * CairoOutputDev: Fix soft mask when image resolution != smask resolution (Bug #57070) + * CairoOutputDev: Fix crash in CairoImageOutputDev with setSoftMaskFromImageMask (Bug #57067) + * Remove a check on fonts that we don't need (Bug #56753) + * Misc code cleanups + + utils: + * pdftocairo: Add tiff output support (Bug #57006) + * pdfunite: Fix -v (Bug #56817) + * Misc code cleanups + +Release 0.21.1 + core: + * Annotation improvements + * Form improvements + * CairoImageOutputDev: Support parameterized Gouraud shading (Bug #56463) + * UTF validation fixes + * Do not call drawing routines if we don't need non text (Bug #54617) + * Fix Memory leak in CharCodeToUnicode (Bug #54702) + + qt4: + * Make LinkRendition properties available (Bug #55378) + * Accessors for FormWidgetChoice::editChoice + * Implement overprint + +Release 0.21.0 + core: + * Support the modification of files with Encrypt + * Annotation improvements + * Form improvements + * Splash: Implement DeviceN support + * Splash: Avoid bogus memory error for tilingPattern + * TextOutputDev: Allow multiple fonts in a TextWord + * Kill the concept of base dir + * PSOutputDev: Always write HiResBoundingBox (Bug #53159) + * Convert UTF-16 to UCS-4 when reading toUnicode cmap + * GooString formatting: add support for uppercase hexadecimal + * Use error() instead of fprintf(stderr, ...) in Annot::layoutText + * poppler-config.h: remove WITH_FONTCONFIGURATION_* macros + + glib: + * Annotation improvements + * Add poppler_page_remove_annot() + * Add poppler_document_new_from_stream + * Add poppler_document_new_from_gfile + * Add poppler_page_find_text_with_options (Bug #2951) + * Demo improvements + * Port tests and demo to GTK+3 + + qt4: + * Add accessor methods for movie poster information + * Make 'additional actions' available in Annotation API (Bug #53589) + * Add whole-page search method to Poppler::Page + * Small changes in tests + + utils: + * pdftohtml: Make the output more xhtml compliant + * pdftohtml: Add -fontfullname. (Bug #49872) + * pdftohtml: Do not invoke gs anymore + + build system: + * Add the possibility of using lcms1 even if lcms2 is installed + * Remove extra fontconfig CFLAGS and LIBS + +Release 0.20.5 + core: + * Fix crashes in malformed documents + * Fix parsing of very big numbers + * Splash: Do not render invalid font outlines (Bug #55573) + * Check for NaN in TextPage::addChar + + build system: + * Fix build using mingw64 with winpthread + * autotools: Fix compilation when lcms is on non standard locations (Bug #55326) + * Support automake-1.12 (Bug #55541) + + glib: + * Chain up finalize to the parent class (Bug #55521) + +Release 0.20.4 + core: + * Improvements regarding embedded 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 embedded 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   + * 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 existent 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/Build/source/libs/poppler/poppler-0.36.0/README b/Build/source/libs/poppler/poppler-0.36.0/README new file mode 100644 index 00000000000..fa223900fbf --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/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/Build/source/libs/poppler/poppler-0.36.0/README-XPDF b/Build/source/libs/poppler/poppler-0.36.0/README-XPDF new file mode 100644 index 00000000000..e97791ce5b2 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/README-XPDF @@ -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/Build/source/libs/poppler/poppler-0.36.0/TODO b/Build/source/libs/poppler/poppler-0.36.0/TODO new file mode 100644 index 00000000000..e067c2a3156 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/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/Build/source/libs/poppler/poppler-0.36.0/config.h.cmake b/Build/source/libs/poppler/poppler-0.36.0/config.h.cmake new file mode 100644 index 00000000000..400b16b1590 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/config.h.cmake @@ -0,0 +1,234 @@ +/* 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 + +/* Define to 1 if you have the `pread64' function. */ +#cmakedefine HAVE_PREAD64 1 + +/* Define to 1 if you have the `lseek64' function. */ +#cmakedefine HAVE_LSEEK64 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 `rand_r' function. */ +#cmakedefine HAVE_RAND_R 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 "${POPPLER_DATADIR}" + +/* Support for curl based doc builder is compiled in. */ +#cmakedefine POPPLER_HAS_CURL_SUPPORT 1 + +/* Include support for CMYK rasterization */ +#cmakedefine SPLASH_CMYK 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. */ +#cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@ + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +/* TODO This is wrong, port if needed #undef _LARGEFILE_SOURCE */ + +/* Define for large files, on AIX-style hosts. */ +/* TODO This is wrong, port if needed #undef _LARGE_FILES */ diff --git a/Build/source/libs/poppler/poppler-0.36.0/config.h.in b/Build/source/libs/poppler/poppler-0.36.0/config.h.in new file mode 100644 index 00000000000..786143b27d4 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/config.h.in @@ -0,0 +1,276 @@ +/* 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 `lseek64' function. */ +#undef HAVE_LSEEK64 + +/* 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 to 1 if you have the `pread64' function. */ +#undef HAVE_PREAD64 + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + +/* Defines if rand_r is available on your system */ +#undef HAVE_RAND_R + +/* 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 `strcat_s' function. */ +#undef HAVE_STRCAT_S + +/* Define to 1 if you have the `strcpy_s' function. */ +#undef HAVE_STRCPY_S + +/* 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 + +/* Include support for CMYK rasterization */ +#undef SPLASH_CMYK + +/* 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 + +/* Defined if using openjpeg1 */ +#undef USE_OPENJPEG1 + +/* Defined if using openjpeg2 */ +#undef USE_OPENJPEG2 + +/* 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/Build/source/libs/poppler/poppler-0.36.0/configure.ac b/Build/source/libs/poppler/poppler-0.36.0/configure.ac new file mode 100644 index 00000000000..4bc1524e48d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/configure.ac @@ -0,0 +1,1050 @@ +m4_define([poppler_version_major],[0]) +m4_define([poppler_version_minor],[36]) +m4_define([poppler_version_micro],[0]) +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([1.7 foreign]) +m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) +AC_CONFIG_HEADERS([config.h 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 +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 -lwinspool -lcomdlg32" + create_shared_lib="-no-undefined" + auto_import_flags="-Wl,--enable-auto-import" + + # Use mingw's ansi stdio extensions + CXXFLAGS="$CXXFLAGS -D__USE_MINGW_ANSI_STDIO=1" + ;; +esac + +AC_SUBST(win32_libs) +AC_SUBST(create_shared_lib) +AC_SUBST(auto_import_flags) + +AX_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) + +dnl ##### Emulate cmake -DCMAKE_BUILD_TYPE=Release using options from cmake/modules/PopplerMacros.cmake + +AC_ARG_ENABLE(build-type, + AC_HELP_STRING([--enable-build-type=@<:@relwithdebinfo/release/debug/debugfull/profile@:>@], + [Build with options similar to 'cmake -DCMAKE_BUILD_TYPE=' values.]), + [enable_build_type=no; + case "$enableval" in + relwithdebinfo|release|debug|debugfull|profile) enable_build_type="$enableval" ;; + *) AC_MSG_ERROR([bad value $enableval for --enable-build-type option. + Options are relwithdebinfo, release, debug, debugfull, and profile.]) ;; + esac], + enable_build_type=no) + +if test "x$GCC" = "xyes"; then + case "$enable_build_type" in + relwithdebinfo) + CFLAGS="-O2 -g $CFLAGS" + CXXFLAGS="-O2 -g $CXXFLAGS" + ;; + release) + CFLAGS="-O2 $CFLAGS -g0 -DNDEBUG" + CXXFLAGS="-O2 $CXXFLAGS -g0 -DNDEBUG" + ;; + debug) + CFLAGS="-O2 -g $CFLAGS -fno-reorder-blocks -fno-schedule-insns -fno-inline" + CXXFLAGS="-O2 -g $CXXFLAGS -fno-reorder-blocks -fno-schedule-insns -fno-inline" + ;; + debugfull) + CFLAGS="$CFLAGS -g3 -fno-inline" + CXXFLAGS="$CXXFLAGS -g3 -fno-inline" + ;; + profile) + CFLAGS="$CFLAGS -g3 -fno-inline -ftest-coverage -fprofile-arcs" + CXXFLAGS="$CXXFLAGS -g3 -fno-inline -ftest-coverage -fprofile-arcs" + LDFLAGS="$LDFLAGS -fprofile-arcs -ftest-coverage -lgcov" + ;; + *) + enable_build_type=no + ;; + esac +else + case "$enable_build_type" in + relwithdebinfo|release|debug|debugfull|profile) + echo " Warning: --enable-build-type ignored for non-gcc compiler." + ;; + esac + enable_build_type=no +fi + +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])) + +AC_ARG_ENABLE(cmyk, +[ --enable-cmyk Include support for CMYK rasterization], +AC_DEFINE(SPLASH_CMYK, [1], [Include support for CMYK rasterization])) + +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 + +dnl ##### Check for installed poppler-data. Use the same datarootdir as default otherwise. +PKG_CHECK_EXISTS(poppler-data, + [POPPLER_DATADIR=`$PKG_CONFIG --variable=poppler_datadir poppler-data` + AC_DEFINE_DIR(POPPLER_DATADIR, "{POPPLER_DATADIR}", [Poppler data dir])], + [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])) +AC_CHECK_FUNC(rand_r, AC_DEFINE(HAVE_RAND_R, 1, [Defines if rand_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. +openjpeg1="no" +openjpeg2="no" +AC_ARG_ENABLE(libopenjpeg, + AC_HELP_STRING([--enable-libopenjpeg=@<:@auto/openjpeg1/openjpeg2/none@:>@], + [Use openjpeg for JPEG2000 images. 'auto' prefers openjpeg1 over openjpeg2 if both are available due to regressions in openjpeg2 [[default=auto]]]), + [enable_libopenjpeg=$enableval], + [enable_libopenjpeg="auto"]) + +openjpeg_header=yes + +dnl test for libopenjpeg1 +if test x$enable_libopenjpeg = xopenjpeg1 || test x$enable_libopenjpeg = xauto; then + PKG_CHECK_MODULES(LIBOPENJPEG, libopenjpeg, + [openjpeg1="yes"], + [AC_CHECK_LIB([openjpeg], [opj_cio_open], + [openjpeg1="yes" + LIBOPENJPEG_LIBS="-lopenjpeg"],[openjpeg_header=no]) + AC_CHECK_HEADERS([openjpeg.h],, + [openjpeg="no"])]) +fi + +dnl test for libopenjpeg2 +if test x$openjpeg1 = xno; then + if test x$enable_libopenjpeg = xopenjpeg2 || test x$enable_libopenjpeg = xauto; then + PKG_CHECK_MODULES(LIBOPENJPEG, libopenjp2, + [openjpeg2=yes],[]) + fi +fi + +if test x$enable_libopenjpeg = xopenjpeg1 && test x$openjpeg1 = xno; then + if test x$openjpeg_header = xno; then + AC_MSG_ERROR("*** libopenjpeg headers not found ***") + else + AC_MSG_ERROR("*** libopenjpeg library not found ***") + fi +fi + +if test x$enable_libopenjpeg = xopenjpeg2 && test x$openjpeg2 = xno; then + AC_MSG_ERROR("*** libopenjp2 library not found ***") +fi + +if test x$openjpeg1 = xyes || test x$openjpeg2 = xyes; then + enable_libopenjpeg=yes + if test x$openjpeg1 = xyes; then + AC_DEFINE(USE_OPENJPEG1, 1, [Defined if using openjpeg1]) + fi + if test x$openjpeg2 = xyes; then + AC_DEFINE(USE_OPENJPEG2, 1, [Defined if using openjpeg2]) + fi + + 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.])], + [PKG_CHECK_EXISTS(libopenjpeg1 >= 1.5, + [AC_DEFINE(WITH_OPENJPEG_IGNORE_PCLR_CMAP_CDEF_FLAG, 1, [OpenJPEG with the OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG flag.])], + []) + ]) +else + enable_libopenjpeg=no +fi + +AM_CONDITIONAL(BUILD_LIBOPENJPEG, test x$openjpeg1 = xyes || test x$openjpeg2 = 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" != x; 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_CFLAGS) + 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) +AC_CHECK_FUNCS(strcpy_s strcat_s) + +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 +AC_CHECK_FUNCS(pread64 lseek64) + +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) +CAIRO_DEPS="cairo >= $CAIRO_VERSION cairo-ft >= $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_DEPS) +elif test x$enable_cairo_output = xtry; then + PKG_CHECK_MODULES(CAIRO, $CAIRO_DEPS, + [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 gio-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 gio-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 gio-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.7.0 QtGui >= 4.7.0 QtXml >= 4.7.0) + PKG_CHECK_MODULES(POPPLER_QT4_TEST, + QtTest >= 4.7.0) +elif test x$enable_poppler_qt4 = xtry; then + PKG_CHECK_MODULES(POPPLER_QT4, + QtCore >= 4.7.0 QtGui >= 4.7.0 QtXml >= 4.7.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.7.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(MOCQT42, moc-qt4) + AC_MSG_CHECKING([for Qt4 moc-qt4]) + mocversion=`$MOCQT42 -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" + else + MOCQT4=$MOCQT42 + fi + fi + AC_SUBST(MOCQT4) + AC_MSG_RESULT([$MOCQT4]) +fi + +AM_CONDITIONAL(BUILD_POPPLER_QT4, test "x$enable_poppler_qt4" = "xyes") + +dnl +dnl Try Qt5 +dnl + +AC_ARG_ENABLE(poppler-qt5, + AC_HELP_STRING([--disable-poppler-qt5], + [Don't compile poppler Qt5 wrapper.]), + enable_poppler_qt5=$enableval, + enable_poppler_qt5="try") +if test x$enable_poppler_qt5 = xyes; then + PKG_CHECK_MODULES(POPPLER_QT5, + Qt5Core >= 5.0.0 Qt5Gui >= 5.0.0 Qt5Xml >= 5.0.0 Qt5Widgets >= 5.0.0) + PKG_CHECK_MODULES(POPPLER_QT5_TEST, + Qt5Test >= 5.0.0 ) +elif test x$enable_poppler_qt5 = xtry; then + PKG_CHECK_MODULES(POPPLER_QT5, + Qt5Core >= 5.0.0 Qt5Gui >= 5.0.0 Qt5Xml >= 5.0.0 Qt5Widgets >= 5.0.0, + [enable_poppler_qt5="yes"], + [enable_poppler_qt5="no"]) + if test x$enable_poppler_qt5 = xyes; then + PKG_CHECK_MODULES(POPPLER_QT5_TEST, + Qt5Test >= 5.0.0, + [enable_poppler_qt5="yes"], + [enable_poppler_qt5="no"]) + fi +fi + +AC_SUBST(POPPLER_QT5_CXXFLAGS) +AC_SUBST(POPPLER_QT5_LIBS) +AC_SUBST(POPPLER_QT5_TEST_LIBS) + +if test x$enable_poppler_qt5 = xyes; then + AC_CHECK_TOOL(MOCQT5, moc) + AC_MSG_CHECKING([for Qt5 moc]) + mocversion=`$MOCQT5 -v 2>&1` + mocversiongrep=`echo $mocversion | grep "Qt 5\|moc 5"` + if test x"$mocversiongrep" != x"$mocversion"; then + AC_MSG_RESULT([no]) + # moc was not the qt5 one, try with moc-qt5 + AC_CHECK_TOOL(MOCQT52, moc-qt5) + AC_MSG_CHECKING([for Qt5 moc-qt5]) + mocversion=`$MOCQT52 -v 2>&1` + mocversiongrep=`echo $mocversion | grep "Qt 5\|moc-qt5 5\|moc 5"` + if test x"$mocversiongrep" != x"$mocversion"; then + AC_CHECK_TOOL(QTCHOOSER, qtchooser) + AC_MSG_CHECKING([for qtchooser]) + qt5tooldir=`QT_SELECT=qt5 qtchooser -print-env | grep QTTOOLDIR | cut -d '=' -f 2 | cut -d \" -f 2` + mocversion=`$qt5tooldir/moc -v 2>&1` + mocversiongrep=`echo $mocversion | grep "Qt 5\|moc 5"` + if test x"$mocversiongrep" != x"$mocversion"; then + # no valid moc found + enable_poppler_qt5=no; + MOCQT5="not found" + else + MOCQT5=$qt5tooldir/moc + fi + else + MOCQT5=$MOCQT52 + fi + fi + AC_SUBST(MOCQT5) + AC_MSG_RESULT([$MOCQT5]) +fi + +AM_CONDITIONAL(BUILD_POPPLER_QT5, test "x$enable_poppler_qt5" = "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") + + +GTK_TEST_DEPS='gtk+-3.0 >= 3.8 gdk-pixbuf-2.0' +if test x$enable_cairo_output = xyes; then + GTK_TEST_DEPS="$GTK_TEST_DEPS $CAIRO_DEPS" +fi +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_TEST_DEPS) +elif test x$enable_gtk_test = xtry; then + PKG_CHECK_MODULES(GTK_TEST, $GTK_TEST_DEPS, + [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([--enable-cms=@<:@auto/lcms1/lcms2/none@:>@], + [Use color management system. 'auto' prefers lcms2 over lcms1 if both are available [[default=auto]]]), + [enable_cms=$enableval], + [enable_cms="auto"]) +if test x$enable_cms = xauto; then + PKG_CHECK_MODULES(LCMS, lcms2, [lcms2=yes], [lcms2=no]) + if test x$lcms2 = xno; then + PKG_CHECK_MODULES(LCMS, lcms, [lcms1=yes], [lcms1=no]) + fi +elif test x$enable_cms = xlcms1; then + PKG_CHECK_MODULES(LCMS, lcms, [lcms1=yes], [lcms1=no]) +elif test x$enable_cms = xlcms2; then + PKG_CHECK_MODULES(LCMS, lcms2, [lcms2=yes], [lcms2=no]) +fi + +if test x$lcms1 = xyes || test x$lcms2 = xyes; then + enable_cms=yes + AC_DEFINE(USE_CMS, 1, [Defines if use cms]) + if test x$lcms1 = xyes; then + lcms1=yes; + AC_DEFINE(USE_LCMS1, 1, [Defines if use lcms1]) + fi +else + enable_cms=no +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) + +# some compilers do not support this flag (see bug #76963) +fno_check_new= +AC_MSG_CHECKING([for -fno-check-new compiler flag]) +AC_LANG_PUSH([C++]) +saved_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-fno-check-new $CXXFLAGS" +AC_TRY_COMPILE([], [], + [AC_MSG_RESULT([yes]) + fno_check_new="-fno-check-new"], + AC_MSG_RESULT([no]) +) +CXXFLAGS=$saved_CXXFLAGS +AC_LANG_POP + +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"; + CFLAGS="-Wall $CFLAGS" ;; + 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 "$host_os" in + mingw*) + # mingw prints "warning: -fPIC ignored for target (all code is position independent)" + # for every file + ;; + *) + CXXFLAGS="-fPIC $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 +qt5/Makefile +qt5/src/Makefile +qt5/tests/Makefile +qt5/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-qt5.pc +poppler-qt5-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" +if test x$enable_cmyk = xyes;then + echo " with CMYK support" +fi +echo " cairo output: $use_cairo" +echo " qt4 wrapper: $enable_poppler_qt4" +echo " qt5 wrapper: $enable_poppler_qt5" +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" +if test x$enable_libopenjpeg = xyes;then + if test x$openjpeg1 = xyes;then + echo " with openjpeg1" + else + echo " with openjpeg2" + fi +fi +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 +if test x$enable_build_type != xno;then + echo " build type: $enable_build_type" +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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiBase.cc b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiBase.cc new file mode 100644 index 00000000000..86bafd80208 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiBase.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiBase.h b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiBase.h new file mode 100644 index 00000000000..d613acd2bb1 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiBase.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiEncodings.cc b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiEncodings.cc new file mode 100644 index 00000000000..5cea6fab7f1 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiEncodings.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiEncodings.h b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiEncodings.h new file mode 100644 index 00000000000..ab80ad362a6 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiEncodings.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiIdentifier.cc b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiIdentifier.cc new file mode 100644 index 00000000000..be28e2568eb --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiIdentifier.cc @@ -0,0 +1,648 @@ +//======================================================================== +// +// FoFiIdentifier.cc +// +// Copyright 2009 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) 2013 Christoph Duelli <duelli@melosgmbh.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 +// +//======================================================================== + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include <stdio.h> +#include <string.h> +#include <limits.h> +#include "goo/gtypes.h" +#include "FoFiIdentifier.h" + +//------------------------------------------------------------------------ + +namespace { // do not pollute global namespace + +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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiIdentifier.h b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiIdentifier.h new file mode 100644 index 00000000000..af1323b76d6 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiIdentifier.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiTrueType.cc b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiTrueType.cc new file mode 100644 index 00000000000..11699dd6119 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiTrueType.cc @@ -0,0 +1,1863 @@ +//======================================================================== +// +// 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, 2014, 2015 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> +// Copyright (C) 2014 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2015 Aleksei Volkov <Aleksei Volkov> +// Copyright (C) 2015 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 <string.h> +#include <algorithm> +#include "goo/gtypes.h" +#include "goo/gmem.h" +#include "goo/GooLikely.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::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, vmtxTabLength; + 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 + vmtxTabLength = 0; + 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; + vmtxTabLength = length; + 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) { + if (unlikely(length > (int)sizeof(vheaTab))) { + error(errSyntaxWarning, -1, "length bigger than vheaTab size"); + length = sizeof(vheaTab); + } + dumpString(vheaTab, length, outputFunc, outputStream); + } else if (needVerticalMetrics && i == t42VmtxTable) { + if (unlikely(length > vmtxTabLength)) { + error(errSyntaxWarning, -1, "length bigger than vmtxTab size"); + length = vmtxTabLength; + } + 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 || + (!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; + } + + // read the post table + readPostTable(); +} + +void FoFiTrueType::readPostTable() { + GooString *name; + int tablePos, postFmt, stringIdx, stringPos, savedStringIdx; + 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 { + savedStringIdx = stringIdx; + 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)) { + stringIdx = savedStringIdx; + if (j < 258) { + ok = gTrue; + nameToGID->removeInt(macGlyphNames[j]); + nameToGID->add(new GooString(macGlyphNames[0]), i); + } else { + goto err; + } + } else { + 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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiTrueType.h b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiTrueType.h new file mode 100644 index 00000000000..b40a44a8d70 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiTrueType.h @@ -0,0 +1,209 @@ +//======================================================================== +// +// 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, 2012 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); + + // 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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1.cc b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1.cc new file mode 100644 index 00000000000..151f2d5f5bb --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1.cc @@ -0,0 +1,359 @@ +//======================================================================== +// +// 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 <jwilk@jwilk.net> +// Copyright (C) 2014 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> + +#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 && code < INT_MAX / (base + (*p - '0')); ++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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1.h b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1.h new file mode 100644 index 00000000000..f4e29b4ef0b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1C.cc b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1C.cc new file mode 100644 index 00000000000..c4595a3260e --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1C.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1C.h b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1C.h new file mode 100644 index 00000000000..698dccd77fd --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/FoFiType1C.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/fofi/Makefile.am b/Build/source/libs/poppler/poppler-0.36.0/fofi/Makefile.am new file mode 100644 index 00000000000..4deb7d5e063 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/fofi/Makefile.am @@ -0,0 +1,28 @@ +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 + +libfofi_la_CPPFLAGS = \ + -I$(top_srcdir) diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/FixedPoint.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/FixedPoint.cc new file mode 100644 index 00000000000..26b2f0fe890 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/FixedPoint.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/FixedPoint.h b/Build/source/libs/poppler/poppler-0.36.0/goo/FixedPoint.h new file mode 100644 index 00000000000..99749802db7 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/FixedPoint.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/GooHash.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/GooHash.cc new file mode 100644 index 00000000000..f4a92f17506 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooHash.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/GooHash.h b/Build/source/libs/poppler/poppler-0.36.0/goo/GooHash.h new file mode 100644 index 00000000000..eda19e31409 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooHash.h @@ -0,0 +1,92 @@ +//======================================================================== +// +// GooHash.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) 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 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: + GooHash(const GooHash &other); + GooHash& operator=(const GooHash &other); + + 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/Build/source/libs/poppler/poppler-0.36.0/goo/GooLikely.h b/Build/source/libs/poppler/poppler-0.36.0/goo/GooLikely.h new file mode 100644 index 00000000000..724ccf00870 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooLikely.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/GooList.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/GooList.cc new file mode 100644 index 00000000000..6ce4952dc6a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooList.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/GooList.h b/Build/source/libs/poppler/poppler-0.36.0/goo/GooList.h new file mode 100644 index 00000000000..c83a0e36a8a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooList.h @@ -0,0 +1,120 @@ +//======================================================================== +// +// GooList.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) 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 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: + GooList(const GooList &other); + GooList& operator=(const GooList &other); + + 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/Build/source/libs/poppler/poppler-0.36.0/goo/GooMutex.h b/Build/source/libs/poppler/poppler-0.36.0/goo/GooMutex.h new file mode 100644 index 00000000000..b2714b048c7 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooMutex.h @@ -0,0 +1,85 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> +// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com> +// Copyright (C) 2014 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 +// +//======================================================================== + +#ifndef GMUTEX_H +#define GMUTEX_H + +// Usage: +// +// GooMutex m; +// gInitMutex(&m); +// ... +// gLockMutex(&m); +// ... critical section ... +// gUnlockMutex(&m); +// ... +// gDestroyMutex(&m); + +#ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif +#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; + +inline void gInitMutex(GooMutex *m) { + pthread_mutexattr_t mutexattr; + pthread_mutexattr_init(&mutexattr); + pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(m, &mutexattr); + pthread_mutexattr_destroy(&mutexattr); +} +#define gDestroyMutex(m) pthread_mutex_destroy(m) +#define gLockMutex(m) pthread_mutex_lock(m) +#define gUnlockMutex(m) pthread_mutex_unlock(m) + +#endif + +class MutexLocker { +public: + MutexLocker(GooMutex *mutexA) : mutex(mutexA) { gLockMutex(mutex); } + ~MutexLocker() { gUnlockMutex(mutex); } + +private: + GooMutex *mutex; +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/GooString.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/GooString.cc new file mode 100644 index 00000000000..3f22f368560 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooString.cc @@ -0,0 +1,962 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2012 Pino Toscano <pino@kde.org> +// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> +// Copyright (C) 2015 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 <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, + fmtIntHexUpper, + fmtIntOctal, + fmtIntBinary, + fmtUIntDecimal, + fmtUIntHex, + fmtUIntHexUpper, + fmtUIntOctal, + fmtUIntBinary, + fmtLongDecimal, + fmtLongHex, + fmtLongHexUpper, + fmtLongOctal, + fmtLongBinary, + fmtULongDecimal, + fmtULongHex, + fmtULongHexUpper, + fmtULongOctal, + fmtULongBinary, +#ifdef LLONG_MAX + fmtLongLongDecimal, + fmtLongLongHex, + fmtLongLongHexUpper, + fmtLongLongOctal, + fmtLongLongBinary, +#endif +#ifdef ULLONG_MAX + fmtULongLongDecimal, + fmtULongLongHex, + fmtULongLongHexUpper, + fmtULongLongOctal, + fmtULongLongBinary, +#endif + fmtDouble, + fmtDoubleTrimSmallAware, + fmtDoubleTrim, + fmtChar, + fmtString, + fmtGooString, + fmtSpace +}; + +static const char *formatStrings[] = { + "d", "x", "X", "o", "b", "ud", "ux", "uX", "uo", "ub", + "ld", "lx", "lX", "lo", "lb", "uld", "ulx", "ulX", "ulo", "ulb", +#ifdef LLONG_MAX + "lld", "llx", "llX", "llo", "llb", +#endif +#ifdef ULLONG_MAX + "ulld", "ullx", "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; + GooStringFormatArg argsBuf[ 8 ]; + + argsLen = 0; + argsSize = sizeof(argsBuf) / sizeof(argsBuf[0]); + args = argsBuf; + + 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; + if (args == argsBuf) { + args = (GooStringFormatArg *)gmallocn(argsSize, sizeof(GooStringFormatArg)); + memcpy(args, argsBuf, argsLen * sizeof(GooStringFormatArg)); + } else { + args = (GooStringFormatArg *)greallocn(args, argsSize, + sizeof(GooStringFormatArg)); + } + } + switch (ft) { + case fmtIntDecimal: + case fmtIntHex: + case fmtIntHexUpper: + case fmtIntOctal: + case fmtIntBinary: + case fmtSpace: + args[argsLen].i = va_arg(argList, int); + break; + case fmtUIntDecimal: + case fmtUIntHex: + case fmtUIntHexUpper: + case fmtUIntOctal: + case fmtUIntBinary: + args[argsLen].ui = va_arg(argList, Guint); + break; + case fmtLongDecimal: + case fmtLongHex: + case fmtLongHexUpper: + case fmtLongOctal: + case fmtLongBinary: + args[argsLen].l = va_arg(argList, long); + break; + case fmtULongDecimal: + case fmtULongHex: + case fmtULongHexUpper: + case fmtULongOctal: + case fmtULongBinary: + args[argsLen].ul = va_arg(argList, Gulong); + break; +#ifdef LLONG_MAX + case fmtLongLongDecimal: + case fmtLongLongHex: + case fmtLongLongHexUpper: + case fmtLongLongOctal: + case fmtLongLongBinary: + args[argsLen].ll = va_arg(argList, long long); + break; +#endif +#ifdef ULLONG_MAX + case fmtULongLongDecimal: + case fmtULongLongHex: + case fmtULongLongHexUpper: + 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 fmtIntHexUpper: + formatInt(arg.i, buf, sizeof(buf), zeroFill, width, 16, &str, &len, + gTrue); + 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 fmtUIntHexUpper: + formatUInt(arg.ui, buf, sizeof(buf), zeroFill, width, 16, + &str, &len, gTrue); + 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 fmtLongHexUpper: + formatInt(arg.l, buf, sizeof(buf), zeroFill, width, 16, &str, &len, + gTrue); + 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 fmtULongHexUpper: + formatUInt(arg.ul, buf, sizeof(buf), zeroFill, width, 16, + &str, &len, gTrue); + 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 fmtLongLongHexUpper: + formatInt(arg.ll, buf, sizeof(buf), zeroFill, width, 16, &str, &len, + gTrue); + 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 fmtULongLongHexUpper: + formatUInt(arg.ull, buf, sizeof(buf), zeroFill, width, 16, + &str, &len, gTrue); + 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; + } + } + + if (args != argsBuf) { + gfree(args); + } + + return this; +} + +static const char lowerCaseDigits[17] = "0123456789abcdef"; +static const char upperCaseDigits[17] = "0123456789ABCDEF"; + +#ifdef LLONG_MAX +void GooString::formatInt(long long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len, GBool upperCase) { +#else +void GooString::formatInt(long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len, GBool upperCase) { +#endif + const char *vals = upperCase ? upperCaseDigits : lowerCaseDigits; + GBool neg; + int start, i, j; +#ifdef LLONG_MAX + unsigned long long abs_x; +#else + unsigned long abs_x; +#endif + + i = bufSize; + if ((neg = x < 0)) { + abs_x = -x; + } else { + abs_x = x; + } + start = neg ? 1 : 0; + if (abs_x == 0) { + buf[--i] = '0'; + } else { + while (i > start && abs_x) { + buf[--i] = vals[abs_x % base]; + abs_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, GBool upperCase) { +#else +void GooString::formatUInt(Gulong x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len, GBool upperCase) { +#endif + const char *vals = upperCase ? upperCaseDigits : lowerCaseDigits; + 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 prevLen = length; + if (CALC_STRING_LEN == lengthA) + lengthA = strlen(str); + + resize(length + lengthA); + memmove(s+i+lengthA, s+i, prevLen-i); + 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::endsWith(const char *suffix) const { + int suffixLen = strlen(suffix); + + if (length < suffixLen) + return gFalse; + + return strcmp(s + length - suffixLen, suffix) == 0; +} + +GBool GooString::hasUnicodeMarker(void) +{ + return length > 1 && (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/Build/source/libs/poppler/poppler-0.36.0/goo/GooString.h b/Build/source/libs/poppler/poppler-0.36.0/goo/GooString.h new file mode 100644 index 00000000000..cca5a905e97 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooString.h @@ -0,0 +1,233 @@ +//======================================================================== +// +// 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, 2014 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2012-2014 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> +// Copyright (C) 2015 Adam Reichold <adam.reichold@t-online.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 GooString_H +#define GooString_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include <limits.h> // for LLONG_MAX and ULLONG_MAX + +/* <limits.h> and/or the compiler may or may not define these. */ +/* Minimum and maximum values a `signed long long int' can hold. */ +#ifndef LLONG_MAX +# define LLONG_MAX 9223372036854775807LL +#endif +#ifndef LLONG_MIN +# define LLONG_MIN (-LLONG_MAX - 1LL) +#endif + +/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */ +#ifndef ULLONG_MAX +# define ULLONG_MAX 18446744073709551615ULL +#endif + +#include <stdarg.h> +#include <stdlib.h> // for NULL +#include "gtypes.h" + +#ifdef __clang__ +# define GOOSTRING_FORMAT __attribute__((__annotate__("gooformat"))) +#else +# define GOOSTRING_FORMAT +#endif + +class GooString { +public: + + // 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; + + // 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, X, o, b -- int in decimal, lowercase hex, uppercase hex, octal, binary + // ud, ux, uX, uo, ub -- unsigned int + // ld, lx, lX, lo, lb, uld, ulx, ulX, ulo, ulb -- long, unsigned long + // lld, llx, llX, llo, llb, ulld, ullx, ullX, ullo, ullb + // -- long long, unsigned long long + // f, g, gs -- floating point (float or double) + // f -- always prints trailing zeros (eg 1.0 with .2f will print 1.00) + // g -- omits trailing zeros and, if possible, the dot (eg 1.0 shows up as 1) + // gs -- is like g, but treats <precision> as number of significant + // digits to show (eg 0.0123 with .2gs will print 0.012) + // c -- character (char, short or int) + // s -- string (char *) + // t -- GooString * + // w -- blank space; arg determines width + // To get literal curly braces, use {{ or }}. + static GooString *format(const char *fmt, ...) GOOSTRING_FORMAT; + static GooString *formatv(const char *fmt, va_list argList); + + // Destructor. + ~GooString(); + + // Get length. + int getLength() const { return length; } + + // Get C string. + char *getCString() { return s; } + const char *getCString() const { return s; } + + // Get <i>th character. + char getChar(int i) const { 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_FORMAT; + 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; + + // Return true if string ends with suffix + GBool endsWith(const char *suffix) 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 the final object size for different time/space tradeoffs. + // In libc malloc(), rounding is 16 so it's best to choose a value that + // is a multiple of 16. + class MemoryLayout { + char c[sizeof(char*)]; + int i; + char* s; + }; + + static const int STR_FINAL_SIZE = 32; + static const int STR_STATIC_SIZE = STR_FINAL_SIZE - sizeof(MemoryLayout) + sizeof(char*); + + 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, GBool upperCase = gFalse); +#else + static void formatInt(long x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len, GBool upperCase = gFalse); +#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, GBool upperCase = gFalse); +#else + static void formatUInt(Gulong x, char *buf, int bufSize, + GBool zeroFill, int width, int base, + char **p, int *len, GBool upperCase = gFalse); +#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/Build/source/libs/poppler/poppler-0.36.0/goo/GooTimer.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/GooTimer.cc new file mode 100644 index 00000000000..c766c6bf2e4 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooTimer.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/GooTimer.h b/Build/source/libs/poppler/poppler-0.36.0/goo/GooTimer.h new file mode 100644 index 00000000000..ac64f6b4868 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/GooTimer.h @@ -0,0 +1,62 @@ +//======================================================================== +// +// 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> +// Copyright 2014 Bogdan Cristea <cristeab@gmail.com> +// Copyright 2014 Peter Breitenlohner <peb@mppmu.mpg.de> +// 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 +#ifndef NOMINMAX +#define NOMINMAX +#endif +#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/Build/source/libs/poppler/poppler-0.36.0/goo/ImgWriter.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/ImgWriter.cc new file mode 100644 index 00000000000..a30d26d89ad --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/ImgWriter.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/ImgWriter.h b/Build/source/libs/poppler/poppler-0.36.0/goo/ImgWriter.h new file mode 100644 index 00000000000..8feb3511e4d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/ImgWriter.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/JpegWriter.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/JpegWriter.cc new file mode 100644 index 00000000000..9b7c5051838 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/JpegWriter.cc @@ -0,0 +1,184 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> +// +//======================================================================== + +#include "JpegWriter.h" + +#ifdef ENABLE_LIBJPEG + +extern "C" { +#include <jpeglib.h> +} + +#include "poppler/Error.h" + +struct JpegWriterPrivate { + bool progressive; + int quality; + JpegWriter::Format format; + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; +}; + +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, Format formatA) +{ + priv = new JpegWriterPrivate; + priv->progressive = p; + priv->quality = q; + priv->format = formatA; +} + +JpegWriter::JpegWriter(Format formatA) +{ + priv = new JpegWriterPrivate; + priv->progressive = false; + priv->quality = -1; + priv->format = formatA; +} + +JpegWriter::~JpegWriter() +{ + // cleanup + jpeg_destroy_compress(&priv->cinfo); + delete priv; +} + +bool JpegWriter::init(FILE *f, int width, int height, int hDPI, int vDPI) +{ + // Setup error handler + priv->cinfo.err = jpeg_std_error(&priv->jerr); + priv->jerr.output_message = &outputMessage; + + // Initialize libjpeg + jpeg_create_compress(&priv->cinfo); + + // First set colorspace and call jpeg_set_defaults() since + // jpeg_set_defaults() sets default values for all fields in + // cinfo based on the colorspace. + switch (priv->format) { + case RGB: + priv->cinfo.in_color_space = JCS_RGB; + break; + case GRAY: + priv->cinfo.in_color_space = JCS_GRAYSCALE; + break; + case CMYK: + priv->cinfo.in_color_space = JCS_CMYK; + break; + default: + return false; + } + jpeg_set_defaults(&priv->cinfo); + + // Set destination file + jpeg_stdio_dest(&priv->cinfo, f); + + // Set libjpeg configuration + priv->cinfo.image_width = width; + priv->cinfo.image_height = height; + priv->cinfo.density_unit = 1; // dots per inch + priv->cinfo.X_density = hDPI; + priv->cinfo.Y_density = vDPI; + switch (priv->format) { + case GRAY: + priv->cinfo.input_components = 1; + break; + case RGB: + priv->cinfo.input_components = 3; + break; + case CMYK: + priv->cinfo.input_components = 4; + jpeg_set_colorspace(&priv->cinfo, JCS_YCCK); + priv->cinfo.write_JFIF_header = TRUE; + break; + default: + return false; + } + + // Set quality + if (priv->quality >= 0 && priv->quality <= 100) { + jpeg_set_quality(&priv->cinfo, priv->quality, TRUE); + } + + // Use progressive mode + if (priv->progressive) { + jpeg_simple_progression(&priv->cinfo); + } + + // Get ready for data + jpeg_start_compress(&priv->cinfo, TRUE); + + return true; +} + +bool JpegWriter::writePointers(unsigned char **rowPointers, int rowCount) +{ + if (priv->format == CMYK) { + for (int y = 0; y < rowCount; y++) { + unsigned char *row = rowPointers[y]; + for (unsigned int x = 0; x < priv->cinfo.image_width; x++) { + for (int n = 0; n < 4; n++) { + *row = 0xff - *row; + row++; + } + } + } + } + // Write all rows to the file + jpeg_write_scanlines(&priv->cinfo, rowPointers, rowCount); + + return true; +} + +bool JpegWriter::writeRow(unsigned char **rowPointer) +{ + if (priv->format == CMYK) { + unsigned char *row = rowPointer[0]; + for (unsigned int x = 0; x < priv->cinfo.image_width; x++) { + for (int n = 0; n < 4; n++) { + *row = 0xff - *row; + row++; + } + } + } + // Write the row to the file + jpeg_write_scanlines(&priv->cinfo, rowPointer, 1); + + return true; +} + +bool JpegWriter::close() +{ + jpeg_finish_compress(&priv->cinfo); + + return true; +} + +bool JpegWriter::supportCMYK() +{ + return priv->format == CMYK; +} + + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/JpegWriter.h b/Build/source/libs/poppler/poppler-0.36.0/goo/JpegWriter.h new file mode 100644 index 00000000000..d69bbbb8dda --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/JpegWriter.h @@ -0,0 +1,59 @@ +//======================================================================== +// +// JpegWriter.h +// +// 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 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" + +struct JpegWriterPrivate; + +class JpegWriter : public ImgWriter +{ +public: + /* RGB - 3 bytes/pixel + * GRAY - 1 byte/pixel + * CMYK - 4 bytes/pixel + */ + enum Format { RGB, GRAY, CMYK }; + + JpegWriter(int quality, bool progressive, Format format = RGB); + JpegWriter(Format format = 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(); + +private: + JpegWriter(const JpegWriter &other); + JpegWriter& operator=(const JpegWriter &other); + + JpegWriterPrivate *priv; +}; + +#endif + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/Makefile.am b/Build/source/libs/poppler/poppler-0.36.0/goo/Makefile.am new file mode 100644 index 00000000000..370e85021be --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/Makefile.am @@ -0,0 +1,66 @@ +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 \ + NetPBMWriter.h \ + PNGWriter.h \ + JpegWriter.h \ + TiffWriter.h \ + ImgWriter.h \ + GooLikely.h \ + gstrtod.h \ + grandom.h + +endif + +libgoo_la_SOURCES = \ + gfile.cc \ + gmempp.cc \ + GooHash.cc \ + GooList.cc \ + GooTimer.cc \ + GooString.cc \ + gmem.cc \ + FixedPoint.cc \ + NetPBMWriter.cc \ + PNGWriter.cc \ + JpegWriter.cc \ + TiffWriter.cc \ + ImgWriter.cc \ + gtypes_p.h \ + gstrtod.cc \ + grandom.cc + +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 + +libgoo_la_CPPFLAGS = \ + -I$(top_srcdir) \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libjpeg2000_includes) \ + $(libpng_includes) diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/NetPBMWriter.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/NetPBMWriter.cc new file mode 100644 index 00000000000..fca00b26b1a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/NetPBMWriter.cc @@ -0,0 +1,84 @@ +//======================================================================== +// +// NetPBMWriter.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) 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, 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Thomas Fischer <fischer@unix-ag.uni-kl.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 "poppler-config.h" + +#include "NetPBMWriter.h" + +// Writer for the NetPBM formats (PBM and PPM) +// This format is documented at: +// http://netpbm.sourceforge.net/doc/pbm.html +// http://netpbm.sourceforge.net/doc/ppm.html + +NetPBMWriter::NetPBMWriter(Format formatA) : format(formatA) +{ +} + +bool NetPBMWriter::init(FILE *f, int widthA, int heightA, int hDPI, int vDPI) +{ + file = f; + width = widthA; + if (format == MONOCHROME) { + fprintf(file, "P4\n"); + fprintf(file, "%d %d\n", widthA, heightA); + } else { + fprintf(file, "P6\n"); + fprintf(file, "%d %d\n", widthA, heightA); + fprintf(file, "255\n"); + } + return true; +} + +bool NetPBMWriter::writePointers(unsigned char **rowPointers, int rowCount) +{ + for (int i = 0; i < rowCount; i++) + writeRow(&rowPointers[i]); + return true; +} + +bool NetPBMWriter::writeRow(unsigned char **row) +{ + if (format == MONOCHROME) { + // PBM uses 0 = white, 1 = black so we need to invert the colors + int size = (width + 7)/8; + for (int i = 0; i < size; i++) + fputc((*row)[i] ^ 0xff, file); + } else { + fwrite(*row, 1, width*3, file); + } + return true; +} + + +bool NetPBMWriter::close() +{ + return true; +} + diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/NetPBMWriter.h b/Build/source/libs/poppler/poppler-0.36.0/goo/NetPBMWriter.h new file mode 100644 index 00000000000..21a19ee7508 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/NetPBMWriter.h @@ -0,0 +1,52 @@ +//======================================================================== +// +// NetPBMWriter.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, 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2010 Brian Cameron <brian.cameron@oracle.com> +// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag@alfa.de> +// +//======================================================================== + +#ifndef NETPBMWRITER_H +#define NETPBMWRITER_H + +#include "poppler-config.h" + +#include "ImgWriter.h" + +// Writer for the NetPBM formats (PBM and PPM) +// This format is documented at: +// http://netpbm.sourceforge.net/doc/pbm.html +// http://netpbm.sourceforge.net/doc/ppm.html + +class NetPBMWriter : public ImgWriter +{ +public: + + /* RGB - 3 bytes/pixel + * MONOCHROME - 8 pixels/byte + */ + enum Format { RGB, MONOCHROME }; + + NetPBMWriter(Format formatA = RGB); + ~NetPBMWriter() {}; + + 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: + FILE *file; + Format format; + int width; +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/PNGWriter.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/PNGWriter.cc new file mode 100644 index 00000000000..c9d5199d040 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/PNGWriter.cc @@ -0,0 +1,189 @@ +//======================================================================== +// +// 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, 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2011 Thomas Klausner <wiz@danbala.tuwien.ac.at> +// Copyright (C) 2012 Pino Toscano <pino@kde.org> +// +//======================================================================== + +#include "PNGWriter.h" + +#ifdef ENABLE_LIBPNG + +#include <zlib.h> +#include <stdlib.h> +#include <string.h> + +#include "poppler/Error.h" +#include "goo/gmem.h" + +#include <png.h> + +struct PNGWriterPrivate { + PNGWriter::Format format; + png_structp png_ptr; + png_infop info_ptr; + unsigned char *icc_data; + int icc_data_size; + char *icc_name; + bool sRGB_profile; +}; + +PNGWriter::PNGWriter(Format formatA) +{ + priv = new PNGWriterPrivate; + priv->format = formatA; + priv->icc_data = NULL; + priv->icc_data_size = 0; + priv->icc_name = NULL; + priv->sRGB_profile = false; +} + +PNGWriter::~PNGWriter() +{ + /* cleanup heap allocation */ + png_destroy_write_struct(&priv->png_ptr, &priv->info_ptr); + if (priv->icc_data) { + gfree(priv->icc_data); + free(priv->icc_name); + } + + delete priv; +} + +void PNGWriter::setICCProfile(const char *name, unsigned char *data, int size) +{ + priv->icc_data = (unsigned char *)gmalloc(size); + memcpy(priv->icc_data, data, size); + priv->icc_data_size = size; + priv->icc_name = strdup(name); +} + +void PNGWriter::setSRGBProfile() +{ + priv->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)priv->icc_data; +#else + png_const_bytep icc_data_ptr = (png_const_bytep)priv->icc_data; +#endif + + /* initialize stuff */ + priv->png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!priv->png_ptr) { + error(errInternal, -1, "png_create_write_struct failed"); + return false; + } + + priv->info_ptr = png_create_info_struct(priv->png_ptr); + if (!priv->info_ptr) { + error(errInternal, -1, "png_create_info_struct failed"); + return false; + } + + if (setjmp(png_jmpbuf(priv->png_ptr))) { + error(errInternal, -1, "png_jmpbuf failed"); + return false; + } + + /* write header */ + png_init_io(priv->png_ptr, f); + if (setjmp(png_jmpbuf(priv->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(priv->png_ptr, Z_BEST_COMPRESSION); + + // Silence silly gcc + png_byte bit_depth = -1; + png_byte color_type = -1; + switch (priv->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(priv->png_ptr, priv->info_ptr, width, height, bit_depth, color_type, interlace_type, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + + png_set_pHYs(priv->png_ptr, priv->info_ptr, hDPI/0.0254, vDPI/0.0254, PNG_RESOLUTION_METER); + + if (priv->icc_data) + png_set_iCCP(priv->png_ptr, priv->info_ptr, priv->icc_name, PNG_COMPRESSION_TYPE_BASE, icc_data_ptr, priv->icc_data_size); + else if (priv->sRGB_profile) + png_set_sRGB(priv->png_ptr, priv->info_ptr, PNG_sRGB_INTENT_RELATIVE); + + png_write_info(priv->png_ptr, priv->info_ptr); + if (setjmp(png_jmpbuf(priv->png_ptr))) { + error(errInternal, -1, "error during writing png info bytes"); + return false; + } + + return true; +} + +bool PNGWriter::writePointers(unsigned char **rowPointers, int rowCount) +{ + png_write_image(priv->png_ptr, rowPointers); + /* write bytes */ + if (setjmp(png_jmpbuf(priv->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(priv->png_ptr, row, 1); + if (setjmp(png_jmpbuf(priv->png_ptr))) { + error(errInternal, -1, "error during png row write"); + return false; + } + + return true; +} + +bool PNGWriter::close() +{ + /* end write */ + png_write_end(priv->png_ptr, priv->info_ptr); + if (setjmp(png_jmpbuf(priv->png_ptr))) { + error(errInternal, -1, "Error during end of write"); + return false; + } + + return true; +} + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/PNGWriter.h b/Build/source/libs/poppler/poppler-0.36.0/goo/PNGWriter.h new file mode 100644 index 00000000000..90a298e7ef3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/PNGWriter.h @@ -0,0 +1,61 @@ +//======================================================================== +// +// 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-2013 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2009 Stefan Thomas <thomas@eload24.com> +// Copyright (C) 2010, 2011, 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2012 Pino Toscano <pino@kde.org> +// +//======================================================================== + +#ifndef PNGWRITER_H +#define PNGWRITER_H + +#include "poppler-config.h" + +#ifdef ENABLE_LIBPNG + +#include "ImgWriter.h" + +struct PNGWriterPrivate; + +class PNGWriter : public ImgWriter +{ +public: + + /* RGB - 3 bytes/pixel + * RGBA - 4 bytes/pixel + * GRAY - 1 byte/pixel + * MONOCHROME - 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: + PNGWriter(const PNGWriter &other); + PNGWriter& operator=(const PNGWriter &other); + + PNGWriterPrivate *priv; +}; + +#endif + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/TiffWriter.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/TiffWriter.cc new file mode 100644 index 00000000000..316008778b1 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/TiffWriter.cc @@ -0,0 +1,236 @@ +//======================================================================== +// +// TiffWriter.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2010, 2012 William Bader <williambader@hotmail.com> +// Copyright (C) 2012 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2012 Pino Toscano <pino@kde.org> +// Copyright (C) 2014 Steven Lee <roc.sky@gmail.com> +// +//======================================================================== + +#include "TiffWriter.h" + +#if ENABLE_LIBTIFF + +#include <string.h> + +#ifdef _WIN32 +#include <io.h> +#endif + +extern "C" { +#include <tiffio.h> +} + +struct TiffWriterPrivate { + TIFF *f; // LibTiff file context + int numRows; // number of rows in the image + int curRow; // number of rows written + const char *compressionString; // compression type + TiffWriter::Format format; // format of image data +}; + +TiffWriter::~TiffWriter() +{ + delete priv; +} + +TiffWriter::TiffWriter(Format formatA) +{ + priv = new TiffWriterPrivate; + priv->f = NULL; + priv->numRows = 0; + priv->curRow = 0; + priv->compressionString = NULL; + priv->format = formatA; +} + +// Set the compression type + +void TiffWriter::setCompressionString(const char *compressionStringArg) +{ + priv->compressionString = compressionStringArg; +} + +// Write a TIFF file. + +bool TiffWriter::init(FILE *openedFile, int width, int height, int hDPI, int vDPI) +{ + unsigned int compression; + uint16 photometric = 0; + uint32 rowsperstrip = (uint32) -1; + int bitspersample; + uint16 samplesperpixel = 0; + 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 + + priv->f = NULL; + priv->curRow = 0; + + // Store the number of rows + + priv->numRows = height; + + // Set the compression + + compression = COMPRESSION_NONE; + + if (priv->compressionString == NULL || strcmp(priv->compressionString, "") == 0) { + compression = COMPRESSION_NONE; + } else { + int i; + for (i = 0; compressionList[i].compressionName != NULL; i++) { + if (strcmp(priv->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", priv->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 format + + bitspersample = (priv->format == MONOCHROME ? 1 : 8); + + switch (priv->format) { + case MONOCHROME: + case GRAY: + samplesperpixel = 1; + photometric = PHOTOMETRIC_MINISBLACK; + break; + + case RGB: + samplesperpixel = 3; + photometric = PHOTOMETRIC_RGB; + break; + + case RGBA_PREMULTIPLIED: + samplesperpixel = 4; + photometric = PHOTOMETRIC_RGB; + break; + + case CMYK: + samplesperpixel = 4; + photometric = PHOTOMETRIC_SEPARATED; + break; + } + + // Open the file + + if (openedFile == NULL) { + fprintf(stderr, "TiffWriter: No output file given.\n"); + return false; + } + +#ifdef _WIN32 + //Convert C Library handle to Win32 Handle + priv->f = TIFFFdOpen(_get_osfhandle(fileno(openedFile)), "-", "w"); +#else + priv->f = TIFFFdOpen(fileno(openedFile), "-", "w"); +#endif + + + if (!priv->f) { + return false; + } + + // Set TIFF tags + + TIFFSetField(priv->f, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField(priv->f, TIFFTAG_IMAGELENGTH, height); + TIFFSetField(priv->f, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField(priv->f, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); + TIFFSetField(priv->f, TIFFTAG_BITSPERSAMPLE, bitspersample); + TIFFSetField(priv->f, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(priv->f, TIFFTAG_PHOTOMETRIC, photometric); + TIFFSetField(priv->f, TIFFTAG_COMPRESSION, (uint16) compression); + TIFFSetField(priv->f, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(priv->f, rowsperstrip)); + TIFFSetField(priv->f, TIFFTAG_XRESOLUTION, (double) hDPI); + TIFFSetField(priv->f, TIFFTAG_YRESOLUTION, (double) vDPI); + TIFFSetField(priv->f, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); + + if (priv->format == RGBA_PREMULTIPLIED) { + uint16 extra = EXTRASAMPLE_ASSOCALPHA; + TIFFSetField(priv->f, TIFFTAG_EXTRASAMPLES, 1, &extra); + } + + if (priv->format == CMYK) { + TIFFSetField(priv->f, TIFFTAG_INKSET, INKSET_CMYK); + TIFFSetField(priv->f, TIFFTAG_NUMBEROFINKS, 4); + } + + 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(priv->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(priv->f, *rowData, priv->curRow, 0) < 0) { + fprintf(stderr, "TiffWriter: Error writing tiff row %d\n", priv->curRow); + return false; + } + + priv->curRow++; + + return true; +} + +bool TiffWriter::close() +{ + // Close the file + + TIFFClose(priv->f); + + return true; +} + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/TiffWriter.h b/Build/source/libs/poppler/poppler-0.36.0/goo/TiffWriter.h new file mode 100644 index 00000000000..52fdd53efa5 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/TiffWriter.h @@ -0,0 +1,60 @@ +//======================================================================== +// +// TiffWriter.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2010, 2012 William Bader <williambader@hotmail.com> +// Copyright (C) 2011, 2012 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2012 Pino Toscano <pino@kde.org> +// +//======================================================================== + +#ifndef TIFFWRITER_H +#define TIFFWRITER_H + +#include "poppler-config.h" + +#ifdef ENABLE_LIBTIFF + +#include <sys/types.h> +#include "ImgWriter.h" + +struct TiffWriterPrivate; + +class TiffWriter : public ImgWriter +{ +public: + /* RGB - 3 bytes/pixel + * RGBA_PREMULTIPLIED - 4 bytes/pixel premultiplied by alpha + * GRAY - 1 byte/pixel + * MONOCHROME - 8 pixels/byte + * CMYK - 4 bytes/pixel + */ + enum Format { RGB, RGBA_PREMULTIPLIED, GRAY, MONOCHROME, CMYK }; + + TiffWriter(Format format = RGB); + ~TiffWriter(); + + void setCompressionString(const char *compressionStringArg); + + 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 supportCMYK() { return true; } + + bool close(); + +private: + TiffWriter(const TiffWriter &other); + TiffWriter& operator=(const TiffWriter &other); + + TiffWriterPrivate *priv; +}; + +#endif + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/gfile.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/gfile.cc new file mode 100644 index 00000000000..3528bb357d8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/gfile.cc @@ -0,0 +1,811 @@ +//======================================================================== +// +// 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, 2012, 2013 Hib Eris <hib@hiberis.nl> +// Copyright (C) 2009, 2012, 2014 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> +// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> +// Copyright (C) 2013 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 _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 <stdio.h> +#include <limits> +#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 *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 +} + +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; + 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 +} + +#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; + size_t 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; (i < sizeof(mode) - 1) && mode[i]; ++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; +} + +int Gfseek(FILE *f, Goffset offset, int whence) { +#if HAVE_FSEEKO + return fseeko(f, offset, whence); +#elif HAVE_FSEEK64 + return fseek64(f, offset, whence); +#elif defined(__MINGW32__) + return fseeko64(f, offset, whence); +#elif _WIN32 + return _fseeki64(f, offset, whence); +#else + return fseek(f, offset, whence); +#endif +} + +Goffset Gftell(FILE *f) { +#if HAVE_FSEEKO + return ftello(f); +#elif HAVE_FSEEK64 + return ftell64(f); +#elif defined(__MINGW32__) + return ftello64(f); +#elif _WIN32 + return _ftelli64(f); +#else + return ftell(f); +#endif +} + +Goffset GoffsetMax() { +#if HAVE_FSEEKO + return (std::numeric_limits<off_t>::max)(); +#elif HAVE_FSEEK64 || defined(__MINGW32__) + return (std::numeric_limits<off64_t>::max)(); +#elif _WIN32 + return (std::numeric_limits<__int64>::max)(); +#else + return (std::numeric_limits<long>::max)(); +#endif +} + +//------------------------------------------------------------------------ +// GooFile +//------------------------------------------------------------------------ + +#ifdef _WIN32 + +int GooFile::read(char *buf, int n, Goffset offset) const { + DWORD m; + + LARGE_INTEGER largeInteger = {0}; + largeInteger.QuadPart = offset; + + OVERLAPPED overlapped = {0}; + overlapped.Offset = largeInteger.LowPart; + overlapped.OffsetHigh = largeInteger.HighPart; + + return FALSE == ReadFile(handle, buf, n, &m, &overlapped) ? -1 : m; +} + +Goffset GooFile::size() const { + LARGE_INTEGER size = {(DWORD)-1,-1}; + + GetFileSizeEx(handle, &size); + + return size.QuadPart; +} + +GooFile* GooFile::open(const GooString *fileName) { + HANDLE handle = CreateFile(fileName->getCString(), + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + + return handle == INVALID_HANDLE_VALUE ? NULL : new GooFile(handle); +} + +GooFile* GooFile::open(const wchar_t *fileName) { + HANDLE handle = CreateFileW(fileName, + GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + + return handle == INVALID_HANDLE_VALUE ? NULL : new GooFile(handle); +} + +#else + +int GooFile::read(char *buf, int n, Goffset offset) const { +#ifdef HAVE_PREAD64 + return pread64(fd, buf, n, offset); +#else + return pread(fd, buf, n, offset); +#endif +} + +Goffset GooFile::size() const { +#ifdef HAVE_LSEEK64 + return lseek64(fd, 0, SEEK_END); +#else + return lseek(fd, 0, SEEK_END); +#endif +} + +GooFile* GooFile::open(const GooString *fileName) { +#ifdef VMS + int fd = ::open(fileName->getCString(), Q_RDONLY, "ctx=stm"); +#else + int fd = ::open(fileName->getCString(), O_RDONLY); +#endif + + return fd < 0 ? NULL : new GooFile(fd); +} + +#endif // _WIN32 + +//------------------------------------------------------------------------ +// 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 = NULL; + +#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; + } + } +#elif defined(ACORN) +#elif defined(MACOS) +#elif defined(VMS) + struct dirent *ent; + 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; + 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/Build/source/libs/poppler/poppler-0.36.0/goo/gfile.h b/Build/source/libs/poppler/poppler-0.36.0/goo/gfile.h new file mode 100644 index 00000000000..1365a9cf2ab --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/gfile.h @@ -0,0 +1,209 @@ +//======================================================================== +// +// 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, 2012 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> +// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com> +// Copyright (C) 2014 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 +// +//======================================================================== + +#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 +# ifndef NOMINMAX +# define NOMINMAX +# endif +# 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 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); + +// 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); + +#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); + +// Like fseek/ftell but uses platform specific variants that support large files +extern int Gfseek(FILE *f, Goffset offset, int whence); +extern Goffset Gftell(FILE *f); + +// Largest offset supported by Gfseek/Gftell +extern Goffset GoffsetMax(); + +//------------------------------------------------------------------------ +// GooFile +//------------------------------------------------------------------------ + +class GooFile +{ +public: + int read(char *buf, int n, Goffset offset) const; + Goffset size() const; + + static GooFile *open(const GooString *fileName); + +#ifdef _WIN32 + static GooFile *open(const wchar_t *fileName); + + ~GooFile() { CloseHandle(handle); } + +private: + GooFile(HANDLE handleA): handle(handleA) {} + HANDLE handle; +#else + ~GooFile() { close(fd); } + +private: + GooFile(int fdA) : fd(fdA) {} + int fd; +#endif // _WIN32 +}; + +//------------------------------------------------------------------------ +// 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: + GDirEntry(const GDirEntry &other); + GDirEntry& operator=(const GDirEntry &other); + + 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: + GDir(const GDir &other); + GDir& operator=(const GDir &other); + + 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/Build/source/libs/poppler/poppler-0.36.0/goo/gmem.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/gmem.cc new file mode 100644 index 00000000000..c1c607ac3f3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/gmem.cc @@ -0,0 +1,326 @@ +/* + * 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, 2012 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) { + 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) { + 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) { + 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) { + 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/Build/source/libs/poppler/poppler-0.36.0/goo/gmem.h b/Build/source/libs/poppler/poppler-0.36.0/goo/gmem.h new file mode 100644 index 00000000000..898f33933f9 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/gmem.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/gmempp.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/gmempp.cc new file mode 100644 index 00000000000..a70338ca3ce --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/gmempp.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/grandom.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/grandom.cc new file mode 100644 index 00000000000..1237175420b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/grandom.cc @@ -0,0 +1,70 @@ +/* + * grandom.cc + * + * This file is licensed under the GPLv2 or later + * + * Pseudo-random number generation + * + * Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> + */ + +#include <config.h> +#include "grandom.h" +#include "gtypes.h" + +#ifdef HAVE_RAND_R // rand_r backend (POSIX) + +static GBool initialized = gFalse; + +#include <stdlib.h> +#include <time.h> +static unsigned int seed; + +static void initialize() { + if (!initialized) { + seed = time(NULL); + initialized = gTrue; + } +} + +void grandom_fill(Guchar *buff, int size) +{ + initialize(); + while (size--) + *buff++ = rand_r(&seed) % 256; +} + +double grandom_double() +{ + initialize(); + return rand_r(&seed) / (1 + (double)RAND_MAX); +} + +#else // srand+rand backend (unsafe, because it may interfere with the application) + +static GBool initialized = gFalse; + +#include <stdlib.h> +#include <time.h> + +static void initialize() { + if (!initialized) { + srand(time(NULL)); + initialized = gTrue; + } +} + +void grandom_fill(Guchar *buff, int size) +{ + initialize(); + while (size--) + *buff++ = rand() % 256; +} + +double grandom_double() +{ + initialize(); + return rand() / (1 + (double)RAND_MAX); +} + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/grandom.h b/Build/source/libs/poppler/poppler-0.36.0/goo/grandom.h new file mode 100644 index 00000000000..45fa791aba8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/grandom.h @@ -0,0 +1,34 @@ +/* + * grandom.h + * + * This file is licensed under the GPLv2 or later + * + * Pseudo-random number generation + * + * Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> + */ + +#ifndef GRANDOM_H +#define GRANDOM_H + +#include "gtypes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Fills the given buffer with random bytes + */ +extern void grandom_fill(Guchar *buff, int size); + +/* + * Returns a random number in [0,1) + */ +extern double grandom_double(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/gstrtod.cc b/Build/source/libs/poppler/poppler-0.36.0/goo/gstrtod.cc new file mode 100644 index 00000000000..cd1d5b554f7 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/gstrtod.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/gstrtod.h b/Build/source/libs/poppler/poppler-0.36.0/goo/gstrtod.h new file mode 100644 index 00000000000..e8abdadf53e --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/gstrtod.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/goo/gtypes.h b/Build/source/libs/poppler/poppler-0.36.0/goo/gtypes.h new file mode 100644 index 00000000000..a8d4519497e --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/gtypes.h @@ -0,0 +1,52 @@ +/* + * 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> +// Copyright (C) 2013 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 GTYPES_H +#define GTYPES_H + +#include "poppler-config.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; +typedef long long Goffset; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/goo/gtypes_p.h b/Build/source/libs/poppler/poppler-0.36.0/goo/gtypes_p.h new file mode 100644 index 00000000000..cc4866e1389 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/goo/gtypes_p.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/gtk-doc.make b/Build/source/libs/poppler/poppler-0.36.0/gtk-doc.make new file mode 100644 index 00000000000..e7916563d75 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/gtk-doc.make @@ -0,0 +1,289 @@ +# -*- 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 + +gtkdoc-check.test: Makefile + $(AM_V_GEN)echo "#!/bin/sh -e" > $@; \ + echo "$(GTKDOC_CHECK_PATH) || exit 1" >> $@; \ + chmod +x $@ + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) gtkdoc-check.test + +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-gtk-doc: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +.PHONY: all-gtk-doc + +if ENABLE_GTK_DOC +all-local: all-gtk-doc +endif + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +#### setup #### + +GTK_DOC_V_SETUP=$(GTK_DOC_V_SETUP_$(V)) +GTK_DOC_V_SETUP_=$(GTK_DOC_V_SETUP_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_SETUP_0=@echo " DOC Preparing build"; + +setup-build.stamp: + -$(GTK_DOC_V_SETUP)if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + destdir=`dirname $(abs_builddir)/$$file`; \ + test -d "$$destdir" || mkdir -p "$$destdir"; \ + test -f $(abs_srcdir)/$$file && \ + cp -pf $(abs_srcdir)/$$file $(abs_builddir)/$$file || true; \ + done; \ + fi; \ + fi + $(AM_V_at)touch setup-build.stamp + + +#### scan #### + +GTK_DOC_V_SCAN=$(GTK_DOC_V_SCAN_$(V)) +GTK_DOC_V_SCAN_=$(GTK_DOC_V_SCAN_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_SCAN_0=@echo " DOC Scanning header files"; + +GTK_DOC_V_INTROSPECT=$(GTK_DOC_V_INTROSPECT_$(V)) +GTK_DOC_V_INTROSPECT_=$(GTK_DOC_V_INTROSPECT_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_INTROSPECT_0=@echo " DOC Introspecting gobjects"; + +scan-build.stamp: setup-build.stamp $(HFILE_GLOB) $(CFILE_GLOB) + $(GTK_DOC_V_SCAN)_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) + $(GTK_DOC_V_INTROSPECT)if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + 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 + $(AM_V_at)touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### xml #### + +GTK_DOC_V_XML=$(GTK_DOC_V_XML_$(V)) +GTK_DOC_V_XML_=$(GTK_DOC_V_XML_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_XML_0=@echo " DOC Building XML"; + +sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) + $(GTK_DOC_V_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) + $(AM_V_at)touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +GTK_DOC_V_HTML=$(GTK_DOC_V_HTML_$(V)) +GTK_DOC_V_HTML_=$(GTK_DOC_V_HTML_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_HTML_0=@echo " DOC Building HTML"; + +GTK_DOC_V_XREF=$(GTK_DOC_V_XREF_$(V)) +GTK_DOC_V_XREF_=$(GTK_DOC_V_XREF_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_XREF_0=@echo " DOC Fixing cross-references"; + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + $(GTK_DOC_V_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; + $(GTK_DOC_V_XREF)gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + $(AM_V_at)touch html-build.stamp + +#### pdf #### + +GTK_DOC_V_PDF=$(GTK_DOC_V_PDF_$(V)) +GTK_DOC_V_PDF_=$(GTK_DOC_V_PDF_$(AM_DEFAULT_VERBOSITY)) +GTK_DOC_V_PDF_0=@echo " DOC Building PDF"; + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + $(GTK_DOC_V_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) + $(AM_V_at)touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-types" ; then \ + rm -f $(DOC_MODULE).types; \ + fi + +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: + @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 HAVE_GTK_DOC +dist-check-gtkdoc: docs +else +dist-check-gtkdoc: + @echo "*** gtk-doc is needed to run 'make dist'. ***" + @echo "*** gtk-doc was not found when 'configure' ran. ***" + @echo "*** please install gtk-doc and rerun 'configure'. ***" + @false +endif + +dist-hook: dist-check-gtkdoc all-gtk-doc 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/Build/source/libs/poppler/poppler-0.36.0/poppler-cairo-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-cairo-uninstalled.pc.in new file mode 100644 index 00000000000..2458eb20df8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-cairo-uninstalled.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-cairo.pc.cmake b/Build/source/libs/poppler/poppler-0.36.0/poppler-cairo.pc.cmake new file mode 100644 index 00000000000..b32f118314b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-cairo.pc.cmake @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-cairo.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-cairo.pc.in new file mode 100644 index 00000000000..367a5b690bf --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-cairo.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-cpp-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-cpp-uninstalled.pc.in new file mode 100644 index 00000000000..af3640eb2c1 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-cpp-uninstalled.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-cpp.pc.cmake b/Build/source/libs/poppler/poppler-0.36.0/poppler-cpp.pc.cmake new file mode 100644 index 00000000000..3f56b3d9d90 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-cpp.pc.cmake @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-cpp.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-cpp.pc.in new file mode 100644 index 00000000000..a7e97c25dfe --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-cpp.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-glib-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-glib-uninstalled.pc.in new file mode 100644 index 00000000000..5506c4e53ac --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-glib-uninstalled.pc.in @@ -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@ gio-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/Build/source/libs/poppler/poppler-0.36.0/poppler-glib.pc.cmake b/Build/source/libs/poppler/poppler-0.36.0/poppler-glib.pc.cmake new file mode 100644 index 00000000000..e15e6699a43 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-glib.pc.cmake @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-glib.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-glib.pc.in new file mode 100644 index 00000000000..cd30feb728f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-glib.pc.in @@ -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@ gio-2.0 >= @GLIB_REQUIRED@ cairo >= @CAIRO_VERSION@ +@PC_REQUIRES_PRIVATE@ + +Libs: -L${libdir} -lpoppler-glib +Cflags: -I${includedir}/poppler/glib diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler-qt4-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt4-uninstalled.pc.in new file mode 100644 index 00000000000..3a336c6c294 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt4-uninstalled.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-qt4.pc.cmake b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt4.pc.cmake new file mode 100644 index 00000000000..b17fd5d8453 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt4.pc.cmake @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-qt4.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt4.pc.in new file mode 100644 index 00000000000..306ae46e0b0 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt4.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-qt5-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt5-uninstalled.pc.in new file mode 100644 index 00000000000..a91e1d5a3bd --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt5-uninstalled.pc.in @@ -0,0 +1,7 @@ +Name: poppler-qt5 +Description: Qt5 bindings for poppler - uninstalled +Version: @VERSION@ +Requires: poppler = @VERSION@ + +Libs: ${pc_top_builddir}/${pcfiledir}/qt5/src/libpoppler-qt5.la +Cflags: -I${pc_top_builddir}/${pcfiledir}/qt5/src diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler-qt5.pc.cmake b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt5.pc.cmake new file mode 100644 index 00000000000..b4d87b76675 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt5.pc.cmake @@ -0,0 +1,13 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=${exec_prefix}/lib@LIB_SUFFIX@ +includedir=${prefix}/include + +Name: poppler-qt5 +Description: Qt5 bindings for poppler +Version: @POPPLER_VERSION@ +Requires: @PC_REQUIRES@ +@PC_REQUIRES_PRIVATE@ + +Libs: -L${libdir} -lpoppler-qt5 +Cflags: -I${includedir}/poppler/qt5 diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler-qt5.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt5.pc.in new file mode 100644 index 00000000000..cda4c6f80fe --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-qt5.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: poppler-qt5 +Description: Qt5 bindings for poppler +Version: @VERSION@ +Requires: @PC_REQUIRES@ +@PC_REQUIRES_PRIVATE@ + +Libs: -L${libdir} -lpoppler-qt5 +Cflags: -I${includedir}/poppler/qt5 diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler-splash-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-splash-uninstalled.pc.in new file mode 100644 index 00000000000..436ecdb8f1b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-splash-uninstalled.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-splash.pc.cmake b/Build/source/libs/poppler/poppler-0.36.0/poppler-splash.pc.cmake new file mode 100644 index 00000000000..cb95b3d2d27 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-splash.pc.cmake @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-splash.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-splash.pc.in new file mode 100644 index 00000000000..cf3491fc7cf --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-splash.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler-uninstalled.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler-uninstalled.pc.in new file mode 100644 index 00000000000..6076e80c5b3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler-uninstalled.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler.pc.cmake b/Build/source/libs/poppler/poppler-0.36.0/poppler.pc.cmake new file mode 100644 index 00000000000..f1aebedbefd --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler.pc.cmake @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler.pc.in b/Build/source/libs/poppler/poppler-0.36.0/poppler.pc.in new file mode 100644 index 00000000000..8605b28673b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler.pc.in @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Annot.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Annot.cc new file mode 100644 index 00000000000..85a8ac4a789 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Annot.cc @@ -0,0 +1,7276 @@ +//======================================================================== +// +// 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-2013 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2007-2013 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, 2013 José Aliste <jaliste@src.gnome.org> +// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2012, 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012, 2015 Tobias Koenig <tokoe@kdab.com> +// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2014 Marek Kasik <mkasik@redhat.com> +// Copyright (C) 2014 Jiri Slaby <jirislaby@gmail.com> +// Copyright (C) 2014 Anuj Khare <khareanuj18@gmail.com> +// Copyright (C) 2015 Petr Gajdos <pgajdos@suse.cz> +// Copyright (C) 2015 Philipp Reinkemeier <philipp.reinkemeier@offis.de> +// Copyright (C) 2015 Tamas Szekeres <szekerest@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 <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> +#include <algorithm> + +#if MULTITHREADED +# define annotLocker() MutexLocker locker(&mutex) +# define annotCondLocker(X) MutexLocker locker(&mutex, (X)) +#else +# define annotLocker() +# define annotCondLocker(X) +#endif + +#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; +} + +static LinkAction* getAdditionalAction(Annot::AdditionalActionsType type, Object *additionalActions, PDFDoc *doc) { + Object additionalActionsObject; + LinkAction *linkAction = NULL; + + if (additionalActions->fetch(doc->getXRef(), &additionalActionsObject)->isDict()) { + const char *key = (type == Annot::actionCursorEntering ? "E" : + type == Annot::actionCursorLeaving ? "X" : + type == Annot::actionMousePressed ? "D" : + type == Annot::actionMouseReleased ? "U" : + type == Annot::actionFocusIn ? "Fo" : + type == Annot::actionFocusOut ? "BI" : + type == Annot::actionPageOpening ? "PO" : + type == Annot::actionPageClosing ? "PC" : + type == Annot::actionPageVisible ? "PV" : + type == Annot::actionPageInvisible ? "PI" : NULL); + + Object actionObject; + + if (additionalActionsObject.dictLookup(key, &actionObject)->isDict()) + linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); + actionObject.free(); + } + + additionalActionsObject.free(); + + return linkAction; +} + +static LinkAction* getFormAdditionalAction(Annot::FormAdditionalActionsType type, Object *additionalActions, PDFDoc *doc) { + Object additionalActionsObject; + LinkAction *linkAction = NULL; + + if (additionalActions->fetch(doc->getXRef(), &additionalActionsObject)->isDict()) { + const char *key = (type == Annot::actionFieldModified ? "K" : + type == Annot::actionFormatField ? "F" : + type == Annot::actionValidateField ? "V" : + type == Annot::actionCalculateField ? "C" : NULL); + + Object actionObject; + + if (additionalActionsObject.dictLookup(key, &actionObject)->isDict()) + linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); + actionObject.free(); + } + + additionalActionsObject.free(); + + return linkAction; +} + +//------------------------------------------------------------------------ +// 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() { + 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() { + 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)); + + if (dashLength > 0) { + Object obj3; + + obj1->arrayAdd(obj3.initArray(xref)); + for (int i = 0; i < dashLength; i++) + obj3.arrayAdd(obj2.initReal(dash[i])); + } +} + +//------------------------------------------------------------------------ +// AnnotBorderBS +//------------------------------------------------------------------------ + +AnnotBorderBS::AnnotBorderBS() { +} + +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; + } + } +} + +const char *AnnotBorderBS::getStyleName() const { + switch (style) { + case borderSolid: + return "S"; + case borderDashed: + return "D"; + case borderBeveled: + return "B"; + case borderInset: + return "I"; + case borderUnderlined: + return "U"; + } + + return "S"; +} + +void AnnotBorderBS::writeToObject(XRef *xref, Object *obj1) const { + Object obj2; + + obj1->initDict(xref); + obj1->dictSet("W", obj2.initReal(width)); + obj1->dictSet("S", obj2.initName(getStyleName())); + if (style == borderDashed && dashLength > 0) { + Object obj3; + + obj1->dictSet("D", obj3.initArray(xref)); + for (int i = 0; i < dashLength; i++) + obj3.arrayAdd(obj2.initReal(dash[i])); + } +} + +//------------------------------------------------------------------------ +// 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(AnnotAppearanceType type, const char *state, Object *dest) { + Object apData, stream; + apData.initNull(); + + // Obtain dictionary or stream associated to appearance type + switch (type) { + case appearRollover: + if (appearDict.dictLookupNF("R", &apData)->isNull()) + appearDict.dictLookupNF("N", &apData); + break; + case appearDown: + if (appearDict.dictLookupNF("D", &apData)->isNull()) + appearDict.dictLookupNF("N", &apData); + break; + case appearNormal: + appearDict.dictLookupNF("N", &apData); + break; + } + + dest->initNull(); + if (apData.isDict() && state) + apData.dictLookupNF(state, dest); + else if (apData.isRef()) + apData.copy(dest); + apData.free(); +} + +GooString * AnnotAppearance::getStateKey(int i) { + Object obj1; + GooString * res = NULL; + if (appearDict.dictLookupNF("N", &obj1)->isDict()) + res = new GooString(obj1.dictGetKey(i)); + obj1.free(); + return res; +} + +int AnnotAppearance::getNumStates() { + Object obj1; + int res = 0; + if (appearDict.dictLookupNF("N", &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()) { + Array *colorComponents = obj1.getArray(); + if (colorComponents->getLength() > 0) { + borderColor = new AnnotColor(colorComponents); + } else { + borderColor = NULL; + } + } else { + borderColor = NULL; + } + obj1.free(); + + if (dict->lookup("BG", &obj1)->isArray()) { + Array *colorComponents = obj1.getArray(); + if (colorComponents->getLength() > 0) { + backColor = new AnnotColor(colorComponents); + } else { + backColor = NULL; + } + } 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 { + 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 = new GooString(); + } + obj1.free(); + + // Note: This value is overwritten by Annots ctor + 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 + // According to the spec if neither the Border nor the BS entry is present, + // the border shall be drawn as a solid line with a width of 1 point. But acroread + // seems to ignore the Border entry for annots that can't have a BS entry. So, we only + // follow this rule for annots tha can have a BS entry. + if (dict->lookup("Border", &obj1)->isArray()) + border = new AnnotBorderArray(obj1.getArray()); + else + 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); + +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +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); + invalidateAppearance(); +} + +GBool Annot::inRect(double x, double y) const { + return rect->contains(x, y); +} + +void Annot::update(const char *key, Object *value) { + annotLocker(); + /* 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) { + annotLocker(); + 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) { + annotLocker(); + 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) { + annotLocker(); + 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) { + annotLocker(); + Object obj1; + flags = new_flags; + obj1.initInt(flags); + update ("F", &obj1); +} + +void Annot::setBorder(AnnotBorder *new_border) { + annotLocker(); + delete border; + + if (new_border) { + Object obj1; + new_border->writeToObject(xref, &obj1); + update(new_border->getType() == AnnotBorder::typeArray ? "Border" : "BS", &obj1); + border = new_border; + } else { + border = NULL; + } + invalidateAppearance(); +} + +void Annot::setColor(AnnotColor *new_color) { + annotLocker(); + delete color; + + if (new_color) { + Object obj1; + new_color->writeToObject(xref, &obj1); + update ("C", &obj1); + color = new_color; + } else { + color = NULL; + } + invalidateAppearance(); +} + +void Annot::setPage(int pageIndex, GBool updateP) { + annotLocker(); + Page *pageobj = doc->getPage(pageIndex); + Object obj1; + + if (pageobj) { + Ref pageRef = pageobj->getRef(); + obj1.initRef(pageRef.num, pageRef.gen); + page = pageIndex; + } else { + obj1.initNull(); + page = 0; + } + + if (updateP) { + update("P", &obj1); + } +} + +void Annot::setAppearanceState(const char *state) { + annotLocker(); + 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() { + annotLocker(); + if (appearStreams) { // Remove existing appearance streams + appearStreams->removeAllStreams(); + } + delete appearStreams; + appearStreams = NULL; + + delete appearState; + appearState = NULL; + + delete appearBBox; + appearBBox = NULL; + + appearance.free(); + appearance.initNull(); + + Object obj1, obj2; + obj1.initNull(); + if (!annotObj.dictLookup("AP", &obj2)->isNull()) + update ("AP", &obj1); // Remove AP + obj2.free(); + + if (!annotObj.dictLookup("AS", &obj2)->isNull()) + update ("AS", &obj1); // Remove AS + obj2.free(); +} + +double Annot::getXMin() { + return rect->x1; +} + +double Annot::getYMin() { + return rect->y1; +} + +double Annot::getXMax() { + return rect->x2; +} + +double Annot::getYMax() { + return rect->y2; +} + +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::removeReferencedObjects() { + // Remove appearance streams (if any) + invalidateAppearance(); +} + +void Annot::incRefCnt() { + annotLocker(); + refCnt++; +} + +void Annot::decRefCnt() { +#if MULTITHREADED + gLockMutex(&mutex); +#endif + if (--refCnt == 0) { +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif + delete this; + return; + } +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif +} + +Annot::~Annot() { + annotObj.free(); + + delete rect; + 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(); + +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +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; + } +} + +void Annot::setLineStyleForBorder(AnnotBorder *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()); +} + +// 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; +} + +int Annot::getRotation() const +{ + Page *pageobj = doc->getPage(page); + assert(pageobj != NULL); + + if (flags & flagNoRotate) { + return (360 - pageobj->getRotate()) % 360; + } else { + return 0; + } +} + +void Annot::draw(Gfx *gfx, GBool printing) { + Object obj; + + annotLocker(); + if (!isVisible (printing)) + return; + + // draw the appearance stream + appearance.fetch(gfx->getXRef(), &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + 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) { + // If there exists an old popup annotation that is already + // associated with a page, then we need to remove that + // popup annotation from the page. Otherwise we would have + // dangling references to it. + if (popup != NULL && popup->getPageNum() != 0) { + Page *pageobj = doc->getPage(popup->getPageNum()); + if (pageobj) { + pageobj->removeAnnot(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; + + // If this annotation is already added to a page, then we + // add the new popup annotation to the same page. + if (page != 0) { + Page *pageobj = doc->getPage(page); + assert(pageobj != NULL); // pageobj should exist in doc (see setPage()) + + pageobj->addAnnot(popup); + } + } else { + popup = NULL; + } +} + +void AnnotMarkup::setOpacity(double opacityA) { + Object obj1; + + opacity = opacityA; + obj1.initReal(opacity); + update ("CA", &obj1); + invalidateAppearance(); +} + +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); +} + +void AnnotMarkup::removeReferencedObjects() { + Page *pageobj = doc->getPage(page); + assert(pageobj != NULL); // We're called when removing an annot from a page + + // Remove popup + if (popup) { + pageobj->removeAnnot(popup); + } + + Annot::removeReferencedObjects(); +} + +//------------------------------------------------------------------------ +// 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); + invalidateAppearance(); +} + +#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; + + annotLocker(); + 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->y2 - 24, rect->x1 + 24, rect->y2); + 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(gfx->getXRef(), &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax(), + getRotation()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + } + 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(); + + if (dict->lookup("BS", &obj1)->isDict()) { + delete border; + border = new AnnotBorderBS(obj1.getDict()); + } else if (!border) { + border = new AnnotBorderBS(); + } + obj1.free(); +} + +void AnnotLink::draw(Gfx *gfx, GBool printing) { + Object obj; + + if (!isVisible (printing)) + return; + + annotLocker(); + // draw the appearance stream + appearance.fetch(gfx->getXRef(), &obj); + gfx->drawAnnot(&obj, border, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + 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("BS", &obj1)->isDict()) { + delete border; + border = new AnnotBorderBS(obj1.getDict()); + } else if (!border) { + border = new AnnotBorderBS(); + } + 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::setContents(GooString *new_content) { + Annot::setContents(new_content); + invalidateAppearance(); +} + +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); + invalidateAppearance(); +} + +void AnnotFreeText::setQuadding(AnnotFreeTextQuadding new_quadding) { + Object obj1; + quadding = new_quadding; + obj1.initInt((int)quadding); + update ("Q", &obj1); + invalidateAppearance(); +} + +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); + invalidateAppearance(); +} + +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"); + + borderWidth = border->getWidth(); + if (borderWidth > 0) + setLineStyleForBorder(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 + if (!contents) + contents = new GooString (); + + // 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; + + annotLocker(); + if (appearance.isNull()) { + generateFreeTextAppearance(); + } + + // draw the appearance stream + appearance.fetch(gfx->getXRef(), &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + 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) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeLine; + annotObj.dictSet ("Subtype", obj1.initName ("Line")); + + 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(); + + if (dict->lookup("BS", &obj1)->isDict()) { + delete border; + border = new AnnotBorderBS(obj1.getDict()); + } else if (!border) { + border = new AnnotBorderBS(); + } + obj1.free(); +} + +void AnnotLine::setContents(GooString *new_content) { + Annot::setContents(new_content); + if (caption) + invalidateAppearance(); +} + +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); + invalidateAppearance(); +} + +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); + invalidateAppearance(); +} + +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; + } + invalidateAppearance(); +} + +void AnnotLine::setLeaderLineLength(double len) { + Object obj1; + + leaderLineLength = len; + obj1.initReal(len); + update ("LL", &obj1); + invalidateAppearance(); +} + +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); + invalidateAppearance(); +} + +void AnnotLine::setCaption(bool new_cap) { + Object obj1; + + caption = new_cap; + obj1.initBool(new_cap); + update ("Cap", &obj1); + invalidateAppearance(); +} + +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); + } + + setLineStyleForBorder(border); + borderWidth = border->getWidth(); + appearBBox->setBorderWidth(std::max(1., borderWidth)); + + 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; + + annotLocker(); + if (appearance.isNull()) { + generateLineAppearance(); + } + + // draw the appearance stream + appearance.fetch(gfx->getXRef(), &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax(), + getRotation()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + } + 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) : + 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"); + } + + // Store dummy quadrilateral with null coordinates + Object obj2, obj3; + obj2.initArray (doc->getXRef()); + for (int i = 0; i < 4*2; ++i) { + obj2.arrayAdd (obj3.initReal (0)); + } + 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); + invalidateAppearance(); +} + +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))); + } + + delete quadrilaterals; + quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect); + + annotObj.dictSet ("QuadPoints", &obj1); + invalidateAppearance(); +} + +void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + int i; + Object obj1, obj2; + + if (!isVisible (printing)) + return; + + annotLocker(); + 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 x3, y3, x4, y4; + + x3 = quadrilaterals->getX3(i); + y3 = quadrilaterals->getY3(i); + x4 = quadrilaterals->getX4(i); + y4 = quadrilaterals->getY4(i); + + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", x3, y3); + appearBuf->appendf ("{0:.2f} {1:.2f} l\n", x4, y4); + 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, y2; + double x3, y3, x4, y4; + + 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); + + appearBuf->appendf ("{0:.2f} {1:.2f} m\n", (x1+x3)/2., (y1+y3)/2.); + appearBuf->appendf ("{0:.2f} {1:.2f} l\n", (x2+x4)/2., (y2+y4)/2.); + 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(gfx->getXRef(), &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax(), + getRotation()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + } + 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; + + additionalActions.free(); + + 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(); + + dict->lookupNF("AA", &additionalActions); + + if(dict->lookup("Parent", &obj1)->isDict()) { + parent = NULL; + } else { + parent = NULL; + } + obj1.free(); + + if (dict->lookup("BS", &obj1)->isDict()) { + delete border; + border = new AnnotBorderBS(obj1.getDict()); + } + obj1.free(); + + updatedAppearanceStream.num = updatedAppearanceStream.gen = -1; +} + +LinkAction* AnnotWidget::getAdditionalAction(AdditionalActionsType type) +{ + return ::getAdditionalAction(type, &additionalActions, doc); +} + +LinkAction* AnnotWidget::getFormAdditionalAction(FormAdditionalActionsType type) +{ + return ::getFormAdditionalAction(type, &additionalActions, doc); +} + +// 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, 2)) { + 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(); + error(errSyntaxError, -1, "AnnotWidget::layoutText, cannot convert U+{0:04uX}", 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 && + static_cast<FormFieldButton *>(field)->getState(appearState->getCString())) { + 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(copyString(appearBuf->getCString()), 0, + appearBuf->getLength(), &appearDict); + appearance.free(); + appearance.initStream(appearStream); + delete appearBuf; + + appearStream->setNeedFree(gTrue); +} + +void AnnotWidget::updateAppearanceStream() +{ + // If this the first time updateAppearanceStream() is called on this widget, + // destroy the AP dictionary because we are going to create a new one. + if (updatedAppearanceStream.num == -1) { + invalidateAppearance(); // Delete AP dictionary and all referenced streams + } + + // There's no need to create a new appearance stream if NeedAppearances is + // set, because it will be ignored next time anyway. + if (form && form->getNeedAppearances()) + return; + + // Create the new appearance + generateFieldAppearance(); + + // Fetch the appearance stream we've just created + Object obj1; + appearance.fetch(xref, &obj1); + + // If this the first time updateAppearanceStream() is called on this widget, + // create a new AP dictionary containing the new appearance stream. + // Otherwise, just update the stream we had created previously. + if (updatedAppearanceStream.num == -1) { + // Write the appearance stream + updatedAppearanceStream = xref->addIndirectObject(&obj1); + obj1.free(); + + // Write the AP dictionary + Object obj2; + obj1.initDict(xref); + obj1.dictAdd(copyString("N"), obj2.initRef(updatedAppearanceStream.num, updatedAppearanceStream.gen)); + update("AP", &obj1); + + // Update our internal pointers to the appearance dictionary + appearStreams = new AnnotAppearance(doc, &obj1); + } else { + // Replace the existing appearance stream + xref->setModifiedObject(&obj1, updatedAppearanceStream); + obj1.free(); + } +} + +void AnnotWidget::draw(Gfx *gfx, GBool printing) { + Object obj; + + if (!isVisible (printing)) + return; + + annotLocker(); + addDingbatsResource = gFalse; + + // Only construct the appearance stream when + // - annot doesn't have an AP or + // - NeedAppearances is true + if (field) { + if (appearance.isNull() || (form && form->getNeedAppearances())) + generateFieldAppearance(); + } + + // draw the appearance stream + appearance.fetch(gfx->getXRef(), &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(gfx->getXRef()); + fontDict->decRef(); + fontDict->add(copyString("BaseFont"), &baseFontObj); + fontDict->add(copyString("Subtype"), &subtypeObj); + fontDictObj.initDict(fontDict); + + Object fontsDictObj; + Dict *fontsDict = new Dict(gfx->getXRef()); + fontsDict->decRef(); + fontsDict->add(copyString("ZaDb"), &fontDictObj); + fontsDictObj.initDict(fontsDict); + + Dict *dict = new Dict(gfx->getXRef()); + dict->add(copyString("Font"), &fontsDictObj); + gfx->pushResources(dict); + delete dict; + } + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + 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; + + annotLocker(); + 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(gfx->getXRef()); + imgDict.dictSet ("MImg", &poster); + + Object resDict; + resDict.initDict(gfx->getXRef()); + resDict.dictSet ("XObject", &imgDict); + + Object formDict, obj1, obj2; + formDict.initDict(gfx->getXRef()); + formDict.dictSet("Length", obj1.initInt(appearBuf->getLength())); + formDict.dictSet("Subtype", obj1.initName("Form")); + formDict.dictSet("Name", obj1.initName("FRM")); + obj1.initArray(gfx->getXRef()); + 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(gfx->getXRef()); + 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(gfx->getXRef()); + objDict.dictSet ("FRM", &aStream); + + resDict.initDict(gfx->getXRef()); + 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(gfx->getXRef(), &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + 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; + + additionalActions.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->lookupNF("AA", &additionalActions); + + appearCharacs = NULL; + if(dict->lookup("MK", &obj1)->isDict()) { + appearCharacs = new AnnotAppearanceCharacs(obj1.getDict()); + } + obj1.free(); +} + +LinkAction* AnnotScreen::getAdditionalAction(AdditionalActionsType type) +{ + if (type == actionFocusIn || type == actionFocusOut) // not defined for screen annotation + return NULL; + + return ::getAdditionalAction(type, &additionalActions, doc); +} + +//------------------------------------------------------------------------ +// 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); + invalidateAppearance(); +} + +//------------------------------------------------------------------------ +// 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("BS", &obj1)->isDict()) { + delete border; + border = new AnnotBorderBS(obj1.getDict()); + } else if (!border) { + border = new AnnotBorderBS(); + } + 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); + invalidateAppearance(); +} + +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; + } + invalidateAppearance(); +} + +void AnnotGeometry::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + + if (!isVisible (printing)) + return; + + annotLocker(); + if (appearance.isNull()) { + ca = opacity; + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + if (color) + setColor(color, gFalse); + + double borderWidth = border->getWidth(); + setLineStyleForBorder(border); + + 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(gfx->getXRef(), &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + obj.free(); +} + +//------------------------------------------------------------------------ +// AnnotPolygon +//------------------------------------------------------------------------ +AnnotPolygon::AnnotPolygon(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType) : + 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"); + } + + // Store dummy path with one null vertex only + Object obj2, obj3; + obj2.initArray (doc->getXRef()); + obj2.arrayAdd (obj3.initReal (0)); + obj2.arrayAdd (obj3.initReal (0)); + 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("BS", &obj1)->isDict()) { + delete border; + border = new AnnotBorderBS(obj1.getDict()); + } else if (!border) { + border = new AnnotBorderBS(); + } + 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); + invalidateAppearance(); +} + +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); + invalidateAppearance(); +} + +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); + invalidateAppearance(); +} + +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; + } + invalidateAppearance(); +} + +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; + + annotLocker(); + if (appearance.isNull()) { + appearBBox = new AnnotAppearanceBBox(rect); + ca = opacity; + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + + if (color) { + setColor(color, gFalse); + } + + setLineStyleForBorder(border); + appearBBox->setBorderWidth(std::max(1., 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(gfx->getXRef(), &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax(), + getRotation()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + } + 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); + invalidateAppearance(); +} + +//------------------------------------------------------------------------ +// AnnotInk +//------------------------------------------------------------------------ +AnnotInk::AnnotInk(PDFDoc *docA, PDFRectangle *rect) : + AnnotMarkup(docA, rect) { + Object obj1; + + type = typeInk; + + annotObj.dictSet ("Subtype", obj1.initName ("Ink")); + + // Store dummy path with one null vertex only + Object obj2, obj3, obj4; + obj2.initArray (doc->getXRef()); + obj2.arrayAdd (obj3.initArray (doc->getXRef())); + obj3.arrayAdd (obj4.initReal (0)); + obj3.arrayAdd (obj4.initReal (0)); + 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(); + + if (dict->lookup("BS", &obj1)->isDict()) { + delete border; + border = new AnnotBorderBS(obj1.getDict()); + } else if (!border) { + border = new AnnotBorderBS(); + } + 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); + invalidateAppearance(); +} + +void AnnotInk::draw(Gfx *gfx, GBool printing) { + Object obj; + double ca = 1; + + if (!isVisible (printing)) + return; + + annotLocker(); + if (appearance.isNull()) { + appearBBox = new AnnotAppearanceBBox(rect); + ca = opacity; + + appearBuf = new GooString (); + appearBuf->append ("q\n"); + + if (color) { + setColor(color, gFalse); + } + + setLineStyleForBorder(border); + appearBBox->setBorderWidth(std::max(1., 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(gfx->getXRef(), &obj); + if (appearBBox) { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + appearBBox->getPageXMin(), appearBBox->getPageYMin(), + appearBBox->getPageXMax(), appearBBox->getPageYMax(), + getRotation()); + } else { + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + } + 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; + + annotLocker(); + 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(gfx->getXRef(), &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + 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; + + annotLocker(); + 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(gfx->getXRef(), &obj); + gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, + rect->x1, rect->y1, rect->x2, rect->y2, getRotation()); + 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(); +} + +//------------------------------------------------------------------------ +// AnnotRichMedia +//------------------------------------------------------------------------ +AnnotRichMedia::AnnotRichMedia(PDFDoc *docA, PDFRectangle *rect) : + Annot(docA, rect) { + Object obj1; + + type = typeRichMedia; + + annotObj.dictSet ("Subtype", obj1.initName ("RichMedia")); + + initialize(docA, annotObj.getDict()); +} + +AnnotRichMedia::AnnotRichMedia(PDFDoc *docA, Dict *dict, Object *obj) : + Annot(docA, dict, obj) { + type = typeRichMedia; + initialize(docA, dict); +} + +AnnotRichMedia::~AnnotRichMedia() { + delete content; + delete settings; +} + +void AnnotRichMedia::initialize(PDFDoc *docA, Dict* dict) { + Object obj1; + + if (dict->lookup("RichMediaContent", &obj1)->isDict()) { + content = new AnnotRichMedia::Content(obj1.getDict()); + } else { + content = NULL; + } + obj1.free(); + + if (dict->lookup("RichMediaSettings", &obj1)->isDict()) { + settings = new AnnotRichMedia::Settings(obj1.getDict()); + } else { + settings = NULL; + } + obj1.free(); +} + +AnnotRichMedia::Content* AnnotRichMedia::getContent() const { + return content; +} + +AnnotRichMedia::Settings* AnnotRichMedia::getSettings() const { + return settings; +} + +AnnotRichMedia::Settings::Settings(Dict *dict) { + Object obj1; + + if (dict->lookup("Activation", &obj1)->isDict()) { + activation = new AnnotRichMedia::Activation(obj1.getDict()); + } else { + activation = NULL; + } + obj1.free(); + + if (dict->lookup("Deactivation", &obj1)->isDict()) { + deactivation = new AnnotRichMedia::Deactivation(obj1.getDict()); + } else { + deactivation = NULL; + } + obj1.free(); +} + +AnnotRichMedia::Settings::~Settings() { + delete activation; + delete deactivation; +} + +AnnotRichMedia::Activation* AnnotRichMedia::Settings::getActivation() const { + return activation; +} + +AnnotRichMedia::Deactivation* AnnotRichMedia::Settings::getDeactivation() const { + return deactivation; +} + +AnnotRichMedia::Activation::Activation(Dict *dict) { + Object obj1; + + if (dict->lookup("Condition", &obj1)->isName()) { + const char *name = obj1.getName(); + + if (!strcmp(name, "PO")) { + condition = conditionPageOpened; + } else if (!strcmp(name, "PV")) { + condition = conditionPageVisible; + } else if (!strcmp(name, "XA")) { + condition = conditionUserAction; + } else { + condition = conditionUserAction; + } + } else { + condition = conditionUserAction; + } + obj1.free(); +} + +AnnotRichMedia::Activation::Condition AnnotRichMedia::Activation::getCondition() const { + return condition; +} + +AnnotRichMedia::Deactivation::Deactivation(Dict *dict) { + Object obj1; + + if (dict->lookup("Condition", &obj1)->isName()) { + const char *name = obj1.getName(); + + if (!strcmp(name, "PC")) { + condition = conditionPageClosed; + } else if (!strcmp(name, "PI")) { + condition = conditionPageInvisible; + } else if (!strcmp(name, "XD")) { + condition = conditionUserAction; + } else { + condition = conditionUserAction; + } + } else { + condition = conditionUserAction; + } + obj1.free(); +} + +AnnotRichMedia::Deactivation::Condition AnnotRichMedia::Deactivation::getCondition() const { + return condition; +} + +AnnotRichMedia::Content::Content(Dict *dict) { + Object obj1; + + if (dict->lookup("Configurations", &obj1)->isArray()) { + nConfigurations = obj1.arrayGetLength(); + + configurations = (Configuration **)gmallocn(nConfigurations, sizeof(Configuration *)); + + for (int i = 0; i < nConfigurations; ++i) { + Object obj2; + + if (obj1.arrayGet(i, &obj2)->isDict()) { + configurations[i] = new AnnotRichMedia::Configuration(obj2.getDict()); + } else { + configurations[i] = NULL; + } + obj2.free(); + } + } else { + configurations = NULL; + } + obj1.free(); + + if (dict->lookup("Assets", &obj1)->isDict()) { + Object obj2; + + if (obj1.getDict()->lookup("Names", &obj2)->isArray()) { + nAssets = obj2.arrayGetLength() / 2; + + assets = (Asset **)gmallocn(nAssets, sizeof(Asset *)); + + int counter = 0; + for (int i = 0; i < obj2.arrayGetLength(); i += 2) { + Object objKey; + + assets[counter] = new AnnotRichMedia::Asset; + + obj2.arrayGet(i, &objKey); + obj2.arrayGet(i + 1, &assets[counter]->fileSpec); + + assets[counter]->name = new GooString( objKey.getString() ); + ++counter; + + objKey.free(); + } + } + obj2.free(); + + } else { + assets = NULL; + } + obj1.free(); +} + +AnnotRichMedia::Content::~Content() { + if (configurations) { + for (int i = 0; i < nConfigurations; ++i) + delete configurations[i]; + gfree(configurations); + } + + if (assets) { + for (int i = 0; i < nAssets; ++i) + delete assets[i]; + gfree(assets); + } +} + +int AnnotRichMedia::Content::getConfigurationsCount() const { + return nConfigurations; +} + +AnnotRichMedia::Configuration* AnnotRichMedia::Content::getConfiguration(int index) const { + if (index < 0 || index >= nConfigurations) + return NULL; + + return configurations[index]; +} + +int AnnotRichMedia::Content::getAssetsCount() const { + return nAssets; +} + +AnnotRichMedia::Asset* AnnotRichMedia::Content::getAsset(int index) const { + if (index < 0 || index >= nAssets) + return NULL; + + return assets[index]; +} + +AnnotRichMedia::Asset::Asset() + : name(NULL) +{ +} + +AnnotRichMedia::Asset::~Asset() +{ + delete name; + fileSpec.free(); +} + +GooString* AnnotRichMedia::Asset::getName() const { + return name; +} + +Object* AnnotRichMedia::Asset::getFileSpec() const { + return const_cast<Object*>(&fileSpec); +} + +AnnotRichMedia::Configuration::Configuration(Dict *dict) +{ + Object obj1; + + if (dict->lookup("Instances", &obj1)->isArray()) { + nInstances = obj1.arrayGetLength(); + + instances = (Instance **)gmallocn(nInstances, sizeof(Instance *)); + + for (int i = 0; i < nInstances; ++i) { + Object obj2; + + if (obj1.arrayGet(i, &obj2)->isDict()) { + instances[i] = new AnnotRichMedia::Instance(obj2.getDict()); + } else { + instances[i] = NULL; + } + obj2.free(); + } + } else { + instances = NULL; + } + obj1.free(); + + if (dict->lookup("Name", &obj1)->isString()) { + name = new GooString(obj1.getString()); + } else { + name = NULL; + } + obj1.free(); + + if (dict->lookup("Subtype", &obj1)->isName()) { + const char *name = obj1.getName(); + + if (!strcmp(name, "3D")) { + type = type3D; + } else if (!strcmp(name, "Flash")) { + type = typeFlash; + } else if (!strcmp(name, "Sound")) { + type = typeSound; + } else if (!strcmp(name, "Video")) { + type = typeVideo; + } else { + // determine from first instance + if (instances && nInstances > 0) { + AnnotRichMedia::Instance *instance = instances[0]; + switch (instance->getType()) { + case AnnotRichMedia::Instance::type3D: + type = type3D; + break; + case AnnotRichMedia::Instance::typeFlash: + type = typeFlash; + break; + case AnnotRichMedia::Instance::typeSound: + type = typeSound; + break; + case AnnotRichMedia::Instance::typeVideo: + type = typeVideo; + break; + default: + type = typeFlash; + break; + } + } + } + } + obj1.free(); +} + +AnnotRichMedia::Configuration::~Configuration() +{ + if (instances) { + for (int i = 0; i < nInstances; ++i) + delete instances[i]; + gfree(instances); + } + + delete name; +} + +int AnnotRichMedia::Configuration::getInstancesCount() const { + return nInstances; +} + +AnnotRichMedia::Instance* AnnotRichMedia::Configuration::getInstance(int index) const { + if (index < 0 || index >= nInstances) + return NULL; + + return instances[index]; +} + +GooString* AnnotRichMedia::Configuration::getName() const { + return name; +} + +AnnotRichMedia::Configuration::Type AnnotRichMedia::Configuration::getType() const { + return type; +} + +AnnotRichMedia::Instance::Instance(Dict *dict) +{ + Object obj1; + + if (dict->lookup("Subtype", &obj1)->isName()) { + const char *name = obj1.getName(); + + if (!strcmp(name, "3D")) { + type = type3D; + } else if (!strcmp(name, "Flash")) { + type = typeFlash; + } else if (!strcmp(name, "Sound")) { + type = typeSound; + } else if (!strcmp(name, "Video")) { + type = typeVideo; + } else { + type = typeFlash; + } + } + obj1.free(); + + if (dict->lookup("Params", &obj1)->isDict()) { + params = new AnnotRichMedia::Params(obj1.getDict()); + } else { + params = NULL; + } +} + +AnnotRichMedia::Instance::~Instance() +{ + delete params; +} + +AnnotRichMedia::Instance::Type AnnotRichMedia::Instance::getType() const { + return type; +} + +AnnotRichMedia::Params* AnnotRichMedia::Instance::getParams() const { + return params; +} + +AnnotRichMedia::Params::Params(Dict *dict) +{ + Object obj1; + + if (dict->lookup("FlashVars", &obj1)->isString()) { + flashVars = new GooString(obj1.getString()); + } else { + flashVars = NULL; + } + obj1.free(); +} + +AnnotRichMedia::Params::~Params() +{ + delete flashVars; +} + +GooString* AnnotRichMedia::Params::getFlashVars() const { + return flashVars; +} + +//------------------------------------------------------------------------ +// Annots +//------------------------------------------------------------------------ + +Annots::Annots(PDFDoc *docA, int page, 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()) { + annot->setPage(page, gFalse); // Don't change /P + 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, "RichMedia")) { + annot = new AnnotRichMedia(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/Build/source/libs/poppler/poppler-0.36.0/poppler/Annot.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Annot.h new file mode 100644 index 00000000000..d90c8080ffe --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Annot.h @@ -0,0 +1,1609 @@ +//======================================================================== +// +// 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, 2013, 2015 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, 2013 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2012, 2015 Tobias Koenig <tokoe@kdab.com> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 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 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 Page; +class PDFDoc; +class Form; +class FormWidget; +class FormField; +class FormFieldChoice; +class PDFRectangle; +class Movie; +class LinkAction; +class Sound; +class FileSpec; + +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 { + typeArray, + typeBS + }; + + enum AnnotBorderStyle { + borderSolid, // Solid + borderDashed, // Dashed + borderBeveled, // Beveled + borderInset, // Inset + borderUnderlined // Underlined + }; + + virtual ~AnnotBorder(); + + virtual void setWidth(double new_width) { width = new_width; } + + virtual AnnotBorderType getType() const = 0; + virtual double getWidth() const { return width; } + virtual int getDashLength() const { return dashLength; } + virtual double *getDash() const { return dash; } + virtual AnnotBorderStyle getStyle() const { return style; } + + virtual void writeToObject(XRef *xref, Object *obj1) const = 0; + +protected: + AnnotBorder(); + + 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 setHorizontalCorner(double hc) { horizontalCorner = hc; } + void setVerticalCorner(double vc) { verticalCorner = vc; } + + double getHorizontalCorner() const { return horizontalCorner; } + double getVerticalCorner() const { return verticalCorner; } + +private: + virtual AnnotBorderType getType() const { return typeArray; } + virtual void writeToObject(XRef *xref, Object *obj1) const; + + 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: + virtual AnnotBorderType getType() const { return typeBS; } + virtual void writeToObject(XRef *xref, Object *obj1) const; + + const char *getStyleName() const; + + // 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 { + friend class Annots; + friend class Page; +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 + typeRichMedia // RichMedia 26 + }; + + /** + * Describes the additional actions of a screen or widget annotation. + */ + enum AdditionalActionsType { + actionCursorEntering, ///< Performed when the cursor enters the annotation's active area + actionCursorLeaving, ///< Performed when the cursor exists the annotation's active area + actionMousePressed, ///< Performed when the mouse button is pressed inside the annotation's active area + actionMouseReleased, ///< Performed when the mouse button is released inside the annotation's active area + actionFocusIn, ///< Performed when the annotation receives the input focus + actionFocusOut, ///< Performed when the annotation loses the input focus + actionPageOpening, ///< Performed when the page containing the annotation is opened + actionPageClosing, ///< Performed when the page containing the annotation is closed + actionPageVisible, ///< Performed when the page containing the annotation becomes visible + actionPageInvisible ///< Performed when the page containing the annotation becomes invisible + }; + + enum FormAdditionalActionsType { + actionFieldModified, ///< Performed when the when the user modifies the field + actionFormatField, ///< Performed before the field is formatted to display its value + actionValidateField, ///< Performed when the field value changes + actionCalculateField, ///< Performed when the field needs to be recalculated + }; + + 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 getXMax(); + double getYMax(); + + 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 + virtual void setContents(GooString *new_content); + void setName(GooString *new_name); + void setModified(GooString *new_date); + void setFlags(Guint new_flags); + + void setBorder(AnnotBorder *new_border); // Takes ownership + + // The annotation takes the ownership of + // new_color. + void setColor(AnnotColor *new_color); + + void setAppearanceState(const char *state); + + // 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); + void setPage (int new_page, GBool updateP); // Called by Page::addAnnot and Annots ctor + + +protected: + virtual ~Annot(); + virtual void removeReferencedObjects(); // Called by Page::removeAnnot + void setColor(AnnotColor *color, GBool fill); + void setLineStyleForBorder(AnnotBorder *border); + 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); + int getRotation() const; + + // Updates the field key of the annotation dictionary + // and sets M to the current time + void update(const char *key, Object *value); + + // Delete appearance streams and reset appearance state + void invalidateAppearance(); + + 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; +#if MULTITHREADED + GooMutex mutex; +#endif +}; + +//------------------------------------------------------------------------ +// 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() { 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: + virtual void removeReferencedObjects(); + + 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; } + LinkAction *getAdditionalAction(AdditionalActionsType type); + + private: + void initialize(PDFDoc *docA, Dict *dict); + + + GooString* title; // T + + AnnotAppearanceCharacs* appearCharacs; // MK + + LinkAction *action; // A + Object additionalActions; // 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); + virtual void setContents(GooString *new_content); + + 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); + AnnotLine(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotLine(); + + virtual void draw(Gfx *gfx, GBool printing); + virtual Object *getAppearanceResDict(Object *dest); + virtual void setContents(GooString *new_content); + + 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); + 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); + 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); + 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 (); + void updateAppearanceStream (); + + AnnotWidgetHighlightMode getMode() { return mode; } + AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; } + LinkAction *getAction() { return action; } + LinkAction *getAdditionalAction(AdditionalActionsType type); + LinkAction *getFormAdditionalAction(FormAdditionalActionsType type); + 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 + Object additionalActions; // AA + // inherited from Annot + // AnnotBorderBS border; // BS + Dict *parent; // Parent + GBool addDingbatsResource; + Ref updatedAppearanceStream; // {-1,-1} if updateAppearanceStream has never been called +}; + +//------------------------------------------------------------------------ +// 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 +}; + +//------------------------------------------------------------------------ +// AnnotRichMedia +//------------------------------------------------------------------------ + +class AnnotRichMedia: public Annot { +public: + class Params { + public: + Params(Dict *dict); + ~Params(); + + GooString* getFlashVars() const; + + private: + // optional + GooString *flashVars; // FlashVars + }; + + class Instance { + public: + enum Type { + type3D, // 3D + typeFlash, // Flash + typeSound, // Sound + typeVideo // Video + }; + + Instance(Dict *dict); + ~Instance(); + + Type getType() const; + Params* getParams() const; + + private: + // optional + Type type; // Subtype + Params *params; // Params + }; + + class Configuration { + public: + enum Type { + type3D, // 3D + typeFlash, // Flash + typeSound, // Sound + typeVideo // Video + }; + + Configuration(Dict *dict); + ~Configuration(); + + Type getType() const; + GooString* getName() const; + int getInstancesCount() const; + Instance* getInstance(int index) const; + + private: + // optional + Type type; // Subtype + GooString *name; // Name + Instance **instances; // Instances + int nInstances; + }; + + class Content; + + class Asset { + public: + Asset(); + ~Asset(); + + GooString* getName() const; + Object* getFileSpec() const; + + private: + friend class AnnotRichMedia::Content; + + GooString *name; + Object fileSpec; + }; + + class Content { + public: + Content(Dict *dict); + ~Content(); + + int getConfigurationsCount() const; + Configuration* getConfiguration(int index) const; + + int getAssetsCount() const; + Asset* getAsset(int index) const; + + private: + // optional + Configuration **configurations; // Configurations + int nConfigurations; + + Asset **assets; // Assets + int nAssets; + }; + + class Activation { + public: + enum Condition { + conditionPageOpened, // PO + conditionPageVisible, // PV + conditionUserAction // XA + }; + + Activation(Dict *dict); + + Condition getCondition() const; + + private: + // optional + Condition condition; + }; + + class Deactivation { + public: + enum Condition { + conditionPageClosed, // PC + conditionPageInvisible, // PI + conditionUserAction // XD + }; + + Deactivation(Dict *dict); + + Condition getCondition() const; + + private: + // optional + Condition condition; + }; + + class Settings { + public: + Settings(Dict *dict); + ~Settings(); + + Activation* getActivation() const; + Deactivation* getDeactivation() const; + + private: + // optional + Activation *activation; + Deactivation *deactivation; + }; + + AnnotRichMedia(PDFDoc *docA, PDFRectangle *rect); + AnnotRichMedia(PDFDoc *docA, Dict *dict, Object *obj); + ~AnnotRichMedia(); + + Content* getContent() const; + + Settings* getSettings() const; + +private: + void initialize(PDFDoc *docA, Dict *dict); + + // required + Content *content; // RichMediaContent + + // optional + Settings *settings; // RichMediaSettings +}; + + +//------------------------------------------------------------------------ +// Annots +//------------------------------------------------------------------------ + +class Annots { +public: + + // Build a list of Annot objects and call setPage on them + Annots(PDFDoc *docA, int page, 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Array.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Array.cc new file mode 100644 index 00000000000..230c3287683 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Array.cc @@ -0,0 +1,152 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 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 <stddef.h> +#include "goo/gmem.h" +#include "Object.h" +#include "Array.h" + +#if MULTITHREADED +# define arrayLocker() MutexLocker locker(&mutex) +#else +# define arrayLocker() +#endif +//------------------------------------------------------------------------ +// Array +//------------------------------------------------------------------------ + +Array::Array(XRef *xrefA) { + xref = xrefA; + elems = NULL; + size = length = 0; + ref = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +Array::~Array() { + int i; + + for (i = 0; i < length; ++i) + elems[i].free(); + gfree(elems); +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +Object *Array::copy(XRef *xrefA, Object *obj) { + arrayLocker(); + obj->initArray(xrefA); + for (int i = 0; i < length; ++i) { + Object obj1; + obj->arrayAdd(elems[i].copy(&obj1)); + } + return obj; +} + +int Array::incRef() { + arrayLocker(); + ++ref; + return ref; +} + +int Array::decRef() { + arrayLocker(); + --ref; + return ref; +} + +void Array::add(Object *elem) { + arrayLocker(); + 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) { + arrayLocker(); + 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, int recursion) { + if (i < 0 || i >= length) { +#ifdef DEBUG_MEM + abort(); +#else + return obj->initNull(); +#endif + } + return elems[i].fetch(xref, obj, recursion); +} + +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/Build/source/libs/poppler/poppler-0.36.0/poppler/Array.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Array.h new file mode 100644 index 00000000000..e78e399baf2 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Array.h @@ -0,0 +1,84 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 ARRAY_H +#define ARRAY_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "Object.h" +#include "goo/GooMutex.h" + +class XRef; + +//------------------------------------------------------------------------ +// Array +//------------------------------------------------------------------------ + +class Array { +public: + + // Constructor. + Array(XRef *xrefA); + + // Destructor. + ~Array(); + + // Reference counting. + int incRef(); + int decRef(); + + // Get number of elements. + int getLength() { return length; } + + // Copy array with new xref + Object *copy(XRef *xrefA, Object *obj); + + // Add an element. + void add(Object *elem); + + // Remove an element by position + void remove(int i); + + // Accessors. + Object *get(int i, Object *obj, int resursion = 0); + 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 +#if MULTITHREADED + GooMutex mutex; +#endif +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFont.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFont.cc new file mode 100644 index 00000000000..20a297d6135 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFont.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFont.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFont.h new file mode 100644 index 00000000000..bbdd0558e9f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFont.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFontTables.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFontTables.cc new file mode 100644 index 00000000000..5115b7bcf13 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFontTables.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFontTables.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFontTables.h new file mode 100644 index 00000000000..eb45549efd2 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/BuiltinFontTables.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/CMap.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/CMap.cc new file mode 100644 index 00000000000..6731ab5a1fa --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CMap.cc @@ -0,0 +1,598 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 <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:ux} - {1:ux} [{2:ud} 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/Build/source/libs/poppler/poppler-0.36.0/poppler/CMap.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CMap.h new file mode 100644 index 00000000000..f4f5a9141c8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CMap.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/CachedFile.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/CachedFile.cc new file mode 100644 index 00000000000..b0ae8388113 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CachedFile.cc @@ -0,0 +1,257 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 Julien Nabet <serval2412@yahoo.fr> +// +//======================================================================== + +#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/Build/source/libs/poppler/poppler-0.36.0/poppler/CachedFile.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CachedFile.h new file mode 100644 index 00000000000..b99ea1ecad4 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CachedFile.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoFontEngine.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoFontEngine.cc new file mode 100644 index 00000000000..1d611b59d3c --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoFontEngine.cc @@ -0,0 +1,832 @@ +//======================================================================== +// +// 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, 2013, 2015 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, 2014 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> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2015 Jason Crain <jason@aquaticape.us> +// +// 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 + +#if MULTITHREADED +# define fontEngineLocker() MutexLocker locker(&mutex) +#else +# define fontEngineLocker() +#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 (data->fd != -1) { +#if defined(__SUNPRO_CC) && defined(__sun) && defined(__SVR4) + munmap ((char*)data->bytes, data->size); +#else + munmap (data->bytes, data->size); +#endif + close (data->fd); + } else { + gfree (data->bytes); + } + + 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); + } else { + gfree (tmpl.bytes); + } + *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; + const 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, NULL))) { + 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, (char*)name); + if (codeToGID[i] == 0) { + name = GfxFont::getAlternateName(name); + if (name) { + codeToGID[i] = FT_Get_Name_Index(face, (char*)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)) { + 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; + gfree (codeToGID); + gfree (font_data); + 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; + XRef *xref; +} 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(), gfx->getXRef()); + 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, XRef *xref) { + 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; + info->xref = xref; + + 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, xref); +} + +CairoType3Font::CairoType3Font(Ref ref, + PDFDoc *doc, + cairo_font_face_t *cairo_font_face, + int *codeToGID, + Guint codeToGIDLen, + GBool printing, XRef *xref) : 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))); +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +CairoFontEngine::~CairoFontEngine() { + int i; + + for (i = 0; i < cairoFontCacheSize; ++i) { + if (fontCache[i]) + delete fontCache[i]; + } +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +CairoFont * +CairoFontEngine::getFont(GfxFont *gfxFont, PDFDoc *doc, GBool printing, XRef *xref) { + int i, j; + Ref ref; + CairoFont *font; + GfxFontType fontType; + + fontEngineLocker(); + 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, xref); + else + font = CairoFreeTypeFont::create (gfxFont, xref, 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/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoFontEngine.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoFontEngine.h new file mode 100644 index 00000000000..8c0dba116d5 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoFontEngine.h @@ -0,0 +1,129 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 CAIROFONTENGINE_H +#define CAIROFONTENGINE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#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, XRef *xref); + 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, XRef *xref); + 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, XRef *xref); + +private: + CairoFont *fontCache[cairoFontCacheSize]; + FT_Library lib; + GBool useCIDs; +#if MULTITHREADED + GooMutex mutex; +#endif +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoOutputDev.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoOutputDev.cc new file mode 100644 index 00000000000..1e201d38e36 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoOutputDev.cc @@ -0,0 +1,3315 @@ +//======================================================================== +// +// 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, 2013, 2014 Carlos Garcia Campos <carlosgc@gnome.org> +// Copyright (C) 2008 Carl Worth <cworth@cworth.org> +// Copyright (C) 2008-2014 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, 2012 Hib Eris <hib@hiberis.nl> +// Copyright (C) 2009, 2010 David Benjamin <davidben@mit.edu> +// Copyright (C) 2011-2014 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012 Patrick Pfeifer <p2000@mailinator.com> +// Copyright (C) 2012, 2015 Jason Crain <jason@aquaticape.us> +// Copyright (C) 2015 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 +// +//======================================================================== + +#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 "UnicodeMap.h" +#include "JBIG2Stream.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; + inUncoloredPattern = gFalse; + inType3Char = gFalse; + t3_glyph_has_bbox = gFalse; + text_matrix_valid = gTrue; + + 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; + xref = NULL; +} + +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; + } + xref = doc->getXRef(); +} + +void CairoOutputDev::startPage(int pageNum, GfxState *state, XRef *xrefA) { + /* 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.); + fill_color.r = fill_color.g = fill_color.b = 0; + stroke_pattern = cairo_pattern_reference(fill_pattern); + stroke_color.r = stroke_color.g = stroke_color.b = 0; + + if (text) + text->startPage(state); + if (xrefA != NULL) { + xref = xrefA; + } +} + +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); + + text_matrix_valid = gTrue; + + /* 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; + + if (inUncoloredPattern) + return; + + 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; + + if (inUncoloredPattern) + return; + + 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; + + if (inUncoloredPattern) + return; + + 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; + + if (inUncoloredPattern) + return; + + 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) { + if (inUncoloredPattern) + return; + + 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, xref); + + 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"); + text_matrix_valid = gFalse; + return; + } + + cairo_set_font_matrix (cairo, &matrix); + text_matrix_valid = gTrue; +} + +/* 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 *gfxA, 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_matrix_t pattern_matrix; + cairo_t *old_cairo; + double xMin, yMin, xMax, yMax; + double width, height; + int surface_width, surface_height; + StrokePathClip *strokePathTmp; + GBool adjusted_stroke_width_tmp; + + width = bbox[2] - bbox[0]; + height = bbox[3] - bbox[1]; + + if (xStep != width || yStep != height) + return gFalse; + /* TODO: implement the other cases here too */ + + // Find the width and height of the transformed pattern + cairo_get_matrix (cairo, &matrix); + cairo_matrix_init (&pattern_matrix, mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]); + cairo_matrix_multiply (&matrix, &matrix, &pattern_matrix); + + double widthX = width, widthY = 0; + cairo_matrix_transform_distance (&matrix, &widthX, &widthY); + surface_width = ceil (sqrt (widthX * widthX + widthY * widthY)); + + double heightX = 0, heightY = height; + cairo_matrix_transform_distance (&matrix, &heightX, &heightY); + surface_height = ceil (sqrt (heightX * heightX + heightY * heightY)); + + 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); + cairo_scale (cairo, surface_width / width, surface_height / height); + + box.x1 = bbox[0]; box.y1 = bbox[1]; + box.x2 = bbox[2]; box.y2 = bbox[3]; + strokePathTmp = strokePathClip; + strokePathClip = NULL; + adjusted_stroke_width_tmp = adjusted_stroke_width; + gfx = new Gfx(doc, this, resDict, &box, NULL, NULL, NULL, gfxA->getXRef()); + if (paintType == 2) + inUncoloredPattern = gTrue; + gfx->display(str); + if (paintType == 2) + inUncoloredPattern = gFalse; + delete gfx; + strokePathClip = strokePathTmp; + adjusted_stroke_width = adjusted_stroke_width_tmp; + + 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_transform (cairo, &pattern_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++) { + if (shading->isParameterized()) { + double color0, color1, color2; + shading->getTriangle(i, &x0, &y0, &color0, + &x1, &y1, &color1, + &x2, &y2, &color2); + shading->getParameterizedColor(color0, &color[0]); + shading->getParameterizedColor(color1, &color[1]); + shading->getParameterizedColor(color2, &color[2]); + } else { + 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) { + GooString enc("UTF-8"); + UnicodeMap *utf8Map = globalParams->getUnicodeMap(&enc); + 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 = utf8Map->mapUnicode(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 || !text_matrix_valid) { + goto finish; + } + + 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); + } + } + +finish: + 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) +{ + cairo_pattern_t *pattern; + cairo_surface_t *surface = NULL; + + cairo_push_group_with_content (cairo, content); + pattern = cairo_pop_group (cairo); + cairo_pattern_get_surface (pattern, &surface); + cairo_surface_reference (surface); + cairo_pattern_destroy (pattern); + return surface; +} + + + +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 || transferFunc) { + /* 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 */ + if (!alpha && groupColorSpaceStack->cs) { + 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 = alpha ? fill_opacity : 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 if (alpha) { + 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(const cairo_matrix_t *matrix, + int orig_width, + int orig_height, + int *scaledWidth, + int *scaledHeight) +{ + 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_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; + + /* When printing, don't change the interpolation. */ + if (printing) + return CAIRO_FILTER_NEAREST; + + cairo_matrix_t matrix; + cairo_get_matrix(cairo, &matrix); + int scaled_width, scaled_height; + getScaledSize (&matrix, 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)) { + 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); + } + } + } else { + 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(state, str, ref, colorMap, 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., 1., 1.); + 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., 1., 1.); + 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., 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; +} + +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; +} + +static GBool colorMapHasIdentityDecodeMap(GfxImageColorMap *colorMap) +{ + for (int i = 0; i < colorMap->getNumPixelComps(); i++) { + if (colorMap->getDecodeLow(i) != 0.0 || colorMap->getDecodeHigh(i) != 1.0) + return gFalse; + } + return gTrue; +} + +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2) +static cairo_status_t setMimeIdFromRef(cairo_surface_t *surface, + const char *mime_type, + const char *mime_id_prefix, + Ref ref) +{ + GooString *mime_id; + char *idBuffer; + cairo_status_t status; + + mime_id = new GooString; + + if (mime_id_prefix) + mime_id->append(mime_id_prefix); + + mime_id->appendf("{0:d}-{1:d}", ref.gen, ref.num); + + idBuffer = copyString(mime_id->getCString()); + status = cairo_surface_set_mime_data (surface, mime_type, + (const unsigned char *)idBuffer, + mime_id->getLength(), + gfree, idBuffer); + delete mime_id; + if (status) + gfree (idBuffer); + return status; +} +#endif + +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) +GBool CairoOutputDev::setMimeDataForJBIG2Globals(Stream *str, + cairo_surface_t *image) +{ + JBIG2Stream *jb2Str = static_cast<JBIG2Stream *>(str); + Object* globalsStr = jb2Str->getGlobalsStream(); + char *globalsBuffer; + int globalsLength; + + // nothing to do for JBIG2 stream without Globals + if (!globalsStr->isStream()) + return gTrue; + + if (setMimeIdFromRef(image, CAIRO_MIME_TYPE_JBIG2_GLOBAL_ID, NULL, + jb2Str->getGlobalsStreamRef())) + return gFalse; + + if (!getStreamData(globalsStr->getStream(), &globalsBuffer, &globalsLength)) + return gFalse; + + if (cairo_surface_set_mime_data (image, CAIRO_MIME_TYPE_JBIG2_GLOBAL, + (const unsigned char*)globalsBuffer, + globalsLength, + gfree, (void*)globalsBuffer)) + { + gfree (globalsBuffer); + return gFalse; + } + + return gTrue; +} +#endif + +void CairoOutputDev::setMimeData(GfxState *state, Stream *str, Object *ref, + GfxImageColorMap *colorMap, cairo_surface_t *image) +{ + char *strBuffer; + int len; + Object obj; + GfxColorSpace *colorSpace; + StreamKind strKind = str->getKind(); + const char *mime_type; + + if (!printing) + return; + + switch (strKind) { + case strDCT: + mime_type = CAIRO_MIME_TYPE_JPEG; + break; + case strJPX: + mime_type = CAIRO_MIME_TYPE_JP2; + break; +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) + case strJBIG2: + mime_type = CAIRO_MIME_TYPE_JBIG2; + break; +#endif + default: + return; + } + + str->getDict()->lookup("ColorSpace", &obj); + colorSpace = GfxColorSpace::parse(NULL, &obj, this, state); + obj.free(); + + // colorspace in stream dict may be different from colorspace in jpx + // data + if (strKind == strJPX && colorSpace) + return; + + // only embed mime data for gray, rgb, and cmyk colorspaces. + if (colorSpace) { + GfxColorSpaceMode mode = colorSpace->getMode(); + delete colorSpace; + switch (mode) { + case csDeviceGray: + case csCalGray: + case csDeviceRGB: + case csCalRGB: + case csDeviceCMYK: + case csICCBased: + break; + + case csLab: + case csIndexed: + case csSeparation: + case csDeviceN: + case csPattern: + return; + } + } + + if (!colorMapHasIdentityDecodeMap(colorMap)) + return; + +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) + if (strKind == strJBIG2 && !setMimeDataForJBIG2Globals(str, image)) + return; +#endif + + if (getStreamData (str->getNextStream(), &strBuffer, &len)) { + cairo_status_t status = CAIRO_STATUS_SUCCESS; + +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2) + if (ref && ref->isRef()) { + status = setMimeIdFromRef(image, CAIRO_MIME_TYPE_UNIQUE_ID, + "poppler-surface-", ref->getRef()); + } +#endif + if (!status) { + status = cairo_surface_set_mime_data (image, mime_type, + (const unsigned char *)strBuffer, len, + gfree, strBuffer); + } + + if (status) + gfree (strBuffer); + } +} + +class RescaleDrawImage : public CairoRescaleBox { +private: + ImageStream *imgStr; + GfxRGB *lookup; + int width; + GfxImageColorMap *colorMap; + int *maskColors; + int current_row; + GBool imageError; + +public: + cairo_surface_t *getSourceImage(Stream *str, + int widthA, int height, + int scaledWidth, int scaledHeight, + GBool printing, + GfxImageColorMap *colorMapA, + int *maskColorsA) { + cairo_surface_t *image = NULL; + int i; + + lookup = NULL; + colorMap = colorMapA; + maskColors = maskColorsA; + width = widthA; + current_row = -1; + imageError = gFalse; + + /* 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 + + // 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]); + } + } + + if (printing || scaledWidth >= width || scaledHeight >= height) { + // No downscaling. Create cairo image containing the source image data. + unsigned char *buffer; + int stride; + + image = cairo_image_surface_create (maskColors ? + CAIRO_FORMAT_ARGB32 : + CAIRO_FORMAT_RGB24, + width, height); + if (cairo_surface_status (image)) + goto cleanup; + + 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); + getRow(y, dest); + } + } else { + // // Downscaling required. Create cairo image the size of the + // rescaled image and // downscale the source image data into + // the cairo image. downScaleImage() will call getRow() to read + // source image data from the image stream. This avoids having + // to create an image the size of the source image which may + // exceed cairo's 32676x32767 image size limit (and also saves a + // lot of memory). + image = cairo_image_surface_create (maskColors ? + CAIRO_FORMAT_ARGB32 : + CAIRO_FORMAT_RGB24, + scaledWidth, scaledHeight); + if (cairo_surface_status (image)) + goto cleanup; + + downScaleImage(width, height, + scaledWidth, scaledHeight, + 0, 0, scaledWidth, scaledHeight, + image); + } + cairo_surface_mark_dirty (image); + + cleanup: + gfree(lookup); + imgStr->close(); + delete imgStr; + return image; + } + + void getRow(int row_num, uint32_t *row_data) { + int i; + Guchar *pix; + + if (row_num <= current_row) + return; + + while (current_row < row_num) { + pix = imgStr->getLine(); + current_row++; + } + + if (unlikely(pix == NULL)) { + memset(row_data, 0, width*4); + if (!imageError) { + error(errInternal, -1, "Bad image stream"); + imageError = gTrue; + } + } else if (lookup) { + Guchar *p = pix; + GfxRGB rgb; + + for (i = 0; i < width; i++) { + rgb = lookup[*p]; + row_data[i] = + ((int) colToByte(rgb.r) << 16) | + ((int) colToByte(rgb.g) << 8) | + ((int) colToByte(rgb.b) << 0); + p++; + } + } else { + colorMap->getRGBLine (pix, row_data, 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) + *row_data |= 0xff000000; + else + *row_data = 0; + row_data++; + pix += colorMap->getNumPixelComps(); + } + } + } + +}; + +void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, + int widthA, int heightA, + GfxImageColorMap *colorMap, + GBool interpolate, + int *maskColors, GBool inlineImg) +{ + cairo_surface_t *image; + cairo_pattern_t *pattern, *maskPattern; + cairo_matrix_t matrix; + int width, height; + int scaledWidth, scaledHeight; + cairo_filter_t filter = CAIRO_FILTER_BILINEAR; + RescaleDrawImage rescale; + + LOG (printf ("drawImage %dx%d\n", widthA, heightA)); + + cairo_get_matrix(cairo, &matrix); + getScaledSize (&matrix, widthA, heightA, &scaledWidth, &scaledHeight); + image = rescale.getSourceImage(str, widthA, heightA, scaledWidth, scaledHeight, printing, colorMap, maskColors); + if (!image) + return; + + width = cairo_image_surface_get_width (image); + height = cairo_image_surface_get_height (image); + if (width == widthA && height == heightA) + filter = getFilterForSurface (image, interpolate); + + if (!inlineImg) /* don't read stream twice if it is an inline image */ + setMimeData(state, str, ref, colorMap, image); + + pattern = cairo_pattern_create_for_surface (image); + cairo_surface_destroy (image); + if (cairo_pattern_status (pattern)) + return; + + 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); + return; + } + + 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); + if (mask) + 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); +} + + +//------------------------------------------------------------------------ +// 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::getBBox(GfxState *state, int width, int height, + double *x1, double *y1, double *x2, double *y2) +{ + double *ctm = state->getCTM(); + cairo_matrix_t matrix; + cairo_matrix_init(&matrix, + ctm[0], ctm[1], + -ctm[2], -ctm[3], + ctm[2] + ctm[4], ctm[3] + ctm[5]); + + int scaledWidth, scaledHeight; + getScaledSize (&matrix, width, height, &scaledWidth, &scaledHeight); + + if (matrix.xx >= 0) { + *x1 = matrix.x0; + } else { + *x1 = matrix.x0 - scaledWidth; + } + *x2 = *x1 + scaledWidth; + + if (matrix.yy >= 0) { + *y1 = matrix.y0; + } else { + *y1 = matrix.y0 - scaledHeight; + } + *y2 = *y1 + scaledHeight; +} + +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; + CairoImage *image; + + getBBox(state, width, height, &x1, &y1, &x2, &y2); + + 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::setSoftMaskFromImageMask(GfxState *state, Object *ref, Stream *str, + int width, int height, GBool invert, + GBool inlineImg, double *baseMatrix) +{ + cairo_t *cr; + cairo_surface_t *surface; + double x1, y1, x2, y2; + CairoImage *image; + + getBBox(state, width, height, &x1, &y1, &x2, &y2); + + 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, inlineImg, gFalse); + if (state->getFillColorSpace()->getMode() == csPattern) { + cairo_mask (cairo, mask); + } + 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; + CairoImage *image; + + getBBox(state, width, height, &x1, &y1, &x2, &y2); + + 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; + CairoImage *image; + + getBBox(state, width, height, &x1, &y1, &x2, &y2); + + 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; + CairoImage *image; + + getBBox(state, width, height, &x1, &y1, &x2, &y2); + + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoOutputDev.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoOutputDev.h new file mode 100644 index 00000000000..33dde0c570a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoOutputDev.h @@ -0,0 +1,517 @@ +//======================================================================== +// +// 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, 2013 Carlos Garcia Campos <carlosgc@gnome.org> +// Copyright (C) 2008, 2009, 2011-2014 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu> +// Copyright (C) 2010-2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2015 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 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; } + + // Does this device need to clip pages to the crop box even when the + // box is the crop box? + virtual GBool needClipToCropBox() { return gTrue; } + + //----- initialization and control + + // Start a page. + virtual void startPage(int pageNum, GfxState *state, XRef *xref); + + // 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 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(const cairo_matrix_t *matrix, + 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(GfxState *state, Stream *str, Object *ref, + GfxImageColorMap *colorMap, cairo_surface_t *image); + void fillToStrokePathClip(GfxState *state); + void alignStrokeCoords(GfxSubpath *subpath, int i, double *x, double *y); +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) + GBool setMimeDataForJBIG2Globals (Stream *str, cairo_surface_t *image); +#endif + + 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; + XRef *xref; + + 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; + GBool text_matrix_valid; + 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 inUncoloredPattern; // inside a uncolored pattern (PaintType = 2) + 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); + 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) {} + + + //----- 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); + void getBBox(GfxState *state, int width, int height, + double *x1, double *y1, double *x2, double *y2); + + CairoImage **images; + int numImages; + int size; + GBool (*imgDrawCbk)(int img_id, void *data); + void *imgDrawCbkData; +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoRescaleBox.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoRescaleBox.cc new file mode 100644 index 00000000000..3c96f45e5d3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoRescaleBox.cc @@ -0,0 +1,378 @@ +/* -*- 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> +// 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 +// +//======================================================================== + + +/* 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 CairoRescaleBox::downScaleImage(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, + cairo_surface_t *dest_surface) { + int pixel_coverage_x, pixel_coverage_y; + int dest_y; + int src_y = 0; + uint32_t *scanline; + int *x_coverage = NULL; + int *y_coverage = NULL; + uint32_t *temp_buf = NULL; + GBool retval = gFalse; + unsigned int *dest; + int dst_stride; + + dest = (unsigned int *)cairo_image_surface_get_data (dest_surface); + dst_stride = cairo_image_surface_get_stride (dest_surface); + + scanline = (uint32_t*)gmallocn3 (orig_width, 1, sizeof(int)); + + 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]; + + getRow(src_y, scanline); + 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) + { + getRow(src_y, scanline); + 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) + { + getRow(src_y, scanline); + 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); + free (scanline); + + return retval; +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoRescaleBox.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoRescaleBox.h new file mode 100644 index 00000000000..072e8a9c80c --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CairoRescaleBox.h @@ -0,0 +1,61 @@ +/* + * 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 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 CAIRO_RESCALE_BOX_H +#define CAIRO_RESCALE_BOX_H + +#include "goo/gtypes.h" +#include <cairo.h> + +class CairoRescaleBox { +public: + + CairoRescaleBox() {}; + virtual ~CairoRescaleBox() {}; + + virtual GBool downScaleImage(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, + cairo_surface_t *dest_surface); + + virtual void getRow(int row_num, uint32_t *row_data) = 0; + +}; + +#endif /* CAIRO_RESCALE_BOX_H */ diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Catalog.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Catalog.cc new file mode 100644 index 00000000000..04caa1c1f35 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Catalog.cc @@ -0,0 +1,1142 @@ +//======================================================================== +// +// 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-2013, 2015 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> +// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 Julien Nabet <serval2412@yahoo.fr> +// Copyright (C) 2013 Adrian Perez de Castro <aperez@igalia.com> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 José Aliste <jaliste@src.gnome.org> +// Copyright (C) 2014 Ed Porras <ed@moto-research.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 <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" +#include "StructTreeRoot.h" + +#if MULTITHREADED +# define catalogLocker() MutexLocker locker(&mutex) +#else +# define catalogLocker() +#endif +//------------------------------------------------------------------------ +// Catalog +//------------------------------------------------------------------------ + +Catalog::Catalog(PDFDoc *docA) { + Object catDict, pagesDict, pagesDictRef; + Object obj, obj2; + Object optContentProps; + +#if MULTITHREADED + gInitMutex(&mutex); +#endif + 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; + structTreeRoot = NULL; + + pagesList = NULL; + pagesRefList = NULL; + attrsList = NULL; + kidsIdxList = NULL; + lastCachedPage = 0; + markInfo = markInfoNull; + + 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(); + + // actions + catDict.dictLookupNF("AA", &additionalActions); + + // 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; + delete structTreeRoot; + metadata.free(); + outline.free(); + acroForm.free(); + viewerPreferences.free(); + additionalActions.free(); +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +GooString *Catalog::readMetadata() { + GooString *s; + Dict *dict; + Object obj; + + catalogLocker(); + 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; + + catalogLocker(); + if (i > lastCachedPage) { + GBool cached = cachePageTree(i); + if ( cached == gFalse) { + return NULL; + } + } + return pages[i-1]; +} + +Ref *Catalog::getPageRef(int i) +{ + if (i < 1) return NULL; + + catalogLocker(); + if (i > lastCachedPage) { + GBool cached = cachePageTree(i); + if ( cached == 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) { + catalogLocker(); + 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; + catalogLocker(); + 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 + catalogLocker(); + 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() { + + catalogLocker(); + 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() { + + catalogLocker(); + 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; +} + +int NameTree::Entry::cmpEntry(const void *voidEntry, const void *voidOtherEntry) +{ + Entry *entry = *(NameTree::Entry **) voidEntry; + Entry *otherEntry = *(NameTree::Entry **) voidOtherEntry; + + return entry->name.cmp(&otherEntry->name); +} + +void NameTree::init(XRef *xrefA, Object *tree) { + xref = xrefA; + parse(tree); + if (entries && length > 0) { + qsort(entries, length, sizeof(Entry *), Entry::cmpEntry); + } +} + +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 { + error(errSyntaxError, -1, "failed to look up ({0:s})", 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() +{ + catalogLocker(); + 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); + + // 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(); + catDict.free(); + return 0; + } + + pagesDict.dictLookup("Count", &obj); + // some PDF files actually use real numbers here ("/Count 9.0") + if (!obj.isNum()) { + if (pagesDict.dictIs("Page")) { + Object pageRootRef; + catDict.dictLookupNF("Pages", &pageRootRef); + + error(errSyntaxError, -1, "Pages top-level is a single Page. The document is malformed, trying to recover..."); + + Dict *pageDict = pagesDict.getDict(); + if (pageRootRef.isRef()) { + const Ref pageRef = pageRootRef.getRef(); + Page *p = new Page(doc, 1, pageDict, pageRef, new PageAttrs(NULL, pageDict), form); + if (p->isOk()) { + pages = (Page **)gmallocn(1, sizeof(Page *)); + pageRefs = (Ref *)gmallocn(1, sizeof(Ref)); + + pages[0] = p; + pageRefs[0].num = pageRef.num; + pageRefs[0].gen = pageRef.gen; + + numPages = 1; + lastCachedPage = 1; + pagesSize = 1; + } else { + delete p; + numPages = 0; + } + } else { + numPages = 0; + } + } else { + error(errSyntaxError, -1, "Page count in top-level pages object is wrong type ({0:s})", + obj.getTypeName()); + numPages = 0; + } + } else { + numPages = (int)obj.getNum(); + } + + catDict.free(); + obj.free(); + pagesDict.free(); + } + + return numPages; +} + +PageLabelInfo *Catalog::getPageLabelInfo() +{ + catalogLocker(); + 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; +} + +StructTreeRoot *Catalog::getStructTreeRoot() +{ + catalogLocker(); + if (!structTreeRoot) { + Object catalog; + Object root; + + xref->getCatalog(&catalog); + if (!catalog.isDict()) { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catalog.getTypeName()); + catalog.free(); + return NULL; + } + + if (catalog.dictLookup("StructTreeRoot", &root)->isDict("StructTreeRoot")) { + structTreeRoot = new StructTreeRoot(doc, root.getDict()); + } + + root.free(); + catalog.free(); + } + return structTreeRoot; +} + +Guint Catalog::getMarkInfo() +{ + if (markInfo == markInfoNull) { + markInfo = 0; + + Object catDict; + catalogLocker(); + xref->getCatalog(&catDict); + + if (catDict.isDict()) { + Object markInfoDict; + catDict.dictLookup("MarkInfo", &markInfoDict); + if (markInfoDict.isDict()) { + Object value; + + if (markInfoDict.dictLookup("Marked", &value)->isBool() && value.getBool()) + markInfo |= markInfoMarked; + else if (!value.isNull()) + error(errSyntaxError, -1, "Marked object is wrong type ({0:s})", value.getTypeName()); + value.free(); + + if (markInfoDict.dictLookup("Suspects", &value)->isBool() && value.getBool()) + markInfo |= markInfoSuspects; + else if (!value.isNull()) + error(errSyntaxError, -1, "Suspects object is wrong type ({0:s})", value.getTypeName()); + value.free(); + + if (markInfoDict.dictLookup("UserProperties", &value)->isBool() && value.getBool()) + markInfo |= markInfoUserProperties; + else if (!value.isNull()) + error(errSyntaxError, -1, "UserProperties object is wrong type ({0:s})", value.getTypeName()); + value.free(); + } else if (!markInfoDict.isNull()) { + error(errSyntaxError, -1, "MarkInfo object is wrong type ({0:s})", markInfoDict.getTypeName()); + } + markInfoDict.free(); + } else { + error(errSyntaxError, -1, "Catalog object is wrong type ({0:s})", catDict.getTypeName()); + } + catDict.free(); + } + return markInfo; +} + +Object *Catalog::getOutline() +{ + catalogLocker(); + 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() +{ + catalogLocker(); + 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; +} + +Catalog::FormType Catalog::getFormType() +{ + Object xfa; + FormType res = NoForm; + + if (acroForm.isDict()) { + acroForm.dictLookup("XFA", &xfa); + if (xfa.isStream() || xfa.isArray()) { + res = XfaForm; + } else { + res = AcroForm; + } + xfa.free(); + } + + return res; +} + +Form *Catalog::getForm() +{ + catalogLocker(); + 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() +{ + catalogLocker(); + 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; +} + +LinkAction* Catalog::getAdditionalAction(DocumentAdditionalActionsType type) { + Object additionalActionsObject; + LinkAction *linkAction = NULL; + + if (additionalActions.fetch(doc->getXRef(), &additionalActionsObject)->isDict()) { + const char *key = (type == actionCloseDocument ? "WC" : + type == actionSaveDocumentStart ? "WS" : + type == actionSaveDocumentFinish ? "DS" : + type == actionPrintDocumentStart ? "WP" : + type == actionPrintDocumentFinish ? "DP" : NULL); + + Object actionObject; + + if (additionalActionsObject.dictLookup(key, &actionObject)->isDict()) + linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); + actionObject.free(); + } + + additionalActionsObject.free(); + + return linkAction; +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Catalog.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Catalog.h new file mode 100644 index 00000000000..bc9ce20b098 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Catalog.h @@ -0,0 +1,272 @@ +//======================================================================== +// +// 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, 2013 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> +// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 Adrian Perez de Castro <aperez@igalia.com> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 José Aliste <jaliste@src.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 CATALOG_H +#define CATALOG_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "Object.h" +#include "goo/GooMutex.h" + +#include <vector> + +class PDFDoc; +class XRef; +class Object; +class Page; +class PageAttrs; +struct Ref; +class LinkDest; +class LinkAction; +class PageLabelInfo; +class Form; +class OCGs; +class ViewerPreferences; +class FileSpec; +class StructTreeRoot; + +//------------------------------------------------------------------------ +// 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 cmpEntry(const void *voidEntry, const void *voidOtherEntry); + 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. + StructTreeRoot *getStructTreeRoot(); + + // Return values from the MarkInfo dictionary as flags in a bitfield. + enum MarkInfoFlags { + markInfoNull = 1 << 0, + markInfoMarked = 1 << 1, + markInfoUserProperties = 1 << 2, + markInfoSuspects = 1 << 3, + }; + Guint getMarkInfo(); + + // 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(); } + GooString *getJSName(int i) { return getJSNameTree()->getName(i); } + + // 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; } + + enum FormType + { + NoForm, + AcroForm, + XfaForm + }; + + FormType getFormType(); + 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(); + + enum DocumentAdditionalActionsType { + actionCloseDocument, ///< Performed before closing the document + actionSaveDocumentStart, ///< Performed before saving the document + actionSaveDocumentFinish, ///< Performed after saving the document + actionPrintDocumentStart, ///< Performed before printing the document + actionPrintDocumentFinish, ///< Performed after printing the document + }; + + LinkAction *getAdditionalAction(DocumentAdditionalActionsType type); + +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 + StructTreeRoot *structTreeRoot; // structure tree root + Guint markInfo; // Flags from MarkInfo 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 + Object additionalActions; // page additional actions + + GBool cachePageTree(int page); // Cache first <page> pages. + Object *findDestInTree(Object *tree, GooString *name, Object *obj); + + Object *getNames(); + NameTree *getDestNameTree(); + NameTree *getEmbeddedFileNameTree(); + NameTree *getJSNameTree(); +#if MULTITHREADED + GooMutex mutex; +#endif + +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/CharCodeToUnicode.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/CharCodeToUnicode.cc new file mode 100644 index 00000000000..5576a4a57d4 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CharCodeToUnicode.cc @@ -0,0 +1,729 @@ +//======================================================================== +// +// 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 <jwilk@jwilk.net> +// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2014 Jiri Slaby <jirislaby@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 <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" +#include "UTF.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; + if (!UnicodeIsValid(map[code])) { + map[code] = 0xfffd; + } + } else { + if (sMapLen >= sMapSize) { + sMapSize = sMapSize + 16; + sMap = (CharCodeToUnicodeString *) + greallocn(sMap, sMapSize, sizeof(CharCodeToUnicodeString)); + } + map[code] = 0; + sMap[sMapLen].c = code; + int utf16Len = n / 4; + Unicode *utf16 = (Unicode*)gmallocn(utf16Len, sizeof(Unicode)); + for (j = 0; j < utf16Len; ++j) { + if (!parseHex(uStr + j*4, 4, &utf16[j])) { + gfree(utf16); + error(errSyntaxWarning, -1, "Illegal entry in ToUnicode CMap"); + return; + } + } + utf16[utf16Len - 1] += offset; + sMap[sMapLen].len = UTF16toUCS4(utf16, utf16Len, &sMap[sMapLen].u); + gfree(utf16); + ++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) { + if (UnicodeIsValid(u[j])) { + sMap[i].u[j] = u[j]; + } else { + sMap[i].u[j] = 0xfffd; + } + } + } +} + +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 || (usize > 1 && !(*u & ~0xff))) { + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/CharCodeToUnicode.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CharCodeToUnicode.h new file mode 100644 index 00000000000..1672105a8f4 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CharCodeToUnicode.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/CharTypes.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CharTypes.h new file mode 100644 index 00000000000..d0df630d0c9 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CharTypes.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/CompactFontTables.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CompactFontTables.h new file mode 100644 index 00000000000..cfbfdaf5752 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CompactFontTables.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlCachedFile.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlCachedFile.cc new file mode 100644 index 00000000000..af4c2b60322 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlCachedFile.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlCachedFile.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlCachedFile.h new file mode 100644 index 00000000000..49882aba8ac --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlCachedFile.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlPDFDocBuilder.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlPDFDocBuilder.cc new file mode 100644 index 00000000000..5b02b14a784 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlPDFDocBuilder.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlPDFDocBuilder.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlPDFDocBuilder.h new file mode 100644 index 00000000000..fb34862057c --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/CurlPDFDocBuilder.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/DCTStream.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/DCTStream.cc new file mode 100644 index 00000000000..bfdb0eaf80a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/DCTStream.cc @@ -0,0 +1,266 @@ +//======================================================================== +// +// 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, 2013 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, Object *dict, int recursion) : + FilterStream(strA) { + colorXform = colorXformA; + if (dict != NULL) { + Object obj; + + dict->dictLookup("Width", &obj, recursion); + err.width = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0; + obj.free(); + dict->dictLookup("Height", &obj, recursion); + err.height = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0; + obj.free(); + } else + err.height = err.width = 0; + 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; + if (cinfo->err->msg_code == JERR_IMAGE_TOO_BIG && err->width != 0 && err->height != 0) { + cinfo->image_height = err->height; + cinfo->image_width = err->width; + } else { + 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)) + { + if (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/Build/source/libs/poppler/poppler-0.36.0/poppler/DCTStream.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/DCTStream.h new file mode 100644 index 00000000000..bc20a7aaab6 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/DCTStream.h @@ -0,0 +1,91 @@ +//======================================================================== +// +// 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> +// Copyright 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// +//======================================================================== + +#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> +#include <jerror.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; + int width; + int height; +}; + +class DCTStream: public FilterStream { +public: + + DCTStream(Stream *strA, int colorXformA, Object *dict, int recursion); + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/DateInfo.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/DateInfo.cc new file mode 100644 index 00000000000..563204a1743 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/DateInfo.cc @@ -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", + ¢ury, &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/Build/source/libs/poppler/poppler-0.36.0/poppler/DateInfo.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/DateInfo.h new file mode 100644 index 00000000000..116350f4134 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/DateInfo.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Decrypt.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Decrypt.cc new file mode 100644 index 00000000000..ba44f959c31 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Decrypt.cc @@ -0,0 +1,1417 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 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 "goo/gmem.h" +#include "goo/grandom.h" +#include "Decrypt.h" +#include "Error.h" + +static void rc4InitKey(Guchar *key, int keyLen, Guchar *state); +static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c); + +static GBool aesReadBlock(Stream *str, Guchar *in, GBool addPadding); + +static void aesKeyExpansion(DecryptAESState *s, Guchar *objKey, int objKeyLen, GBool decrypt); +static void aesEncryptBlock(DecryptAESState *s, Guchar *in); +static void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last); + +static void aes256KeyExpansion(DecryptAES256State *s, Guchar *objKey, int objKeyLen, GBool decrypt); +static void aes256EncryptBlock(DecryptAES256State *s, Guchar *in); +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, gTrue); + 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, gTrue); + 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; +} + +//------------------------------------------------------------------------ +// BaseCryptStream +//------------------------------------------------------------------------ + +BaseCryptStream::BaseCryptStream(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; + autoDelete = gTrue; +} + +BaseCryptStream::~BaseCryptStream() { + if (autoDelete) { + delete str; + } +} + +void BaseCryptStream::reset() { + charactersRead = 0; + nextCharBuff = EOF; + str->reset(); +} + +Goffset BaseCryptStream::getPos() { + return charactersRead; +} + +int BaseCryptStream::getChar() { + // Read next character and empty the buffer, so that a new character will be read next time + int c = lookChar(); + nextCharBuff = EOF; + + if (c != EOF) + charactersRead++; + return c; +} + +GBool BaseCryptStream::isBinary(GBool last) { + return str->isBinary(last); +} + +void BaseCryptStream::setAutoDelete(GBool val) { + autoDelete = val; +} + +//------------------------------------------------------------------------ +// EncryptStream +//------------------------------------------------------------------------ + +EncryptStream::EncryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, + int keyLength, int objNum, int objGen): + BaseCryptStream(strA, fileKey, algoA, keyLength, objNum, objGen) +{ + // Fill the CBC initialization vector for AES and AES-256 + switch (algo) { + case cryptAES: + grandom_fill(state.aes.cbc, 16); + break; + case cryptAES256: + grandom_fill(state.aes256.cbc, 16); + break; + default: + break; + } +} + +EncryptStream::~EncryptStream() { +} + +void EncryptStream::reset() { + BaseCryptStream::reset(); + + switch (algo) { + case cryptRC4: + state.rc4.x = state.rc4.y = 0; + rc4InitKey(objKey, objKeyLength, state.rc4.state); + break; + case cryptAES: + aesKeyExpansion(&state.aes, objKey, objKeyLength, gFalse); + memcpy(state.aes.buf, state.aes.cbc, 16); // Copy CBC IV to buf + state.aes.bufIdx = 0; + state.aes.paddingReached = gFalse; + break; + case cryptAES256: + aes256KeyExpansion(&state.aes256, objKey, objKeyLength, gFalse); + memcpy(state.aes256.buf, state.aes256.cbc, 16); // Copy CBC IV to buf + state.aes256.bufIdx = 0; + state.aes256.paddingReached = gFalse; + break; + } +} + +int EncryptStream::lookChar() { + Guchar in[16]; + int c; + + if (nextCharBuff != EOF) + return nextCharBuff; + + c = EOF; // make gcc happy + switch (algo) { + case cryptRC4: + if ((c = str->getChar()) != EOF) { + // RC4 is XOR-based: the decryption algorithm works for encryption too + c = rc4DecryptByte(state.rc4.state, &state.rc4.x, &state.rc4.y, (Guchar)c); + } + break; + case cryptAES: + if (state.aes.bufIdx == 16 && !state.aes.paddingReached) { + state.aes.paddingReached = !aesReadBlock(str, in, gTrue); + aesEncryptBlock(&state.aes, in); + } + if (state.aes.bufIdx == 16) { + c = EOF; + } else { + c = state.aes.buf[state.aes.bufIdx++]; + } + break; + case cryptAES256: + if (state.aes256.bufIdx == 16 && !state.aes256.paddingReached) { + state.aes256.paddingReached = !aesReadBlock(str, in, gTrue); + aes256EncryptBlock(&state.aes256, in); + } + if (state.aes256.bufIdx == 16) { + c = EOF; + } else { + c = state.aes256.buf[state.aes256.bufIdx++]; + } + break; + } + return (nextCharBuff = c); +} + +//------------------------------------------------------------------------ +// DecryptStream +//------------------------------------------------------------------------ + +DecryptStream::DecryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, + int keyLength, int objNum, int objGen): + BaseCryptStream(strA, fileKey, algoA, keyLength, objNum, objGen) +{ +} + +DecryptStream::~DecryptStream() { +} + +void DecryptStream::reset() { + int i; + BaseCryptStream::reset(); + + switch (algo) { + case cryptRC4: + state.rc4.x = state.rc4.y = 0; + rc4InitKey(objKey, objKeyLength, state.rc4.state); + break; + case cryptAES: + aesKeyExpansion(&state.aes, objKey, objKeyLength, gTrue); + for (i = 0; i < 16; ++i) { + state.aes.cbc[i] = str->getChar(); + } + state.aes.bufIdx = 16; + break; + case cryptAES256: + aes256KeyExpansion(&state.aes256, objKey, objKeyLength, gTrue); + for (i = 0; i < 16; ++i) { + state.aes256.cbc[i] = str->getChar(); + } + state.aes256.bufIdx = 16; + break; + } +} + +int DecryptStream::lookChar() { + Guchar in[16]; + int c; + + if (nextCharBuff != EOF) + return nextCharBuff; + + c = EOF; // make gcc happy + switch (algo) { + case cryptRC4: + if ((c = str->getChar()) != EOF) { + c = rc4DecryptByte(state.rc4.state, &state.rc4.x, &state.rc4.y, (Guchar)c); + } + break; + case cryptAES: + if (state.aes.bufIdx == 16) { + if (aesReadBlock(str, in, gFalse)) { + 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) { + if (aesReadBlock(str, in, gFalse)) { + aes256DecryptBlock(&state.aes256, in, str->lookChar() == EOF); + } + } + if (state.aes256.bufIdx == 16) { + c = EOF; + } else { + c = state.aes256.buf[state.aes256.bufIdx++]; + } + break; + } + return (nextCharBuff = c); +} + +//------------------------------------------------------------------------ +// RC4-compatible decryption +//------------------------------------------------------------------------ + +static 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; + } +} + +static 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 +//------------------------------------------------------------------------ + +// Returns gFalse if EOF was reached, gTrue otherwise +static GBool aesReadBlock(Stream *str, Guchar *in, GBool addPadding) +{ + int c, i; + + for (i = 0; i < 16; ++i) { + if ((c = str->getChar()) != EOF) { + in[i] = (Guchar)c; + } else { + break; + } + } + + if (i == 16) { + return gTrue; + } else { + if (addPadding) { + c = 16 - i; + while (i < 16) { + in[i++] = (Guchar)c; + } + } + return gFalse; + } +} + +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 subBytes(Guchar *state) { + int i; + + for (i = 0; i < 16; ++i) { + state[i] = sbox[state[i]]; + } +} + +static inline void invSubBytes(Guchar *state) { + int i; + + for (i = 0; i < 16; ++i) { + state[i] = invSbox[state[i]]; + } +} + +static inline void shiftRows(Guchar *state) { + Guchar t; + + t = state[4]; + state[4] = state[5]; + state[5] = state[6]; + state[6] = state[7]; + state[7] = t; + + t = state[8]; + state[8] = state[10]; + state[10] = t; + t = state[9]; + state[9] = state[11]; + state[11] = t; + + t = state[15]; + state[15] = state[14]; + state[14] = state[13]; + state[13] = state[12]; + state[12] = t; +} + +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; +} + +// {02} \cdot s +static inline Guchar mul02(Guchar s) { + return (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); +} + +// {03} \cdot s +static inline Guchar mul03(Guchar s) { + Guchar s2 = (s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1); + return s ^ s2; +} + +// {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 mixColumns(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] = mul02(s0) ^ mul03(s1) ^ s2 ^ s3; + state[4+c] = s0 ^ mul02(s1) ^ mul03(s2) ^ s3; + state[8+c] = s0 ^ s1 ^ mul02(s2) ^ mul03(s3); + state[12+c] = mul03(s0) ^ s1 ^ s2 ^ mul02(s3); + } +} + +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*/, GBool decrypt) { + 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; + } + + /* In case of decryption, adjust the key schedule for the equivalent inverse cipher */ + if (decrypt) { + for (round = 1; round <= 9; ++round) { + invMixColumnsW(&s->w[round * 4]); + } + } +} + +static void aesEncryptBlock(DecryptAESState *s, Guchar *in) { + int c, round; + + // initial state (input is xor'd with previous output because of CBC) + for (c = 0; c < 4; ++c) { + s->state[c] = in[4*c] ^ s->buf[4*c]; + s->state[4+c] = in[4*c+1] ^ s->buf[4*c+1]; + s->state[8+c] = in[4*c+2] ^ s->buf[4*c+2]; + s->state[12+c] = in[4*c+3] ^ s->buf[4*c+3]; + } + + // round 0 + addRoundKey(s->state, &s->w[0]); + + // rounds 1-9 + for (round = 1; round <= 9; ++round) { + subBytes(s->state); + shiftRows(s->state); + mixColumns(s->state); + addRoundKey(s->state, &s->w[round * 4]); + } + + // round 10 + subBytes(s->state); + shiftRows(s->state); + addRoundKey(s->state, &s->w[10 * 4]); + + for (c = 0; c < 4; ++c) { + s->buf[4*c] = s->state[c]; + s->buf[4*c+1] = s->state[4+c]; + s->buf[4*c+2] = s->state[8+c]; + s->buf[4*c+3] = s->state[12+c]; + } + + s->bufIdx = 0; +} + +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, GBool decrypt) { + 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; + } + + /* In case of decryption, adjust the key schedule for the equivalent inverse cipher */ + if (decrypt) { + for (round = 1; round <= 13; ++round) { + invMixColumnsW(&s->w[round * 4]); + } + } +} + +static void aes256EncryptBlock(DecryptAES256State *s, Guchar *in) { + int c, round; + + // initial state (input is xor'd with previous output because of CBC) + for (c = 0; c < 4; ++c) { + s->state[c] = in[4*c] ^ s->buf[4*c]; + s->state[4+c] = in[4*c+1] ^ s->buf[4*c+1]; + s->state[8+c] = in[4*c+2] ^ s->buf[4*c+2]; + s->state[12+c] = in[4*c+3] ^ s->buf[4*c+3]; + } + + // round 0 + addRoundKey(s->state, &s->w[0]); + + // rounds 1-13 + for (round = 1; round <= 13; ++round) { + subBytes(s->state); + shiftRows(s->state); + mixColumns(s->state); + addRoundKey(s->state, &s->w[round * 4]); + } + + // round 14 + subBytes(s->state); + shiftRows(s->state); + addRoundKey(s->state, &s->w[14 * 4]); + + for (c = 0; c < 4; ++c) { + s->buf[4*c] = s->state[c]; + s->buf[4*c+1] = s->state[4+c]; + s->buf[4*c+2] = s->state[8+c]; + s->buf[4*c+3] = s->state[12+c]; + } + + s->bufIdx = 0; +} + +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/Build/source/libs/poppler/poppler-0.36.0/poppler/Decrypt.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Decrypt.h new file mode 100644 index 00000000000..10a6386c6b5 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Decrypt.h @@ -0,0 +1,161 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2013 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 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); +}; + +//------------------------------------------------------------------------ +// Helper classes +//------------------------------------------------------------------------ + +/* DecryptRC4State, DecryptAESState, DecryptAES256State are named like this for + * historical reasons, but they're used for encryption too. + * In case of decryption, the cbc field in AES and AES-256 contains the previous + * input block or the CBC initialization vector (IV) if the stream has just been + * reset). In case of encryption, it always contains the IV, whereas the + * previous output is kept in buf. The paddingReached field is only used in + * case of encryption. */ +struct DecryptRC4State { + Guchar state[256]; + Guchar x, y; +}; + +struct DecryptAESState { + Guint w[44]; + Guchar state[16]; + Guchar cbc[16]; + Guchar buf[16]; + GBool paddingReached; // encryption only + int bufIdx; +}; + +struct DecryptAES256State { + Guint w[60]; + Guchar state[16]; + Guchar cbc[16]; + Guchar buf[16]; + GBool paddingReached; // encryption only + int bufIdx; +}; + +class BaseCryptStream : public FilterStream { +public: + + BaseCryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, + int keyLength, int objNum, int objGen); + virtual ~BaseCryptStream(); + virtual StreamKind getKind() { return strCrypt; } + virtual void reset(); + virtual int getChar(); + virtual int lookChar() = 0; + virtual Goffset getPos(); + virtual GBool isBinary(GBool last); + virtual Stream *getUndecodedStream() { return this; } + void setAutoDelete(GBool val); + +protected: + CryptAlgorithm algo; + int objKeyLength; + Guchar objKey[32]; + Goffset charactersRead; // so that getPos() can be correct + int nextCharBuff; // EOF means not read yet + GBool autoDelete; + + union { + DecryptRC4State rc4; + DecryptAESState aes; + DecryptAES256State aes256; + } state; +}; + +//------------------------------------------------------------------------ +// EncryptStream / DecryptStream +//------------------------------------------------------------------------ + +class EncryptStream : public BaseCryptStream { +public: + + EncryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, + int keyLength, int objNum, int objGen); + ~EncryptStream(); + virtual void reset(); + virtual int lookChar(); +}; + +class DecryptStream : public BaseCryptStream { +public: + + DecryptStream(Stream *strA, Guchar *fileKey, CryptAlgorithm algoA, + int keyLength, int objNum, int objGen); + ~DecryptStream(); + virtual void reset(); + virtual int lookChar(); +}; + +//------------------------------------------------------------------------ + +extern void md5(Guchar *msg, int msgLen, Guchar *digest); + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Dict.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Dict.cc new file mode 100644 index 00000000000..c2a94f4a1fa --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Dict.cc @@ -0,0 +1,300 @@ +//======================================================================== +// +// 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, 2013, 2014 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2010 PaweÅ‚ Wiejacha <pawel.wiejacha@gmail.com> +// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2014 Scott West <scott.gregory.west@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 <algorithm> +#include <stddef.h> +#include <string.h> +#include "goo/gmem.h" +#include "Object.h" +#include "XRef.h" +#include "Dict.h" + +#if MULTITHREADED +# define dictLocker() MutexLocker locker(&mutex) +#else +# define dictLocker() +#endif +//------------------------------------------------------------------------ +// 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; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +Dict::Dict(Dict* dictA) { + xref = dictA->xref; + size = length = dictA->length; + ref = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif + + sorted = dictA->sorted; + entries = (DictEntry *)gmallocn(size, sizeof(DictEntry)); + for (int i=0; i<length; i++) { + entries[i].key = copyString(dictA->entries[i].key); + dictA->entries[i].val.copy(&entries[i].val); + } +} + +Dict *Dict::copy(XRef *xrefA) { + dictLocker(); + Dict *dictA = new Dict(this); + dictA->xref = xrefA; + for (int i=0; i<length; i++) { + if (dictA->entries[i].val.getType() == objDict) { + Dict *dict = dictA->entries[i].val.getDict(); + Object obj; + obj.initDict(dict->copy(xrefA)); + dictA->entries[i].val.free(); + dictA->entries[i].val = obj; + obj.free(); + } + } + return dictA; +} + +Dict::~Dict() { + int i; + + for (i = 0; i < length; ++i) { + gfree(entries[i].key); + entries[i].val.free(); + } + gfree(entries); +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +int Dict::incRef() { + dictLocker(); + ++ref; + return ref; +} + +int Dict::decRef() { + dictLocker(); + --ref; + return ref; +} + +void Dict::add(char *key, Object *val) { + dictLocker(); + 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) + { + dictLocker(); + 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) { + dictLocker(); + if (sorted) { + const int pos = binarySearch(key, entries, length); + if (pos != -1) { + length -= 1; + gfree(entries[pos].key); + entries[pos].val.free(); + 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 + gfree(entries[i].key); + entries[i].val.free(); + 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) { + dictLocker(); + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Dict.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Dict.h new file mode 100644 index 00000000000..fba99edc513 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Dict.h @@ -0,0 +1,112 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 DICT_H +#define DICT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "Object.h" +#include "goo/GooMutex.h" + +//------------------------------------------------------------------------ +// Dict +//------------------------------------------------------------------------ + +struct DictEntry { + char *key; + Object val; +}; + +class Dict { +public: + + // Constructor. + Dict(XRef *xrefA); + Dict(Dict* dictA); + Dict *copy(XRef *xrefA); + + // Destructor. + ~Dict(); + + // Reference counting. + int incRef(); + int decRef(); + + // 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 +#if MULTITHREADED + GooMutex mutex; +#endif + + DictEntry *find(const char *key); +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Error.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Error.cc new file mode 100644 index 00000000000..99ca3ad3f53 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Error.cc @@ -0,0 +1,98 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2012 Marek Kasik <mkasik@redhat.com> +// Copyright (C) 2013 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 <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, + Goffset pos, char *msg) = NULL; +static void *errorCbkData = NULL; + +void setErrorCallback(void (*cbk)(void *data, ErrorCategory category, + Goffset pos, char *msg), + void *data) { + errorCbk = cbk; + errorCbkData = data; +} + +void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) { + va_list args; + GooString *s, *sanitized; + + // 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); + + sanitized = new GooString (); + for (int i = 0; i < s->getLength(); ++i) { + const char c = s->getChar(i); + if (c < (char)0x20 || c >= (char)0x7f) { + sanitized->appendf("<{0:02x}>", c & 0xff); + } else { + sanitized->append(c); + } + } + + if (errorCbk) { + (*errorCbk)(errorCbkData, category, pos, sanitized->getCString()); + } else { + if (pos >= 0) { + fprintf(stderr, "%s (%lld): %s\n", + errorCategoryNames[category], (long long)pos, sanitized->getCString()); + } else { + fprintf(stderr, "%s: %s\n", + errorCategoryNames[category], sanitized->getCString()); + } + fflush(stderr); + } + delete s; + delete sanitized; +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Error.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Error.h new file mode 100644 index 00000000000..9e11733d803 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Error.h @@ -0,0 +1,60 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2014 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 ERROR_H +#define ERROR_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include <stdarg.h> +#include "poppler-config.h" +#include "goo/gtypes.h" +#include "goo/GooString.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, + Goffset pos, char *msg), + void *data); + +extern void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) GOOSTRING_FORMAT; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/ErrorCodes.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/ErrorCodes.h new file mode 100644 index 00000000000..b28528df564 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/ErrorCodes.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/FileSpec.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/FileSpec.cc new file mode 100644 index 00000000000..bac1eaea0d7 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/FileSpec.cc @@ -0,0 +1,295 @@ +//======================================================================== +// +// 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> +// 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 +// +//======================================================================== + +//======================================================================== +// +// 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", ¶mDict)->isDict()) { + Object paramObj; + if (paramDict.dictLookup("ModDate", ¶mObj)->isString()) + m_modDate = new GooString(paramObj.getString()); + paramObj.free(); + + if (paramDict.dictLookup("CreationDate", ¶mObj)->isString()) + m_createDate = new GooString(paramObj.getString()); + paramObj.free(); + + if (paramDict.dictLookup("Size", ¶mObj)->isInt()) + m_size = paramObj.getInt(); + paramObj.free(); + + if (paramDict.dictLookup("CheckSum", ¶mObj)->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 + const 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/Build/source/libs/poppler/poppler-0.36.0/poppler/FileSpec.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/FileSpec.h new file mode 100644 index 00000000000..9f2f6fcd131 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/FileSpec.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/FlateStream.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/FlateStream.cc new file mode 100644 index 00000000000..7990dadd821 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/FlateStream.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/FlateStream.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/FlateStream.h new file mode 100644 index 00000000000..9e3835f042a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/FlateStream.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/FontEncodingTables.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/FontEncodingTables.cc new file mode 100644 index 00000000000..6ebef787421 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/FontEncodingTables.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/FontEncodingTables.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/FontEncodingTables.h new file mode 100644 index 00000000000..a417b324e48 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/FontEncodingTables.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/FontInfo.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/FontInfo.cc new file mode 100644 index 00000000000..8fc89e9d827 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/FontInfo.cc @@ -0,0 +1,245 @@ +//======================================================================== +// +// 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, 2013 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; + } + + XRef *xrefA = doc->getXRef()->copy(); + for (int pg = currentPage; pg < lastPage; ++pg) { + page = doc->getPage(pg); + if (!page) continue; + + if ((resDict = page->getResourceDictCopy(xrefA))) { + scanFonts(xrefA, resDict, result); + delete resDict; + } + annots = page->getAnnots(); + for (int i = 0; i < annots->getNumAnnots(); ++i) { + if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) { + scanFonts(xrefA, obj1.getDict(), result); + } + obj1.free(); + } + } + + currentPage = lastPage; + + delete xrefA; + return result; +} + +void FontInfoScanner::scanFonts(XRef *xrefA, 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(xrefA, &obj2); + if (obj2.isDict()) { + r = obj1.getRef(); + gfxFontDict = new GfxFontDict(xrefA, &r, obj2.getDict()); + } + obj2.free(); + } else if (obj1.isDict()) { + gfxFontDict = new GfxFontDict(xrefA, 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, xrefA)); + 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(xrefA, &obj2); + + if (obj2.isStream()) { + obj2.streamGetDict()->lookup("Resources", &resObj); + if (resObj.isDict() && resObj.getDict() != resDict) { + scanFonts(xrefA, resObj.getDict(), fontsList); + } + resObj.free(); + } + obj1.free(); + obj2.free(); + } + } + objDict.free(); + } +} + +FontInfo::FontInfo(GfxFont *font, XRef *xref) { + 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 (xref->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/Build/source/libs/poppler/poppler-0.36.0/poppler/FontInfo.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/FontInfo.h new file mode 100644 index 00000000000..615b6793de3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/FontInfo.h @@ -0,0 +1,103 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 +// +//======================================================================== + +//======================================================================== +// +// 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, XRef *xrefA); + // 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(XRef *xrefA, Dict *resDict, GooList *fontsList); +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Form.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Form.cc new file mode 100644 index 00000000000..a46a6590f27 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Form.cc @@ -0,0 +1,1612 @@ +//======================================================================== +// +// 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, 2013 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> +// Copyright 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// +//======================================================================== + +#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(); +} + +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; +} + +LinkAction *FormWidget::getAdditionalAction(Annot::FormAdditionalActionsType type) { + return widget ? widget->getFormAdditionalAction(type) : 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; + + 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 () +{ + delete onStr; +} + +FormButtonType FormWidgetButton::getButtonType () const +{ + return parent->getButtonType (); +} + +void FormWidgetButton::setAppearanceState(const char *state) { + if (!widget) + return; + widget->setAppearanceState(state); +} + +void FormWidgetButton::updateWidgetAppearance() +{ + // The appearance stream must NOT be regenerated for this widget type +} + +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; +} + + +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(); +} + +void FormWidgetText::updateWidgetAppearance() +{ + if (widget) + widget->updateAppearanceStream(); +} + +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(); +} + +void FormWidgetChoice::updateWidgetAppearance() +{ + if (widget) + widget->updateAppearanceStream(); +} + +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); +} + +void FormWidgetSignature::updateWidgetAppearance() +{ + // Unimplemented +} + + +//======================================================================== +// 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; + + 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(); + } +} + +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; +} + +void FormField::updateChildrenAppearance() +{ + // Recursively update each child's appearance + if (terminal) { + for (int i = 0; i < numChildren; i++) + widgets[i]->updateWidgetAppearance(); + } else { + for (int i = 0; i < numChildren; i++) + children[i]->updateChildrenAppearance(); + } +} + +//------------------------------------------------------------------------ +// 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; + siblings = NULL; + numSiblings = 0; + 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::setNumSiblings (int num) +{ + numSiblings = num; + siblings = (FormFieldButton**)greallocn(siblings, numSiblings, sizeof(FormFieldButton*)); +} + +void FormFieldButton::fillChildrenSiblingsID() +{ + if (!terminal) { + for(int i=0; i<numChildren; i++) { + FormFieldButton *child = dynamic_cast<FormFieldButton*>(children[i]); + if (child != NULL) { + // Fill the siblings of this node childs + child->setNumSiblings(numChildren-1); + for(int j=0, counter=0; j<numChildren; j++) { + FormFieldButton *otherChild = dynamic_cast<FormFieldButton*>(children[j]); + if (i == j) continue; + if (child == otherChild) continue; + child->setSibling(counter, otherChild); + counter++; + } + + // now call ourselves on the child + // to fill its children data + child->fillChildrenSiblingsID(); + } + } + } +} + +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)) { + 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); + + 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(); + if (siblings) + gfree(siblings); +} + +//------------------------------------------------------------------------ +// 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); + updateChildrenAppearance(); +} + +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 + // Note: PDF specs say that /V has precedence over /I, but acroread seems to + // do the opposite. We do the same. + if (Form::fieldLookup(dict, "I", &obj1)->isArray()) { + for (int i = 0; i < obj1.arrayGetLength(); i++) { + Object obj2; + if (obj1.arrayGet(i, &obj2)->isInt() && obj2.getInt() >= 0 && obj2.getInt() < numChoices) { + choices[obj2.getInt()].selected = true; + } + obj2.free(); + } + } else { + obj1.free(); + // Note: According to PDF specs, /V should *never* contain the exportVal. + // However, if /Opt is an array of (exportVal,optionName) pairs, acroread + // seems to expect the exportVal instead of the optionName and so we do too. + if (Form::fieldLookup(dict, "V", &obj1)->isString()) { + GBool optionFound = gFalse; + + for (int i = 0; i < numChoices; i++) { + if (choices[i].exportVal) { + if (choices[i].exportVal->cmp(obj1.getString()) == 0) { + optionFound = gTrue; + } + } else if (choices[i].optionName) { + if (choices[i].optionName->cmp(obj1.getString()) == 0) { + optionFound = gTrue; + } + } + + if (optionFound) { + choices[i].selected = true; + break; // We've determined that this option is selected. No need to keep on scanning + } + } + + // Set custom value if /V doesn't refer to any predefined option and the field is user-editable + if (!optionFound && edit) { + editedChoice = obj1.getString()->copy(); + } + } else if (obj1.isArray()) { + for (int i = 0; i < numChoices; i++) { + for (int j = 0; j < obj1.arrayGetLength(); j++) { + Object obj2; + obj1.arrayGet(j, &obj2); + GBool matches = gFalse; + + if (choices[i].exportVal) { + if (choices[i].exportVal->cmp(obj2.getString()) == 0) { + matches = gTrue; + } + } else if (choices[i].optionName) { + if (choices[i].optionName->cmp(obj2.getString()) == 0) { + matches = gTrue; + } + } + + obj2.free(); + + if (matches) { + choices[i].selected = true; + break; // We've determined that this option is selected. No need to keep on scanning + } + } + } + } + } + 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 objV, objI, obj1; + objI.initNull(); + + if (edit && editedChoice) { + // This is an editable combo-box with user-entered text + objV.initString(editedChoice->copy()); + } else { + const int numSelected = getNumSelected(); + + // Create /I array only if multiple selection is allowed (as per PDF spec) + if (multiselect) { + objI.initArray(xref); + } + + if (numSelected == 0) { + // No options are selected + objV.initString(new GooString("")); + } else if (numSelected == 1) { + // Only one option is selected + for (int i = 0; i < numChoices; i++) { + if (choices[i].selected) { + if (multiselect) { + objI.arrayAdd(obj1.initInt(i)); + } + + if (choices[i].exportVal) { + objV.initString(choices[i].exportVal->copy()); + } else if (choices[i].optionName) { + objV.initString(choices[i].optionName->copy()); + } + + break; // We've just written the selected option. No need to keep on scanning + } + } + } else { + // More than one option is selected + objV.initArray(xref); + for (int i = 0; i < numChoices; i++) { + if (choices[i].selected) { + if (multiselect) { + objI.arrayAdd(obj1.initInt(i)); + } + + if (choices[i].exportVal) { + objV.arrayAdd(obj1.initString(choices[i].exportVal->copy())); + } else if (choices[i].optionName) { + objV.arrayAdd(obj1.initString(choices[i].optionName->copy())); + } + } + } + } + } + + obj.getDict()->set("V", &objV); + obj.getDict()->set("I", &objI); + xref->setModifiedObject(&obj, ref); + updateChildrenAppearance(); +} + +void FormFieldChoice::unselectAll () +{ + for (int i = 0; i < numChoices; i++) { + choices[i].selected = false; + } +} + +void FormFieldChoice::deselectAll () { + delete editedChoice; + editedChoice = NULL; + + unselectAll(); + updateSelection(); +} + +void FormFieldChoice::toggle (int i) +{ + delete editedChoice; + editedChoice = NULL; + + choices[i].selected = !choices[i].selected; + updateSelection(); +} + +void FormFieldChoice::select (int i) +{ + delete editedChoice; + editedChoice = NULL; + + 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 existent 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Form.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Form.h new file mode 100644 index 00000000000..3778ff6f2ef --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Form.h @@ -0,0 +1,563 @@ +//======================================================================== +// +// 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, 2012 Albert Astals Cid <aacid@kde.org> +// Copyright 2010 Mark Riedesel <mark@klowner.com> +// Copyright 2011 Pino Toscano <pino@kde.org> +// Copyright 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright 2013 Adrian Johnson <ajohnson@redneon.com> +// +//======================================================================== + +#ifndef FORM_H +#define FORM_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "Object.h" +#include "Annot.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(); + LinkAction *getAdditionalAction(Annot::FormAdditionalActionsType type); + + // 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; } + + virtual void updateWidgetAppearance() = 0; + +#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 updateWidgetAppearance(); + +protected: + 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); + + void updateWidgetAppearance(); + + 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 (); + + void updateWidgetAppearance(); + 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); + void updateWidgetAppearance(); +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; } + + 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); + int getNumWidgets() { return terminal ? numChildren : 0; } + 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); + void updateChildrenAppearance(); + + FormFieldType type; // field type + Ref ref; + bool terminal; + Object obj; + PDFDoc *doc; + XRef *xref; + FormField **children; + FormField *parent; + int numChildren; + FormWidget **widgets; + bool readOnly; + + 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 (); + + void setNumSiblings (int num); + void setSibling (int i, FormFieldButton *id) { siblings[i] = id; } + + //For radio buttons, return the fields of the other radio buttons in the same group + FormFieldButton* getSibling (int i) const { return siblings[i]; } + int getNumSiblings () const { return numSiblings; } + +#ifdef DEBUG_FORMS + void print(int indent = 0); +#endif + + virtual ~FormFieldButton(); +protected: + void updateState(char *state); + + FormFieldButton** siblings; // IDs of dependent buttons (each button of a radio field has all the others buttons + // of the same field in this array) + int numSiblings; + + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Function.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Function.cc new file mode 100644 index 00000000000..67283dffe9f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Function.cc @@ -0,0 +1,1788 @@ +//======================================================================== +// +// 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, 2013, 2014 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> +// Copyright (C) 2012 Adam Reichold <adamreichold@myopera.com> +// Copyright (C) 2013 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 <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; +} + +Function::Function(const Function *func) { + m = func->m; + n = func->n; + + memcpy(domain, func->domain, funcMaxInputs * 2 * sizeof(double)); + memcpy(range, func->range, funcMaxOutputs * 2 * sizeof(double)); + + hasRange = func->hasRange; +} + +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(const SampledFunction *func) : Function(func) { + memcpy(sampleSize, func->sampleSize, funcMaxInputs * sizeof(int)); + + memcpy(encode, func->encode, funcMaxInputs * 2 * sizeof(double)); + memcpy(decode, func->decode, funcMaxOutputs * 2 * sizeof(double)); + + memcpy(inputMul, func->inputMul, funcMaxInputs * sizeof(double)); + + nSamples = func->nSamples; + + 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)); + + memcpy(cacheIn, func->cacheIn, funcMaxInputs * sizeof(double)); + memcpy(cacheOut, func->cacheOut, funcMaxOutputs * sizeof(double)); + + ok = func->ok; +} + +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]; + } +} + +GBool SampledFunction::hasDifferentResultSet(Function *func) { + if (func->getType() == 0) { + SampledFunction *compTo = (SampledFunction *) func; + if (compTo->getSampleNumber() != nSamples) + return gTrue; + double *compSamples = compTo->getSamples(); + for (int i = 0; i < nSamples; i++) { + if (samples[i] != compSamples[i]) + return gTrue; + } + } + return gFalse; +} + +//------------------------------------------------------------------------ +// 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(const ExponentialFunction *func) : Function(func) { + memcpy(c0, func->c0, funcMaxOutputs * sizeof(double)); + memcpy(c1, func->c1, funcMaxOutputs * sizeof(double)); + + e = func->e; + isLinear = func->isLinear; + ok = func->ok; +} + +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(const StitchingFunction *func) : Function(func) { + k = func->k; + + funcs = (Function **)gmallocn(k, sizeof(Function *)); + for (int 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 = func->ok; +} + +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 (unlikely(sp + i + 1 >= psStackSize)) { + error(errSyntaxError, -1, "Stack underflow in PostScript function"); + return; + } + if (unlikely(sp + i + 1 < 0)) { + error(errSyntaxError, -1, "Stack overflow 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 (unlikely(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(const PostScriptFunction *func) : Function(func) { + codeSize = func->codeSize; + + code = (PSObject *)gmallocn(codeSize, sizeof(PSObject)); + memcpy(code, func->code, codeSize * sizeof(PSObject)); + + codeString = func->codeString->copy(); + + memcpy(cacheIn, func->cacheIn, funcMaxInputs * sizeof(double)); + memcpy(cacheOut, func->cacheOut, funcMaxOutputs * sizeof(double)); + + ok = func->ok; +} + +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/Build/source/libs/poppler/poppler-0.36.0/poppler/Function.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Function.h new file mode 100644 index 00000000000..90e2a768ad0 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Function.h @@ -0,0 +1,258 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012 Adam Reichold <adamreichold@myopera.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; } + virtual GBool hasDifferentResultSet(Function *func) { return gFalse; } + + // 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); + + Function(const Function *func); + + 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; } + virtual GBool hasDifferentResultSet(Function *func); + + 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; } + int getSampleNumber() { return nSamples; } + +private: + + SampledFunction(const 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(const 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(const 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(const 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Gfx.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Gfx.cc new file mode 100644 index 00000000000..07d95b355a8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Gfx.cc @@ -0,0 +1,5501 @@ +//======================================================================== +// +// 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-2013, 2015 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-2014 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, 2013 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2012 Lu Wang <coolwanglu@gmail.com> +// Copyright (C) 2014 Jason Crain <jason@aquaticape.us> +// +// 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 "Annot.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 *resDictA, GfxResources *nextA) : + gStateCache(2, xref) { + Object obj1, obj2; + Ref r; + + if (resDictA) { + + // build font dictionary + Dict *resDict = resDictA->copy(xref); + 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); + + delete resDict; + } 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, OutputDev *out, GfxState *state) { + 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(resPtr, &obj, out, state); + obj.free(); + return pattern; + } + obj.free(); + } + } + error(errSyntaxError, -1, "Unknown pattern '{0:s}'", name); + return NULL; +} + +GfxShading *GfxResources::lookupShading(char *name, OutputDev *out, GfxState *state) { + 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(resPtr, &obj, out, state); + 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, XRef *xrefA) +{ + int i; + + doc = docA; + xref = (xrefA == NULL) ? doc->getXRef() : xrefA; + 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, xref); + out->setDefaultCTM(state->getCTM()); + out->updateAll(state); + for (i = 0; i < 6; ++i) { + baseMatrix[i] = state->getCTM()[i]; + } + formDepth = 0; + 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(); + } +#ifdef USE_CMS + initDisplayProfile(); +#endif +} + +Gfx::Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict, + PDFRectangle *box, PDFRectangle *cropBox, + GBool (*abortCheckCbkA)(void *data), + void *abortCheckCbkDataA, XRef *xrefA) +{ + int i; + + doc = docA; + xref = (xrefA == NULL) ? doc->getXRef() : xrefA; + 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; + 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(); + } +#ifdef USE_CMS + initDisplayProfile(); +#endif +} + +#ifdef USE_CMS + +#ifdef USE_LCMS1 +#include <lcms.h> +#else +#include <lcms2.h> +#define LCMS_FLAGS cmsFLAGS_NOOPTIMIZE +#endif + +void Gfx::initDisplayProfile() { + Object catDict; + xref->getCatalog(&catDict); + if (catDict.isDict()) { + Object outputIntents; + catDict.dictLookup("OutputIntents", &outputIntents); + if (outputIntents.isArray() && outputIntents.arrayGetLength() == 1) { + Object firstElement; + outputIntents.arrayGet(0, &firstElement); + if (firstElement.isDict()) { + Object profile; + firstElement.dictLookup("DestOutputProfile", &profile); + if (profile.isStream()) { + Stream *iccStream = profile.getStream(); + int length = 0; + Guchar *profBuf = iccStream->toUnsignedChars(&length, 65536, 65536); + cmsHPROFILE hp = cmsOpenProfileFromMem(profBuf,length); + if (hp == 0) { + error(errSyntaxWarning, -1, "read ICCBased color space profile error"); + } else { + state->setDisplayProfile(hp); + } + gfree(profBuf); + } + profile.free(); + } + firstElement.free(); + } + outputIntents.free(); + } + catDict.free(); +} + +#endif + +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; +} + +Goffset 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) { + a->get(i, &obj); + if (obj.isNum()) { + dash[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(res, &obj5, out, state); + } + 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) { + state->setRenderingIntent(args[0].getName()); +} + +//------------------------------------------------------------------------ +// 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(res, &obj, out, state); + } + 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(res, &obj, out, state); + } + 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(res, &obj, out, state); + } + 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(res, &obj, out, state); + } + 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(res, &obj, out, state); + } + 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(res, &obj, out, state); + } + 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(res, &args[0], out, state); + } else { + colorSpace = GfxColorSpace::parse(res, &obj, out, state); + } + 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(res, &args[0], out, state); + } else { + colorSpace = GfxColorSpace::parse(res, &obj, out, state); + } + 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(), out, state))) { + 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(), out, state))) { + 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()); + if (tPat->getBBox()[0] < tPat->getBBox()[2]) { + xi0 = (int)ceil((xMin - tPat->getBBox()[2]) / xstep); + xi1 = (int)floor((xMax - tPat->getBBox()[0]) / xstep) + 1; + } else { + xi0 = (int)ceil((xMin - tPat->getBBox()[0]) / xstep); + xi1 = (int)floor((xMax - tPat->getBBox()[2]) / xstep) + 1; + } + if (tPat->getBBox()[1] < tPat->getBBox()[3]) { + yi0 = (int)ceil((yMin - tPat->getBBox()[3]) / ystep); + yi1 = (int)floor((yMax - tPat->getBBox()[1]) / ystep) + 1; + } else { + yi0 = (int)ceil((yMin - tPat->getBBox()[1]) / ystep); + yi1 = (int)floor((yMax - tPat->getBBox()[3]) / 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(), out, state))) { + 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; +} + +static inline void checkTrue(bool b, const char *message) { + if (unlikely(!b)) { + error(errSyntaxError, -1, message); + } +} + +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(); checkTrue(!path->isEnd(), "Path should not be at end"); + path->setCoord(x0,y0); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); + path->setCoord(x1,y1); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); + path->setCoord(x2,y2); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); + path->setCoord(x0,y0); path->next(); checkTrue( path->isEnd(), "Path should be at end"); + 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(); checkTrue(!path->isEnd(), "Path should not be at end"); + path->setCoord(x0,y0); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); + path->setCoord(x1,y1); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); + path->setCoord(x2,y2); path->next(); checkTrue(!path->isEnd(), "Path should not be at end"); + path->setCoord(x0,y0); path->next(); checkTrue( path->isEnd(), "Path should be at end"); + 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; +} + +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); + GBool shouldDoForm = gTrue; + std::set<int>::iterator drawingFormIt; + if (refObj.isRef()) { + const int num = refObj.getRef().num; + if (formsDrawing.find(num) == formsDrawing.end()) { + drawingFormIt = formsDrawing.insert(num).first; + } else { + shouldDoForm = gFalse; + } + } + if (shouldDoForm) { + if (out->useDrawForm() && refObj.isRef()) { + out->drawForm(refObj.getRef()); + } else { + doForm(&obj1); + } + } + if (refObj.isRef() && shouldDoForm) { + formsDrawing.erase(drawingFormIt); + } + 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 || !out->needNonText()) { + 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()) { + Object objIntent; + char *tempIntent = NULL; + dict->lookup("Intent", &objIntent); + if (objIntent.isName()) { + tempIntent = state->getRenderingIntent(); + if (tempIntent != NULL) { + tempIntent = strdup(tempIntent); + } + state->setRenderingIntent(objIntent.getName()); + } + colorSpace = GfxColorSpace::parse(res, &obj1, out, state); + if (objIntent.isName()) { + state->setRenderingIntent(tempIntent); + free(tempIntent); + } + objIntent.free(); + } else if (csMode == streamCSDeviceGray) { + Object objCS; + res->lookupColorSpace("DefaultGray", &objCS); + if (objCS.isNull()) { + colorSpace = new GfxDeviceGrayColorSpace(); + } else { + colorSpace = GfxColorSpace::parse(res, &objCS, out, state); + } + objCS.free(); + } else if (csMode == streamCSDeviceRGB) { + Object objCS; + res->lookupColorSpace("DefaultRGB", &objCS); + if (objCS.isNull()) { + colorSpace = new GfxDeviceRGBColorSpace(); + } else { + colorSpace = GfxColorSpace::parse(res, &objCS, out, state); + } + objCS.free(); + } else if (csMode == streamCSDeviceCMYK) { + Object objCS; + res->lookupColorSpace("DefaultCMYK", &objCS); + if (objCS.isNull()) { + colorSpace = new GfxDeviceCMYKColorSpace(); + } else { + colorSpace = GfxColorSpace::parse(res, &objCS, out, state); + } + 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(NULL, &obj1, out, state); + 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 || !out->needNonText()) { + 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) && obj1.isDict()) { + 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(res, &obj3, out, state); + } + 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 +//------------------------------------------------------------------------ + +struct GfxStackStateSaver { + GfxStackStateSaver(Gfx *gfx) : gfx(gfx) { + gfx->saveState(); + } + + ~GfxStackStateSaver() { + gfx->restoreState(); + } + + Gfx * const gfx; +}; + +void Gfx::drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, + double xMin, double yMin, double xMax, double yMax, int rotate) { + 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; + } + + // saves gfx state and automatically restores it on return + GfxStackStateSaver stackStateSaver(this); + + // Rotation around the topleft corner (for the NoRotate flag) + if (rotate != 0) { + const double angle_rad = rotate * M_PI / 180; + const double c = cos(angle_rad); + const double s = sin(angle_rad); + + // (xMin, yMax) is the pivot + const double unrotateMTX[6] = { + +c, -s, + +s, +c, + -c*xMin - s*yMax + xMin, -c*yMax + s*xMin + yMax + }; + + state->concatCTM(unrotateMTX[0], unrotateMTX[1], unrotateMTX[2], + unrotateMTX[3], unrotateMTX[4], unrotateMTX[5]); + out->updateCTM(state, unrotateMTX[0], unrotateMTX[1], unrotateMTX[2], + unrotateMTX[3], unrotateMTX[4], unrotateMTX[5]); + } + + // 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(); + bboxObj.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); + if (likely(obj1.isNum())) { + m[i] = obj1.getNum(); + obj1.free(); + } else { + obj1.free(); + matrixObj.free(); + error(errSyntaxError, getPos(), "Bad form matrix"); + return; + } + } + } 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) { + 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); + } +} + +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; +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Gfx.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Gfx.h new file mode 100644 index 00000000000..a82f9f4af24 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Gfx.h @@ -0,0 +1,387 @@ +//======================================================================== +// +// 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-2013 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2009, 2010, 2012, 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2010 David Benjamin <davidben@mit.edu> +// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com> +// Copyright (C) 2013 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 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, OutputDev *out, GfxState *state); + GfxShading *lookupShading(char *name, OutputDev *out, GfxState *state); + 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, XRef *xrefA = 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, XRef *xrefA = NULL); +#ifdef USE_CMS + void initDisplayProfile(); +#endif + ~Gfx(); + + XRef *getXRef() { return xref; } + + // 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, int rotate); + + // 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(); + +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; + GBool ocState; // true if drawing is enabled, false if + // disabled + + MarkedContentStack *mcStack; // current BMC/EMC stack + + Parser *parser; // parser for page content stream(s) + + std::set<int> formsDrawing; // the forms that are being drawn + + 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); + Goffset 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/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxFont.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxFont.cc new file mode 100644 index 00000000000..81f59037f7f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxFont.cc @@ -0,0 +1,2620 @@ +//======================================================================== +// +// 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, 2014, 2015 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, 2014 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> +// Copyright (C) 2013-2015 Jason Crain <jason@aquaticape.us> +// Copyright (C) 2014 Olly Betts <olly@survex.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 <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" +#include "PSOutputDev.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, PSOutputDev *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 = ps->getEmbedType1(); + break; + case fontTrueType: + case fontTrueTypeOT: + embed = ps->getEmbedTrueType(); + break; + case fontCIDType0C: + case fontCIDType0COT: + embed = ps->getEmbedCIDPostScript(); + break; + case fontCIDType2: + case fontCIDType2OT: + embed = ps->getEmbedCIDTrueType(); + break; + default: + break; + } + } + if (embed) { + fontLoc = new GfxFontLoc(); + fontLoc->locType = gfxFontLocEmbedded; + fontLoc->fontType = type; + fontLoc->embFontID = embFontID; + return fontLoc; + } + } + } + + //----- PS passthrough + if (ps && !isCIDFont() && ps->getFontPassthrough()) { + 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:s}'", + base14SubstFonts[substIdx], name ? name->getCString() : "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:s}'", + base14SubstFonts[substIdx], name ? name->getCString() : ""); + 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; +} + + +struct AlternateNameMap { + const char *name; + const char *alt; +}; + +static const AlternateNameMap alternateNameMap[] = +{ + { "fi", "f_i" }, + { "fl", "f_l" }, + { "ff", "f_f" }, + { "ffi", "f_f_i" }, + { "ffl", "f_f_l" }, + { 0, 0 } +}; + +const char *GfxFont::getAlternateName(const char *name) { + const AlternateNameMap *map = alternateNameMap; + while (map->name) { + if (strcmp(name, map->name) == 0) { + return map->alt; + } + map++; + } + return 0; +} + +//------------------------------------------------------------------------ +// Gfx8BitFont +//------------------------------------------------------------------------ + +// Parse character 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 decimal digits. +static GBool parseNumericName(char *s, GBool hex, unsigned int *u) { + char *endptr; + + // Strip leading alpha characters. + if (hex) { + int n = 0; + + // Get string length while ignoring junk at end. + while (isalnum(s[n])) + ++n; + + // Only 2 hex characters with optional leading alpha is allowed. + if (n == 3 && isalpha(*s)) { + ++s; + } else if (n != 2) { + return gFalse; + } + } else { + // Strip up to two alpha characters. + for (int i = 0; i < 2 && isalpha(*s); ++i) + ++s; + } + + int v = strtol(s, &endptr, hex ? 16 : 10); + + if (endptr == s) + return gFalse; + + // Skip trailing junk characters. + while (*endptr != '\0' && !isalnum(*endptr)) + ++endptr; + + if (*endptr == '\0') { + if (u) + *u = v; + return gTrue; + } + return gFalse; +} + +// Returns gTrue if the font has character names like xx or Axx which +// should be parsed for hex or decimal values. +static GBool testForNumericNames(Dict *fontDict, GBool hex) { + Object enc, diff, obj; + GBool numeric = gTrue; + + fontDict->lookup("Encoding", &enc); + if (!enc.isDict()) { + enc.free(); + return gFalse; + } + + enc.dictLookup("Differences", &diff); + enc.free(); + if (!diff.isArray()) { + diff.free(); + return gFalse; + } + + for (int i = 0; i < diff.arrayGetLength() && numeric; ++i) { + diff.arrayGet(i, &obj); + if (obj.isInt()) { + // All sequences must start between character codes 0 and 5. + if (obj.getInt() > 5) + numeric = gFalse; + } else if (obj.isName()) { + // All character names must sucessfully parse. + if (!parseNumericName(obj.getName(), hex, NULL)) + numeric = gFalse; + } else { + numeric = gFalse; + } + obj.free(); + } + + diff.free(); + return numeric; +} + +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; + GBool numeric; + 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; + GBool isZapfDingbats = name && name->endsWith("ZapfDingbats"); + for (code = 0; code < 256; ++code) { + if ((charName = enc[code])) { + if (isZapfDingbats) { + // include ZapfDingbats names + toUnicode[code] = globalParams->mapNameToUnicodeAll(charName); + } else { + toUnicode[code] = globalParams->mapNameToUnicodeText(charName); + } + if (!toUnicode[code] && 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]) && + // Only check idx 1 to avoid misidentifying a decimal + // number like a0 + ((charName[1] >= 'a' && charName[1] <= 'f') || + (charName[1] >= 'A' && charName[1] <= 'F')))) { + hex = gTrue; + } + missing = gTrue; + } + } else { + toUnicode[code] = 0; + } + } + + numeric = testForNumericNames(fontDict, hex); + + // 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 + numeric, + hex, + gTrue))) { // do check variants + ctu->setMapping((CharCode)code, uBuf, n); + continue; + } + + // if the 'mapUnknownCharNames' flag is set, do a simple pass-through + // mapping for unknown character names + if (globalParams->getMapUnknownCharNames()) { + 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, 16, 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->mapNameToUnicodeText(charName))) { + return 1; + } + if (globalParams->getMapNumericCharNames()) { + 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 like xx + // or Axx and parse for hex or decimal values. + if (numeric && parseNumericName(charName, hex, uBuf)) + 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->mapNameToUnicodeAll(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 = getWidth(cid); + h = vx = vy = 0; + + // vertical + } else { + w = 0; + h = widths.defHeight; + vx = getWidth(cid) / 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(CID cid) { + double w; + int a, b, m; + + 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; +} + +double GfxCIDFont::getWidth (char* s, int len) { + int nUsed; + CharCode c; + + CID cid = cMap->getCID(s, len, &c, &nUsed); + return getWidth(cid); +} + +//------------------------------------------------------------------------ +// 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/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxFont.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxFont.h new file mode 100644 index 00000000000..febb902922d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxFont.h @@ -0,0 +1,444 @@ +//======================================================================== +// +// 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, 2015 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, 2014 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2015 Jason Crain <jason@aquaticape.us> +// +// 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; +class PSOutputDev; +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 not null, includes PS + // printer-resident fonts. Returns NULL on failure. + GfxFontLoc *locateFont(XRef *xref, PSOutputDev *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; } + + // Return AGLFN names of ligatures in the Standard and Expert encodings + // for use with fonts that are not compatible with the Standard 14 fonts. + // http://sourceforge.net/adobe/aglfn/wiki/AGL%20Specification/ + static const char *getAlternateName(const char *name); + +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); + double getWidth(CID cid); // Get width of a character. + + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState.cc new file mode 100644 index 00000000000..cacccad3097 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState.cc @@ -0,0 +1,7273 @@ +//======================================================================== +// +// 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-2015 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2009, 2012 Koji Otani <sho@bbr.jp> +// Copyright (C) 2009, 2011-2014 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> +// Copyright (C) 2013 Lu Wang <coolwanglu@gmail.com> +// Copyright (C) 2013 Hib Eris <hib@hiberis.nl> +// Copyright (C) 2013 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 <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" +#include "OutputDev.h" +#include "splash/SplashTypes.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 + +static const std::map<unsigned int, unsigned int>::size_type CMSCACHE_LIMIT = 2048; + +#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 | cmsFLAGS_BLACKPOINTCOMPENSATION +#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, int cmsIntentA, unsigned int inputPixelTypeA, unsigned int transformPixelTypeA) { + transform = transformA; + refCount = 1; + cmsIntent = cmsIntentA; + inputPixelType = inputPixelTypeA; + transformPixelType = transformPixelTypeA; +} + +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; + if (displayProfile != NULL) { + cmsHTRANSFORM transform; + unsigned int nChannels; + + 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, INTENT_RELATIVE_COLORIMETRIC, PT_XYZ, displayPixelType); + } + cmsCloseProfile(XYZProfile); + } +} + +void GfxColorSpace::setDisplayProfileName(GooString *name) { + displayProfileName = name->copy(); +} + +cmsHPROFILE GfxColorSpace::getRGBProfile() { + return RGBProfile; +} + +cmsHPROFILE GfxColorSpace::getDisplayProfile() { + return displayProfile; +} + +#endif + +//------------------------------------------------------------------------ +// GfxColorSpace +//------------------------------------------------------------------------ + +GfxColorSpace::GfxColorSpace() { + overprintMask = 0x0f; + mapping = NULL; +} + +GfxColorSpace::~GfxColorSpace() { +} + +GfxColorSpace *GfxColorSpace::parse(GfxResources *res, Object *csObj, OutputDev *out, GfxState *state, 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")) { + if (res != NULL) { + Object objCS; + res->lookupColorSpace("DefaultGray", &objCS); + if (objCS.isNull()) { + cs = new GfxDeviceGrayColorSpace(); + } else { + cs = GfxColorSpace::parse(NULL, &objCS, out, state); + } + objCS.free(); + } else { + cs = new GfxDeviceGrayColorSpace(); + } + } else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) { + if (res != NULL) { + Object objCS; + res->lookupColorSpace("DefaultRGB", &objCS); + if (objCS.isNull()) { + cs = new GfxDeviceRGBColorSpace(); + } else { + cs = GfxColorSpace::parse(NULL, &objCS, out, state); + } + objCS.free(); + } else { + cs = new GfxDeviceRGBColorSpace(); + } + } else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) { + if (res != NULL) { + Object objCS; + res->lookupColorSpace("DefaultCMYK", &objCS); + if (objCS.isNull()) { + cs = new GfxDeviceCMYKColorSpace(); + } else { + cs = GfxColorSpace::parse(NULL, &objCS, out, state); + } + objCS.free(); + } else { + 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")) { + if (res != NULL) { + Object objCS; + res->lookupColorSpace("DefaultGray", &objCS); + if (objCS.isNull()) { + cs = new GfxDeviceGrayColorSpace(); + } else { + cs = GfxColorSpace::parse(NULL, &objCS, out, state); + } + objCS.free(); + } else { + cs = new GfxDeviceGrayColorSpace(); + } + } else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) { + if (res != NULL) { + Object objCS; + res->lookupColorSpace("DefaultRGB", &objCS); + if (objCS.isNull()) { + cs = new GfxDeviceRGBColorSpace(); + } else { + cs = GfxColorSpace::parse(NULL, &objCS, out, state); + } + objCS.free(); + } else { + cs = new GfxDeviceRGBColorSpace(); + } + } else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) { + if (res != NULL) { + Object objCS; + res->lookupColorSpace("DefaultCMYK", &objCS); + if (objCS.isNull()) { + cs = new GfxDeviceCMYKColorSpace(); + } else { + cs = GfxColorSpace::parse(NULL, &objCS, out, state); + } + objCS.free(); + } else { + cs = new GfxDeviceCMYKColorSpace(); + } + } else if (obj1.isName("CalGray")) { + cs = GfxCalGrayColorSpace::parse(csObj->getArray(), state); + } else if (obj1.isName("CalRGB")) { + cs = GfxCalRGBColorSpace::parse(csObj->getArray(), state); + } else if (obj1.isName("Lab")) { + cs = GfxLabColorSpace::parse(csObj->getArray(), state); + } else if (obj1.isName("ICCBased")) { + cs = GfxICCBasedColorSpace::parse(csObj->getArray(), out, state, recursion); + } else if (obj1.isName("Indexed") || obj1.isName("I")) { + cs = GfxIndexedColorSpace::parse(res, csObj->getArray(), out, state, recursion); + } else if (obj1.isName("Separation")) { + cs = GfxSeparationColorSpace::parse(res, csObj->getArray(), out, state, recursion); + } else if (obj1.isName("DeviceN")) { + cs = GfxDeviceNColorSpace::parse(res, csObj->getArray(), out, state, recursion); + } else if (obj1.isName("Pattern")) { + cs = GfxPatternColorSpace::parse(res, csObj->getArray(), out, state, recursion); + } else { + error(errSyntaxWarning, -1, "Bad color space"); + } + obj1.free(); + } else if (csObj->isDict()) { + csObj->dictLookup("ColorSpace", &obj1); + if (obj1.isName("DeviceGray")) { + if (res != NULL) { + Object objCS; + res->lookupColorSpace("DefaultGray", &objCS); + if (objCS.isNull()) { + cs = new GfxDeviceGrayColorSpace(); + } else { + cs = GfxColorSpace::parse(NULL, &objCS, out, state); + } + objCS.free(); + } else { + cs = new GfxDeviceGrayColorSpace(); + } + } else if (obj1.isName("DeviceRGB")) { + if (res != NULL) { + Object objCS; + res->lookupColorSpace("DefaultRGB", &objCS); + if (objCS.isNull()) { + cs = new GfxDeviceRGBColorSpace(); + } else { + cs = GfxColorSpace::parse(NULL, &objCS, out, state); + } + objCS.free(); + } else { + cs = new GfxDeviceRGBColorSpace(); + } + } else if (obj1.isName("DeviceCMYK")) { + if (res != NULL) { + Object objCS; + res->lookupColorSpace("DefaultCMYK", &objCS); + if (objCS.isNull()) { + cs = new GfxDeviceCMYKColorSpace(); + } else { + cs = GfxColorSpace::parse(NULL, &objCS, out, state); + } + objCS.free(); + } else { + cs = new GfxDeviceCMYKColorSpace(); + } + } else { + error(errSyntaxWarning, -1, "Bad color space dict'"); + } + obj1.free(); + } else { + error(errSyntaxWarning, -1, "Bad color space - expected name or array or dict"); + } + return cs; +} + +void GfxColorSpace::createMapping(GooList *separationList, int maxSepComps) { + return; +} + +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 global directory + GooString *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, INTENT_RELATIVE_COLORIMETRIC, PT_XYZ, displayPixelType); + } + 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::getCMYKLine(Guchar *in, Guchar *out, int length) { + for (int i = 0; i < length; i++) { + *out++ = 0; + *out++ = 0; + *out++ = 0; + *out++ = in[i]; + } +} + +void GfxDeviceGrayColorSpace::getDeviceNLine(Guchar *in, Guchar *out, int length) { + for (int i = 0; i < length; i++) { + for (int j = 0; j < SPOT_NCOMPS+4; j++) + out[j] = 0; + out[4] = in[i]; + out += (SPOT_NCOMPS+4); + } +} + +void GfxDeviceGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + cmyk->c = cmyk->m = cmyk->y = 0; + cmyk->k = clip01(gfxColorComp1 - color->c[0]); +} + +void GfxDeviceGrayColorSpace::getDeviceN(GfxColor *color, GfxColor *deviceN) { + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + deviceN->c[3] = 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() { +#ifdef USE_CMS + if (transform != NULL) { + if (transform->unref() == 0) delete transform; + } +#endif +} + +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; +#ifdef USE_CMS + cs->transform = transform; + if (transform != NULL) transform->ref(); +#endif + 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, GfxState *state) { + 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); +#ifdef USE_CMS + cs->transform = (state != NULL) ? state->getXYZ2DisplayTransform() : XYZ2DisplayTransform; + if (cs->transform != NULL) cs->transform->ref(); +#endif + 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 (transform != NULL && transform->getTransformPixelType() == 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); + transform->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 (transform != NULL && transform->getTransformPixelType() == PT_RGB) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + + in[0] = clip01(X); + in[1] = clip01(Y); + in[2] = clip01(Z); + transform->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 (transform != NULL && transform->getTransformPixelType() == 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); + + 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]); + 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { + GfxCMYK cmyk; + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + getCMYK(color, &cmyk); + deviceN->c[0] = cmyk.c; + deviceN->c[1] = cmyk.m; + deviceN->c[2] = cmyk.y; + deviceN->c[3] = cmyk.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::getCMYKLine(Guchar *in, Guchar *out, int length) { + GfxColorComp c, m, y, k; + + for (int i = 0; i < length; i++) { + c = byteToCol(255 - *in++); + m = byteToCol(255 - *in++); + y = byteToCol(255 - *in++); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + *out++ = colToByte(c - k); + *out++ = colToByte(m - k); + *out++ = colToByte(y - k); + *out++ = colToByte(k); + } +} + +void GfxDeviceRGBColorSpace::getDeviceNLine(Guchar *in, Guchar *out, int length) { + GfxColorComp c, m, y, k; + + for (int i = 0; i < length; i++) { + for (int j = 0; j < SPOT_NCOMPS+4; j++) + out[j] = 0; + c = byteToCol(255 - *in++); + m = byteToCol(255 - *in++); + y = byteToCol(255 - *in++); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + out[0] = colToByte(c - k); + out[1] = colToByte(m - k); + out[2] = colToByte(y - k); + out[3] = colToByte(k); + out += (SPOT_NCOMPS+4); + } +} + +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::getDeviceN(GfxColor *color, GfxColor *deviceN) { + GfxCMYK cmyk; + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + getCMYK(color, &cmyk); + deviceN->c[0] = cmyk.c; + deviceN->c[1] = cmyk.m; + deviceN->c[2] = cmyk.y; + deviceN->c[3] = cmyk.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() { +#ifdef USE_CMS + if (transform != NULL) { + if (transform->unref() == 0) delete transform; + } +#endif +} + +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]; + } +#ifdef USE_CMS + cs->transform = transform; + if (transform != NULL) transform->ref(); +#endif + return cs; +} + +GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr, GfxState *state) { + 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); + +#ifdef USE_CMS + cs->transform = (state != NULL) ? state->getXYZ2DisplayTransform() : XYZ2DisplayTransform; + if (cs->transform != NULL) cs->transform->ref(); +#endif + 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 (transform != NULL && transform->getTransformPixelType() == 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); + transform->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 (transform != NULL && transform->getTransformPixelType() == PT_RGB) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + + in[0] = clip01(X/whiteX); + in[1] = clip01(Y/whiteY); + in[2] = clip01(Z/whiteZ); + transform->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 (transform != NULL && transform->getTransformPixelType() == 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); + 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]); + 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { + GfxCMYK cmyk; + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + getCMYK(color, &cmyk); + deviceN->c[0] = cmyk.c; + deviceN->c[1] = cmyk.m; + deviceN->c[2] = cmyk.y; + deviceN->c[3] = cmyk.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::getCMYKLine(Guchar *in, Guchar *out, int length) +{ + for (int i = 0; i < length; i++) { + *out++ = *in++; + *out++ = *in++; + *out++ = *in++; + *out++ = *in++; + } +} + +void GfxDeviceCMYKColorSpace::getDeviceNLine(Guchar *in, Guchar *out, int length) +{ + for (int i = 0; i < length; i++) { + for (int j = 0; j < SPOT_NCOMPS+4; j++) + out[j] = 0; + out[0] = *in++; + out[1] = *in++; + out[2] = *in++; + out[3] = *in++; + out += (SPOT_NCOMPS+4); + } +} + +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::getDeviceN(GfxColor *color, GfxColor *deviceN) { + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + deviceN->c[0] = clip01(color->c[0]); + deviceN->c[1] = clip01(color->c[1]); + deviceN->c[2] = clip01(color->c[2]); + deviceN->c[3] = 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() { +#ifdef USE_CMS + if (transform != NULL) { + if (transform->unref() == 0) delete transform; + } +#endif +} + +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; +#ifdef USE_CMS + cs->transform = transform; + if (transform != NULL) transform->ref(); +#endif + return cs; +} + +GfxColorSpace *GfxLabColorSpace::parse(Array *arr, GfxState *state) { + 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); + +#ifdef USE_CMS + cs->transform = (state != NULL) ? state->getXYZ2DisplayTransform() : XYZ2DisplayTransform; + if (cs->transform != NULL) cs->transform->ref(); +#endif + return cs; +} + +void GfxLabColorSpace::getGray(GfxColor *color, GfxGray *gray) { + GfxRGB rgb; + +#ifdef USE_CMS + if (transform != NULL && transform->getTransformPixelType() == PT_GRAY) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + + getXYZ(color, &in[0], &in[1], &in[2]); + transform->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 (transform != NULL && transform->getTransformPixelType() == PT_RGB) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + + in[0] = clip01(X); + in[1] = clip01(Y); + in[2] = clip01(Z); + transform->doTransform(in,out,1); + rgb->r = byteToCol(out[0]); + rgb->g = byteToCol(out[1]); + rgb->b = byteToCol(out[2]); + return; + } else if (transform != NULL && transform->getTransformPixelType() == PT_CMYK) { + Guchar out[gfxColorMaxComps]; + double in[gfxColorMaxComps]; + double c, m, y, k, c1, m1, y1, k1, r, g, b; + + in[0] = clip01(X); + in[1] = clip01(Y); + in[2] = clip01(Z); + transform->doTransform(in,out,1); + c = byteToDbl(out[0]); + m = byteToDbl(out[1]); + y = byteToDbl(out[2]); + k = byteToDbl(out[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)); + 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 (transform != NULL && transform->getTransformPixelType() == PT_CMYK) { + double in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + + getXYZ(color, &in[0], &in[1], &in[2]); + 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]); + 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { + GfxCMYK cmyk; + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + getCMYK(color, &cmyk); + deviceN->c[0] = cmyk.c; + deviceN->c[1] = cmyk.m; + deviceN->c[2] = cmyk.y; + deviceN->c[3] = cmyk.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, OutputDev *out, GfxState *state, 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 (out && iccProfileStreamA.num > 0) { + GfxICCBasedColorSpaceKey k(iccProfileStreamA.num, iccProfileStreamA.gen); + GfxICCBasedColorSpaceItem *item = static_cast<GfxICCBasedColorSpaceItem *>(out->getIccColorSpaceCache()->lookup(k)); + if (item != NULL) + { + cs = static_cast<GfxICCBasedColorSpace*>(item->cs->copy()); + int transformIntent = cs->getIntent(); + int cmsIntent = INTENT_RELATIVE_COLORIMETRIC; + if (state != NULL) { + const char *intent = state->getRenderingIntent(); + if (intent != NULL) { + if (strcmp(intent, "AbsoluteColorimetric") == 0) { + cmsIntent = INTENT_ABSOLUTE_COLORIMETRIC; + } else if (strcmp(intent, "Saturation") == 0) { + cmsIntent = INTENT_SATURATION; + } else if (strcmp(intent, "Perceptual") == 0) { + cmsIntent = INTENT_PERCEPTUAL; + } + } + } + if (transformIntent == cmsIntent) { + return cs; + } + delete 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(NULL, &obj2, out, state, 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 = (state != NULL && state->getDisplayProfile() != NULL) ? state->getDisplayProfile() : 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; + + int cmsIntent = INTENT_RELATIVE_COLORIMETRIC; + if (state != NULL) { + const char *intent = state->getRenderingIntent(); + if (intent != NULL) { + if (strcmp(intent, "AbsoluteColorimetric") == 0) { + cmsIntent = INTENT_ABSOLUTE_COLORIMETRIC; + } else if (strcmp(intent, "Saturation") == 0) { + cmsIntent = INTENT_SATURATION; + } else if (strcmp(intent, "Perceptual") == 0) { + cmsIntent = INTENT_PERCEPTUAL; + } + } + } + if ((transform = cmsCreateTransform(hp, + COLORSPACE_SH(cst) |CHANNELS_SH(nCompsA) | BYTES_SH(1), + dhp, + COLORSPACE_SH(dcst) | + CHANNELS_SH(dNChannels) | BYTES_SH(1), + cmsIntent, LCMS_FLAGS)) == 0) { + error(errSyntaxWarning, -1, "Can't create transform"); + cs->transform = NULL; + } else { + cs->transform = new GfxColorTransform(transform, cmsIntent, cst, dcst); + } + if (dcst == PT_RGB || dcst == PT_CMYK) { + // create line transform only when the display is RGB type color space + if ((transform = cmsCreateTransform(hp, + CHANNELS_SH(nCompsA) | BYTES_SH(1),dhp, + (dcst == PT_RGB) ? TYPE_RGB_8 : TYPE_CMYK_8, cmsIntent, LCMS_FLAGS)) == 0) { + error(errSyntaxWarning, -1, "Can't create transform"); + cs->lineTransform = NULL; + } else { + cs->lineTransform = new GfxColorTransform(transform, cmsIntent, cst, dcst); + } + } + cmsCloseProfile(hp); + } + obj1.free(); + // put this colorSpace into cache + if (out && iccProfileStreamA.num > 0) { + GfxICCBasedColorSpaceKey *k = new GfxICCBasedColorSpaceKey(iccProfileStreamA.num, iccProfileStreamA.gen); + GfxICCBasedColorSpaceItem *item = new GfxICCBasedColorSpaceItem(cs); + out->getIccColorSpaceCache()->put(k, item); + } +#endif + return cs; +} + +void GfxICCBasedColorSpace::getGray(GfxColor *color, GfxGray *gray) { +#ifdef USE_CMS + if (transform != 0 && transform->getTransformPixelType() == PT_GRAY) { + Guchar in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + + if (nComps == 3 && transform->getInputPixelType() == PT_Lab) { + in[0] = colToByte(dblToCol(colToDbl(color->c[0]) / 100.0)); + in[1] = colToByte(dblToCol((colToDbl(color->c[1]) + 128.0) / 255.0)); + in[2] = colToByte(dblToCol((colToDbl(color->c[2]) + 128.0) / 255.0)); + } else { + for (int i = 0;i < nComps;i++) { + in[i] = colToByte(color->c[i]); + } + } + if (nComps <= 4) { + unsigned int key = 0; + for (int j = 0; j < nComps; j++) { + key = (key << 8) + in[j]; + } + std::map<unsigned int, unsigned int>::iterator it = cmsCache.find(key); + if (it != cmsCache.end()) { + unsigned int value = it->second; + *gray = byteToCol(value & 0xff); + return; + } + } + transform->doTransform(in,out,1); + *gray = byteToCol(out[0]); + if (nComps <= 4 && cmsCache.size() <= CMSCACHE_LIMIT) { + unsigned int key = 0; + for (int j = 0; j < nComps; j++) { + key = (key << 8) + in[j]; + } + unsigned int value = out[0]; + cmsCache.insert(std::pair<unsigned int, unsigned int>(key, value)); + } + } 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 && transform->getTransformPixelType() == PT_RGB) { + Guchar in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + + if (nComps == 3 && transform->getInputPixelType() == PT_Lab) { + in[0] = colToByte(dblToCol(colToDbl(color->c[0]) / 100.0)); + in[1] = colToByte(dblToCol((colToDbl(color->c[1]) + 128.0) / 255.0)); + in[2] = colToByte(dblToCol((colToDbl(color->c[2]) + 128.0) / 255.0)); + } else { + for (int i = 0;i < nComps;i++) { + in[i] = colToByte(color->c[i]); + } + } + if (nComps <= 4) { + unsigned int key = 0; + for (int j = 0; j < nComps; j++) { + key = (key << 8) + in[j]; + } + std::map<unsigned int, unsigned int>::iterator it = cmsCache.find(key); + if (it != cmsCache.end()) { + unsigned int value = it->second; + rgb->r = byteToCol(value >> 16); + rgb->g = byteToCol((value >> 8) & 0xff); + rgb->b = byteToCol(value & 0xff); + return; + } + } + transform->doTransform(in,out,1); + rgb->r = byteToCol(out[0]); + rgb->g = byteToCol(out[1]); + rgb->b = byteToCol(out[2]); + if (nComps <= 4 && cmsCache.size() <= CMSCACHE_LIMIT) { + unsigned int key = 0; + for (int j = 0; j < nComps; j++) { + key = (key << 8) + in[j]; + } + unsigned int value = (out[0] << 16) + (out[1] << 8) + out[2]; + cmsCache.insert(std::pair<unsigned int, unsigned int>(key, value)); + } + } else if (transform != NULL && transform->getTransformPixelType() == PT_CMYK) { + Guchar in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + double c, m, y, k, c1, m1, y1, k1, r, g, b; + + if (nComps == 3 && transform->getInputPixelType() == PT_Lab) { + in[0] = colToByte(dblToCol(colToDbl(color->c[0]) / 100.0)); + in[1] = colToByte(dblToCol((colToDbl(color->c[1]) + 128.0) / 255.0)); + in[2] = colToByte(dblToCol((colToDbl(color->c[2]) + 128.0) / 255.0)); + } else { + for (int i = 0;i < nComps;i++) { + in[i] = colToByte(color->c[i]); + } + } + if (nComps <= 4) { + unsigned int key = 0; + for (int j = 0; j < nComps; j++) { + key = (key << 8) + in[j]; + } + std::map<unsigned int, unsigned int>::iterator it = cmsCache.find(key); + if (it != cmsCache.end()) { + unsigned int value = it->second; + rgb->r = byteToCol(value >> 16); + rgb->g = byteToCol((value >> 8) & 0xff); + rgb->b = byteToCol(value & 0xff); + return; + } + } + transform->doTransform(in,out,1); + c = byteToDbl(out[0]); + m = byteToDbl(out[1]); + y = byteToDbl(out[2]); + k = byteToDbl(out[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)); + if (nComps <= 4 && cmsCache.size() <= CMSCACHE_LIMIT) { + unsigned int key = 0; + for (int j = 0; j < nComps; j++) { + key = (key << 8) + in[j]; + } + unsigned int value = (dblToByte(r) << 16) + (dblToByte(g) << 8) + dblToByte(b); + cmsCache.insert(std::pair<unsigned int, unsigned int>(key, value)); + } + } 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 && lineTransform->getTransformPixelType() == PT_RGB) { + 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 && lineTransform->getTransformPixelType() == PT_RGB) { + 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 if (lineTransform != NULL && lineTransform->getTransformPixelType() == PT_CMYK) { + Guchar* tmp = (Guchar *)gmallocn(4 * length, sizeof(Guchar)); + lineTransform->doTransform(in, tmp, length); + Guchar *current = tmp; + double c, m, y, k, c1, m1, y1, k1, r, g, b; + for (int i = 0; i < length; ++i) { + c = byteToDbl(*current++); + m = byteToDbl(*current++); + y = byteToDbl(*current++); + k = byteToDbl(*current++); + c1 = 1 - c; + m1 = 1 - m; + y1 = 1 - y; + k1 = 1 - k; + cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b); + *out++ = dblToByte(r); + *out++ = dblToByte(g); + *out++ = dblToByte(b); + } + 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 && lineTransform->getTransformPixelType() == PT_RGB) { + 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::getCMYKLine(Guchar *in, Guchar *out, int length) { +#ifdef USE_CMS + if (lineTransform != NULL && lineTransform->getTransformPixelType() == PT_CMYK) { + transform->doTransform(in,out,length); + } else if (lineTransform != NULL && nComps != 4) { + GfxColorComp c, m, y, k; + Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar)); + getRGBLine(in, tmp, length); + Guchar *p = tmp; + for (int i = 0; i < length; i++) { + c = byteToCol(255 - *p++); + m = byteToCol(255 - *p++); + y = byteToCol(255 - *p++); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + *out++ = colToByte(c - k); + *out++ = colToByte(m - k); + *out++ = colToByte(y - k); + *out++ = colToByte(k); + } + gfree(tmp); + } else { + alt->getCMYKLine(in, out, length); + } +#else + alt->getCMYKLine(in, out, length); +#endif +} + +void GfxICCBasedColorSpace::getDeviceNLine(Guchar *in, Guchar *out, int length) { +#ifdef USE_CMS + if (lineTransform != NULL && lineTransform->getTransformPixelType() == PT_CMYK) { + Guchar* tmp = (Guchar *)gmallocn(4 * length, sizeof(Guchar)); + transform->doTransform(in,tmp,length); + Guchar *p = tmp; + for (int i = 0; i < length; i++) { + for (int j = 0; j < 4; j++) + *out++ = *p++; + for (int j = 4; j < SPOT_NCOMPS+4; j++) + *out++ = 0; + } + gfree(tmp); + } else if (lineTransform != NULL && nComps != 4) { + GfxColorComp c, m, y, k; + Guchar* tmp = (Guchar *)gmallocn(3 * length, sizeof(Guchar)); + getRGBLine(in, tmp, length); + Guchar *p = tmp; + for (int i = 0; i < length; i++) { + for (int j = 0; j < SPOT_NCOMPS+4; j++) + out[j] = 0; + c = byteToCol(255 - *p++); + m = byteToCol(255 - *p++); + y = byteToCol(255 - *p++); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + out[0] = colToByte(c - k); + out[1] = colToByte(m - k); + out[2] = colToByte(y - k); + out[3] = colToByte(k); + out += (SPOT_NCOMPS+4); + } + gfree(tmp); + } else { + alt->getDeviceNLine(in, out, length); + } +#else + alt->getDeviceNLine(in, out, length); +#endif +} + +void GfxICCBasedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { +#ifdef USE_CMS + if (transform != NULL && transform->getTransformPixelType() == PT_CMYK) { + Guchar in[gfxColorMaxComps]; + Guchar out[gfxColorMaxComps]; + + if (nComps == 3 && transform->getInputPixelType() == PT_Lab) { + in[0] = colToByte(dblToCol(colToDbl(color->c[0]) / 100.0)); + in[1] = colToByte(dblToCol((colToDbl(color->c[1]) + 128.0) / 255.0)); + in[2] = colToByte(dblToCol((colToDbl(color->c[2]) + 128.0) / 255.0)); + } else { + for (int i = 0;i < nComps;i++) { + in[i] = colToByte(color->c[i]); + } + } + if (nComps <= 4) { + unsigned int key = 0; + for (int j = 0; j < nComps; j++) { + key = (key << 8) + in[j]; + } + std::map<unsigned int, unsigned int>::iterator it = cmsCache.find(key); + if (it != cmsCache.end()) { + unsigned int value = it->second; + cmyk->c = byteToCol(value >> 24); + cmyk->m = byteToCol((value >> 16) & 0xff); + cmyk->y = byteToCol((value >> 8) & 0xff); + cmyk->k = byteToCol(value & 0xff); + return; + } + } + 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]); + if (nComps <= 4 && cmsCache.size() <= CMSCACHE_LIMIT) { + unsigned int key = 0; + for (int j = 0; j < nComps; j++) { + key = (key << 8) + in[j]; + } + unsigned int value = (out[0] << 24) + (out[1] << 16) + (out[2] << 8) + out[3]; + cmsCache.insert(std::pair<unsigned int, unsigned int>(key, value)); + } + } else if (nComps != 4 && transform != NULL && transform->getTransformPixelType() == PT_RGB) { + 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); + } +#else + alt->getCMYK(color, cmyk); +#endif +} + +GBool GfxICCBasedColorSpace::useGetRGBLine() { +#ifdef USE_CMS + return lineTransform != NULL || alt->useGetRGBLine(); +#else + return alt->useGetRGBLine(); +#endif +} + +GBool GfxICCBasedColorSpace::useGetCMYKLine() { +#ifdef USE_CMS + return lineTransform != NULL || alt->useGetCMYKLine(); +#else + return alt->useGetCMYKLine(); +#endif +} + +GBool GfxICCBasedColorSpace::useGetDeviceNLine() { +#ifdef USE_CMS + return lineTransform != NULL || alt->useGetDeviceNLine(); +#else + return alt->useGetDeviceNLine(); +#endif +} + +void GfxICCBasedColorSpace::getDeviceN(GfxColor *color, GfxColor *deviceN) { + GfxCMYK cmyk; + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + getCMYK(color, &cmyk); + deviceN->c[0] = cmyk.c; + deviceN->c[1] = cmyk.m; + deviceN->c[2] = cmyk.y; + deviceN->c[3] = cmyk.k; +} + +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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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(res, &obj1, out, state, 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()) && idx >= 0)) { + 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::getCMYKLine(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->getCMYKLine(line, out, length); + + gfree (line); +} + +void GfxIndexedColorSpace::getDeviceNLine(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->getDeviceNLine(line, out, length); + + gfree (line); +} + +void GfxIndexedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) { + GfxColor color2; + + base->getCMYK(mapColorToBase(color, &color2), cmyk); +} + +void GfxIndexedColorSpace::getDeviceN(GfxColor *color, GfxColor *deviceN) { + GfxColor color2; + + base->getDeviceN(mapColorToBase(color, &color2), deviceN); +} + +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; + } else if (!name->cmp("All")) { + overprintMask = 0xffffffff; + } +} + +GfxSeparationColorSpace::GfxSeparationColorSpace(GooString *nameA, + GfxColorSpace *altA, + Function *funcA, + GBool nonMarkingA, + Guint overprintMaskA, + int *mappingA) { + name = nameA; + alt = altA; + func = funcA; + nonMarking = nonMarkingA; + overprintMask = overprintMaskA; + mapping = mappingA; +} + +GfxSeparationColorSpace::~GfxSeparationColorSpace() { + delete name; + delete alt; + delete func; + if (mapping != NULL) + gfree(mapping); +} + +GfxColorSpace *GfxSeparationColorSpace::copy() { + int *mappingA = NULL; + if (mapping != NULL) { + mappingA = (int *) gmalloc(sizeof(int)); + *mappingA = *mapping; + } + return new GfxSeparationColorSpace(name->copy(), alt->copy(), func->copy(), + nonMarking, overprintMask, mappingA); +} + +//~ handle the 'All' and 'None' colorants +GfxColorSpace *GfxSeparationColorSpace::parse(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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(res, &obj1, out, state, 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; + } + if (funcA->getInputSize() != 1) { + error(errSyntaxWarning, -1, "Bad SeparationColorSpace function"); + goto err5; + } + obj1.free(); + cs = new GfxSeparationColorSpace(nameA, altA, funcA); + return cs; + + err5: + delete funcA; + 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + if (mapping == NULL || mapping[0] == -1) { + GfxCMYK cmyk; + + getCMYK(color, &cmyk); + deviceN->c[0] = cmyk.c; + deviceN->c[1] = cmyk.m; + deviceN->c[2] = cmyk.y; + deviceN->c[3] = cmyk.k; + } else { + deviceN->c[mapping[0]] = color->c[0]; + } +} + +void GfxSeparationColorSpace::getDefaultColor(GfxColor *color) { + color->c[0] = gfxColorComp1; +} + +void GfxSeparationColorSpace::createMapping(GooList *separationList, int maxSepComps) { + if (nonMarking) + return; + mapping = (int *)gmalloc(sizeof(int)); + switch (overprintMask) { + case 0x01: + *mapping = 0; + break; + case 0x02: + *mapping = 1; + break; + case 0x04: + *mapping = 2; + break; + case 0x08: + *mapping = 3; + break; + default: + Guint newOverprintMask = 0x10; + for (int i = 0; i < separationList->getLength(); i++) { + GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(i); + if (!sepCS->getName()->cmp(name)) { + if (sepCS->getFunc()->hasDifferentResultSet(func)) { + error(errSyntaxWarning, -1, + "Different functions found for '{0:t}', convert immediately", name); + gfree(mapping); + mapping = NULL; + return; + } + *mapping = i+4; + overprintMask = newOverprintMask; + return; + } + newOverprintMask <<=1; + } + if (separationList->getLength() == maxSepComps) { + error(errSyntaxWarning, -1, + "Too many ({0:d}) spots, convert '{1:t}' immediately", maxSepComps, name); + gfree(mapping); + mapping = NULL; + return; + } + *mapping = separationList->getLength() + 4; + separationList->append(copy()); + overprintMask = newOverprintMask; + break; + } +} + +//------------------------------------------------------------------------ +// GfxDeviceNColorSpace +//------------------------------------------------------------------------ + +GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA, + GooString **namesA, + GfxColorSpace *altA, + Function *funcA, + GooList *sepsCSA) { + int i; + + nComps = nCompsA; + alt = altA; + func = funcA; + sepsCS = sepsCSA; + nonMarking = gTrue; + overprintMask = 0; + mapping = NULL; + 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 if (!names[i]->cmp("All")) { + overprintMask = 0xffffffff; + } else { + overprintMask = 0x0f; + } + } +} + +GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA, + GooString **namesA, + GfxColorSpace *altA, + Function *funcA, + GooList *sepsCSA, + int *mappingA, + GBool nonMarkingA, + Guint overprintMaskA) { + int i; + + nComps = nCompsA; + alt = altA; + func = funcA; + sepsCS = sepsCSA; + mapping = mappingA; + 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; + deleteGooList(sepsCS, GfxSeparationColorSpace); + if (mapping != NULL) + gfree(mapping); +} + +GfxColorSpace *GfxDeviceNColorSpace::copy() { + int i; + int *mappingA = NULL; + + GooList *sepsCSA = new GooList(sepsCS->getLength()); + for (i = 0; i < sepsCS->getLength(); i++) { + GfxSeparationColorSpace *scs = (GfxSeparationColorSpace *) sepsCS->get(i); + if (likely(scs != NULL)) { + sepsCSA->append(scs->copy()); + } + } + if (mapping != NULL) { + mappingA = (int *)gmalloc(sizeof(int) * nComps); + for (i = 0; i < nComps; i++) + mappingA[i] = mapping[i]; + } + return new GfxDeviceNColorSpace(nComps, names, alt->copy(), func->copy(), + sepsCSA, mappingA, nonMarking, overprintMask); +} + +//~ handle the 'None' colorant +GfxColorSpace *GfxDeviceNColorSpace::parse(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, int recursion) { + GfxDeviceNColorSpace *cs; + int nCompsA; + GooString *namesA[gfxColorMaxComps]; + GfxColorSpace *altA; + Function *funcA; + Object obj1, obj2; + int i; + GooList *separationList = new GooList(); + + 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(res, &obj1, out, state, 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(); + if (arr->getLength() == 5) { + if (!arr->get(4, &obj1)->isDict()) { + error(errSyntaxWarning, -1, "Bad DeviceN color space (attributes)"); + goto err4; + } + Dict *attribs = obj1.getDict(); + attribs->lookup("Colorants", &obj2); + if (obj2.isDict()) { + Dict *colorants = obj2.getDict(); + for (i = 0; i < colorants->getLength(); i++) { + Object obj3; + colorants->getVal(i, &obj3); + if (obj3.isArray()) { + separationList->append(GfxSeparationColorSpace::parse(res, obj3.getArray(), out, state, recursion)); + } else { + obj3.free(); + obj2.free(); + error(errSyntaxWarning, -1, "Bad DeviceN color space (colorant value entry is not an Array)"); + goto err4; + } + obj3.free(); + } + } + obj2.free(); + obj1.free(); + } + cs = new GfxDeviceNColorSpace(nCompsA, namesA, altA, funcA, separationList); + return cs; + + err4: + delete altA; + err3: + for (i = 0; i < nCompsA; ++i) { + delete namesA[i]; + } + err2: + obj1.free(); + err1: + delete separationList; + 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + if (mapping == NULL) { + GfxCMYK cmyk; + + getCMYK(color, &cmyk); + deviceN->c[0] = cmyk.c; + deviceN->c[1] = cmyk.m; + deviceN->c[2] = cmyk.y; + deviceN->c[3] = cmyk.k; + } else { + for (int j = 0; j < nComps; j++) + if (mapping[j] != -1) + deviceN->c[mapping[j]] = color->c[j]; + } +} + +void GfxDeviceNColorSpace::getDefaultColor(GfxColor *color) { + int i; + + for (i = 0; i < nComps; ++i) { + color->c[i] = gfxColorComp1; + } +} + +void GfxDeviceNColorSpace::createMapping(GooList *separationList, int maxSepComps) { + if (nonMarking) // None + return; + mapping = (int *)gmalloc(sizeof(int) * nComps); + Guint newOverprintMask = 0; + for (int i = 0; i < nComps; i++) { + if (!names[i]->cmp("None")) { + mapping[i] = -1; + } else if (!names[i]->cmp("Cyan")) { + newOverprintMask |= 0x01; + mapping[i] = 0; + } else if (!names[i]->cmp("Magenta")) { + newOverprintMask |= 0x02; + mapping[i] = 1; + } else if (!names[i]->cmp("Yellow")) { + newOverprintMask |= 0x04; + mapping[i] = 2; + } else if (!names[i]->cmp("Black")) { + newOverprintMask |= 0x08; + mapping[i] = 3; + } else { + Guint startOverprintMask = 0x10; + GBool found = gFalse; + Function *sepFunc = NULL; + if (nComps == 1) + sepFunc = func; + else { + for (int k = 0; k < sepsCS->getLength(); k++) { + GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)sepsCS->get(k); + if (!sepCS->getName()->cmp(names[i])) { + sepFunc = sepCS->getFunc(); + break; + } + } + } + for (int j = 0; j < separationList->getLength(); j++) { + GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(j); + if (!sepCS->getName()->cmp(names[i])) { + if (sepFunc != NULL && sepCS->getFunc()->hasDifferentResultSet(sepFunc)) { + error(errSyntaxWarning, -1, + "Different functions found for '{0:t}', convert immediately", names[i]); + gfree(mapping); + mapping = NULL; + overprintMask = 0xffffffff; + return; + } + mapping[i] = j+4; + newOverprintMask |= startOverprintMask; + found = gTrue; + break; + } + startOverprintMask <<=1; + } + if (!found) { + if (separationList->getLength() == maxSepComps) { + error(errSyntaxWarning, -1, + "Too many ({0:d}) spots, convert '{1:t}' immediately", maxSepComps, names[i]); + gfree(mapping); + mapping = NULL; + overprintMask = 0xffffffff; + return; + } + mapping[i] = separationList->getLength() + 4; + newOverprintMask |= startOverprintMask; + if (nComps == 1) + separationList->append(new GfxSeparationColorSpace(names[i]->copy(),alt->copy(), func->copy())); + else { + for (int k = 0; k < sepsCS->getLength(); k++) { + GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)sepsCS->get(k); + if (!sepCS->getName()->cmp(names[i])) { + found = gTrue; + separationList->append(sepCS->copy()); + break; + } + } + if(!found) { + error(errSyntaxWarning, -1, "DeviceN has no suitable colorant"); + gfree(mapping); + mapping = NULL; + overprintMask = 0xffffffff; + return; + } + } + } + } + } + overprintMask = newOverprintMask; +} + +//------------------------------------------------------------------------ +// 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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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(res, &obj1, out, state, 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::getDeviceN(GfxColor *color, GfxColor *deviceN) { + for (int i = 0; i < gfxColorMaxComps; i++) + deviceN->c[i] = 0; + deviceN->c[3] = 1; +} + +void GfxPatternColorSpace::getDefaultColor(GfxColor *color) { + color->c[0]=0; +} + +//------------------------------------------------------------------------ +// Pattern +//------------------------------------------------------------------------ + +GfxPattern::GfxPattern(int typeA) { + type = typeA; +} + +GfxPattern::~GfxPattern() { +} + +GfxPattern *GfxPattern::parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state) { + 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(res, obj, out, state); + } + 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(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state) { + 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(res, &obj1, out, state); + 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(GfxResources *res, Object *obj, OutputDev *out, GfxState *state) { + 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(res, dict, out, state); + break; + case 2: + shading = GfxAxialShading::parse(res, dict, out, state); + break; + case 3: + shading = GfxRadialShading::parse(res, dict, out, state); + break; + case 4: + if (obj->isStream()) { + shading = GfxGouraudTriangleShading::parse(res, 4, dict, obj->getStream(), out, state); + } else { + error(errSyntaxWarning, -1, "Invalid Type 4 shading object"); + goto err1; + } + break; + case 5: + if (obj->isStream()) { + shading = GfxGouraudTriangleShading::parse(res, 5, dict, obj->getStream(), out, state); + } else { + error(errSyntaxWarning, -1, "Invalid Type 5 shading object"); + goto err1; + } + break; + case 6: + if (obj->isStream()) { + shading = GfxPatchMeshShading::parse(res, 6, dict, obj->getStream(), out, state); + } else { + error(errSyntaxWarning, -1, "Invalid Type 6 shading object"); + goto err1; + } + break; + case 7: + if (obj->isStream()) { + shading = GfxPatchMeshShading::parse(res, 7, dict, obj->getStream(), out, state); + } 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state) { + Object obj1, obj2; + int i; + + dict->lookup("ColorSpace", &obj1); + if (!(colorSpace = GfxColorSpace::parse(res, &obj1, out, state))) { + 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state) { + 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 || nFuncsA <= 0) { + 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(res, dict, out, state)) { + 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) { + if (funcs[i]->getInputSize() != 1) { + error(errSyntaxWarning, -1, "Invalid shading function (input != 1)"); + break; + } + 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state) { + 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 || nFuncsA == 0) { + 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) { + obj1.arrayGet(0, &obj2); + if (obj2.isBool()) { + extend0A = obj2.getBool(); + } else { + error(errSyntaxWarning, -1, "Invalid axial shading extend (0)"); + } + obj2.free(); + obj1.arrayGet(1, &obj2); + if (obj2.isBool()) { + extend1A = obj2.getBool(); + } else { + error(errSyntaxWarning, -1, "Invalid axial shading extend (1)"); + } + obj2.free(); + } + obj1.free(); + + shading = new GfxAxialShading(x0A, y0A, x1A, y1A, t0A, t1A, + funcsA, nFuncsA, extend0A, extend1A); + if (!shading->init(res, dict, out, state)) { + 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state) { + 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(res, dict, out, state)) { + 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(GfxResources *res, int typeA, + Dict *dict, + Stream *str, + OutputDev *out, GfxState *gfxState) { + 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(res, dict, out, gfxState)) { + 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(GfxResources *res, int typeA, Dict *dict, + Stream *str, OutputDev *out, GfxState *state) { + 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(res, dict, out, state)) { + 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() || colorSpace2->useGetCMYKLine() || colorSpace2->useGetDeviceNLine()) { + 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() || colorSpace2->useGetCMYKLine() || colorSpace2->useGetDeviceNLine()) { + 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() || colorSpace->useGetCMYKLine() || colorSpace->useGetDeviceNLine()) { + 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::getCMYKLine(Guchar *in, Guchar *out, int length) { + int i, j; + Guchar *inp, *tmp_line; + + if (!useCMYKLine()) { + GfxCMYK cmyk; + + inp = in; + for (i = 0; i < length; i++) { + getCMYK (inp, &cmyk); + *out++ = colToByte(cmyk.c); + *out++ = colToByte(cmyk.m); + *out++ = colToByte(cmyk.y); + *out++ = colToByte(cmyk.k); + 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->getCMYKLine(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->getCMYKLine(in, out, length); + break; + } + +} + +void GfxImageColorMap::getDeviceNLine(Guchar *in, Guchar *out, int length) { + int i, j; + Guchar *inp, *tmp_line; + + if (!useDeviceNLine()) { + GfxColor deviceN; + + inp = in; + for (i = 0; i < length; i++) { + getDeviceN (inp, &deviceN); + for (int j = 0; j < SPOT_NCOMPS+4; j++) + *out++ = deviceN.c[j]; + 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->getDeviceNLine(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->getDeviceNLine(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::getDeviceN(Guchar *x, GfxColor *deviceN) { + GfxColor color; + int i; + + if (colorSpace2) { + for (i = 0; i < nComps2; ++i) { + color.c[i] = lookup2[i][x[0]]; + } + colorSpace2->getDeviceN(&color, deviceN); + } else { + for (i = 0; i < nComps; ++i) { + color.c[i] = lookup[i][x[i]]; + } + colorSpace->getDeviceN(&color, deviceN); + } +} + +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; + + renderingIntent[0] = 0; + + saved = NULL; +#ifdef USE_CMS + GfxColorSpace::setupColorProfiles(); + XYZ2DisplayTransformRelCol = NULL; + XYZ2DisplayTransformAbsCol = NULL; + XYZ2DisplayTransformSat = NULL; + XYZ2DisplayTransformPerc = NULL; + localDisplayProfile = NULL; + displayProfileRef = 0; +#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(); + } +#ifdef USE_CMS + if (XYZ2DisplayTransformRelCol) { + if (XYZ2DisplayTransformRelCol->unref() == 0) + delete XYZ2DisplayTransformRelCol; + } + if (XYZ2DisplayTransformAbsCol) { + if (XYZ2DisplayTransformAbsCol->unref() == 0) + delete XYZ2DisplayTransformAbsCol; + } + if (XYZ2DisplayTransformSat) { + if (XYZ2DisplayTransformSat->unref() == 0) + delete XYZ2DisplayTransformSat; + } + if (XYZ2DisplayTransformPerc) { + if (XYZ2DisplayTransformPerc->unref() == 0) + delete XYZ2DisplayTransformPerc; + } + if (--displayProfileRef == 0 && localDisplayProfile != NULL) { + cmsCloseProfile(localDisplayProfile); + } +#endif +} + +// 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; +#ifdef USE_CMS + if (XYZ2DisplayTransformRelCol) { + XYZ2DisplayTransformRelCol->ref(); + } + if (XYZ2DisplayTransformAbsCol) { + XYZ2DisplayTransformAbsCol->ref(); + } + if (XYZ2DisplayTransformSat) { + XYZ2DisplayTransformSat->ref(); + } + if (XYZ2DisplayTransformPerc) { + XYZ2DisplayTransformPerc->ref(); + } + if (localDisplayProfile) { + displayProfileRef++; + } +#endif +} + +#ifdef USE_CMS +void GfxState::setDisplayProfile(cmsHPROFILE localDisplayProfileA) { + if (localDisplayProfile != NULL) { + cmsCloseProfile(localDisplayProfile); + } + localDisplayProfile = localDisplayProfileA; + if (localDisplayProfileA != NULL) { + cmsHTRANSFORM transform; + unsigned int nChannels; + unsigned int localDisplayPixelType; + + localDisplayPixelType = getCMSColorSpaceType(cmsGetColorSpace(localDisplayProfile)); + nChannels = getCMSNChannels(cmsGetColorSpace(localDisplayProfile)); + displayProfileRef = 1; + // create transform from XYZ + cmsHPROFILE XYZProfile = cmsCreateXYZProfile(); + if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL, + localDisplayProfile, + COLORSPACE_SH(localDisplayPixelType) | + CHANNELS_SH(nChannels) | BYTES_SH(1), + INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) { + error(errSyntaxWarning, -1, "Can't create Lab transform"); + } else { + XYZ2DisplayTransformRelCol = new GfxColorTransform(transform, INTENT_RELATIVE_COLORIMETRIC, PT_XYZ, localDisplayPixelType); + } + if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL, + localDisplayProfile, + COLORSPACE_SH(localDisplayPixelType) | + CHANNELS_SH(nChannels) | BYTES_SH(1), + INTENT_ABSOLUTE_COLORIMETRIC,LCMS_FLAGS)) == 0) { + error(errSyntaxWarning, -1, "Can't create Lab transform"); + } else { + XYZ2DisplayTransformAbsCol = new GfxColorTransform(transform, INTENT_ABSOLUTE_COLORIMETRIC, PT_XYZ, localDisplayPixelType); + } + if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL, + localDisplayProfile, + COLORSPACE_SH(localDisplayPixelType) | + CHANNELS_SH(nChannels) | BYTES_SH(1), + INTENT_SATURATION,LCMS_FLAGS)) == 0) { + error(errSyntaxWarning, -1, "Can't create Lab transform"); + } else { + XYZ2DisplayTransformSat = new GfxColorTransform(transform, INTENT_SATURATION, PT_XYZ, localDisplayPixelType); + } + if ((transform = cmsCreateTransform(XYZProfile, TYPE_XYZ_DBL, + localDisplayProfile, + COLORSPACE_SH(localDisplayPixelType) | + CHANNELS_SH(nChannels) | BYTES_SH(1), + INTENT_PERCEPTUAL,LCMS_FLAGS)) == 0) { + error(errSyntaxWarning, -1, "Can't create Lab transform"); + } else { + XYZ2DisplayTransformPerc = new GfxColorTransform(transform, INTENT_PERCEPTUAL, PT_XYZ, localDisplayPixelType); + } + cmsCloseProfile(XYZProfile); + } +} + +GfxColorTransform *GfxState::getXYZ2DisplayTransform() { + GfxColorTransform *transform; + + transform = XYZ2DisplayTransformRelCol; + if (strcmp(renderingIntent, "AbsoluteColorimetric") == 0) { + transform = XYZ2DisplayTransformAbsCol; + } else if (strcmp(renderingIntent, "Saturation") == 0) { + transform = XYZ2DisplayTransformSat; + } else if (strcmp(renderingIntent, "Perceptual") == 0) { + transform = XYZ2DisplayTransformPerc; + } + if (transform == NULL) { + transform = XYZ2DisplayTransform; + } + return transform; +} + +#endif + +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::shiftCTMAndClip(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/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState.h new file mode 100644 index 00000000000..f018e93dd34 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState.h @@ -0,0 +1,1651 @@ +//======================================================================== +// +// 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, 2013 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-2014 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 Lu Wang <coolwanglu@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 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> +#include <map> + +class Array; +class Gfx; +class GfxFont; +class PDFRectangle; +class GfxShading; +class PopplerCache; +class GooList; +class OutputDev; +class GfxState; +class GfxResources; + +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, int cmsIntent, unsigned int inputPixelType, unsigned int transformPixelType); + ~GfxColorTransform(); + int getIntent() { return cmsIntent; } + int getInputPixelType() { return inputPixelType; } + int getTransformPixelType() { return transformPixelType; } + void ref(); + unsigned int unref(); +private: + GfxColorTransform() {} + void *transform; + unsigned int refCount; + int cmsIntent; + unsigned int inputPixelType; + unsigned int transformPixelType; +}; + +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(GfxResources *res, Object *csObj, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN) = 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"); } + virtual void getCMYKLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getCMYKLine this should not happen"); } + virtual void getDeviceNLine(Guchar * /*in*/, Guchar * /*out*/, int /*length*/) { error(errInternal, -1, "GfxColorSpace::getDeviceNLine this should not happen"); } + + // create mapping for spot colorants + virtual void createMapping(GooList *separationList, int maxSepComps); + + // Does this ColorSpace support getRGBLine? + virtual GBool useGetRGBLine() { return gFalse; } + // Does this ColorSpace support getGrayLine? + virtual GBool useGetGrayLine() { return gFalse; } + // Does this ColorSpace support getCMYKLine? + virtual GBool useGetCMYKLine() { return gFalse; } + // Does this ColorSpace support getDeviceNLine? + virtual GBool useGetDeviceNLine() { 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; + int *mapping; +}; + +//------------------------------------------------------------------------ +// 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 getDeviceN(GfxColor *color, GfxColor *deviceN); + 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 void getCMYKLine(Guchar *in, Guchar *out, int length); + virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); + + virtual GBool useGetRGBLine() { return gTrue; } + virtual GBool useGetGrayLine() { return gTrue; } + virtual GBool useGetCMYKLine() { return gTrue; } + virtual GBool useGetDeviceNLine() { 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, GfxState *state); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + virtual void getDeviceN(GfxColor *color, GfxColor *deviceN); + + 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); +#ifdef USE_CMS + GfxColorTransform *transform; +#endif +}; + +//------------------------------------------------------------------------ +// 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 getDeviceN(GfxColor *color, GfxColor *deviceN); + 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 void getCMYKLine(Guchar *in, Guchar *out, int length); + virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); + + virtual GBool useGetRGBLine() { return gTrue; } + virtual GBool useGetGrayLine() { return gTrue; } + virtual GBool useGetCMYKLine() { return gTrue; } + virtual GBool useGetDeviceNLine() { 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, GfxState *state); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + virtual void getDeviceN(GfxColor *color, GfxColor *deviceN); + + 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); +#ifdef USE_CMS + GfxColorTransform *transform; +#endif +}; + +//------------------------------------------------------------------------ +// 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 getDeviceN(GfxColor *color, GfxColor *deviceN); + 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 void getCMYKLine(Guchar *in, Guchar *out, int length); + virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); + virtual GBool useGetRGBLine() { return gTrue; } + virtual GBool useGetCMYKLine() { return gTrue; } + virtual GBool useGetDeviceNLine() { 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, GfxState *state); + + virtual void getGray(GfxColor *color, GfxGray *gray); + virtual void getRGB(GfxColor *color, GfxRGB *rgb); + virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk); + virtual void getDeviceN(GfxColor *color, GfxColor *deviceN); + + 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); +#ifdef USE_CMS + GfxColorTransform *transform; +#endif +}; + +//------------------------------------------------------------------------ +// 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, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); + 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 void getCMYKLine(Guchar *in, Guchar *out, int length); + virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); + + virtual GBool useGetRGBLine(); + virtual GBool useGetCMYKLine(); + virtual GBool useGetDeviceNLine(); + + 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 + int getIntent() { return (transform != NULL) ? transform->getIntent() : 0; } + GfxColorTransform *transform; + GfxColorTransform *lineTransform; // color transform for line + std::map<unsigned int, unsigned int> cmsCache; +#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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); + 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 void getCMYKLine(Guchar *in, Guchar *out, int length); + virtual void getDeviceNLine(Guchar *in, Guchar *out, int length); + + virtual GBool useGetRGBLine() { return gTrue; } + virtual GBool useGetCMYKLine() { return gTrue; } + virtual GBool useGetDeviceNLine() { 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); + Guint getOverprintMask() { return base->getOverprintMask(); } + virtual void createMapping(GooList *separationList, int maxSepComps) + { base->createMapping(separationList, maxSepComps); } + + +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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); + + virtual void createMapping(GooList *separationList, int maxSepComps); + + 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, int *mappingA); + + 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, GooList *sepsCS); + virtual ~GfxDeviceNColorSpace(); + virtual GfxColorSpace *copy(); + virtual GfxColorSpaceMode getMode() { return csDeviceN; } + + // Construct a DeviceN color space. Returns NULL if unsuccessful. + static GfxColorSpace *parse(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); + + virtual void createMapping(GooList *separationList, int maxSepComps); + + 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, GooList *sepsCSA, + int *mappingA, 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; + GooList *sepsCS; // list of separation cs for spot colorants; +}; + +//------------------------------------------------------------------------ +// 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(GfxResources *res, Array *arr, OutputDev *out, GfxState *state, 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 getDeviceN(GfxColor *color, GfxColor *deviceN); + + 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(GfxResources *res, Object *obj, OutputDev *out, GfxState *state); + + 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(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state); + 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(GfxResources *res, Object *obj, OutputDev *out, GfxState *state); + + 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state); + + 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state); + + 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state); + + 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(GfxResources *res, Dict *dict, OutputDev *out, GfxState *state); + + 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(GfxResources *res, int typeA, Dict *dict, Stream *str, OutputDev *out, GfxState *state); + + 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(GfxResources *res, int typeA, Dict *dict, Stream *str, OutputDev *out, GfxState *state); + + 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 ()); } + bool useCMYKLine() { return (colorSpace2 && colorSpace2->useGetCMYKLine ()) || (!colorSpace2 && colorSpace->useGetCMYKLine ()); } + bool useDeviceNLine() { return (colorSpace2 && colorSpace2->useGetDeviceNLine ()) || (!colorSpace2 && colorSpace->useGetDeviceNLine ()); } + + // 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 getCMYKLine(Guchar *in, Guchar *out, int length); + void getDeviceNLine(Guchar *in, Guchar *out, int length); + void getCMYK(Guchar *x, GfxCMYK *cmyk); + void getDeviceN(Guchar *x, GfxColor *deviceN); + 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 getFillDeviceN(GfxColor *deviceN) + { fillColorSpace->getDeviceN(&fillColor, deviceN); } + void getStrokeCMYK(GfxCMYK *cmyk) + { strokeColorSpace->getCMYK(&strokeColor, cmyk); } + void getStrokeDeviceN(GfxColor *deviceN) + { strokeColorSpace->getDeviceN(&strokeColor, deviceN); } + 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; } + char *getRenderingIntent() { return renderingIntent; } + 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 shiftCTMAndClip(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; } + void setRenderingIntent(const char *intent) + { strncpy(renderingIntent, intent, 31); } + +#ifdef USE_CMS + void setDisplayProfile(void *localDisplayProfileA); + void *getDisplayProfile() { return localDisplayProfile; } + GfxColorTransform *getXYZ2DisplayTransform(); +#endif + + // 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; + char renderingIntent[32]; + + GfxState *saved; // next GfxState on stack + + GfxState(GfxState *state, GBool copyPath); + +#ifdef USE_CMS + void *localDisplayProfile; + int displayProfileRef; + GfxColorTransform *XYZ2DisplayTransformRelCol; + GfxColorTransform *XYZ2DisplayTransformAbsCol; + GfxColorTransform *XYZ2DisplayTransformSat; + GfxColorTransform *XYZ2DisplayTransformPerc; +#endif +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState_helpers.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState_helpers.h new file mode 100644 index 00000000000..bc0024edd79 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/GfxState_helpers.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParams.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParams.cc new file mode 100644 index 00000000000..e5434084c31 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParams.cc @@ -0,0 +1,2031 @@ +//======================================================================== +// +// 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, 2015 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, 2015 William Bader <williambader@hotmail.com> +// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> +// Copyright (C) 2010, 2012 Hib Eris <hib@hiberis.nl> +// Copyright (C) 2010 Patrick Spendrin <ps_ml@gmx.de> +// Copyright (C) 2010 Jakub Wilk <jwilk@jwilk.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> +// Copyright (C) 2013, 2014 Jason Crain <jason@aquaticape.us> +// +// 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 const 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 = new GooString(POPPLER_DATADIR); + 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 + substFiles = new GooHash(gTrue); +#endif + nameToUnicodeZapfDingbats = new NameToCharCode(); + nameToUnicodeText = 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(); + 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; + 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 = gTrue; + 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 tables + for (i = 0; nameToUnicodeZapfDingbatsTab[i].name; ++i) { + nameToUnicodeZapfDingbats->add(nameToUnicodeZapfDingbatsTab[i].name, nameToUnicodeZapfDingbatsTab[i].u); + } + + for (i = 0; nameToUnicodeTextTab[i].name; ++i) { + nameToUnicodeText->add(nameToUnicodeTextTab[i].name, nameToUnicodeTextTab[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); + nameToUnicodeText->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 nameToUnicodeZapfDingbats; + delete nameToUnicodeText; + 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 +} + +//------------------------------------------------------------------------ +// accessors +//------------------------------------------------------------------------ + +CharCode GlobalParams::getMacRomanCharCode(char *charName) { + // no need to lock - macRomanReverseMap is constant + return macRomanReverseMap->lookup(charName); +} + +Unicode GlobalParams::mapNameToUnicodeAll(const char *charName) { + // no need to lock - nameToUnicodeZapfDingbats and nameToUnicodeText are constant + Unicode u = nameToUnicodeZapfDingbats->lookup(charName); + if (!u) + u = nameToUnicodeText->lookup(charName); + return u; +} + +Unicode GlobalParams::mapNameToUnicodeText(const char *charName) { + // no need to lock - nameToUnicodeText is constant + return nameToUnicodeText->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; +} + +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::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::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; +} + +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/Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParams.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParams.h new file mode 100644 index 00000000000..16d615ae6d9 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParams.h @@ -0,0 +1,336 @@ +//======================================================================== +// +// 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, 2012, 2015 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, 2014, 2015 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> +// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> +// +// 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 setupBaseFonts(char *dir); + + //----- accessors + + CharCode getMacRomanCharCode(char *charName); + + // Return Unicode values for character names. Used for general text + // extraction. + Unicode mapNameToUnicodeText(const char *charName); + + // Return Unicode values for character names. Used for glyph + // lookups or text extraction with ZapfDingbats fonts. + Unicode mapNameToUnicodeAll(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); + GooString *getTextEncodingName(); + EndOfLineKind getTextEOL(); + GBool getTextPageBreaks(); + GBool getTextKeepTinyChars(); + GBool getEnableFreeType(); + 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(); + + 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 setTextEncoding(char *encodingName); + GBool setTextEOL(char *s); + void setTextPageBreaks(GBool pageBreaks); + void setTextKeepTinyChars(GBool keep); + GBool setEnableFreeType(char *s); + GBool setDisableFreeTypeHinting(char *s); + 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); + + static GBool parseYesNo2(const char *token, GBool *flag); + + //----- security handlers + + void addSecurityHandler(XpdfSecurityHandler *handler); + XpdfSecurityHandler *getSecurityHandler(char *name); + +private: + + void parseNameToUnicode(GooString *name); + 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 + + NameToCharCode * // mapping from char name to Unicode for ZapfDingbats + nameToUnicodeZapfDingbats; + NameToCharCode * // mapping from char name to Unicode for text + nameToUnicodeText; // extraction + 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] + 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 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/Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParamsWin.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParamsWin.cc new file mode 100644 index 00000000000..f9f40ef4e29 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/GlobalParamsWin.cc @@ -0,0 +1,598 @@ +/* Written by Krzysztof Kowalczyk (http://blog.kowalczyk.info) + but mostly based on xpdf code. + + // Copyright (C) 2010, 2012 Hib Eris <hib@hiberis.nl> + // Copyright (C) 2012, 2013 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> + // Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> + // Copyright (C) 2013 Dmytro Morgun <lztoad@gmail.com> + +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; + const 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, + ®Key) == 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; + GooFile *file; + + 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}'", displayFontTab[i].name); + delete fontName; + } + } + if (winFontDir[0]) { + GooString gooWinFontsDir(winFontDir); + sysFonts->scanWindowsFonts(&gooWinFontsDir); + } + + fileName = new GooString(dataRoot); + fileName->append("/cidfmap"); + + // try to open file + file = GooFile::open(fileName); + + if (file != NULL) { + Parser *parser; + Object obj1, obj2; + + obj1.initNull(); + parser = new Parser(NULL, + new Lexer(NULL, + new FileStream(file, 0, gFalse, file->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); + } + } + delete file; + delete parser; + } + else { + delete fileName; + } +} + +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/Build/source/libs/poppler/poppler-0.36.0/poppler/Hints.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Hints.cc new file mode 100644 index 00000000000..bdd0d322612 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Hints.cc @@ -0,0 +1,452 @@ +//======================================================================== +// +// Hints.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010, 2012 Hib Eris <hib@hiberis.nl> +// Copyright 2010, 2011, 2013, 2014 Albert Astals Cid <aacid@kde.org> +// Copyright 2010, 2013 Pino Toscano <pino@kde.org> +// Copyright 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright 2014 Fabio D'Urso <fabiodurso@hotmail.it> +// +//======================================================================== + +#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 ({0: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 = (Goffset *) gmallocn_checkoverflow(nPages, sizeof(Goffset)); + 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 table"); + 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); + if (nObjectLeast < 1) { + error(errSyntaxWarning, -1, "Invalid least number of objects reading page offset hints table"); + nPages = 0; + return; + } + + 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"); + nSharedGroups = 0; + return; + } + + 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]; + } + } +} + +Goffset 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Hints.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Hints.h new file mode 100644 index 00000000000..f46c07f673b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Hints.h @@ -0,0 +1,95 @@ +//======================================================================== +// +// Hints.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010 Hib Eris <hib@hiberis.nl> +// Copyright 2010, 2013 Albert Astals Cid <aacid@kde.org> +// Copyright 2013 Adrian Johnson <ajohnson@redneon.com> +// +//======================================================================== + +#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); + Goffset 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; + Goffset pageOffsetFirst; + Guint pageEndFirst; + + 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; + Goffset *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/Build/source/libs/poppler/poppler-0.36.0/poppler/JArithmeticDecoder.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/JArithmeticDecoder.cc new file mode 100644 index 00000000000..d23f7ea3887 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/JArithmeticDecoder.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/JArithmeticDecoder.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/JArithmeticDecoder.h new file mode 100644 index 00000000000..3c3e6fed0e5 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/JArithmeticDecoder.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/JBIG2Stream.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/JBIG2Stream.cc new file mode 100644 index 00000000000..66c1d2505e8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/JBIG2Stream.cc @@ -0,0 +1,4292 @@ +//======================================================================== +// +// 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, 2014 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> +// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013, 2014 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2015 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 +// +//======================================================================== + +#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); + } + if (unlikely((code & 0xff) < 64)) { + break; + } + 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_checkoverflow(h * line + 1); + if (data != NULL) { + 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) { if (likely(idx < size)) bitmaps[idx] = bitmap; } + JBIG2Bitmap *getBitmap(Guint idx) { return (idx < size) ? bitmaps[idx] : NULL; } + +private: + + Guint size; + JBIG2Bitmap **bitmaps; +}; + +JBIG2PatternDict::JBIG2PatternDict(Guint segNumA, Guint sizeA): + JBIG2Segment(segNumA) +{ + bitmaps = (JBIG2Bitmap **)gmallocn_checkoverflow(sizeA, sizeof(JBIG2Bitmap *)); + if (bitmaps) { + size = sizeA; + } else { + size = 0; + error(errSyntaxError, -1, "JBIG2PatternDict: can't allocate bitmaps"); + } +} + +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, Object *globalsStreamRefA): + 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(); + + if (globalsStreamA->isStream()) { + globalsStreamA->copy(&globalsStream); + if (globalsStreamRefA->isRef()) + globalsStreamRef = globalsStreamRefA->getRef(); + } + + 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; +} + +Goffset 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; + Goffset 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) { + + Goffset 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:lld} 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 (Goffset 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; + if (unlikely(symHeight > 0x40000000)) { + error(errSyntaxError, curStr->getPos(), "Bad height value in JBIG2 symbol dictionary"); + goto syntaxError; + } + 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]; + if (unlikely(refBitmap == NULL)) { + error(errSyntaxError, curStr->getPos(), "Invalid ref bitmap for symbol ID {0:ud} in JBIG2 symbol dictionary", symID); + goto syntaxError; + } + 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(); + if (unlikely(p == NULL)) { + delete collBitmap; + goto syntaxError; + } + 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) { + if (unlikely(i == 0)) ++i; + 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"); + delete codeTables; + gfree(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"); + if (unlikely(numInstances - inst > 0x800)) { + // don't loop too often with damaged JBIg2 streams + delete bitmap; + return NULL; + } + } 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; + if (unlikely(symbolBitmap->getHeight() == 0)) { + error(errSyntaxError, curStr->getPos(), "Invalid symbol bitmap height"); + if (ri) { + delete symbolBitmap; + } + delete bitmap; + return NULL; + } + bh = symbolBitmap->getHeight() - 1; + if (transposed) { + if (unlikely(s > 2 * bitmap->getHeight())) { + error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); + if (ri) { + delete symbolBitmap; + } + delete bitmap; + return NULL; + } + 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 + if (unlikely(tt - (int) bh > 2 * bitmap->getHeight())) { + error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); + if (ri) { + delete symbolBitmap; + } + delete bitmap; + return NULL; + } + bitmap->combine(symbolBitmap, s, tt - bh, combOp); + break; + case 1: // top left + if (unlikely(tt > 2 * bitmap->getHeight())) { + error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); + if (ri) { + delete symbolBitmap; + } + delete bitmap; + return NULL; + } + bitmap->combine(symbolBitmap, s, tt, combOp); + break; + case 2: // bottom right + if (unlikely(tt - (int) bh > 2 * bitmap->getHeight())) { + error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); + if (ri) { + delete symbolBitmap; + } + delete bitmap; + return NULL; + } + bitmap->combine(symbolBitmap, s, tt - bh, combOp); + break; + case 3: // top right + if (unlikely(tt > 2 * bitmap->getHeight())) { + error(errSyntaxError, curStr->getPos(), "Invalid JBIG2 combine"); + if (ri) { + delete symbolBitmap; + } + delete bitmap; + return NULL; + } + 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->getSize(); ++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]); + if (unlikely(patternBitmap == NULL)) { + error(errSyntaxError, curStr->getPos(), "Bad pattern bitmap"); + return; + } + 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 && y + aty[0] < bitmap->getHeight()) { + 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 && y + aty[1] < bitmap->getHeight()) { + 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 && y + aty[2] < bitmap->getHeight()) { + 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 && y + aty[3] < bitmap->getHeight()) { + 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 + const int atY = y + aty[0]; + if ((atY >= 0) && (atY < bitmap->getHeight())) { + atP0 = bitmap->getDataPtr() + atY * 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 + const int atY = y + aty[0]; + if ((atY >= 0) && (atY < bitmap->getHeight())) { + atP0 = bitmap->getDataPtr() + atY * 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 + const int atY = y + aty[0]; + if ((atY >= 0) && (atY < bitmap->getHeight())) { + atP0 = bitmap->getDataPtr() + atY * 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 && bitmap) { + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/JBIG2Stream.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/JBIG2Stream.h new file mode 100644 index 00000000000..1e14c5cf783 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/JBIG2Stream.h @@ -0,0 +1,169 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2015 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 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, Object *globalsStreamRefA); + virtual ~JBIG2Stream(); + virtual StreamKind getKind() { return strJBIG2; } + virtual void reset(); + virtual void close(); + virtual Goffset getPos(); + virtual int getChar(); + virtual int lookChar(); + virtual GooString *getPSFilter(int psLevel, const char *indent); + virtual GBool isBinary(GBool last = gTrue); + virtual Object *getGlobalsStream() { return &globalsStream; } + virtual Ref getGlobalsStreamRef() { return globalsStreamRef; } + +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; + Ref globalsStreamRef; + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/JPEG2000Stream.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/JPEG2000Stream.cc new file mode 100644 index 00000000000..35e98b86ebc --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/JPEG2000Stream.cc @@ -0,0 +1,448 @@ +//======================================================================== +// +// 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> +// Copyright 2014 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright 2013, 2014 Adrian Johnson <ajohnson@redneon.com> +// Copyright 2015 Adam Reichold <adam.reichold@t-online.de> +// +// Licensed under GPLv2 or later +// +//======================================================================== + +#include "config.h" +#include "JPEG2000Stream.h" +#include <openjpeg.h> + +#define OPENJPEG_VERSION_ENCODE(major, minor, micro) ( \ + ((major) * 10000) \ + + ((minor) * 100) \ + + ((micro) * 1)) + +#ifdef USE_OPENJPEG2 +#ifdef OPJ_VERSION_MAJOR +#define OPENJPEG_VERSION OPENJPEG_VERSION_ENCODE(OPJ_VERSION_MAJOR, OPJ_VERSION_MINOR, OPJ_VERSION_BUILD) +#else +// OpenJPEG started providing version macros in version 2.1. +// If the version macro is not found, set the version to 2.0.0 and +// assume there will be no API changes in 2.0.x. +#define OPENJPEG_VERSION OPENJPEG_VERSION_ENCODE(2, 0, 0) +#endif +#endif + +struct JPXStreamPrivate { + opj_image_t *image; + int counter; + int ccounter; + int npixels; + int ncomps; + GBool inited; +#ifdef USE_OPENJPEG1 + opj_dinfo_t *dinfo; + void init2(unsigned char *buf, int bufLen, OPJ_CODEC_FORMAT format); +#endif +#ifdef USE_OPENJPEG2 + void init2(OPJ_CODEC_FORMAT format, unsigned char *data, int length); +#endif +}; + +static inline int doLookChar(JPXStreamPrivate* priv) { + if (unlikely(priv->counter >= priv->npixels)) + return EOF; + + return ((unsigned char *)priv->image->comps[priv->ccounter].data)[priv->counter]; +} + +static inline int doGetChar(JPXStreamPrivate* priv) { + const int result = doLookChar(priv); + if (++priv->ccounter == priv->ncomps) { + priv->ccounter = 0; + ++priv->counter; + } + return result; +} + +JPXStream::JPXStream(Stream *strA) : FilterStream(strA) { + priv = new JPXStreamPrivate; + priv->inited = gFalse; + priv->image = NULL; + priv->npixels = 0; + priv->ncomps = 0; +#ifdef USE_OPENJPEG1 + priv->dinfo = NULL; +#endif +} + +JPXStream::~JPXStream() { + delete str; + close(); + delete priv; +} + +void JPXStream::reset() { + priv->counter = 0; + priv->ccounter = 0; +} + +void JPXStream::close() { + if (priv->image != NULL) { + opj_image_destroy(priv->image); + priv->image = NULL; + priv->npixels = 0; + } + +#ifdef USE_OPENJPEG1 + if (priv->dinfo != NULL) { + opj_destroy_decompress(priv->dinfo); + priv->dinfo = NULL; + } +#endif +} + +Goffset JPXStream::getPos() { + return priv->counter * priv->ncomps + priv->ccounter; +} + +int JPXStream::getChars(int nChars, Guchar *buffer) { + if (unlikely(priv->inited == gFalse)) { init(); } + + for (int i = 0; i < nChars; ++i) { + const int c = doGetChar(priv); + if (likely(c != EOF)) buffer[i] = c; + else return i; + } + return nChars; +} + +int JPXStream::getChar() { + if (unlikely(priv->inited == gFalse)) { init(); } + + return doGetChar(priv); +} + +int JPXStream::lookChar() { + if (unlikely(priv->inited == gFalse)) { init(); } + + return doLookChar(priv); +} + +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 (unlikely(priv->inited == gFalse)) { init(); } + + *bitsPerComponent = 8; + if (priv->image && priv->image->numcomps == 3) + *csMode = streamCSDeviceRGB; + else if (priv->image && priv->image->numcomps == 4) + *csMode = streamCSDeviceCMYK; + else + *csMode = streamCSDeviceGray; +} + + +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); +} + +#ifdef USE_OPENJPEG1 + +#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); + priv->init2(buf, length, CODEC_JP2); + free(buf); + + if (priv->image) { + priv->npixels = priv->image->comps[0].w * priv->image->comps[0].h; + priv->ncomps = priv->image->numcomps; + for (int component = 0; component < priv->ncomps; component++) { + if (priv->image->comps[component].data == NULL) { + close(); + break; + } + unsigned char *cdata = (unsigned char *)priv->image->comps[component].data; + int adjust = 0; + if (priv->image->comps[component].prec > 8) + adjust = priv->image->comps[component].prec - 8; + int sgndcorr = 0; + if (priv->image->comps[component].sgnd) + sgndcorr = 1 << (priv->image->comps[0].prec - 1); + for (int i = 0; i < priv->npixels; i++) { + int r = priv->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 + priv->npixels = 0; + + priv->counter = 0; + priv->ccounter = 0; + priv->inited = gTrue; +} + +void JPXStreamPrivate::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(¶meters); +#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, ¶meters); + + /* 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."); + } +} +#endif + + +#ifdef USE_OPENJPEG2 +typedef struct JPXData_s +{ + unsigned char *data; + int size; + int pos; +} JPXData; + +#define BUFFER_INITIAL_SIZE 4096 + +static OPJ_SIZE_T jpxRead_callback(void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) +{ + JPXData *jpxData = (JPXData *)p_user_data; + int len; + + len = jpxData->size - jpxData->pos; + if (len < 0) + len = 0; + if (len == 0) + return (OPJ_SIZE_T)-1; /* End of file! */ + if ((OPJ_SIZE_T)len > p_nb_bytes) + len = p_nb_bytes; + memcpy(p_buffer, jpxData->data + jpxData->pos, len); + jpxData->pos += len; + return len; +} + +static OPJ_OFF_T jpxSkip_callback(OPJ_OFF_T skip, void * p_user_data) +{ + JPXData *jpxData = (JPXData *)p_user_data; + + jpxData->pos += (skip > jpxData->size - jpxData->pos) ? jpxData->size - jpxData->pos : skip; + /* Always return input value to avoid "Problem with skipping JPEG2000 box, stream error" */ + return skip; +} + +static OPJ_BOOL jpxSeek_callback(OPJ_OFF_T seek_pos, void * p_user_data) +{ + JPXData *jpxData = (JPXData *)p_user_data; + + if (seek_pos > jpxData->size) + return OPJ_FALSE; + jpxData->pos = seek_pos; + return OPJ_TRUE; +} + +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); + priv->init2(OPJ_CODEC_JP2, buf, length); + gfree(buf); + + if (priv->image) { + priv->npixels = priv->image->comps[0].w * priv->image->comps[0].h; + priv->ncomps = priv->image->numcomps; + for (int component = 0; component < priv->ncomps; component++) { + if (priv->image->comps[component].data == NULL) { + close(); + break; + } + unsigned char *cdata = (unsigned char *)priv->image->comps[component].data; + int adjust = 0; + if (priv->image->comps[component].prec > 8) + adjust = priv->image->comps[component].prec - 8; + int sgndcorr = 0; + if (priv->image->comps[component].sgnd) + sgndcorr = 1 << (priv->image->comps[0].prec - 1); + for (int i = 0; i < priv->npixels; i++) { + int r = priv->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 { + priv->npixels = 0; + } + + priv->counter = 0; + priv->ccounter = 0; + priv->inited = gTrue; +} + +void JPXStreamPrivate::init2(OPJ_CODEC_FORMAT format, unsigned char *buf, int length) +{ + JPXData jpxData; + + jpxData.data = buf; + jpxData.pos = 0; + jpxData.size = length; + + opj_stream_t *stream; + + stream = opj_stream_default_create(OPJ_TRUE); + +#if OPENJPEG_VERSION >= OPENJPEG_VERSION_ENCODE(2, 1, 0) + opj_stream_set_user_data (stream, &jpxData, NULL); +#else + opj_stream_set_user_data (stream, &jpxData); +#endif + + opj_stream_set_read_function(stream, jpxRead_callback); + opj_stream_set_skip_function(stream, jpxSkip_callback); + opj_stream_set_seek_function(stream, jpxSeek_callback); + /* Set the length to avoid an assert */ + opj_stream_set_user_data_length(stream, length); + + opj_codec_t *decoder; + + /* Use default decompression parameters */ + opj_dparameters_t parameters; + opj_set_default_decoder_parameters(¶meters); + parameters.flags |= OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; + + /* Get the decoder handle of the format */ + decoder = opj_create_decompress(format); + if (decoder == NULL) { + error(errSyntaxWarning, -1, "Unable to create decoder"); + goto error; + } + + /* Catch events using our callbacks */ + opj_set_warning_handler(decoder, libopenjpeg_warning_callback, NULL); + opj_set_error_handler(decoder, libopenjpeg_error_callback, NULL); + + /* Setup the decoder decoding parameters */ + if (!opj_setup_decoder(decoder, ¶meters)) { + error(errSyntaxWarning, -1, "Unable to set decoder parameters"); + goto error; + } + + /* Decode the stream and fill the image structure */ + image = NULL; + if (!opj_read_header(stream, decoder, &image)) { + error(errSyntaxWarning, -1, "Unable to read header"); + goto error; + } + + /* Optional if you want decode the entire image */ + if (!opj_set_decode_area(decoder, image, parameters.DA_x0, + parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)){ + error(errSyntaxWarning, -1, "X2"); + goto error; + } + + /* Get the decoded image */ + if (!(opj_decode(decoder, stream, image) && opj_end_decompress(decoder, stream))) { + error(errSyntaxWarning, -1, "Unable to decode image"); + goto error; + } + + opj_destroy_codec(decoder); + opj_stream_destroy(stream); + + if (image != NULL) + return; + +error: + opj_destroy_codec(decoder); + if (format == OPJ_CODEC_JP2) { + error(errSyntaxWarning, -1, "Did no succeed opening JPX Stream as JP2, trying as J2K."); + init2(OPJ_CODEC_J2K, buf, length); + } else if (format == OPJ_CODEC_J2K) { + error(errSyntaxWarning, -1, "Did no succeed opening JPX Stream as J2K, trying as JPT."); + init2(OPJ_CODEC_JPT, buf, length); + } else { + error(errSyntaxError, -1, "Did no succeed opening JPX Stream."); + } +} +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/JPEG2000Stream.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/JPEG2000Stream.h new file mode 100644 index 00000000000..73b6bdd97b8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/JPEG2000Stream.h @@ -0,0 +1,55 @@ +//======================================================================== +// +// 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> +// Copyright 2013, 2014 Adrian Johnson <ajohnson@redneon.com> +// Copyright 2015 Adam Reichold <adam.reichold@t-online.de> +// +// Licensed under GPLv2 or later +// +//======================================================================== + + +#ifndef JPEG2000STREAM_H +#define JPEG2000STREAM_H + +#include "config.h" +#include "goo/gtypes.h" +#include "Object.h" +#include "Stream.h" + +struct JPXStreamPrivate; + +class JPXStream: public FilterStream { +public: + + JPXStream(Stream *strA); + virtual ~JPXStream(); + virtual StreamKind getKind() { return strJPX; } + virtual void reset(); + virtual void close(); + virtual Goffset 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); + + int readStream(int nChars, Guchar *buffer) { + return str->doGetChars(nChars, buffer); + } +private: + JPXStream(const JPXStream &other); + JPXStream& operator=(const JPXStream &other); + JPXStreamPrivate *priv; + + void init(); + virtual GBool hasGetChars() { return true; } + virtual int getChars(int nChars, Guchar *buffer); +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/JPXStream.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/JPXStream.cc new file mode 100644 index 00000000000..1476e6a0cfe --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/JPXStream.cc @@ -0,0 +1,3478 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012 Even Rouault <even.rouault@mines-paris.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; + + curX = curY = 0; + curComp = 0; + readBufLen = 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 + if (img.tiles == NULL || tileIdx >= img.nXTiles * img.nYTiles || img.tiles[tileIdx].tileComps == NULL) { + error(errSyntaxError, getPos(), "Unexpected tileIdx in fillReadBuf in JPX stream"); + return; + } + 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; + } + if (unlikely(tx >= (tileComp->x1 - tileComp->x0))) { + error(errSyntaxError, getPos(), "Unexpected tx 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; + } + if( dataLen >= 7 ) { + for (i = 0; i < dataLen - 7; ++i) { + if (bufStr->getChar() == EOF) + break; + } + } + } + } else { + if( dataLen >= 3 ) { + for (i = 0; i < dataLen - 3; ++i) { + if (bufStr->getChar() == EOF) + break; + } + } + } + } + } else if (boxType == 0x6A703263) { // codestream + cover(3); + if (!(haveBPC && haveCSMode)) { + getImageParams2(bitsPerComponent, csMode); + } + break; + } else { + cover(4); + for (i = 0; i < dataLen; ++i) { + if (unlikely(bufStr->getChar() == EOF)) { + error(errSyntaxError, getPos(), "Unexpected EOF in getImageParams in JPX stream"); + break; + } + } + } + } + } + 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; + + // initialize in case there is a parse error + img.xSize = img.ySize = 0; + img.xOffset = img.yOffset = 0; + img.xTileSize = img.yTileSize = 0; + img.xTileOffset = img.yTileOffset = 0; + img.nComps = 0; + + // 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, nDecompLevels; + 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 >= 65535 / 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 (img.tiles == NULL || img.nXTiles * img.nYTiles == 0 || img.tiles[0].tileComps == NULL) { + error(errSyntaxError, getPos(), "Error in JPX COD marker 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(&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 (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].nDecompLevels = nDecompLevels; + 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_checkoverflow( + (img.tiles[i].tileComps[comp].nDecompLevels + 1), + sizeof(JPXResLevel)); + if (img.tiles[i].tileComps[comp].resLevels == NULL) { + error(errSyntaxError, getPos(), "Error in JPX COD marker segment"); + return gFalse; + } + 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(&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 (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].nDecompLevels = nDecompLevels; + 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, nDecompLevels; + 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 (tileIdx >= img.nXTiles * img.nYTiles || + (tilePartIdx > 0 && !img.tiles[tileIdx].init)) { + 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(&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 (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].nDecompLevels = nDecompLevels; + 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(&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 (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].nDecompLevels = nDecompLevels; + 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; + } + } + tileComp = &tile->tileComps[tile->comp]; + if (tile->res >= tileComp->nDecompLevels + 1) { + if (++tile->comp == img.nComps) { + return gTrue; + } + } + } + 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); + const Guint stepIndex = 3*r - 2 + sb; + if (unlikely(stepIndex >= tileComp->nQuantSteps)) { + error(errSyntaxError, getPos(), + "Wrong index for quantSteps in inverseTransformLevel in JPX stream"); + break; + } + eps = (tileComp->quantSteps[stepIndex] >> 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]; + } + } + if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) { + x = tileComp->x1 - tileComp->x0 + 5; + } else { + x = tileComp->y1 - tileComp->y0 + 5; + } + if (offset + nx2 > x || nx2 == 0) { + error(errSyntaxError, getPos(), + "Invalid call of inverseTransform1D in inverseTransformLevel in JPX stream"); + return; + } + 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]; + } + } + if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) { + y = tileComp->x1 - tileComp->x0 + 5; + } else { + y = tileComp->y1 - tileComp->y0 + 5; + } + if (offset + ny2 > y || ny2 == 0) { + error(errSyntaxError, getPos(), + "Invalid call of inverseTransform1D in inverseTransformLevel in JPX stream"); + return; + } + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/JPXStream.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/JPXStream.h new file mode 100644 index 00000000000..30855431fb4 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/JPXStream.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Lexer.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Lexer.cc new file mode 100644 index 00000000000..952967a998a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Lexer.cc @@ -0,0 +1,645 @@ +//======================================================================== +// +// 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, 2012-2014 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, 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 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 <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; +static const long long LongLongSafeLimit = (LLONG_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, overflownLongLong; + int numParen; + int xi; + long long xll = 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; + overflownLongLong = 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(overflownLongLong)) { + xf = xf * 10.0 + (c - '0'); + } else if (unlikely (overflownInteger)) { + if (unlikely(xll > LongLongSafeLimit) && + (xll > (LLONG_MAX - (c - '0')) / 10.0)) { + overflownLongLong = gTrue; + xf = xll * 10.0 + (c - '0'); + } else { + xll = xll * 10 + (c - '0'); + } + } else { + if (unlikely(xi > IntegerSafeLimit) && + (xi > (INT_MAX - (c - '0')) / 10.0)) { + overflownInteger = gTrue; + xll = xi * 10LL + (c - '0'); + } else { + xi = xi * 10 + (c - '0'); + } + } + } else if (c == '.') { + getChar(); + goto doReal; + } else { + break; + } + } + if (neg) { + xi = -xi; + xll = -xll; + xf = -xf; + } + if (unlikely(overflownInteger)) { + if (overflownLongLong) { + obj->initReal(xf); + } else { + if (unlikely(xll == INT_MIN)) { + obj->initInt(INT_MIN); + } else { + obj->initInt64(xll); + } + } + } else { + obj->initInt(xi); + } + break; + doReal: + if (likely(!overflownInteger)) { + xf = xi; + } else if (!overflownLongLong) { + xf = xll; + } + 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; +} + +Object *Lexer::getObj(Object *obj, const char *cmdA, int objNum) { + char *p; + int c; + GBool comment; + int n; + + // skip whitespace and comments + comment = gFalse; + const char *cmd1 = tokBuf; + *tokBuf = 0; + while (strcmp(cmdA, cmd1) && (objNum < 0 || (xref && xref->getNumEntry(getPos()) == objNum))) { + 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; + } + } + p = tokBuf; + *p++ = c; + n = 1; + while ((c = lookChar()) != EOF && specialChars[c] == 0) { + getChar(); + if (++n == tokBufSize) { + break; + } + *p++ = c; + } + *p = '\0'; + } + obj->initCmd(tokBuf); + + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Lexer.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Lexer.h new file mode 100644 index 00000000000..02b6cdc6923 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Lexer.h @@ -0,0 +1,108 @@ +//======================================================================== +// +// 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, 2013 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk@gmail.com> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 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 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); + Object *getObj(Object *obj, const char *cmdA, int objNum); + + // 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. + Goffset getPos() + { return curStr.isStream() ? curStr.streamGetPos() : -1; } + + // Set position in file. + void setPos(Goffset 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Linearization.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Linearization.cc new file mode 100644 index 00000000000..be041f96407 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Linearization.cc @@ -0,0 +1,223 @@ +//======================================================================== +// +// Linearization.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2010, 2012 Hib Eris <hib@hiberis.nl> +// Copyright 2015 Jason Crain <jason@aquaticape.us> +// +//======================================================================== + +#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/Build/source/libs/poppler/poppler-0.36.0/poppler/Linearization.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Linearization.h new file mode 100644 index 00000000000..6728a750aba --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Linearization.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Link.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Link.cc new file mode 100644 index 00000000000..4ab5f52ceda --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Link.cc @@ -0,0 +1,951 @@ +//======================================================================== +// +// 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-2014 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> +// Copyright (C) 2009 Ilya Gorenbein <igorenbein@finjan.com> +// Copyright (C) 2012 Tobias Koening <tobias.koenig@kdab.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()) { + zoom = obj2.getNum(); + changeZoom = (zoom == 0) ? gFalse : gTrue; + } 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(); + if (uri->getLength() > 0) { + 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 = NoRendition; + media = NULL; + js = NULL; + int operationCode = -1; + + 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()) { + operationCode = tmp.getInt(); + if (!js && (operationCode < 0 || operationCode > 4)) { + error(errSyntaxWarning, -1, "Invalid Rendition Action: unrecognized operation valued: {0:d}", operationCode); + } else { + Object obj1; + + // retrieve rendition object + if (obj->dictLookup("R", &renditionObj)->isDict()) { + media = new MediaRendition(&renditionObj); + } else if (operationCode == 0 || operationCode == 4) { + error(errSyntaxWarning, -1, "Invalid Rendition Action: no R field with op = {0:d}", operationCode); + 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}", operationCode); + screenRef.free(); + } + } + + switch (operationCode) { + case 0: + operation = PlayRendition; + break; + case 1: + operation = StopRendition; + break; + case 2: + operation = PauseRendition; + break; + case 3: + operation = ResumeRendition; + break; + case 4: + operation = PlayRendition; + break; + } + } 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Link.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Link.h new file mode 100644 index 00000000000..fc2abe60052 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Link.h @@ -0,0 +1,501 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2012 Tobias Koening <tobias.koenig@kdab.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 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, // rendition action + 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: + /** + * Describes the possible rendition operations. + */ + enum RenditionOperation { + NoRendition, + PlayRendition, + StopRendition, + PauseRendition, + ResumeRendition + }; + + 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(); } + + RenditionOperation getOperation() { return operation; } + + MediaRendition* getMedia() { return media; } + + GooString *getScript() { return js; } + +private: + + Object screenRef; + Object renditionObj; + RenditionOperation 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/Build/source/libs/poppler/poppler-0.36.0/poppler/LocalPDFDocBuilder.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/LocalPDFDocBuilder.cc new file mode 100644 index 00000000000..6f6f1fca9f7 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/LocalPDFDocBuilder.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/LocalPDFDocBuilder.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/LocalPDFDocBuilder.h new file mode 100644 index 00000000000..c2b1d903885 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/LocalPDFDocBuilder.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Makefile.am b/Build/source/libs/poppler/poppler-0.36.0/poppler/Makefile.am new file mode 100644 index 00000000000..9a5d0267401 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Makefile.am @@ -0,0 +1,317 @@ +CFLAGS+=$(PTHREAD_CFLAGS) +CXXFLAGS+=$(PTHREAD_CFLAGS) + +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo + +lib_LTLIBRARIES = libpoppler.la + +if BUILD_CAIRO_OUTPUT +noinst_LTLIBRARIES = libpoppler-cairo.la +endif + +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_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 + +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 \ + StructElement.h \ + StructTreeRoot.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 \ + MarkedContentOutputDev.h \ + SecurityHandler.h \ + UTF.h \ + UTF8.h \ + XpdfPluginAPI.h \ + Sound.h +nodist_poppler_include_HEADERS = poppler-config.h + +endif + +libpoppler_la_SOURCES = \ + $(splash_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 \ + StructTreeRoot.cc \ + StructElement.cc \ + strtok_r.cpp \ + UnicodeMap.cc \ + UnicodeTypeTable.cc \ + UTF.cc \ + ViewerPreferences.cc \ + XRef.cc \ + PSOutputDev.cc \ + TextOutputDev.cc \ + MarkedContentOutputDev.cc \ + PageLabelInfo.h \ + PageLabelInfo.cc \ + SecurityHandler.cc \ + Sound.cc \ + XpdfPluginAPI.cc + +libpoppler_la_CPPFLAGS = \ + $(cms_includes) \ + $(splash_includes) \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libjpeg2000_includes) \ + $(libpng_includes) \ + $(libcurl_includes) \ + $(FREETYPE_CFLAGS) \ + $(FONTCONFIG_CFLAGS) \ + $(AM_CPPFLAGS) + +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 55:0:0 \ + @create_shared_lib@ \ + @auto_import_flags@ + +libpoppler_cairo_la_SOURCES = \ + CairoFontEngine.cc \ + CairoFontEngine.h \ + CairoOutputDev.cc \ + CairoOutputDev.h \ + CairoRescaleBox.cc \ + CairoRescaleBox.h + +libpoppler_cairo_la_CPPFLAGS = \ + $(CAIRO_CFLAGS) \ + $(AM_CPPFLAGS) + +EXTRA_DIST = gen-unicode-tables.py \ + GlobalParamsWin.cc \ + PageLabelInfo_p.h diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/MarkedContentOutputDev.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/MarkedContentOutputDev.cc new file mode 100644 index 00000000000..7fdd8f54c53 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/MarkedContentOutputDev.cc @@ -0,0 +1,212 @@ +//======================================================================== +// +// MarkedContentOutputDev.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2013 Igalia S.L. +// +//======================================================================== + +#include "MarkedContentOutputDev.h" +#include "GlobalParams.h" +#include "UnicodeMap.h" +#include "GfxState.h" +#include "GfxFont.h" +#include "Annot.h" +#include <vector> + + +MarkedContentOutputDev::MarkedContentOutputDev(int mcidA): + currentFont(NULL), + currentText(NULL), + mcid(mcidA), + pageWidth(0.0), + pageHeight(0.0), + unicodeMap(NULL) +{ + currentColor.r = currentColor.g = currentColor.b = 0; +} + + +MarkedContentOutputDev::~MarkedContentOutputDev() +{ + if (unicodeMap) + unicodeMap->decRefCnt(); + if (currentFont) + currentFont->decRefCnt(); + delete currentText; +} + + +void MarkedContentOutputDev::endSpan() +{ + if (currentText && currentText->getLength()) { + // The TextSpan takes ownership of currentText and + // increases the reference count for currentFont. + textSpans.push_back(TextSpan(currentText, + currentFont, + currentColor)); + } + currentText = NULL; +} + + +void MarkedContentOutputDev::startPage(int pageNum, GfxState *state, XRef *xref) +{ + if (state) { + pageWidth = state->getPageWidth(); + pageHeight = state->getPageHeight(); + } else { + pageWidth = pageHeight = 0.0; + } +} + + +void MarkedContentOutputDev::endPage() +{ + pageWidth = pageHeight = 0.0; +} + + +void MarkedContentOutputDev::beginMarkedContent(char *name, Dict *properties) +{ + int id = -1; + if (properties) + properties->lookupInt("MCID", NULL, &id); + + if (id == -1) + return; + + // The stack keep track of MCIDs of nested marked content. + if (inMarkedContent() || id == mcid) + mcidStack.push_back(id); +} + + +void MarkedContentOutputDev::endMarkedContent(GfxState *state) +{ + if (inMarkedContent()) { + mcidStack.pop_back(); + // The outer marked content sequence MCID was popped, ensure + // that the last piece of text collected ends up in a TextSpan. + if (!inMarkedContent()) + endSpan(); + } +} + + +bool MarkedContentOutputDev::needFontChange(GfxFont* font) const +{ + if (currentFont == font) + return gFalse; + + if (!currentFont) + return font != NULL && font->isOk(); + + if (font == NULL) + return gTrue; + + // Two non-null valid fonts are the same if they point to the same Ref + if (currentFont->getID()->num == font->getID()->num && + currentFont->getID()->gen == font->getID()->gen) + return gFalse; + + return gTrue; +} + + +void MarkedContentOutputDev::drawChar(GfxState *state, + double xx, double yy, + double dx, double dy, + double ox, double oy, + CharCode c, int nBytes, + Unicode *u, int uLen) +{ + if (!inMarkedContent() || !uLen) + return; + + + // Color changes are tracked here so the color can be chosen depending on + // the render mode (for mode 1 stroke color is used), so there is no need + // to implement both updateFillColor() and updateStrokeColor(). + GBool colorChange = gFalse; + GfxRGB color; + if ((state->getRender() & 3) == 1) + state->getStrokeRGB(&color); + else + state->getFillRGB(&color); + + colorChange = (color.r != currentColor.r || + color.g != currentColor.g || + color.b != currentColor.b); + + // Check also for font changes. + GBool fontChange = needFontChange(state->getFont()); + + // Save a span with the current changes. + if (colorChange || fontChange) { + endSpan(); + } + + // Perform the color/font changes. + if (colorChange) + currentColor = color; + + if (fontChange) { + if (currentFont != NULL) { + currentFont->decRefCnt(); + currentFont = NULL; + } + if (state->getFont() != NULL) { + currentFont = state->getFont(); + currentFont->incRefCnt(); + } + } + + + double sp, dx2, dy2, w1, h1, x1, y1; + + // 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); + state->transform(xx, yy, &x1, &y1); + + // Throw away characters that are not inside the page boundaries. + if (x1 + w1 < 0 || x1 > pageWidth || y1 + h1 < 0 || y1 > pageHeight) + return; + + // Make a sanity check on character size. Note: (x != x) <-> isnan(x) + if (x1 != x1 || y1 != y1 || w1 != w1 || h1 != h1) + return; + + for (int i = 0; i < uLen; i++) { + // Soft hyphen markers are skipped, as they are invisible unless + // rendering is done to an actual device and the hyphenation hint + // used. MarkedContentOutputDev extracts the *visible* text content. + if (u[i] != 0x00AD) { + // Add the UTF-8 sequence to the current text span. + if (!unicodeMap) + unicodeMap = globalParams->getTextEncoding(); + + char buf[8]; + int n = unicodeMap->mapUnicode(u[i], buf, sizeof(buf)); + if (n > 0) { + if (currentText == NULL) + currentText = new GooString(); + currentText->append(buf, n); + } + } + } +} + + +const TextSpanArray& MarkedContentOutputDev::getTextSpans() const +{ + return textSpans; +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/MarkedContentOutputDev.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/MarkedContentOutputDev.h new file mode 100644 index 00000000000..4ea60c255a1 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/MarkedContentOutputDev.h @@ -0,0 +1,130 @@ +//======================================================================== +// +// MarkedContentOutputDev.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2013 Igalia S.L. +// +//======================================================================== + +#ifndef MARKEDCONTENTOUTPUTDEV_H +#define MARKEDCONTENTOUTPUTDEV_H + +#include "goo/gtypes.h" +#include "goo/gmem.h" +#include "OutputDev.h" +#include "GfxState.h" +#include "GfxFont.h" +#include <vector> + +class Dict; +class UnicodeMap; + + +class TextSpan { +public: + TextSpan(const TextSpan& other): data(other.data) { + data->refcount++; + } + + TextSpan& operator=(const TextSpan& other) { + if (this != &other) { + data = other.data; + data->refcount++; + } + return *this; + } + + ~TextSpan() { + if (data && --data->refcount == 0) + delete data; + } + + GfxFont* getFont() const { return data->font; } + GooString* getText() const { return data->text; } + GfxRGB& getColor() const { return data->color; } + +private: + // Note: Takes ownership of strings, increases refcount for font. + TextSpan(GooString *text, + GfxFont *font, + const GfxRGB& color) + : data(new Data) { + data->text = text; + data->font = font; + data->color = color; + if (data->font) + data->font->incRefCnt(); + } + + struct Data { + GfxFont *font; + GooString *text; + GfxRGB color; + unsigned refcount; + + Data(): refcount(1) {} + + ~Data() { + assert(refcount == 0); + if (font) + font->decRefCnt(); + delete text; + } + }; + + Data *data; + + friend class MarkedContentOutputDev; +}; + + +typedef std::vector<TextSpan> TextSpanArray; + + +class MarkedContentOutputDev: public OutputDev { +public: + MarkedContentOutputDev(int mcidA); + virtual ~MarkedContentOutputDev(); + + virtual GBool isOk() { return gTrue; } + virtual GBool upsideDown() { return gTrue; } + virtual GBool useDrawChar() { return gTrue; } + virtual GBool interpretType3Chars() { return gFalse; } + virtual GBool needNonText() { return gFalse; } + virtual GBool needCharCount() { return gFalse; } + + virtual void startPage(int pageNum, GfxState *state, XRef *xref); + virtual void endPage(); + + virtual void drawChar(GfxState *state, + double xx, double yy, + double dx, double dy, + double ox, double oy, + CharCode c, int nBytes, + Unicode *u, int uLen); + + virtual void beginMarkedContent(char *name, Dict *properties); + virtual void endMarkedContent(GfxState *state); + + const TextSpanArray& getTextSpans() const; + +private: + + void endSpan(); + bool inMarkedContent() const { return mcidStack.size() > 0; } + bool needFontChange(GfxFont* font) const; + + GfxFont *currentFont; + GooString *currentText; + GfxRGB currentColor; + TextSpanArray textSpans; + int mcid; + std::vector<int> mcidStack; + double pageWidth; + double pageHeight; + UnicodeMap *unicodeMap; +}; + +#endif /* !MARKEDCONTENTOUTPUTDEV_H */ diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Movie.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Movie.cc new file mode 100644 index 00000000000..f68b6adcd4d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Movie.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Movie.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Movie.h new file mode 100644 index 00000000000..1a162659179 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Movie.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/NameToCharCode.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/NameToCharCode.cc new file mode 100644 index 00000000000..5448dc4ce10 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/NameToCharCode.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/NameToCharCode.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/NameToCharCode.h new file mode 100644 index 00000000000..5b1092bb96b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/NameToCharCode.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/NameToUnicodeTable.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/NameToUnicodeTable.h new file mode 100644 index 00000000000..827edbaee60 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/NameToUnicodeTable.h @@ -0,0 +1,4484 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> +// +// 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> + +struct NameToUnicodeTab { + Unicode u; + const char *name; +}; + +// map character names to Unicode +static struct NameToUnicodeTab nameToUnicodeTextTab[] = { + {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"}, + {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 } +}; + +// map ZapfDingbats names to Unicode +static struct NameToUnicodeTab nameToUnicodeZapfDingbatsTab[] = { + {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"}, + { 0, NULL } +}; diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Object.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Object.cc new file mode 100644 index 00000000000..d06bb39fb6d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Object.cc @@ -0,0 +1,252 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 <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", + "integer64" +}; + +#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 objInt64: + fprintf(f, "%lld", int64g); + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Object.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Object.h new file mode 100644 index 00000000000..2a3766288a6 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Object.h @@ -0,0 +1,373 @@ +//======================================================================== +// +// 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 <jwilk@jwilk.net> +// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Adrian Perez de Castro <aperez@igalia.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 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, "Call to Object where the object was type {0:d}, " \ + "not the expected type {1:d}", type, wanted_type); \ + abort(); \ + } + +#define OBJECT_3TYPES_CHECK(wanted_type1, wanted_type2, wanted_type3) \ + if (unlikely(type != wanted_type1) && unlikely(type != wanted_type2) && unlikely(type != wanted_type3)) { \ + error(errInternal, 0, "Call to Object where the object was type {0:d}, " \ + "not the expected type {1:d}, {2:d} or {3:d}", type, wanted_type1, wanted_type2, wanted_type3); \ + 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 + objInt64 // integer with at least 64-bits +}; + +#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(const char *cmdA) + { initObj(objCmd); cmd = copyString(cmdA); return this; } + Object *initError() + { initObj(objError); return this; } + Object *initEOF() + { initObj(objEOF); return this; } + Object *initInt64(long long int64gA) + { initObj(objInt64); int64g = int64gA; 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 || type == objInt64; } + 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 isInt64() { return type == objInt64; } + + // Special type checking. + GBool isName(const char *nameA) + { return type == objName && !strcmp(name, nameA); } + GBool isDict(const char *dictType); + GBool isStream(const 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; } + + // Note: integers larger than 2^53 can not be exactly represented by a double. + // Where the exact value of integers up to 2^63 is required, use isInt64()/getInt64(). + double getNum() { OBJECT_3TYPES_CHECK(objInt, objInt64, objReal); + return type == objInt ? (double)intg : type == objInt64 ? (double)int64g : real; } + GooString *getString() { OBJECT_TYPE_CHECK(objString); return string; } + // After takeString() the only method that should be called for the object is free() + // because the object it's not expected to have a NULL string. + GooString *takeString() { + OBJECT_TYPE_CHECK(objString); GooString *s = string; string = NULL; return s; } + 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; } + long long getInt64() { OBJECT_TYPE_CHECK(objInt64); return int64g; } + + // Array accessors. + int arrayGetLength(); + void arrayAdd(Object *elem); + void arrayRemove(int i); + Object *arrayGet(int i, Object *obj, int recursion); + 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(const char *dictType); + void streamReset(); + void streamClose(); + int streamGetChar(); + int streamGetChars(int nChars, Guchar *buffer); + int streamLookChar(); + char *streamGetLine(char *buf, int size); + Goffset streamGetPos(); + void streamSetPos(Goffset 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 + long long int64g; // 64-bit 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, int recursion = 0) + { OBJECT_TYPE_CHECK(objArray); return array->get(i, obj, recursion); } + +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(const char *dictType) + { OBJECT_TYPE_CHECK(objStream); return stream->getDict()->is(dictType); } + +inline GBool Object::isStream(const 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 Goffset Object::streamGetPos() + { OBJECT_TYPE_CHECK(objStream); return stream->getPos(); } + +inline void Object::streamSetPos(Goffset 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/Build/source/libs/poppler/poppler-0.36.0/poppler/OptionalContent.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/OptionalContent.cc new file mode 100644 index 00000000000..e0d49bc9a5f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/OptionalContent.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/OptionalContent.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/OptionalContent.h new file mode 100644 index 00000000000..2e416462003 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/OptionalContent.h @@ -0,0 +1,140 @@ +//======================================================================== +// +// OptionalContent.h +// +// Copyright 2007 Brad Hards <bradh@kde.org> +// Copyright 2008 Carlos Garcia Campos <carlosgc@gnome.org> +// Copyright 2013 Albert Astals Cid <aacid@kde.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: + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Outline.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Outline.cc new file mode 100644 index 00000000000..bd4e6d01b6d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Outline.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Outline.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Outline.h new file mode 100644 index 00000000000..90190e69280 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Outline.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/OutputDev.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/OutputDev.cc new file mode 100644 index 00000000000..ee3cf5a30ff --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/OutputDev.cc @@ -0,0 +1,201 @@ +//======================================================================== +// +// 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, 2013 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; +} + +#ifdef USE_CMS +PopplerCache *OutputDev::getIccColorSpaceCache() +{ + return &iccColorSpaceCache; +} +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/OutputDev.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/OutputDev.h new file mode 100644 index 00000000000..e8a7a4794ce --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/OutputDev.h @@ -0,0 +1,350 @@ +//======================================================================== +// +// 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-2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2009, 2011 Carlos Garcia Campos <carlosgc@gnome.org> +// Copyright (C) 2009, 2012, 2013 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com> +// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// 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 +// +//======================================================================== + +#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" +#include "PopplerCache.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() +#ifdef USE_CMS + : iccColorSpaceCache(5) +#endif + { + 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; } + + // Does this device need to clip pages to the crop box even when the + // box is the crop box? + virtual GBool needClipToCropBox() { 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, XRef *xref) {} + + // 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 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 + +#ifdef USE_CMS + PopplerCache *getIccColorSpaceCache(); +#endif + +private: + + double defCTM[6]; // default coordinate transform matrix + double defICTM[6]; // inverse of default CTM + GooHash *profileHash; + +#ifdef USE_CMS + PopplerCache iccColorSpaceCache; +#endif +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDoc.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDoc.cc new file mode 100644 index 00000000000..46c4544e75b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDoc.cc @@ -0,0 +1,1955 @@ +//======================================================================== +// +// 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-2014 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-2012, 2014 Hib Eris <hib@hiberis.nl> +// Copyright (C) 2010 Jakub Wilk <jwilk@jwilk.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-2015 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013, 2014 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> +// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com> +// Copyright (C) 2015 Li Junling <lijunling@sina.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 <ctype.h> +#include <locale.h> +#include <stdio.h> +#include <errno.h> +#include <stdlib.h> +#include <stddef.h> +#include <string.h> +#include <time.h> +#include <sys/stat.h> +#include "goo/gstrtod.h" +#include "goo/GooString.h" +#include "goo/gfile.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" + +#if MULTITHREADED +# define pdfdocLocker() MutexLocker locker(&mutex) +#else +# define pdfdocLocker() +#endif + +//------------------------------------------------------------------------ + +#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() +{ +#if MULTITHREADED + gInitMutex(&mutex); +#endif + 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 = -1; + secHdlr = NULL; + pageCache = NULL; +} + +PDFDoc::PDFDoc() +{ + init(); +} + +PDFDoc::PDFDoc(GooString *fileNameA, GooString *ownerPassword, + GooString *userPassword, void *guiDataA) { + Object obj; +#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 + + // try to open file + file = GooFile::open(fileName); + 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}': {1:s}.", fileName, strerror(errno)); + errCode = errOpenFile; + return; + } + + // create stream + obj.initNull(); + str = new FileStream(file, 0, gFalse, file->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 + version.dwOSVersionInfoSize = sizeof(version); + GetVersionEx(&version); + if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) { + file = GooFile::open(fileNameU); + } else { + file = GooFile::open(fileName); + } + 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, file->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) { + pdfdocLocker(); + 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()) { + if (wasReconstructed) { + delete xref; + startXRefPos = -1; + xref = new XRef(str, getStartXRef(gTrue), getMainXRefEntriesOffset(gTrue), &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) { + delete file; + } + if (fileName) { + delete fileName; + } +#ifdef _WIN32 + if (fileNameU) { + gfree(fileNameU); + } +#endif +#if MULTITHREADED + gDestroyMutex(&mutex); +#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]; + Goffset 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, GBool copyXRef) { + 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, copyXRef); + +} + +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, GBool copyXRef) { + if (getPage(page)) + getPage(page)->displaySlice(out, hDPI, vDPI, + rotate, useMediaBox, crop, + sliceX, sliceY, sliceW, sliceH, + printing, + abortCheckCbk, abortCheckCbkData, + annotDisplayDecideCbk, annotDisplayDecideCbkData, copyXRef); +} + +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(GBool tryingToReconstruct) { + if ((str->getLength()) && + (getLinearization()->getLength() == str->getLength())) + return gTrue; + else { + if (tryingToReconstruct) + return getLinearization()->getLength() > 0; + 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; + + // Make sure that special flags are set, because we are going to read + // all objects, including Unencrypted ones. + xref->scanSpecialFlags(); + + Guchar *fileKey; + CryptAlgorithm encAlgorithm; + int keyLength; + xref->getEncryptionParameters(&fileKey, &encAlgorithm, &keyLength); + + if (pageNo < 1 || pageNo > getNumPages() || !getCatalog()->getPage(pageNo)) { + 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); + 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()); + + if (secHdlr != NULL && !secHdlr->isUnencrypted()) { + yRef->setEncryption(secHdlr->getPermissionFlags(), + secHdlr->getOwnerPasswordOk(), fileKey, keyLength, secHdlr->getEncVersion(), secHdlr->getEncRevision(), encAlgorithm); + } + countRef = new XRef(); + Object *trailerObj = getXRef()->getTrailerDict(); + if (trailerObj->isDict()) { + markPageObjects(trailerObj->getDict(), yRef, countRef, 0, refPage->num, rootNum + 2); + } + 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, refPage->num, rootNum + 2); + 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, annotsObj, afObj; + getXRef()->getCatalog(&catObj); + Dict *catDict = catObj.getDict(); + catDict->lookup("Pages", &pagesObj); + catDict->lookupNF("AcroForm", &afObj); + if (!afObj.isNull()) { + markAcroForm(&afObj, yRef, countRef, 0, refPage->num, rootNum + 2); + afObj.free(); + } + Dict *pagesDict = pagesObj.getDict(); + pagesDict->lookup("Resources", &resourcesObj); + if (resourcesObj.isDict()) + markPageObjects(resourcesObj.getDict(), yRef, countRef, 0, refPage->num, rootNum + 2); + markPageObjects(catDict, yRef, countRef, 0, refPage->num, rootNum + 2); + + Dict *pageDict = page.getDict(); + markPageObjects(pageDict, yRef, countRef, 0, refPage->num, rootNum + 2); + pageDict->lookupNF("Annots", &annotsObj); + if (!annotsObj.isNull()) { + markAnnotations(&annotsObj, yRef, countRef, 0, refPage->num, rootNum + 2); + annotsObj.free(); + } + yRef->markUnencrypted(); + 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, outStr, getXRef(), 0, NULL, cryptRC4, 0, 0, 0); + value.free(); + } + } + catObj.free(); + pagesObj.free(); + outStr->printf(">>\nendobj\n"); + + 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, outStr, getXRef(), 0, NULL, cryptRC4, 0, 0, 0); + resourcesObj.free(); + } + outStr->printf(">>\n"); + outStr->printf("endobj\n"); + + 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, outStr, getXRef(), 0, NULL, cryptRC4, 0, 0, 0); + } + value.free(); + } + outStr->printf(" >>\nendobj\n"); + page.free(); + + Goffset uxrefOffset = outStr->getPos(); + Ref ref; + ref.num = rootNum; + ref.gen = 0; + Dict *trailerDict = createTrailerDict(rootNum + 3, 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; + delete outStr; + + 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)->getFlag(XRefEntry::Updated)) { + updated = gTrue; + break; + } + } + + if (!updated && mode == writeStandard) { + // simply copy the original file + saveWithoutChangesAs (outStr); + } else if (mode == writeForceRewrite) { + saveCompleteRewrite(outStr); + } else { + saveIncrementalUpdate(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; + + BaseStream *copyStr = str->copy(); + copyStr->reset(); + while ((c = copyStr->getChar()) != EOF) { + outStr->put(c); + } + copyStr->close(); + delete copyStr; + + return errNone; +} + +void PDFDoc::saveIncrementalUpdate (OutStream* outStr) +{ + XRef *uxref; + int c; + //copy the original file + BaseStream *copyStr = str->copy(); + copyStr->reset(); + while ((c = copyStr->getChar()) != EOF) { + outStr->put(c); + } + copyStr->close(); + delete copyStr; + + Guchar *fileKey; + CryptAlgorithm encAlgorithm; + int keyLength; + xref->getEncryptionParameters(&fileKey, &encAlgorithm, &keyLength); + + uxref = new XRef(); + uxref->add(0, 65535, 0, gFalse); + xref->lock(); + 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)->getFlag(XRefEntry::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, 1); + Goffset offset = writeObjectHeader(&ref, outStr); + writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen); + writeObjectFooter(outStr); + uxref->add(ref.num, ref.gen, offset, gTrue); + obj1.free(); + } else { + uxref->add(ref.num, ref.gen, 0, gFalse); + } + } + } + xref->unlock(); + if (uxref->getNumObjects() == 0) { //we have nothing to update + delete uxref; + return; + } + + Goffset 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) +{ + // Make sure that special flags are set, because we are going to read + // all objects, including Unencrypted ones. + xref->scanSpecialFlags(); + + Guchar *fileKey; + CryptAlgorithm encAlgorithm; + int keyLength; + xref->getEncryptionParameters(&fileKey, &encAlgorithm, &keyLength); + + outStr->printf("%%PDF-%d.%d\r\n",pdfMajorVersion,pdfMinorVersion); + XRef *uxref = new XRef(); + uxref->add(0, 65535, 0, gFalse); + xref->lock(); + 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 (xref->getEntry(i)->getFlag(XRefEntry::DontRewrite)) { + // This entry must not be written, put a free entry instead (with incremented gen) + ref.num = i; + ref.gen = xref->getEntry(i)->gen + 1; + 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, 1); + Goffset offset = writeObjectHeader(&ref, outStr); + // Write unencrypted objects in unencrypted form + if (xref->getEntry(i)->getFlag(XRefEntry::Unencrypted)) { + writeObject(&obj1, outStr, NULL, cryptRC4, 0, 0, 0); + } else { + writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen); + } + writeObjectFooter(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, 1); + Goffset offset = writeObjectHeader(&ref, outStr); + writeObject(&obj1, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen); + writeObjectFooter(outStr); + uxref->add(ref.num, ref.gen, offset, gTrue); + obj1.free(); + } + } + xref->unlock(); + Goffset 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, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen) +{ + 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), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); + 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() && !obj1.isInt64()) { + error (errSyntaxError, -1, "PDFDoc::writeRawStream, no Length in stream dict"); + return; + } + + Goffset length; + if (obj1.isInt()) + length = obj1.getInt(); + else + length = obj1.getInt64(); + obj1.free(); + + outStr->printf("stream\r\n"); + str->unfilteredReset(); + for (Goffset i = 0; i < length; i++) { + int c = str->getUnfilteredChar(); + if (unlikely(c == EOF)) { + error (errSyntaxError, -1, "PDFDoc::writeRawStream: EOF reading stream"); + break; + } + outStr->printf("%c", c); + } + str->reset(); + outStr->printf("\r\nendstream\r\n"); +} + +void PDFDoc::writeString (GooString* s, OutStream* outStr, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen) +{ + // Encrypt string if encryption is enabled + GooString *sEnc = NULL; + if (fileKey) { + Object obj; + EncryptStream *enc = new EncryptStream(new MemStream(s->getCString(), 0, s->getLength(), obj.initNull()), + fileKey, encAlgorithm, keyLength, objNum, objGen); + sEnc = new GooString(); + int c; + enc->reset(); + while ((c = enc->getChar()) != EOF) { + sEnc->append((char)c); + } + + delete enc; + s = sEnc; + } + + // Write data + 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(") "); + } + + delete sEnc; +} + +Goffset PDFDoc::writeObjectHeader (Ref *ref, OutStream* outStr) +{ + Goffset offset = outStr->getPos(); + outStr->printf("%i %i obj ", ref->num, ref->gen); + return offset; +} + +void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, Guint numOffset, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen) +{ + Array *array; + Object obj1; + Goffset tmp; + + switch (obj->getType()) { + case objBool: + outStr->printf("%s ", obj->getBool()?"true":"false"); + break; + case objInt: + outStr->printf("%i ", obj->getInt()); + break; + case objInt64: + outStr->printf("%lli ", obj->getInt64()); + break; + case objReal: + { + GooString s; + s.appendf("{0:.10g}", obj->getReal()); + outStr->printf("%s ", s.getCString()); + break; + } + case objString: + writeString(obj->getString(), outStr, fileKey, encAlgorithm, keyLength, objNum, objGen); + 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), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); + obj1.free(); + } + outStr->printf("] "); + break; + case objDict: + writeDictionnary (obj->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); + 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 || stream->getKind() == strCrypt) { + //we write the stream unencoded => TODO: write stream encoder + + // Encrypt stream + EncryptStream *encStream = NULL; + GBool removeFilter = gTrue; + if (stream->getKind() == strWeird && fileKey) { + Object filter; + stream->getDict()->lookup("Filter", &filter); + if (!filter.isName("Crypt")) { + if (filter.isArray()) { + for (int i = 0; i < filter.arrayGetLength(); i++) { + Object filterEle; + filter.arrayGet(i, &filterEle); + if (filterEle.isName("Crypt")) { + filterEle.free(); + removeFilter = gFalse; + break; + } + filterEle.free(); + } + if (removeFilter) { + encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen); + encStream->setAutoDelete(gFalse); + stream = encStream; + } + } else { + encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen); + encStream->setAutoDelete(gFalse); + stream = encStream; + } + } else { + removeFilter = gFalse; + } + filter.free(); + } else if (fileKey != NULL) { // Encrypt stream + encStream = new EncryptStream(stream, fileKey, encAlgorithm, keyLength, objNum, objGen); + encStream->setAutoDelete(gFalse); + stream = encStream; + } + + stream->reset(); + //recalculate stream length + tmp = 0; + for (int c=stream->getChar(); c!=EOF; c=stream->getChar()) { + tmp++; + } + obj1.initInt64(tmp); + stream->getDict()->set("Length", &obj1); + + //Remove Stream encoding + if (removeFilter) { + stream->getDict()->remove("Filter"); + } + stream->getDict()->remove("DecodeParms"); + + writeDictionnary (stream->getDict(),outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); + writeStream (stream,outStr); + delete encStream; + obj1.free(); + } else { + //raw stream copy + FilterStream *fs = dynamic_cast<FilterStream*>(stream); + if (fs) { + BaseStream *bs = fs->getBaseStream(); + if (bs) { + Goffset streamEnd; + if (xRef->getStreamEnd(bs->getStart(), &streamEnd)) { + Object val; + val.initInt64(streamEnd - bs->getStart()); + stream->getDict()->set("Length", &val); + } + } + } + writeDictionnary (stream->getDict(), outStr, xRef, numOffset, fileKey, encAlgorithm, keyLength, objNum, objGen); + 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; + } +} + +void PDFDoc::writeObjectFooter (OutStream* outStr) +{ + outStr->printf("endobj\r\n"); +} + +Dict *PDFDoc::createTrailerDict(int uxrefSize, GBool incrUpdate, Goffset startxRef, + Ref *root, XRef *xRef, const char *fileName, Goffset 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, "%lli", (long long)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(); + + GBool hasEncrypt = gFalse; + if (!xRef->getTrailerDict()->isNone()) { + Object obj2; + xRef->getTrailerDict()->dictLookupNF("Encrypt", &obj2); + if (!obj2.isNull()) { + trailerDict->set("Encrypt", &obj2); + hasEncrypt = gTrue; + obj2.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); + + // In case of encrypted files, the ID must not be changed because it's used to calculate the key + if (incrUpdate || hasEncrypt) { + 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.initInt64(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, Goffset uxrefOffset, OutStream* outStr, XRef *xRef) +{ + uxref->writeTableToFile( outStr, writeAllEntries ); + outStr->printf( "trailer\r\n"); + writeDictionnary(trailerDict, outStr, xRef, 0, NULL, cryptRC4, 0, 0, 0); + outStr->printf( "\r\nstartxref\r\n"); + outStr->printf( "%lli\r\n", uxrefOffset); + outStr->printf( "%%%%EOF\r\n"); +} + +void PDFDoc::writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef, Goffset 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) ); + writeObjectHeader(uxrefStreamRef, outStr); + writeObject(obj1.initStream(mStream), outStr, xRef, 0, NULL, cryptRC4, 0, 0, 0); + writeObjectFooter(outStr); + obj1.free(); + + outStr->printf( "startxref\r\n"); + outStr->printf( "%lli\r\n", uxrefOffset); + outStr->printf( "%%%%EOF\r\n"); +} + +void PDFDoc::writeXRefTableTrailer(Goffset 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, int oldRefNum, int newRefNum) +{ + Object obj1; + for (int i=0; i<dict->getLength(); i++) { + const char *key = dict->getKey(i); + if (strcmp(key, "Annots") != 0) { + markObject(dict->getValNF(i, &obj1), xRef, countRef, numOffset, oldRefNum, newRefNum); + } else { + Object annotsObj; + dict->getValNF(i, &annotsObj); + if (!annotsObj.isNull()) { + markAnnotations(&annotsObj, xRef, countRef, 0, oldRefNum, newRefNum); + annotsObj.free(); + } + } + obj1.free(); + } +} + +void PDFDoc::markObject (Object* obj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum) +{ + 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, oldRefNum, newRefNum); + obj1.free(); + } + break; + case objDict: + markDictionnary (obj->getDict(), xRef, countRef, numOffset, oldRefNum, newRefNum); + break; + case objStream: + { + Stream *stream = obj->getStream(); + markDictionnary (stream->getDict(), xRef, countRef, numOffset, oldRefNum, newRefNum); + } + 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, oldRefNum, newRefNum); + obj1.free(); + } + break; + default: + break; + } +} + +void PDFDoc::replacePageDict(int pageNo, int rotate, + PDFRectangle *mediaBox, + PDFRectangle *cropBox) +{ + Ref *refPage = getCatalog()->getPageRef(pageNo); + Object page; + getXRef()->fetch(refPage->num, refPage->gen, &page); + Dict *pageDict = page.getDict(); + pageDict->remove("MediaBoxssdf"); + pageDict->remove("MediaBox"); + pageDict->remove("CropBox"); + pageDict->remove("ArtBox"); + pageDict->remove("BleedBox"); + pageDict->remove("TrimBox"); + pageDict->remove("Rotate"); + Object mediaBoxObj; + mediaBoxObj.initArray(getXRef()); + Object murx; + murx.initReal(mediaBox->x1); + Object mury; + mury.initReal(mediaBox->y1); + Object mllx; + mllx.initReal(mediaBox->x2); + Object mlly; + 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; + cropBoxObj.initArray(getXRef()); + Object curx; + curx.initReal(cropBox->x1); + Object cury; + cury.initReal(cropBox->y1); + Object cllx; + cllx.initReal(cropBox->x2); + Object clly; + clly.initReal(cropBox->y2); + cropBoxObj.arrayAdd(&curx); + cropBoxObj.arrayAdd(&cury); + cropBoxObj.arrayAdd(&cllx); + cropBoxObj.arrayAdd(&clly); + pageDict->add(copyString("CropBox"), &cropBoxObj); + cropBoxObj.getArray()->incRef(); + pageDict->add(copyString("TrimBox"), &cropBoxObj); + } else { + mediaBoxObj.getArray()->incRef(); + pageDict->add(copyString("TrimBox"), &mediaBoxObj); + } + Object rotateObj; + rotateObj.initInt(rotate); + pageDict->add(copyString("Rotate"), &rotateObj); + getXRef()->setModifiedObject(&page, *refPage); + page.free(); +} + +void PDFDoc::markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum) +{ + 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 && + strcmp(key, "AcroForm") != 0 && + strcmp(key, "Annots") != 0 && + strcmp(key, "P") != 0 && + strcmp(key, "Root") != 0) { + markObject(&value, xRef, countRef, numOffset, oldRefNum, newRefNum); + } + value.free(); + } +} + +GBool PDFDoc::markAnnotations(Object *annotsObj, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum) { + Object annots; + GBool modified = gFalse; + annotsObj->fetch(getXRef(), &annots); + if (annots.isArray()) { + Array *array = annots.getArray(); + for (int i=array->getLength() - 1; i >= 0; i--) { + Object obj1; + if (array->get(i, &obj1)->isDict()) { + Object type; + Dict *dict = obj1.getDict(); + dict->lookup("Type", &type); + if (type.isName() && strcmp(type.getName(), "Annot") == 0) { + Object obj2; + if (dict->lookupNF("P", &obj2)->isRef()) { + if (obj2.getRef().num == oldPageNum) { + Object obj3; + array->getNF(i, &obj3); + if (obj3.isRef()) { + Object *newRef = new Object(); + newRef->initRef(newPageNum, 0); + dict->set("P", newRef); + getXRef()->setModifiedObject(&obj1, obj3.getRef()); + } + obj3.free(); + } else if (obj2.getRef().num == newPageNum) { + obj1.free(); + obj2.free(); + type.free(); + continue; + } else { + Object page; + getXRef()->fetch(obj2.getRef().num, obj2.getRef().gen, &page); + if (page.isDict()) { + Object pagetype; + Dict *dict = page.getDict(); + dict->lookup("Type", &pagetype); + if (!pagetype.isName() || strcmp(pagetype.getName(), "Page") != 0) { + obj1.free(); + obj2.free(); + type.free(); + page.free(); + pagetype.free(); + continue; + } + pagetype.free(); + } + page.free(); + obj1.free(); + obj2.free(); + type.free(); + array->remove(i); + modified = gTrue; + continue; + } + } + obj2.free(); + } + type.free(); + markPageObjects(dict, xRef, countRef, numOffset, oldPageNum, newPageNum); + } + obj1.free(); + array->getNF(i, &obj1); + if (obj1.isRef()) { + if (obj1.getRef().num + (int) numOffset >= xRef->getNumObjects() || xRef->getEntry(obj1.getRef().num + numOffset)->type == xrefEntryFree) { + if (getXRef()->getEntry(obj1.getRef().num)->type == xrefEntryFree) { + continue; // already marked as free => should be replaced + } + xRef->add(obj1.getRef().num + numOffset, obj1.getRef().gen, 0, gTrue); + if (getXRef()->getEntry(obj1.getRef().num)->type == xrefEntryCompressed) { + xRef->getEntry(obj1.getRef().num + numOffset)->type = xrefEntryCompressed; + } + } + if (obj1.getRef().num + (int) numOffset >= countRef->getNumObjects() || + countRef->getEntry(obj1.getRef().num + numOffset)->type == xrefEntryFree) + { + countRef->add(obj1.getRef().num + numOffset, 1, 0, gTrue); + } else { + XRefEntry *entry = countRef->getEntry(obj1.getRef().num + numOffset); + entry->gen++; + } + } + obj1.free(); + } + } + if (annotsObj->isRef()) { + if (annotsObj->getRef().num + (int) numOffset >= xRef->getNumObjects() || xRef->getEntry(annotsObj->getRef().num + numOffset)->type == xrefEntryFree) { + if (getXRef()->getEntry(annotsObj->getRef().num)->type == xrefEntryFree) { + return modified; // already marked as free => should be replaced + } + xRef->add(annotsObj->getRef().num + numOffset, annotsObj->getRef().gen, 0, gTrue); + if (getXRef()->getEntry(annotsObj->getRef().num)->type == xrefEntryCompressed) { + xRef->getEntry(annotsObj->getRef().num + numOffset)->type = xrefEntryCompressed; + } + } + if (annotsObj->getRef().num + (int) numOffset >= countRef->getNumObjects() || + countRef->getEntry(annotsObj->getRef().num + numOffset)->type == xrefEntryFree) + { + countRef->add(annotsObj->getRef().num + numOffset, 1, 0, gTrue); + } else { + XRefEntry *entry = countRef->getEntry(annotsObj->getRef().num + numOffset); + entry->gen++; + } + getXRef()->setModifiedObject(&annots, annotsObj->getRef()); + } + annots.free(); + return modified; +} + +void PDFDoc::markAcroForm(Object *afObj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum) { + Object acroform; + GBool modified = gFalse; + afObj->fetch(getXRef(), &acroform); + if (acroform.isDict()) { + Dict *dict = acroform.getDict(); + for (int i=0; i < dict->getLength(); i++) { + if (strcmp(dict->getKey(i), "Fields") == 0) { + Object fields; + modified = markAnnotations(dict->getValNF(i, &fields), xRef, countRef, numOffset, oldRefNum, newRefNum); + fields.free(); + } else { + Object obj; + markObject(dict->getValNF(i, &obj), xRef, countRef, numOffset, oldRefNum, newRefNum); + obj.free(); + } + } + } + if (afObj->isRef()) { + if (afObj->getRef().num + (int) numOffset >= xRef->getNumObjects() || xRef->getEntry(afObj->getRef().num + numOffset)->type == xrefEntryFree) { + if (getXRef()->getEntry(afObj->getRef().num)->type == xrefEntryFree) { + return; // already marked as free => should be replaced + } + xRef->add(afObj->getRef().num + numOffset, afObj->getRef().gen, 0, gTrue); + if (getXRef()->getEntry(afObj->getRef().num)->type == xrefEntryCompressed) { + xRef->getEntry(afObj->getRef().num + numOffset)->type = xrefEntryCompressed; + } + } + if (afObj->getRef().num + (int) numOffset >= countRef->getNumObjects() || + countRef->getEntry(afObj->getRef().num + numOffset)->type == xrefEntryFree) + { + countRef->add(afObj->getRef().num + numOffset, 1, 0, gTrue); + } else { + XRefEntry *entry = countRef->getEntry(afObj->getRef().num + numOffset); + entry->gen++; + } + if (modified){ + getXRef()->setModifiedObject(&acroform, afObj->getRef()); + } + } + acroform.free(); + return; +} + +Guint PDFDoc::writePageObjects(OutStream *outStr, XRef *xRef, Guint numOffset, GBool combine) +{ + Guint objectsCount = 0; //count the number of objects in the XRef(s) + Guchar *fileKey; + CryptAlgorithm encAlgorithm; + int keyLength; + xRef->getEncryptionParameters(&fileKey, &encAlgorithm, &keyLength); + + 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); + Goffset offset = writeObjectHeader(&ref, outStr); + if (combine) { + writeObject(&obj, outStr, getXRef(), numOffset, NULL, cryptRC4, 0, 0, 0); + } else if (xRef->getEntry(n)->getFlag(XRefEntry::Unencrypted)) { + writeObject(&obj, outStr, NULL, cryptRC4, 0, 0, 0); + } else { + writeObject(&obj, outStr, fileKey, encAlgorithm, keyLength, ref.num, ref.gen); + } + writeObjectFooter(outStr); + xRef->add(ref.num, ref.gen, offset, gTrue); + obj.free(); + } + } + return objectsCount; +} + +#ifndef DISABLE_OUTLINE +Outline *PDFDoc::getOutline() +{ + if (!outline) { + pdfdocLocker(); + // 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; +} + +long long PDFDoc::strToLongLong(char *s) { + long long x, d; + char *p; + + x = 0; + for (p = s; *p && isdigit(*p & 0xff); ++p) { + d = *p - '0'; + if (x > (LLONG_MAX - d) / 10) { + break; + } + x = 10 * x + d; + } + return x; +} + +// Read the 'startxref' position. +Goffset PDFDoc::getStartXRef(GBool tryingToReconstruct) +{ + if (startXRefPos == -1) { + + if (isLinearized(tryingToReconstruct)) { + 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 + int segnum = 0; + int maxXRefSearch = 24576; + if (str->getLength() < maxXRefSearch) maxXRefSearch = str->getLength(); + for (; (xrefSearchSize - 16) * segnum < maxXRefSearch; segnum++) { + str->setPos((xrefSearchSize - 16) * segnum + 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 = strToLongLong(p); + break; + } + } + } + + } + + return startXRefPos; +} + +Goffset PDFDoc::getMainXRefEntriesOffset(GBool tryingToReconstruct) +{ + Guint mainXRefEntriesOffset = 0; + + if (isLinearized(tryingToReconstruct)) { + 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()) { + pdfdocLocker(); + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDoc.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDoc.h new file mode 100644 index 00000000000..6c40f7b0c0c --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDoc.h @@ -0,0 +1,343 @@ +//======================================================================== +// +// 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, 2014 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, 2014 Hib Eris <hib@hiberis.nl> +// Copyright (C) 2010 Srinivas Adicherla <srinivas.adicherla@geodesic.com> +// Copyright (C) 2011, 2013, 2014 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> +// Copyright (C) 2013 Adrian Perez de Castro <aperez@igalia.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 PDFDOC_H +#define PDFDOC_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include <stdio.h> +#include "goo/GooMutex.h" +#include "XRef.h" +#include "Catalog.h" +#include "Page.h" +#include "Annot.h" +#include "OptionalContent.h" +#include "Stream.h" + +class GooString; +class GooFile; +class BaseStream; +class OutputDev; +class Links; +class LinkAction; +class LinkDest; +class Outline; +class Linearization; +class SecurityHandler; +class Hints; +class StructTreeRoot; + +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. + StructTreeRoot *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, GBool copyXRef = gFalse); + + // 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, GBool copyXRef = gFalse); + + // 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(GBool tryingToReconstruct = gFalse); + + // 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); + void markPageObjects(Dict *pageDict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum); + GBool markAnnotations(Object *annots, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum); + void markAcroForm(Object *acrpForm, XRef *xRef, XRef *countRef, Guint numOffset, int oldPageNum, int newPageNum); + // write all objects used by pageDict to outStr + Guint writePageObjects(OutStream *outStr, XRef *xRef, Guint numOffset, GBool combine = gFalse); + static void writeObject (Object *obj, OutStream* outStr, XRef *xref, Guint numOffset, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen); + static void writeHeader(OutStream *outStr, int major, int minor); + + // Ownership goes to the caller + static Dict *createTrailerDict (int uxrefSize, GBool incrUpdate, Goffset startxRef, + Ref *root, XRef *xRef, const char *fileName, Goffset fileSize); + static void writeXRefTableTrailer (Dict *trailerDict, XRef *uxref, GBool writeAllEntries, + Goffset uxrefOffset, OutStream* outStr, XRef *xRef); + static void writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefStreamRef, + Goffset uxrefOffset, OutStream* outStr, XRef *xRef); + +private: + // insert referenced objects in XRef + void markDictionnary (Dict* dict, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum); + void markObject (Object *obj, XRef *xRef, XRef *countRef, Guint numOffset, int oldRefNum, int newRefNum); + static void writeDictionnary (Dict* dict, OutStream* outStr, XRef *xRef, Guint numOffset, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen); + + // Write object header to current file stream and return its offset + static Goffset writeObjectHeader (Ref *ref, OutStream* outStr); + static void writeObjectFooter (OutStream* outStr); + + void writeObject (Object *obj, OutStream* outStr, Guchar *fileKey, CryptAlgorithm encAlgorithm, + int keyLength, int objNum, int objGen) + { writeObject(obj, outStr, getXRef(), 0, fileKey, encAlgorithm, keyLength, objNum, objGen); } + void writeDictionnary (Dict* dict, OutStream* outStr, Guchar *fileKey, CryptAlgorithm encAlgorithm, + int keyLength, int objNum, int objGen) + { writeDictionnary(dict, outStr, getXRef(), 0, fileKey, encAlgorithm, keyLength, objNum, objGen); } + static void writeStream (Stream* str, OutStream* outStr); + static void writeRawStream (Stream* str, OutStream* outStr); + void writeXRefTableTrailer (Goffset uxrefOffset, XRef *uxref, GBool writeAllEntries, + int uxrefSize, OutStream* outStr, GBool incrUpdate); + static void writeString (GooString* s, OutStream* outStr, Guchar *fileKey, + CryptAlgorithm encAlgorithm, int keyLength, int objNum, int objGen); + 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. + Goffset getStartXRef(GBool tryingToReconstruct = gFalse); + // Get the offset of the entries in the main XRef table of a + // linearized document (0 for non linearized documents). + Goffset getMainXRefEntriesOffset(GBool tryingToReconstruct = gFalse); + long long strToLongLong(char *s); + + GooString *fileName; +#ifdef _WIN32 + wchar_t *fileNameU; +#endif + GooFile *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; + + Goffset startXRefPos; // offset of last xref table +#if MULTITHREADED + GooMutex mutex; +#endif +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocBuilder.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocBuilder.h new file mode 100644 index 00000000000..d6eccf5487a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocBuilder.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocEncoding.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocEncoding.cc new file mode 100644 index 00000000000..79408346419 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocEncoding.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocEncoding.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocEncoding.h new file mode 100644 index 00000000000..4f0840bb28a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocEncoding.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocFactory.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocFactory.cc new file mode 100644 index 00000000000..1ec46477237 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocFactory.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocFactory.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocFactory.h new file mode 100644 index 00000000000..dbceaa567ee --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PDFDocFactory.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/PSOutputDev.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/PSOutputDev.cc new file mode 100644 index 00000000000..7b93e3bf65a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PSOutputDev.cc @@ -0,0 +1,7565 @@ +//======================================================================== +// +// 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-2013, 2015 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-2013 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, 2014, 2015 William Bader <williambader@hotmail.com> +// Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> +// Copyright (C) 2009-2011, 2013, 2014 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2012, 2014 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2012 Lu Wang <coolwanglu@gmail.com> +// Copyright (C) 2014 Till Kamppeter <till.kamppeter@gmail.com> +// Copyright (C) 2015 Marek Kasik <mkasik@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 +// +//======================================================================== + +#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 {", + " % Change paper size, but only if different from previous paper size otherwise", + " % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size", + " % so we use the same when checking if the size changes.", + " /setpagedevice where {", + " pop currentpagedevice", + " /PageSize known {", + " 2 copy", + " currentpagedevice /PageSize get aload pop", + " exch 4 1 roll", + " sub abs 5 gt", + " 3 1 roll", + " sub abs 5 gt", + " or", + " } {", + " true", + " } ifelse", + " {", + " 2 array astore", + " 2 dict begin", + " /PageSize exch def", + " /ImagingBBox null def", + " currentdict end", + " setpagedevice", + " } {", + " pop pop", + " } ifelse", + " } {", + " 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(GooString *nameA, int wA, int hA) { name = nameA; w = wA; h = hA; } + ~PSOutPaperSize() { delete name; } + GooString *name; + 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 *psTitleA, + const std::vector<int> &pages, PSOutMode modeA, + int paperWidthA, int paperHeightA, + GBool noCropA, 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; + paperSizes = NULL; + embFontList = NULL; + customColors = NULL; + haveTextClip = gFalse; + t3String = NULL; + forceRasterize = forceRasterizeA; + psTitle = NULL; + + // 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, psTitleA, + doc, pages, modeA, + imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA, + paperWidthA, paperHeightA, noCropA, duplexA); +} + +PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA, + char *psTitleA, + PDFDoc *doc, + const std::vector<int> &pages, PSOutMode modeA, + int paperWidthA, int paperHeightA, + GBool noCropA, 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; + paperSizes = NULL; + embFontList = NULL; + customColors = NULL; + haveTextClip = gFalse; + t3String = NULL; + forceRasterize = forceRasterizeA; + psTitle = NULL; + + init(outputFuncA, outputStreamA, psGeneric, psTitleA, + doc, pages, modeA, + imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA, + paperWidthA, paperHeightA, noCropA, duplexA); +} + +struct StandardMedia { + const char *name; + int width; + int height; +}; + +static const StandardMedia standardMedia[] = +{ + { "A0", 2384, 3371 }, + { "A1", 1685, 2384 }, + { "A2", 1190, 1684 }, + { "A3", 842, 1190 }, + { "A4", 595, 842 }, + { "A5", 420, 595 }, + { "B4", 729, 1032 }, + { "B5", 516, 729 }, + { "Letter", 612, 792 }, + { "Tabloid", 792, 1224 }, + { "Ledger", 1224, 792 }, + { "Legal", 612, 1008 }, + { "Statement", 396, 612 }, + { "Executive", 540, 720 }, + { "Folio", 612, 936 }, + { "Quarto", 610, 780 }, + { "10x14", 720, 1008 }, + { NULL, 0, 0 } +}; + +/* PLRM specifies a tolerance of 5 points when matching page sizes */ +static bool pageDimensionEqual(int a, int b) { + return (abs (a - b) < 5); +} + +// Shared initialization of PSOutputDev members. +// Store the values but do not process them so the function that +// created the PSOutputDev can use the various setters to change defaults. + +void PSOutputDev::init(PSOutputFunc outputFuncA, void *outputStreamA, + PSFileType fileTypeA, char *psTitleA, PDFDoc *docA, + const std::vector<int> &pagesA, PSOutMode modeA, + int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, + GBool manualCtrlA, int paperWidthA, int paperHeightA, + GBool noCropA, GBool duplexA) { + + if (pagesA.empty()) { + ok = gFalse; + return; + } + + // initialize + postInitDone = gFalse; + embedType1 = gTrue; + embedTrueType = gTrue; + embedCIDPostScript = gTrue; + embedCIDTrueType = gTrue; + fontPassthrough = gFalse; + optimizeColorSpace = gFalse; + preloadImagesForms = gFalse; + generateOPI = gFalse; + useASCIIHex = gFalse; + useBinary = gFalse; + rasterMono = gFalse; + rasterResolution = 300; + uncompressPreloadedImages = gFalse; + rasterAntialias = gFalse; + displayText = gTrue; + ok = gTrue; + outputFunc = outputFuncA; + outputStream = outputStreamA; + fileType = fileTypeA; + psTitle = (psTitleA? strdup(psTitleA): NULL); + doc = docA; + level = globalParams->getPSLevel(); + pages = pagesA; + mode = modeA; + paperWidth = paperWidthA; + paperHeight = paperHeightA; + noCrop = noCropA; + duplex = duplexA; + imgLLX = imgLLXA; + imgLLY = imgLLYA; + imgURX = imgURXA; + imgURY = imgURYA; + manualCtrl = manualCtrlA; + + xref = NULL; + + processColors = 0; + inType3Char = gFalse; + inUncoloredPattern = gFalse; + t3FillColorOnly = 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 sequential page number + seqPage = 1; +} + +// Complete the initialization after the function that created the PSOutputDev +// has had a chance to modify default values with the various setters. + +void PSOutputDev::postInit() +{ + Catalog *catalog; + PDFRectangle *box; + PSOutPaperSize *size; + GooList *names; + int w, h, i; + + if (postInitDone || !ok) { + return; + } + + postInitDone = gTrue; + + xref = doc->getXRef(); + catalog = doc->getCatalog(); + + if (paperWidth < 0 || paperHeight < 0) { + paperMatch = gTrue; + } else { + paperMatch = gFalse; + } + Page *page; + paperSizes = new GooList(); + for (size_t pgi = 0; pgi < pages.size(); ++pgi) { + const int pg = pages[pgi]; + page = catalog->getPage(pg); + if (page == NULL) + paperMatch = gFalse; + if (!paperMatch) { + w = paperWidth; + h = paperHeight; + if (w < 0 || h < 0) { + // Unable to obtain a paper size from the document and no page size + // specified. In this case use A4 as the page size to ensure the PS output is + // valid. This will only occur if the PDF is very broken. + w = 595; + h = 842; + } + } else if (noCrop) { + w = (int)ceil(page->getMediaWidth()); + h = (int)ceil(page->getMediaHeight()); + } else { + w = (int)ceil(page->getCropWidth()); + h = (int)ceil(page->getCropHeight()); + } + if (paperMatch) { + int rotate = page->getRotate(); + if (rotate == 90 || rotate == 270) + std::swap(w, h); + } + if (w > paperWidth) + paperWidth = w; + if (h > paperHeight) + paperHeight = h; + for (i = 0; i < paperSizes->getLength(); ++i) { + size = (PSOutPaperSize *)paperSizes->get(i); + if (pageDimensionEqual(w, size->w) && pageDimensionEqual(h, size->h)) + break; + } + if (i == paperSizes->getLength()) { + const StandardMedia *media = standardMedia; + GooString *name = NULL; + while (media->name) { + if (pageDimensionEqual(w, media->width) && pageDimensionEqual(h, media->height)) { + name = new GooString(media->name); + w = media->width; + h = media->height; + break; + } + media++; + } + if (!name) + name = GooString::format("{0:d}x{1:d}mm", int(w*25.4/72), int(h*25.4/72)); + paperSizes->append(new PSOutPaperSize(name, w, h)); + } + pagePaperSize.insert(std::pair<int,int>(pg, i)); + if (!paperMatch) + break; // we only need one entry when all pages are the same size + } + if (imgLLX == 0 && imgURX == 0 && imgLLY == 0 && imgURY == 0) { + imgLLX = imgLLY = 0; + imgURX = paperWidth; + imgURY = paperHeight; + } + std::vector<int> pageList; + if (mode == psModeForm) { + pageList.push_back(pages[0]); + } else { + pageList = pages; + } + + // 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; + + 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(pageList[0]))) { + writeHeader(pageList, + page->getMediaBox(), + page->getCropBox(), + page->getRotate(), + psTitle); + } else { + error(errSyntaxError, -1, "Invalid page {0:d}", pageList[0]); + box = new PDFRectangle(0, 0, 1, 1); + writeHeader(pageList, 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, pageList, duplex); + if (mode != psModeForm) { + writePS("%%EndSetup\n"); + } + } +} + +PSOutputDev::~PSOutputDev() { + PSOutCustomColor *cc; + int i; + + if (ok) { + if (!postInitDone) { + postInit(); + } + 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); + while (customColors) { + cc = customColors; + customColors = cc->next; + delete cc; + } + gfree(psTitle); +} + +void PSOutputDev::writeHeader(const std::vector<int> &pages, + PDFRectangle *mediaBox, PDFRectangle *cropBox, + int pageRotate, char *psTitle) { + Object info, obj1; + PSOutPaperSize *size; + double x1, y1, x2, y2; + int i; + + switch (mode) { + 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) { + char *sanitizedTitle = strdup(psTitle); + for (Guint i = 0; i < strlen(sanitizedTitle); ++i) { + if (sanitizedTitle[i] == '\n' || sanitizedTitle[i] == '\r') { + sanitizedTitle[i] = ' '; + } + } + writePSFmt("%%Title: {0:s}\n", sanitizedTitle); + free(sanitizedTitle); + } + 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) && useBinary) { + writePS("%%DocumentData: Binary\n"); + } + + switch (mode) { + case psModePS: + for (i = 0; i < paperSizes->getLength(); ++i) { + size = (PSOutPaperSize *)paperSizes->get(i); + writePSFmt("%%{0:s} {1:t} {2:d} {3:d} 0 () ()\n", + i==0 ? "DocumentMedia:" : "+", size->name, size->w, size->h); + } + writePSFmt("%%BoundingBox: 0 0 {0:d} {1:d}\n", paperWidth, paperHeight); + writePSFmt("%%Pages: {0:d}\n", static_cast<int>(pages.size())); + writePS("%%EndComments\n"); + if (!paperMatch) { + size = (PSOutPaperSize *)paperSizes->get(0); + writePS("%%BeginDefaults\n"); + writePSFmt("%%PageMedia: {0:t}\n", size->name); + 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)); + 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, + const std::vector<int> &pages, + GBool duplexA) { + Page *page; + Dict *resDict; + Annots *annots; + Object *acroForm; + Object obj1, obj2, obj3; + GooString *s; + int i; + + if (mode == psModeForm) { + // swap the form and xpdf dicts + writePS("xpdf end begin dup begin\n"); + } else { + writePS("xpdf begin\n"); + } + for (size_t pgi = 0; pgi < pages.size(); ++pgi) { + const int pg = pages[pgi]; + 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 (generateOPI) { + 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; + GBool skip; + int i; + + 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(); + if (resourceIDs.find(ref0.num) != resourceIDs.end()) { + skip = gTrue; + } else { + resourceIDs.insert(ref0.num); + } + } + 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(); + } + + 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(); + if (resourceIDs.find(ref0.num) != resourceIDs.end()) { + skip = gTrue; + } else { + resourceIDs.insert(ref0.num); + } + } + 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(); + } + + 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, this); + 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() ? font->getEmbeddedFontName()->copy() : new GooString(); + 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->getEmbeddedFontName()) { + // this assumes that the PS font name matches the PDF font name + psName = font->getEmbeddedFontName()->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; + long 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"); + + strObj.streamReset(); + if (strObj.streamGetChar() == 0x80 && + strObj.streamGetChar() == 1) { + // PFB format + length1 = strObj.streamGetChar() | + (strObj.streamGetChar() << 8) | + (strObj.streamGetChar() << 16) | + (strObj.streamGetChar() << 24); + } else { + strObj.streamReset(); + } + // copy ASCII portion of font + 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) { + if (start[0] == 0x80 && + start[1] == 2) { + length2 = start[2] | + (start[3] << 8) | + (strObj.streamGetChar() << 16) | + (strObj.streamGetChar() << 24); + i = 0; + } else { + 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 + c = strObj.streamGetChar(); + if (c == 0x80) { + c = strObj.streamGetChar(); + if (c == 1) { + length3 = strObj.streamGetChar() | + (strObj.streamGetChar() << 8) | + (strObj.streamGetChar() << 16) | + (strObj.streamGetChar() << 24); + + i = 0; + while (i < length3) { + if ((c = strObj.streamGetChar()) == EOF) { + break; + } + writePSChar(c); + ++i; + } + } + } else { + if (c != EOF) { + writePSChar(c); + + 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: + if (strObj.isStream()) + strObj.streamClose(); + strObj.free(); +} + +void PSOutputDev::setupExternalType1Font(GooString *fileName, GooString *psName) { + static const char hexChar[17] = "0123456789abcdef"; + 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; + } + + c = fgetc(fontFile); + if (c == 0x80) { + // PFB file + ungetc(c, fontFile); + while (!feof(fontFile)) { + fgetc(fontFile); // skip start of segment byte (0x80) + int segType = fgetc(fontFile); + long segLen = fgetc(fontFile) | + (fgetc(fontFile) << 8) | + (fgetc(fontFile) << 16) | + (fgetc(fontFile) << 24); + if (feof(fontFile)) + break; + + if (segType == 1) { + // ASCII segment + for (long i = 0; i < segLen; i++) { + c = fgetc(fontFile); + if (c == EOF) + break; + writePSChar(c); + } + } else if (segType == 2) { + // binary segment + for (long i = 0; i < segLen; i++) { + c = fgetc(fontFile); + if (c == EOF) + break; + writePSChar(hexChar[(c >> 4) & 0x0f]); + writePSChar(hexChar[c & 0x0f]); + if (i % 36 == 35) + writePSChar('\n'); + } + } else { + // end of file + break; + } + } + } else if (c != EOF) { + writePSChar(c); + 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 '{0: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 || preloadImagesForms)) { + 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, doUseASCIIHex; + 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; + doUseASCIIHex = gTrue; + } else { + if (uncompressPreloadedImages) { + 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; + } + } + doUseASCIIHex = useASCIIHex; + } + if (useCompressed) { + str = str->getUndecodedStream(); + } + if (useRLE) { + str = new RunLengthEncoder(str); + } + if (doUseASCIIHex) { + 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 == (doUseASCIIHex ? '>' : '~') || c == EOF) { + break; + } + if (c == 'z') { + ++col; + } else { + ++col; + for (i = 1; i <= (doUseASCIIHex ? 1 : 4); ++i) { + do { + c = str->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { + break; + } + ++col; + } + if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { + break; + } + } + if (col > 225) { + ++size; + col = 0; + } + } while (c != (doUseASCIIHex ? '>' : '~') && 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 *)(doUseASCIIHex ? "dup 0 <" : "dup 0 <~")); + for (;;) { + do { + c = str->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { + break; + } + if (c == 'z') { + writePSChar(c); + ++col; + } else { + writePSChar(c); + ++col; + for (i = 1; i <= (doUseASCIIHex ? 1 : 4); ++i) { + do { + c = str->getChar(); + } while (c == '\n' || c == '\r'); + if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { + break; + } + writePSChar(c); + ++col; + } + } + if (c == (doUseASCIIHex ? '>' : '~') || 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 *)(doUseASCIIHex ? "> put\n" : "~> put\n")); + ++line; + if (line >= innerSize) break; + writePSFmt((char *)(doUseASCIIHex ? "dup {0:d} <" : "dup {0:d} <~"), line); + col = 0; + } + } + if (c == (doUseASCIIHex ? '>' : '~') || c == EOF) { + writePS((char *)(doUseASCIIHex ? "> 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 (!preloadImagesForms) { + 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 + 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 isGray; + + if (!postInitDone) { + postInit(); + } + 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 + // start the PS page + page->makeBox(rasterResolution, rasterResolution, 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(rasterResolution, rasterResolution, &box, rotateA, gFalse); + startPage(page->getNum(), state, xref); + delete state; + + // set up the SplashOutputDev + if (rasterMono || level == psLevel1) { + numComps = 1; + paperColor[0] = 0xff; + splashOut = new SplashOutputDev(splashModeMono8, 1, gFalse, + paperColor, gFalse); +#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); +#endif + } else { + numComps = 3; + paperColor[0] = paperColor[1] = paperColor[2] = 0xff; + splashOut = new SplashOutputDev(splashModeRGB8, 1, gFalse, + paperColor, gFalse); + } + splashOut->setFontAntialias(rasterAntialias); + splashOut->setVectorAntialias(rasterAntialias); + splashOut->startDoc(doc); + + // break the page into stripes + hDPI2 = xScale * rasterResolution; + vDPI2 = yScale * rasterResolution; + 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: + 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: + p = bitmap->getDataPtr(); + // Check for an all gray image + if (getOptimizeColorSpace()) { + 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(); + } + } else { + isGray = gFalse; + } + 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 (!getOptimizeColorSpace()) { + isGray = gFalse; + } else 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"); + if (useBinary) { + /* nothing to do */; + } else if (useASCIIHex) { + writePS(" /ASCIIHexDecode filter\n"); + } else { + writePS(" /ASCII85Decode filter\n"); + } + writePS(" /RunLengthDecode filter\n"); + writePS(">>\n"); + if (useBinary) { + /* nothing to do */; + } else if (useASCIIHex) { + 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, XRef *xrefA) { + Page *page; + int x1, y1, x2, y2, width, height, t; + int imgWidth, imgHeight, imgWidth2, imgHeight2; + GBool landscape; + GooString *s; + PSOutPaperSize *paperSize; + + if (!postInitDone) { + postInit(); + } + xref = xrefA; + if (mode == psModePS) { + 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; + if (noCrop) { + imgURX = (int)ceil(page->getMediaWidth()); + imgURY = (int)ceil(page->getMediaHeight()); + } else { + imgURX = (int)ceil(page->getCropWidth()); + imgURY = (int)ceil(page->getCropHeight()); + } + if (state->getRotate() == 90 || state->getRotate() == 270) { + t = imgURX; + imgURX = imgURY; + imgURY = t; + } + } + } + + // underlays + if (underlayCbk) { + (*underlayCbk)(this, underlayCbkData); + } + if (overlayCbk) { + saveState(NULL); + } + + xScale = yScale = 1; + switch (mode) { + + 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; + } + } + } + if (paperMatch) { + paperSize = (PSOutPaperSize *)paperSizes->get(pagePaperSize[pageNum]); + writePSFmt("%%PageMedia: {0:t}\n", paperSize->name); + } + if (rotate == 0 || rotate == 180) { + writePSFmt("%%PageBoundingBox: 0 0 {0:d} {1:d}\n", width, height); + } else { + writePSFmt("%%PageBoundingBox: 0 0 {0:d} {1:d}\n", height, width); + } + writePSFmt("%%PageOrientation: {0:s}\n", + landscape ? "Landscape" : "Portrait"); + writePS("%%BeginPageSetup\n"); + 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; + } + } + + 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 *gfxA, 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, NULL, NULL, gfxA->getXRef()); + 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; + + // explicit masking + if (maskStr && !(maskColors && colorMap)) { + maskToClippingPath(maskStr, maskWidth, maskHeight, maskInvert); + } + + if ((inType3Char || preloadImagesForms) && !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 || preloadImagesForms) && !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 || preloadImagesForms) && !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; + + // 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, 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"); + } + + // set up the image data + if (mode == psModeForm || inType3Char || preloadImagesForms) { + 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 || preloadImagesForms) { + 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 || preloadImagesForms) && + uncompressPreloadedImages) { + 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 || preloadImagesForms); + useCompressed = gFalse; + } else { + useRLE = gFalse; + useASCII = str->isBinary() && + !(mode == psModeForm || inType3Char || preloadImagesForms); + 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 || preloadImagesForms) { + + // 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, useCompressed; + GBool maskUseRLE, maskUseASCII, maskUseCompressed; + GooString *maskFilters; + GfxSeparationColorSpace *sepCS; + GfxColor color; + GfxCMYK cmyk; + int c; + int col, i; + + 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 || preloadImagesForms) && + uncompressPreloadedImages) { + s = NULL; + maskUseRLE = gFalse; + maskUseCompressed = gFalse; + maskUseASCII = gFalse; + } else { + s = maskStr->getPSFilter(3, " "); + if (!s) { + maskUseRLE = gTrue; + maskUseASCII = !(mode == psModeForm || inType3Char || preloadImagesForms); + maskUseCompressed = gFalse; + } else { + maskUseRLE = gFalse; + maskUseASCII = maskStr->isBinary() && + !(mode == psModeForm || inType3Char || preloadImagesForms); + 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 || preloadImagesForms) { + 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 || preloadImagesForms) { + 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 || preloadImagesForms) { + 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 || preloadImagesForms) && + uncompressPreloadedImages) { + 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 || preloadImagesForms); + useCompressed = gFalse; + } else { + useRLE = gFalse; + useASCII = str->isBinary() && + !(mode == psModeForm || inType3Char || preloadImagesForms); + 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 || preloadImagesForms) { + writePS(" /DataSource {pdfMaskSrc}\n"); + writePS(maskFilters->getCString()); + } else { + writePS(" /DataSource maskStream\n"); + } + delete maskFilters; + + writePS(">>\n"); + writePS(">>\n"); + } + + if (mode == psModeForm || inType3Char || preloadImagesForms) { + + // 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 || preloadImagesForms) { + 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 || preloadImagesForms)) { + 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 (generateOPI) { + 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 (generateOPI) { + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/PSOutputDev.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PSOutputDev.h new file mode 100644 index 00000000000..7318cafdf2a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PSOutputDev.h @@ -0,0 +1,546 @@ +//======================================================================== +// +// 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, 2012, 2013, 2015 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2007 Brad Hards <bradh@kde.org> +// Copyright (C) 2009-2013 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, 2015 William Bader <williambader@hotmail.com> +// Copyright (C) 2010 Hib Eris <hib@hiberis.nl> +// Copyright (C) 2011, 2014 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" +#include <set> +#include <map> +#include <vector> + +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 +}; + +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. + // pages has to be sorted in increasing order + PSOutputDev(const char *fileName, PDFDoc *docA, + char *psTitleA, + const std::vector<int> &pages, PSOutMode modeA, + int paperWidthA = -1, int paperHeightA = -1, + GBool noCrop = gFalse, + 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. + // pages has to be sorted in increasing order + PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA, + char *psTitleA, + PDFDoc *docA, + const std::vector<int> &pages, PSOutMode modeA, + int paperWidthA = -1, int paperHeightA = -1, + GBool noCrop = gFalse, + 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 preloadImagesForms; } + + // Does this device use beginType3Char/endType3Char? Otherwise, + // text in Type 3 fonts will be drawn with drawChar/drawString. + virtual GBool interpretType3Chars() { return gFalse; } + + virtual GBool needClipToCropBox() { return mode == psModeEPS; } + + //----- header/trailer (used only if manualCtrl is true) + + // Write the document-level header. + void writeHeader(const std::vector<int> &pages, + 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, XRef *xref); + + // 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 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; } + + void setRasterAntialias(GBool a) { rasterAntialias = a; } + void setRasterResolution(double r) { rasterResolution = r; } + void setRasterMono(GBool b) { rasterMono = b; } + void setUncompressPreloadedImages(GBool b) { uncompressPreloadedImages = b; } + + GBool getEmbedType1() const { return embedType1; } + GBool getEmbedTrueType() const { return embedTrueType; } + GBool getEmbedCIDPostScript() const { return embedCIDPostScript; } + GBool getEmbedCIDTrueType() const { return embedCIDTrueType; } + GBool getFontPassthrough() const { return fontPassthrough; } + GBool getOptimizeColorSpace() const { return optimizeColorSpace; } + void setEmbedType1(GBool b) { embedType1 = b; } + void setEmbedTrueType(GBool b) { embedTrueType = b; } + void setEmbedCIDPostScript(GBool b) { embedCIDPostScript = b; } + void setEmbedCIDTrueType(GBool b) { embedCIDTrueType = b; } + void setFontPassthrough(GBool b) { fontPassthrough = b; } + void setOptimizeColorSpace(GBool b) { optimizeColorSpace = b; } + void setPreloadImagesForms(GBool b) { preloadImagesForms = b; } + void setGenerateOPI(GBool b) { generateOPI = b; } + void setUseASCIIHex(GBool b) { useASCIIHex = b; } + void setUseBinary(GBool b) { useBinary = b; } + +private: + + void init(PSOutputFunc outputFuncA, void *outputStreamA, + PSFileType fileTypeA, char *psTitleA, PDFDoc *doc, + const std::vector<int> &pages, PSOutMode modeA, + int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, + GBool manualCtrlA, int paperWidthA, int paperHeightA, + GBool noCropA, GBool duplexA); + void postInit(); + 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, const std::vector<int> &pages, 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 noCrop; + GBool duplex; + std::vector<int> pages; + char *psTitle; + GBool postInitDone; // true if postInit() was called + + 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 + std::set<int> resourceIDs; // list of object IDs of objects containing Resources we've already set up + 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 + 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] + std::map<int,int> pagePaperSize; // page num to paperSize entry mapping + 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 + GBool rasterAntialias; // antialias on rasterize + GBool uncompressPreloadedImages; + double rasterResolution; // PostScript rasterization resolution (dpi) + GBool rasterMono; // true to do PostScript rasterization + // in monochrome (gray); false to do it + // in color (RGB/CMYK) + GBool embedType1; // embed Type 1 fonts? + GBool embedTrueType; // embed TrueType fonts? + GBool embedCIDPostScript; // embed CID PostScript fonts? + GBool embedCIDTrueType; // embed CID TrueType fonts? + GBool fontPassthrough; // pass all fonts through as-is? + GBool optimizeColorSpace; // false to keep gray RGB images in their original color space + // true to optimize gray images to DeviceGray color space + GBool preloadImagesForms; // preload PostScript images and forms into + // memory + GBool generateOPI; // generate PostScript OPI comments? + GBool useASCIIHex; // use ASCIIHex instead of ASCII85? + GBool useBinary; // use binary instead of hex + +#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/Build/source/libs/poppler/poppler-0.36.0/poppler/PSTokenizer.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/PSTokenizer.cc new file mode 100644 index 00000000000..05127f0d03c --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PSTokenizer.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/PSTokenizer.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PSTokenizer.h new file mode 100644 index 00000000000..fc2f053d3f2 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PSTokenizer.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Page.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Page.cc new file mode 100644 index 00000000000..a4af3405b92 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Page.cc @@ -0,0 +1,860 @@ +//======================================================================== +// +// 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-2013 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, 2015 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, 2013 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013, 2014 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 Jason Crain <jason@aquaticape.us> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2015 Philipp Reinkemeier <philipp.reinkemeier@offis.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 <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" + +#if MULTITHREADED +# define pageLocker() MutexLocker locker(&mutex) +#else +# define pageLocker() +#endif +//------------------------------------------------------------------------ +// 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; + +#if MULTITHREADED + gInitMutex(&mutex); +#endif + 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(); +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +Dict *Page::getResourceDict() { + return attrs->getResourceDict(); +} + +Dict *Page::getResourceDictCopy(XRef *xrefA) { + pageLocker(); + Dict *dict = attrs->getResourceDict(); + return dict ? dict->copy(xrefA) : NULL; +} + +void Page::replaceXRef(XRef *xrefA) { + Object obj1; + Dict *pageDict = pageObj.getDict()->copy(xrefA); + xref = xrefA; + trans.free(); + pageDict->lookupNF("Trans", &trans); + annotsObj.free(); + pageDict->lookupNF("Annots", &annotsObj); + contents.free(); + pageDict->lookupNF("Contents", &contents); + if (contents.isArray()) { + contents.free(); + pageDict->lookupNF("Contents", &obj1)->getArray()->copy(xrefA, &contents); + obj1.free(); + } + thumb.free(); + pageDict->lookupNF("Thumb", &thumb); + actions.free(); + pageDict->lookupNF("AA", &actions); + pageDict->lookup("Resources", &obj1); + if (obj1.isDict()) { + attrs->replaceResource(obj1); + } + obj1.free(); + delete pageDict; +} + +Annots *Page::getAnnots(XRef *xrefA) { + if (!annots) { + Object obj; + annots = new Annots(doc, num, getAnnots(&obj, (xrefA == NULL) ? xref : xrefA)); + 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) + pageLocker(); + 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(); + } + + // Popup annots are already handled by markup annots, + // so add to the list only Popup annots without a + // markup annotation associated. + if (annot->getType() != Annot::typePopup || + static_cast<AnnotPopup*>(annot)->getParentNF()->isNull()) { + annots->appendAnnot(annot); + } + annot->setPage(num, gTrue); + + AnnotMarkup *annotMarkup = dynamic_cast<AnnotMarkup*>(annot); + if (annotMarkup) { + AnnotPopup *annotPopup = annotMarkup->getPopup(); + if (annotPopup) + addAnnot(annotPopup); + } +} + +void Page::removeAnnot(Annot *annot) { + Ref annotRef = annot->getRef(); + Object annArray; + + pageLocker(); + getAnnots(&annArray); + if (annArray.isArray()) { + int idx = -1; + // Get annotation position + for (int i = 0; idx == -1 && i < annArray.arrayGetLength(); ++i) { + Object tmp; + if (annArray.arrayGetNF(i, &tmp)->isRef()) { + Ref currAnnot = tmp.getRef(); + if (currAnnot.num == annotRef.num && currAnnot.gen == annotRef.gen) { + idx = i; + } + } + tmp.free(); + } + + 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(); + annot->removeReferencedObjects(); // Note: Might recurse in removeAnnot again + annot->setPage(0, gFalse); +} + +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, + GBool copyXRef) { + displaySlice(out, hDPI, vDPI, rotate, useMediaBox, crop, -1, -1, -1, -1, printing, + abortCheckCbk, abortCheckCbkData, + annotDisplayDecideCbk, annotDisplayDecideCbkData, copyXRef); +} + +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, XRef *xrefA) { + 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()); + } + + if (!crop) { + crop = (box == *cropBox) && out->needClipToCropBox(); + } + gfx = new Gfx(doc, out, num, attrs->getResourceDict(), + hDPI, vDPI, &box, crop ? cropBox : (PDFRectangle *)NULL, + rotate, abortCheckCbk, abortCheckCbkData, xrefA); + + 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, + GBool copyXRef) { + 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; + } + pageLocker(); + XRef *localXRef = (copyXRef) ? xref->copy() : xref; + if (copyXRef) { + replaceXRef(localXRef); + } + + gfx = createGfx(out, hDPI, vDPI, rotate, useMediaBox, crop, + sliceX, sliceY, sliceW, sliceH, + printing, + abortCheckCbk, abortCheckCbkData, localXRef); + + contents.fetch(localXRef, &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; + if (copyXRef) { + replaceXRef(doc->getXRef()); + delete localXRef; + } +} + +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 */ + pageLocker(); + 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(NULL, &obj1, NULL, 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; +} + +LinkAction* Page::getAdditionalAction(PageAdditionalActionsType type) { + Object additionalActionsObject; + LinkAction *linkAction = NULL; + + if (actions.fetch(doc->getXRef(), &additionalActionsObject)->isDict()) { + const char *key = (type == actionOpenPage ? "O" : + type == actionClosePage ? "C" : NULL); + + Object actionObject; + + if (additionalActionsObject.dictLookup(key, &actionObject)->isDict()) + linkAction = LinkAction::parseAction(&actionObject, doc->getCatalog()->getBaseURI()); + actionObject.free(); + } + + additionalActionsObject.free(); + + return linkAction; +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Page.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Page.h new file mode 100644 index 00000000000..2aaabae9b16 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Page.h @@ -0,0 +1,287 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 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 PAGE_H +#define PAGE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "Object.h" +#include "goo/GooMutex.h" + +class Dict; +class PDFDoc; +class XRef; +class OutputDev; +class Links; +class LinkAction; +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); + + bool operator==(const PDFRectangle &rect) const { return x1 == rect.x1 && y1 == rect.y1 && x2 == rect.x2 && y2 == rect.y2; } +}; + +//------------------------------------------------------------------------ +// 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; } + void replaceResource(Object obj1) + { resources.free(); obj1.copy(&resources); } + + // 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; } + Ref getRef() { return pageRef; } + + // Get resource dictionary. + Dict *getResourceDict(); + Dict *getResourceDictCopy(XRef *xrefA); + + // Get annotations array. + Object *getAnnots(Object *obj, XRef *xrefA = NULL) { return annotsObj.fetch((xrefA == NULL) ? xref : xrefA, obj); } + // Add a new annotation to the page + void addAnnot(Annot *annot); + // Remove an existing annotation from the page + 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(XRef *xrefA = NULL); + + // 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); } + + enum PageAdditionalActionsType { + actionOpenPage, ///< Performed when opening the page + actionClosePage, ///< Performed when closing the page + }; + + LinkAction *getAdditionalAction(PageAdditionalActionsType type); + + 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, XRef *xrefA = NULL); + + // 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, + GBool copyXRef = gFalse); + + // 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, + GBool copyXRef = gFalse); + + 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: + // replace xref + void replaceXRef(XRef *xrefA); + + 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 additional actions + double duration; // page duration + GBool ok; // true if page is valid +#if MULTITHREADED + GooMutex mutex; +#endif +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo.cc new file mode 100644 index 00000000000..3153377f6d3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo.cc @@ -0,0 +1,230 @@ +//======================================================================== +// +// This file is under the GPLv2 or later license +// +// Copyright (C) 2005-2006 Kristian Høgsberg <krh@redhat.com> +// Copyright (C) 2005, 2009, 2013 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" +#include "PageLabelInfo_p.h" + +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::LowercaseLatin: + toLatin(number, &number_string, gFalse); + break; + case Interval::UppercaseLatin: + toLatin(number, &number_string, gTrue); + 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; +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo.h new file mode 100644 index 00000000000..960e710069d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo_p.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo_p.h new file mode 100644 index 00000000000..6cd5220d372 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageLabelInfo_p.h @@ -0,0 +1,153 @@ +//======================================================================== +// +// This file is under the GPLv2 or later license +// +// Copyright (C) 2005-2006 Kristian Høgsberg <krh@redhat.com> +// Copyright (C) 2005, 2009, 2014 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 +// +//======================================================================== + +/* http://mathworld.wolfram.com/RomanNumerals.html */ + +#include "goo/GooString.h" +#include "Error.h" + +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 (number >= 4000) { + error(errUnimplemented, -1, "Conversion to roman numberals of numbers >= 4000 not implemented"); + return; + } + + 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; +} + +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); +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/PageTransition.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageTransition.cc new file mode 100644 index 00000000000..441634c039f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageTransition.cc @@ -0,0 +1,138 @@ +/* PageTransition.cc + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2010, Albert Astals Cid <aacid@kde.org> + * Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.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. + */ + +#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 scale + if (dict->lookup("SS", &obj)->isNum()) { + scale = obj.getNum(); + } + obj.free(); + + // get rectangular + if (dict->lookup("B", &obj)->isBool()) { + rectangular = obj.getBool(); + } + obj.free(); +} + +PageTransition::~PageTransition() +{ +} + diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/PageTransition.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageTransition.h new file mode 100644 index 00000000000..e892c6c5051 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PageTransition.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Parser.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Parser.cc new file mode 100644 index 00000000000..28a54607f5c --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Parser.cc @@ -0,0 +1,325 @@ +//======================================================================== +// +// 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, 2013, 2014 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> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 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 "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 (buf2.isCmd("stream")) { + if (allowStreams && (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; + Goffset length; + Goffset pos, endPos; + + // 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 = obj.getInt(); + obj.free(); + } else if (obj.isInt64()) { + length = obj.getInt64(); + 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("endstream", objNum); // kill 'stream' + if (buf1.isCmd("endstream")) { + shift(); + } else { + error(errSyntaxError, getPos(), "Missing 'endstream' or incorrect stream length"); + if (strict) return NULL; + if (xref && lexer->getStream()) { + // shift until we find the proper endstream or we change to another object or reach eof + length = lexer->getPos() - pos; + if (buf1.isCmd("endstream")) { + obj.initInt64(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, recursion); + + 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); +} + +void Parser::shift(const char *cmdA, 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) { + buf2.initNull(); + } else if (buf1.isCmd(cmdA)) { + lexer->getObj(&buf2, objNum); + } else { + lexer->getObj(&buf2, cmdA, objNum); + } +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/Parser.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Parser.h new file mode 100644 index 00000000000..1ce9445e19d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Parser.h @@ -0,0 +1,82 @@ +//======================================================================== +// +// 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, 2013 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2012 Hib Eris <hib@hiberis.nl> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 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 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. + Goffset 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); + void shift(const char *cmdA, int objNum); +}; + +#endif + diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/PopplerCache.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/PopplerCache.cc new file mode 100644 index 00000000000..6018a77b70f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PopplerCache.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/PopplerCache.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PopplerCache.h new file mode 100644 index 00000000000..74010a2fa6b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PopplerCache.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/PreScanOutputDev.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/PreScanOutputDev.cc new file mode 100644 index 00000000000..b2af18d86b8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PreScanOutputDev.cc @@ -0,0 +1,369 @@ +//======================================================================== +// +// 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, 2014 William Bader <williambader@hotmail.com> +// Copyright (C) 2011, 2013 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*/, XRef * /*xref*/) { +} + +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) { + GBool tilingNeeded = (x1 - x0 != 1 || y1 - y0 != 1); + if (tilingNeeded) { + inTilingPatternFill++; + } + gfx->drawForm(str, resDict, mat, bbox); + if (tilingNeeded) { + inTilingPatternFill--; + } + } 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 || inTilingPatternFill > 0)) { + 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 ((level == psLevel1 || level == psLevel1Sep) && + inTilingPatternFill > 0) { + patternImgMask = gTrue; + } + + 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; + inTilingPatternFill = 0; +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/PreScanOutputDev.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/PreScanOutputDev.h new file mode 100644 index 00000000000..50fcbf22f73 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/PreScanOutputDev.h @@ -0,0 +1,182 @@ +//======================================================================== +// +// 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, 2014 William Bader <williambader@hotmail.com> +// Copyright (C) 2011, 2013 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, XRef *xref); + + // 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; + int inTilingPatternFill; +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/ProfileData.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/ProfileData.cc new file mode 100644 index 00000000000..a0c44747a56 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/ProfileData.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/ProfileData.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/ProfileData.h new file mode 100644 index 00000000000..418ee010755 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/ProfileData.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Rendition.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Rendition.cc new file mode 100644 index 00000000000..c040bf2b4a8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Rendition.cc @@ -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", ¶ms)->isDict()) { + MH.parseMediaPlayParameters(¶ms); + } + params.free(); + if (tmp2.dictLookup("BE", ¶ms)->isDict()) { + BE.parseMediaPlayParameters(¶ms); + } + 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", ¶ms)->isDict()) { + MH.parseMediaScreenParameters(¶ms); + } + params.free(); + if (tmp2.dictLookup("BE", ¶ms)->isDict()) { + BE.parseMediaScreenParameters(¶ms); + } + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Rendition.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Rendition.h new file mode 100644 index 00000000000..75bfeff32c9 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Rendition.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/SecurityHandler.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/SecurityHandler.cc new file mode 100644 index 00000000000..63d8b4e1287 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/SecurityHandler.cc @@ -0,0 +1,461 @@ +//======================================================================== +// +// 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, 2015 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2014 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 "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.isInt64()) { + unsigned int permUint = permObj.getInt64(); + 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 + if (ownerEncObj.isString() && userEncObj.isString()) { + ownerEnc = ownerEncObj.getString()->copy(); + userEnc = userEncObj.getString()->copy(); + if (fileKeyLength > 32 || fileKeyLength < 0) { + fileKeyLength = 32; + } + ok = gTrue; + } else { + error(errSyntaxError, -1, "Weird encryption owner/user info"); + } + } else if (!(encVersion == -1 && encRevision == -1)) { + error(errUnimplemented, -1, + "Unsupported version/revision ({0:d}/{1: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/Build/source/libs/poppler/poppler-0.36.0/poppler/SecurityHandler.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/SecurityHandler.h new file mode 100644 index 00000000000..c2991c8f375 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/SecurityHandler.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Sound.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Sound.cc new file mode 100644 index 00000000000..6129fdcb47d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Sound.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Sound.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Sound.h new file mode 100644 index 00000000000..acb0f8d9acd --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Sound.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/SplashOutputDev.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/SplashOutputDev.cc new file mode 100644 index 00000000000..d9d5699a051 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/SplashOutputDev.cc @@ -0,0 +1,4672 @@ +//======================================================================== +// +// 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-2015 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-2015 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2009 Carlos Garcia Campos <carlosgc@gnome.org> +// Copyright (C) 2009, 2014, 2015 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, 2012 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Lu Wang <coolwanglu@gmail.com> +// Copyright (C) 2013 Li Junling <lijunling@sina.com> +// Copyright (C) 2014 Ed Porras <ed@moto-research.com> +// Copyright (C) 2014 Richard PALO <richard@netbsd.org> +// Copyright (C) 2015 Tamas Szekeres <szekerest@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 "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" +#include <algorithm> + +#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> +#ifndef isfinite +#define isfinite(x) finite(x) +#endif +#endif + +static inline void convertGfxColor(SplashColorPtr dest, + SplashColorMode colorMode, + GfxColorSpace *colorSpace, + GfxColor *src) { + SplashColor color; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; + GfxColor deviceN; +#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; + case splashModeDeviceN8: + colorSpace->getDeviceN(src, &deviceN); + for (int i = 0; i < SPOT_NCOMPS + 4; i++) + color[i] = colToByte(deviceN.c[i]); + break; +#endif + } + splashColorCopy(dest, color); +} + +// Copy a color according to the color mode. +// Use convertGfxShortColor() below when the destination is a bitmap +// to avoid overwriting cells. +// Calling this in SplashGouraudPattern::getParameterizedColor() fixes bug 90570. +// Use convertGfxColor() above when the destination is an array of SPOT_NCOMPS+4 bytes, +// to ensure that everything is initialized. + +static inline void convertGfxShortColor(SplashColorPtr dest, + SplashColorMode colorMode, + GfxColorSpace *colorSpace, + GfxColor *src) { + switch (colorMode) { + case splashModeMono1: + case splashModeMono8: + { + GfxGray gray; + colorSpace->getGray(src, &gray); + dest[0] = colToByte(gray); + } + break; + case splashModeXBGR8: + dest[3] = 255; + case splashModeBGR8: + case splashModeRGB8: + { + GfxRGB rgb; + colorSpace->getRGB(src, &rgb); + dest[0] = colToByte(rgb.r); + dest[1] = colToByte(rgb.g); + dest[2] = colToByte(rgb.b); + } + break; +#if SPLASH_CMYK + case splashModeCMYK8: + { + GfxCMYK cmyk; + colorSpace->getCMYK(src, &cmyk); + dest[0] = colToByte(cmyk.c); + dest[1] = colToByte(cmyk.m); + dest[2] = colToByte(cmyk.y); + dest[3] = colToByte(cmyk.k); + } + break; + case splashModeDeviceN8: + { + GfxColor deviceN; + colorSpace->getDeviceN(src, &deviceN); + for (int i = 0; i < SPOT_NCOMPS + 4; i++) + dest[i] = colToByte(deviceN.c[i]); + } + break; +#endif + } +} + +//------------------------------------------------------------------------ +// 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); + gfxMode = shadingA->getColorSpace()->getMode(); +} + +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; + else if (mode == splashModeDeviceN8) + colorComps=4 + SPOT_NCOMPS; +#endif + + shading->getParameterizedColor(colorinterp, &src); + + if (bDirectColorTranslation) { + for (int m = 0; m < colorComps; ++m) + dest[m] = colToByte(src.c[m]); + } else { + convertGfxShortColor(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); + gfxMode = shadingA->getColorSpace()->getMode(); +} + +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 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = (dest[i] * src[i]) / 255; + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } +#endif +} + +static void splashOutBlendScreen(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] + src[i] - (dest[i] * src[i]) / 255; + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } +#endif +} + +static void splashOutBlendOverlay(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#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; + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } +#endif +} + +static void splashOutBlendDarken(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] < src[i] ? dest[i] : src[i]; + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } +#endif +} + +static void splashOutBlendLighten(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] > src[i] ? dest[i] : src[i]; + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } +#endif +} + +static void splashOutBlendColorDodge(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { + int i, x; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#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; + } + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } +#endif +} + +static void splashOutBlendColorBurn(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i, x; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#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; + } + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } +#endif +} + +static void splashOutBlendHardLight(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#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; + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } +#endif +} + +static void splashOutBlendSoftLight(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i, x; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#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; + } + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } +#endif +} + +static void splashOutBlendDifference(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, + SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] < src[i] ? src[i] - dest[i] : dest[i] - src[i]; + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } + if (cm == splashModeDeviceN8) { + for (i = 4; i < splashColorModeNComps[cm]; ++i) { + if (dest[i] == 0 && src[i] == 0) + blend[i] = 0; + } + } +#endif +} + +static void splashOutBlendExclusion(SplashColorPtr src, SplashColorPtr dest, + SplashColorPtr blend, SplashColorMode cm) { + int i; + +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + } + } +#endif + { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + blend[i] = dest[i] + src[i] - (2 * dest[i] * src[i]) / 255; + } + } +#if SPLASH_CMYK + if (cm == splashModeCMYK8 || cm == splashModeDeviceN8) { + for (i = 0; i < splashColorModeNComps[cm]; ++i) { + dest[i] = 255 - dest[i]; + src[i] = 255 - src[i]; + blend[i] = 255 - blend[i]; + } + } + if (cm == splashModeDeviceN8) { + for (i = 4; i < splashColorModeNComps[cm]; ++i) { + if (dest[i] == 0 && src[i] == 0) + blend[i] = 0; + } + } +#endif +} + +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; +#if 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: + case splashModeDeviceN8: + 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; +#if 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: + case splashModeDeviceN8: + 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: + case splashModeDeviceN8: + 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: + case splashModeDeviceN8: + 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 + SplashBitmap *softmask; // bitmap for softmasks + GfxColorSpace *blendingColorSpace; + GBool isolated; + + //----- for knockout + SplashBitmap *shape; + GBool knockout; + SplashCoord knockoutOpacity; + GBool fontAA; + + //----- saved state + SplashBitmap *origBitmap; + Splash *origSplash; + + SplashTransparencyGroup *next; +}; + +//------------------------------------------------------------------------ +// SplashOutputDev +//------------------------------------------------------------------------ + +SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA, + int bitmapRowPadA, + GBool reverseVideoA, + SplashColorPtr paperColorA, + GBool bitmapTopDownA, + SplashThinLineMode thinLineMode, + GBool overprintPreviewA) { + colorMode = colorModeA; + bitmapRowPad = bitmapRowPadA; + bitmapTopDown = bitmapTopDownA; + bitmapUpsideDown = gFalse; + fontAntialias = gTrue; + vectorAntialias = gTrue; + overprintPreview = overprintPreviewA; + 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->setThinLineMode(thinLineMode); + splash->clear(paperColor, 0); + + fontEngine = NULL; + + nT3Fonts = 0; + t3GlyphStack = NULL; + + font = NULL; + needFontUpdate = gFalse; + textClipPath = NULL; + transpGroupStack = NULL; + nestCount = 0; + xref = NULL; +} + +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 + getFontAntialias() && + colorMode != splashModeMono1); + for (i = 0; i < nT3Fonts; ++i) { + delete t3FontCache[i]; + } + nT3Fonts = 0; +} + +void SplashOutputDev::startPage(int pageNum, GfxState *state, XRef *xrefA) { + int w, h; + double *ctm; + SplashCoord mat[6]; + SplashColor color; + + xref = xrefA; + 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; + } + SplashThinLineMode thinLineMode = splashThinLineDefault; + if (splash) { + thinLineMode = splash->getThinLineMode(); + 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); + if (!bitmap->getDataPtr()) { + delete bitmap; + w = h = 1; + bitmap = new SplashBitmap(w, h, bitmapRowPad, colorMode, + colorMode != splashModeMono1, bitmapTopDown); + } + } + splash = new Splash(bitmap, vectorAntialias, &screenParams); + splash->setThinLineMode(thinLineMode); + 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; + case splashModeDeviceN8: + for (int i = 0; i < 4 + SPOT_NCOMPS; i++) + color[i] = 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); + updateFillColorSpace(state); + updateFillColor(state); + updateStrokeColorSpace(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::updateFillColorSpace(GfxState *state) { +#if SPLASH_CMYK + if (colorMode == splashModeDeviceN8) + state->getFillColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); +#endif +} + +void SplashOutputDev::updateStrokeColorSpace(GfxState *state) { +#if SPLASH_CMYK + if (colorMode == splashModeDeviceN8) + state->getStrokeColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); +#endif +} + +void SplashOutputDev::updateFillColor(GfxState *state) { + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; + GfxColor deviceN; +#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; + case splashModeDeviceN8: + state->getFillDeviceN(&deviceN); + splash->setFillPattern(getColor(&deviceN)); + break; +#endif + } +} + +void SplashOutputDev::updateStrokeColor(GfxState *state) { + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; + GfxColor deviceN; +#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; + case splashModeDeviceN8: + state->getStrokeDeviceN(&deviceN); + splash->setStrokePattern(getColor(&deviceN)); + 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); +} + +SplashPattern *SplashOutputDev::getColor(GfxColor *deviceN) { + SplashColor color; + + for (int i = 0; i < 4 + SPOT_NCOMPS; i++) + color[i] = colToByte(deviceN->c[i]); + 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 && overprintPreview) { + 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((xref) ? xref : doc->getXRef(), NULL))) { + 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) ? xref : 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) { + t3gs = t3GlyphStack; + while (t3gs != NULL) { + if (t3gs->cache == t3FontCache[nT3Fonts - 1]) { + error(errSyntaxWarning, -1, "t3FontCache reaches limit but font still on stack in SplashOutputDev::beginType3Char"); + return gTrue; + } + t3gs = t3gs->next; + } + 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->setThinLineMode(splashThinLineDefault); + 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) { + 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; + + transpGroupStack->softmask = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(), 1, splashModeMono8, gFalse); + maskSplash = new Splash(transpGroupStack->softmask, 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()); + if (transpGroupStack->softmask != NULL) { + Guchar *dest = bitmap->getAlphaPtr(); + Guchar *src = transpGroupStack->softmask->getDataPtr(); + for (int c= 0; c < transpGroupStack->softmask->getRowSize() * transpGroupStack->softmask->getHeight(); c++) { + dest[c] = src[c]; + } + delete transpGroupStack->softmask; + transpGroupStack->softmask = 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; +}; + +#ifdef USE_CMS +GBool SplashOutputDev::useIccImageSrc(void *data) { + SplashOutImageData *imgData = (SplashOutImageData *)data; + + if (!imgData->lookup && imgData->colorMap->getColorSpace()->getMode() == csICCBased) { + GfxICCBasedColorSpace *colorSpace = (GfxICCBasedColorSpace *) imgData->colorMap->getColorSpace(); + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + if (colorSpace->getAlt() != NULL && colorSpace->getAlt()->getMode() == csDeviceGray) + return gTrue; + break; + case splashModeXBGR8: + case splashModeRGB8: + case splashModeBGR8: + if (colorSpace->getAlt() != NULL && colorSpace->getAlt()->getMode() == csDeviceRGB) + return gTrue; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + if (colorSpace->getAlt() != NULL && colorSpace->getAlt()->getMode() == csDeviceCMYK) + return gTrue; + break; +#endif + } + } + + return gFalse; +} +#endif + +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; + GfxColor deviceN; +#endif + int nComps, x; + + if (imgData->y == imgData->height) { + return gFalse; + } + if (!(p = imgData->imgStr->getLine())) { + int destComps = 1; + if (imgData->colorMode == splashModeRGB8 || imgData->colorMode == splashModeBGR8) + destComps = 3; + else if (imgData->colorMode == splashModeXBGR8) + destComps = 4; +#if SPLASH_CMYK + else if (imgData->colorMode == splashModeCMYK8) + destComps = 4; + else if (imgData->colorMode == splashModeDeviceN8) + destComps = SPOT_NCOMPS + 4; +#endif + memset(colorLine, 0, imgData->width * destComps); + 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; + case splashModeDeviceN8: + for (x = 0, q = colorLine; x < imgData->width; ++x, ++p) { + col = &imgData->lookup[(SPOT_NCOMPS+4) * *p]; + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *q++ = col[cp]; + } + 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: + if (imgData->colorMap->useRGBLine()) { + imgData->colorMap->getRGBLine(p, (Guchar *) colorLine, imgData->width); + } else { + 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: + if (imgData->colorMap->useRGBLine()) { + imgData->colorMap->getRGBXLine(p, (Guchar *) colorLine, imgData->width); + } else { + 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: + if (imgData->colorMap->useCMYKLine()) { + imgData->colorMap->getCMYKLine(p, (Guchar *) colorLine, imgData->width); + } else { + 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; + case splashModeDeviceN8: + if (imgData->colorMap->useDeviceNLine()) { + imgData->colorMap->getDeviceNLine(p, (Guchar *) colorLine, imgData->width); + } else { + for (x = 0, q = colorLine; x < imgData->width; ++x, p += nComps) { + imgData->colorMap->getDeviceN(p, &deviceN); + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *q++ = colToByte(deviceN.c[cp]); + } + } + break; +#endif + } + } + + ++imgData->y; + return gTrue; +} + +#ifdef USE_CMS +GBool SplashOutputDev::iccImageSrc(void *data, SplashColorPtr colorLine, + Guchar * /*alphaLine*/) { + SplashOutImageData *imgData = (SplashOutImageData *)data; + Guchar *p; + int nComps; + + if (imgData->y == imgData->height) { + return gFalse; + } + if (!(p = imgData->imgStr->getLine())) { + int destComps = 1; + if (imgData->colorMode == splashModeRGB8 || imgData->colorMode == splashModeBGR8) + destComps = 3; + else if (imgData->colorMode == splashModeXBGR8) + destComps = 4; +#if SPLASH_CMYK + else if (imgData->colorMode == splashModeCMYK8) + destComps = 4; + else if (imgData->colorMode == splashModeDeviceN8) + destComps = SPOT_NCOMPS + 4; +#endif + memset(colorLine, 0, imgData->width * destComps); + return gFalse; + } + + if (imgData->colorMode == splashModeXBGR8) { + SplashColorPtr q; + int x; + for (x = 0, q = colorLine; x < imgData->width; ++x) { + *q++ = *p++; + *q++ = *p++; + *q++ = *p++; + *q++ = 255; + } + } else { + nComps = imgData->colorMap->getNumPixelComps(); + memcpy(colorLine, p, imgData->width * nComps); + } + + ++imgData->y; + return gTrue; +} + +void SplashOutputDev::iccTransform(void *data, SplashBitmap *bitmap) { + SplashOutImageData *imgData = (SplashOutImageData *)data; + int nComps = imgData->colorMap->getNumPixelComps(); + + Guchar *colorLine = (Guchar *) gmalloc(nComps * bitmap->getWidth()); + Guchar *rgbxLine = (imgData->colorMode == splashModeXBGR8) ? (Guchar *) gmalloc(3 * bitmap->getWidth()) : NULL; + for (int i = 0; i < bitmap->getHeight(); i++) { + Guchar *p = bitmap->getDataPtr() + i * bitmap->getRowSize(); + switch (imgData->colorMode) { + case splashModeMono1: + case splashModeMono8: + imgData->colorMap->getGrayLine(p, colorLine, bitmap->getWidth()); + memcpy(p, colorLine, nComps * bitmap->getWidth()); + break; + case splashModeRGB8: + case splashModeBGR8: + imgData->colorMap->getRGBLine(p, colorLine, bitmap->getWidth()); + memcpy(p, colorLine, nComps * bitmap->getWidth()); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + imgData->colorMap->getCMYKLine(p, colorLine, bitmap->getWidth()); + memcpy(p, colorLine, nComps * bitmap->getWidth()); + break; +#endif + case splashModeXBGR8: + Guchar *q; + Guchar *b = p; + int x; + for (x = 0, q = rgbxLine; x < bitmap->getWidth(); ++x, ++b) { + *q++ = *b++; + *q++ = *b++; + *q++ = *b++; + } + imgData->colorMap->getRGBLine(rgbxLine, colorLine, bitmap->getWidth()); + b = p; + for (x = 0, q = colorLine; x < bitmap->getWidth(); ++x, ++b) { + *b++ = *q++; + *b++ = *q++; + *b++ = *q++; + } + break; + } + } + gfree(colorLine); + if (rgbxLine != NULL) + gfree(rgbxLine); +} +#endif + +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; + GfxColor deviceN; +#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; + case splashModeDeviceN8: + col = &imgData->lookup[(SPOT_NCOMPS+4) * *p]; + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *q++ = col[cp]; + 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; + case splashModeDeviceN8: + imgData->colorMap->getDeviceN(p, &deviceN); + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *q++ = colToByte(deviceN.c[cp]); + 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 || imgData->colorMode == splashModeDeviceN8) + 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; + SplashICCTransform tf; + GfxGray gray; + GfxRGB rgb; +#if SPLASH_CMYK + GfxCMYK cmyk; + GBool grayIndexed = gFalse; + GfxColor deviceN; +#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; + case splashModeDeviceN8: + colorMap->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); + grayIndexed = colorMap->getColorSpace()->getMode() != csDeviceGray; + imgData.lookup = (SplashColorPtr)gmallocn(n, SPOT_NCOMPS+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; + } + colorMap->getDeviceN(&pix, &deviceN); + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + imgData.lookup[(SPOT_NCOMPS+4)*i +cp] = colToByte(deviceN.c[cp]); + } + 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; + } +#ifdef USE_CMS + src = maskColors ? &alphaImageSrc : useIccImageSrc(&imgData) ? &iccImageSrc : &imageSrc; + tf = maskColors == NULL && useIccImageSrc(&imgData) ? &iccTransform : NULL; +#else + src = maskColors ? &alphaImageSrc : &imageSrc; + tf = NULL; +#endif + splash->drawImage(src, tf, &imgData, srcMode, maskColors ? gTrue : gFalse, + width, height, mat, interpolate); + 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; + GfxColor deviceN; +#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; + case splashModeDeviceN8: + col = &imgData->lookup[(SPOT_NCOMPS+4) * *p]; + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *q++ = col[cp]; + 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; + case splashModeDeviceN8: + imgData->colorMap->getDeviceN(p, &deviceN); + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *q++ = colToByte(deviceN.c[cp]); + 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; + GfxColor deviceN; +#endif + Guchar pix; + int n, i; + +#if SPLASH_CMYK + colorMap->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); +#endif + 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((xref) ? xref : 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; + case splashModeDeviceN8: + imgData.lookup = (SplashColorPtr)gmallocn(n, SPOT_NCOMPS+4); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getDeviceN(&pix, &deviceN); + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + imgData.lookup[(SPOT_NCOMPS+4)*i + cp] = colToByte(deviceN.c[cp]); + } + break; +#endif + } + } + + if (colorMode == splashModeMono1) { + srcMode = splashModeMono8; + } else { + srcMode = colorMode; + } + splash->drawImage(&maskedImageSrc, NULL, &imgData, srcMode, gTrue, + width, height, mat, interpolate); + 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; + GfxColor deviceN; +#endif + Guchar pix; + int n, i; + +#if SPLASH_CMYK + colorMap->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); +#endif + 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, NULL, &imgMaskData, splashModeMono8, gFalse, + maskWidth, maskHeight, mat, maskInterpolate); + 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; + case splashModeDeviceN8: + imgData.lookup = (SplashColorPtr)gmallocn(n, SPOT_NCOMPS+4); + for (i = 0; i < n; ++i) { + pix = (Guchar)i; + colorMap->getDeviceN(&pix, &deviceN); + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + imgData.lookup[(SPOT_NCOMPS+4)*i + cp] = colToByte(deviceN.c[cp]); + } + break; +#endif + } + } + + if (colorMode == splashModeMono1) { + srcMode = splashModeMono8; + } else { + srcMode = colorMode; + } + splash->drawImage(&imageSrc, NULL, &imgData, srcMode, gFalse, width, height, mat, interpolate); + 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->softmask = NULL; + transpGroup->tx = tx; + transpGroup->ty = ty; + transpGroup->blendingColorSpace = blendingColorSpace; + transpGroup->isolated = isolated; + transpGroup->shape = (knockout && !isolated) ? SplashBitmap::copy(bitmap) : NULL; + transpGroup->knockout = (knockout && isolated); + transpGroup->knockoutOpacity = 1.0; + transpGroup->next = transpGroupStack; + transpGroupStack = transpGroup; + + // save state + transpGroup->origBitmap = bitmap; + transpGroup->origSplash = splash; + transpGroup->fontAA = fontEngine->getAA(); + + //~ 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, bitmap->getSeparationList()); + splash = new Splash(bitmap, vectorAntialias, + transpGroup->origSplash->getScreen()); + if (transpGroup->next != NULL && transpGroup->next->knockout) { + fontEngine->setAA(gFalse); + } + splash->setThinLineMode(transpGroup->origSplash->getThinLineMode()); + 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; + int shapeTx = (knockout) ? tx : + (transpGroup->next != NULL && transpGroup->next->shape != NULL) ? transpGroup->next->tx + tx : tx; + int shapeTy = (knockout) ? ty : + (transpGroup->next != NULL && transpGroup->next->shape != NULL) ? transpGroup->next->ty + ty : ty; + splash->blitTransparent(transpGroup->origBitmap, tx, ty, 0, 0, w, h); + splash->setInNonIsolatedGroup(shape, shapeTx, shapeTy); + } + transpGroup->tBitmap = bitmap; + state->shiftCTMAndClip(-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->shiftCTMAndClip(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); + fontEngine->setAA(transpGroupStack->fontAA); + 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; + GfxColor deviceN; +#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; + case splashModeDeviceN8: + transpGroupStack->blendingColorSpace->getDeviceN(backdropColor, &deviceN); + for (int cp=0; cp < SPOT_NCOMPS+4; cp++) + color[cp] = colToByte(deviceN.c[cp]); + 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 > bitmap->getWidth() - tx) xMax = bitmap->getWidth() - tx; + if (yMax > bitmap->getHeight() - ty) yMax = bitmap->getHeight() - ty; + for (y = 0; y < yMax; ++y) { + for (x = 0; x < xMax; ++x) { + if (alpha) { + if (transferFunc) { + lum = tBitmap->getAlpha(x, y) / 255.0; + transferFunc->transform(&lum, &lum2); + p[x] = (int)(lum2 * 255.0 + 0.5); + } else + 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: + case splashModeDeviceN8: + 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) { + vaa = vaa && colorMode != splashModeMono1; + vectorAntialias = vaa; + splash->setVectorAntialias(vaa); +} +#endif + +void SplashOutputDev::setFreeTypeHinting(GBool enable, GBool enableSlightHintingA) +{ + enableFreeTypeHinting = enable; + enableSlightHinting = enableSlightHintingA; +} + +GBool SplashOutputDev::tilingPatternFill(GfxState *state, Gfx *gfxA, 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; + GBool retValue = gFalse; + + 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])) { + state->setCTM(savedCTM[0], savedCTM[1], savedCTM[2], savedCTM[3], savedCTM[4], savedCTM[5]); + 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 { + if ((unsigned long) result_width * result_height > 0x800000L) { + state->setCTM(savedCTM[0], savedCTM[1], savedCTM[2], savedCTM[3], savedCTM[4], savedCTM[5]); + return gFalse; + } + 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) { + state->setCTM(savedCTM[0], savedCTM[1], savedCTM[2], savedCTM[3], savedCTM[4], savedCTM[5]); + 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, 1, + (paintType == 1) ? colorMode : splashModeMono8, gTrue); + splash = new Splash(bitmap, gTrue); + if (paintType == 2) { + SplashColor clearColor; +#if SPLASH_CMYK + clearColor[0] = (colorMode == splashModeCMYK8 || colorMode == splashModeDeviceN8) ? 0x00 : 0xFF; +#else + clearColor[0] = 0xFF; +#endif + splash->clear(clearColor, 0); + } else { + splash->clear(paperColor, 0); + } + splash->setThinLineMode(formerSplash->getThinLineMode()); + 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, NULL, NULL, gfxA->getXRef()); + // 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); + delete splash; + 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]; + GBool minorAxisZero = matc[1] == 0 && matc[2] == 0; + if (matc[0] > 0 && minorAxisZero && matc[3] > 0) { + // draw the tiles + for (int y = 0; y < imgData.repeatY; ++y) { + for (int x = 0; x < imgData.repeatX; ++x) { + x0 = splashFloor(matc[4]) + x * tBitmap->getWidth(); + y0 = splashFloor(matc[5]) + y * tBitmap->getHeight(); + splash->blitImage(tBitmap, gTrue, x0, y0); + } + } + retValue = gTrue; + } else { + retValue = splash->drawImage(&tilingBitmapSrc, NULL, &imgData, colorMode, gTrue, result_width, result_height, matc, gFalse, gTrue) == splashOk; + } + delete tBitmap; + delete gfx; + return retValue; +} + +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: + case splashModeDeviceN8: + 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; + } + delete splashShading; + 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); + +#if SPLASH_CMYK + pattern->getShading()->getColorSpace()->createMapping(bitmap->getSeparationList(), SPOT_NCOMPS); +#endif + setOverprintMask(pattern->getShading()->getColorSpace(), state->getFillOverprint(), + state->getOverprintMode(), NULL); + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/SplashOutputDev.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/SplashOutputDev.h new file mode 100644 index 00000000000..d34426c0f3c --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/SplashOutputDev.h @@ -0,0 +1,442 @@ +//======================================================================== +// +// 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-2015 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, 2015 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2015 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 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" +#include "GlobalParams.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; } + + virtual GBool isCMYK() { return gfxMode == csDeviceCMYK; } + +protected: + Matrix ictm; + double t0, t1, dt; + GfxUnivariateShading *shading; + GfxState *state; + SplashColorMode colorMode; + GfxColorSpaceMode gfxMode; +}; + +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 isCMYK() { return gfxMode == csDeviceCMYK; } + + 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; + GfxColorSpaceMode gfxMode; +}; + +// 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, + SplashThinLineMode thinLineMode = splashThinLineDefault, + GBool overprintPreviewA = globalParams->getOverprintPreview()); + + // 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, XRef *xref); + + // 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 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); + + //----- 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 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 + + GBool getFontAntialias() { return fontAntialias; } + void setFontAntialias(GBool anti) { fontAntialias = anti; } + + 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); + SplashPattern *getColor(GfxColor *deviceN); +#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); +#ifdef USE_CMS + GBool useIccImageSrc(void *data); + static void iccTransform(void *data, SplashBitmap *bitmap); + static GBool iccImageSrc(void *data, SplashColorPtr colorLine, + Guchar *alphaLine); +#endif + 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 fontAntialias; + GBool vectorAntialias; + GBool overprintPreview; + GBool enableFreeTypeHinting; + GBool enableSlightHinting; + GBool reverseVideo; // reverse video mode + SplashColor paperColor; // paper color + SplashScreenParams screenParams; + GBool skipHorizText; + GBool skipRotatedText; + + PDFDoc *doc; // the current document + XRef *xref; // the xref of 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/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinCachedFile.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinCachedFile.cc new file mode 100644 index 00000000000..db966377bb0 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinCachedFile.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinCachedFile.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinCachedFile.h new file mode 100644 index 00000000000..5be6fa841a3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinCachedFile.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinPDFDocBuilder.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinPDFDocBuilder.cc new file mode 100644 index 00000000000..571ee46d7f6 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinPDFDocBuilder.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinPDFDocBuilder.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinPDFDocBuilder.h new file mode 100644 index 00000000000..e9b2f47f636 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/StdinPDFDocBuilder.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Stream-CCITT.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Stream-CCITT.h new file mode 100644 index 00000000000..7207729a4d1 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Stream-CCITT.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/Stream.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/Stream.cc new file mode 100644 index 00000000000..961767896c2 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Stream.cc @@ -0,0 +1,5388 @@ +//======================================================================== +// +// 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-2014 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, 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012 Oliver Sander <sander@mi.fu-berlin.de> +// Copyright (C) 2012 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2012 Even Rouault <even.rouault@mines-paris.org> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> +// Copyright (C) 2013 Pino Toscano <pino@kde.org> +// Copyright (C) 2015 Suzuki Toshiya <mpsuzuki@hiroshima-u.ac.jp> +// Copyright (C) 2015 Jason Crain <jason@aquaticape.us> +// +// 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 "XRef.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 + +#if MULTITHREADED +# define streamLocker() MutexLocker locker(&mutex) +#else +# define streamLocker() +#endif +//------------------------------------------------------------------------ +// Stream (base class) +//------------------------------------------------------------------------ + +Stream::Stream() { + ref = 1; +#if MULTITHREADED + gInitMutex(&mutex); +#endif +} + +Stream::~Stream() { +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +int Stream::incRef() { + streamLocker(); + ++ref; + return ref; +} + +int Stream::decRef() { + streamLocker(); + --ref; + return ref; +} + +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, int recursion) { + Object obj, obj2; + Object params, params2; + Stream *str; + int i; + + str = this; + dict->dictLookup("Filter", &obj, recursion); + if (obj.isNull()) { + obj.free(); + dict->dictLookup("F", &obj); + } + dict->dictLookup("DecodeParms", ¶ms, recursion); + if (params.isNull()) { + params.free(); + dict->dictLookup("DP", ¶ms); + } + if (obj.isName()) { + str = makeFilter(obj.getName(), str, ¶ms, recursion, dict); + } else if (obj.isArray()) { + for (i = 0; i < obj.arrayGetLength(); ++i) { + obj.arrayGet(i, &obj2, recursion); + if (params.isArray()) + params.arrayGet(i, ¶ms2, recursion); + else + params2.initNull(); + if (obj2.isName()) { + str = makeFilter(obj2.getName(), str, ¶ms2, recursion); + } 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 recursion, Object *dict) { + 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, recursion); + if (obj.isInt()) + pred = obj.getInt(); + obj.free(); + params->dictLookup("Columns", &obj, recursion); + if (obj.isInt()) + columns = obj.getInt(); + obj.free(); + params->dictLookup("Colors", &obj, recursion); + if (obj.isInt()) + colors = obj.getInt(); + obj.free(); + params->dictLookup("BitsPerComponent", &obj, recursion); + if (obj.isInt()) + bits = obj.getInt(); + obj.free(); + params->dictLookup("EarlyChange", &obj, recursion); + 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, recursion); + if (obj.isInt()) { + encoding = obj.getInt(); + } + obj.free(); + params->dictLookup("EndOfLine", &obj, recursion); + if (obj.isBool()) { + endOfLine = obj.getBool(); + } + obj.free(); + params->dictLookup("EncodedByteAlign", &obj, recursion); + if (obj.isBool()) { + byteAlign = obj.getBool(); + } + obj.free(); + params->dictLookup("Columns", &obj, recursion); + if (obj.isInt()) { + columns = obj.getInt(); + } + obj.free(); + params->dictLookup("Rows", &obj, recursion); + if (obj.isInt()) { + rows = obj.getInt(); + } + obj.free(); + params->dictLookup("EndOfBlock", &obj, recursion); + if (obj.isBool()) { + endOfBlock = obj.getBool(); + } + obj.free(); + params->dictLookup("BlackIs1", &obj, recursion); + 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, recursion)->isInt()) { + colorXform = obj.getInt(); + } + obj.free(); + } + str = new DCTStream(str, colorXform, dict, recursion); + } else if (!strcmp(name, "FlateDecode") || !strcmp(name, "Fl")) { + pred = 1; + columns = 1; + colors = 1; + bits = 8; + if (params->isDict()) { + params->dictLookup("Predictor", &obj, recursion); + if (obj.isInt()) + pred = obj.getInt(); + obj.free(); + params->dictLookup("Columns", &obj, recursion); + if (obj.isInt()) + columns = obj.getInt(); + obj.free(); + params->dictLookup("Colors", &obj, recursion); + if (obj.isInt()) + colors = obj.getInt(); + obj.free(); + params->dictLookup("BitsPerComponent", &obj, recursion); + if (obj.isInt()) + bits = obj.getInt(); + obj.free(); + } + str = new FlateStream(str, pred, columns, colors, bits); + } else if (!strcmp(name, "JBIG2Decode")) { + if (params->isDict()) { + XRef *xref = params->getDict()->getXRef(); + params->dictLookupNF("JBIG2Globals", &obj); + obj.fetch(xref, &globals, recursion); + } + str = new JBIG2Stream(str, &globals, &obj); + globals.free(); + obj.free(); + } else if (!strcmp(name, "JPXDecode")) { + str = new JPXStream(str); + } else if (!strcmp(name, "Crypt")) { + if (str->getKind() == strCrypt) { + str = str->getBaseStream(); + } else { + error(errSyntaxError, getPos(), "Can't revert non decrypt streams"); + } + } 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, Goffset startA) +{ + f = fa; + start = startA; +} + +FileOutStream::~FileOutStream () +{ + close (); +} + +void FileOutStream::close () +{ + +} + +Goffset FileOutStream::getPos () +{ + return Gftell(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, Goffset 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(Goffset 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 (nBits <= 0 || nVals > INT_MAX / nBits - 7 || width > INT_MAX / nComps) { + inputLineSize = -1; + } + inputLine = (Guchar *)gmallocn_checkoverflow(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; + + if (unlikely(inputLine == NULL)) { + return NULL; + } + + 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(GooFile* fileA, Goffset startA, GBool limitedA, + Goffset lengthA, Object *dictA): + BaseStream(dictA, lengthA) { + file = fileA; + offset = start = startA; + limited = limitedA; + length = lengthA; + bufPtr = bufEnd = buf; + bufPos = start; + savePos = 0; + saved = gFalse; +} + +FileStream::~FileStream() { + close(); +} + +BaseStream *FileStream::copy() { + return new FileStream(file, start, limited, length, &dict); +} + +Stream *FileStream::makeSubStream(Goffset startA, GBool limitedA, + Goffset lengthA, Object *dictA) { + return new FileStream(file, startA, limitedA, lengthA, dictA); +} + +void FileStream::reset() { + savePos = offset; + offset = start; + saved = gTrue; + bufPtr = bufEnd = buf; + bufPos = start; +} + +void FileStream::close() { + if (saved) { + offset = savePos; + 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 = file->read(buf, n, offset); + if (n == -1) { + return gFalse; + } + offset += n; + bufEnd = buf + n; + if (bufPtr >= bufEnd) { + return gFalse; + } + return gTrue; +} + +void FileStream::setPos(Goffset pos, int dir) { + Goffset size; + + if (dir >= 0) { + offset = bufPos = pos; + } else { + size = file->size(); + if (pos > size) + pos = size; + offset = size - pos; + bufPos = offset; + } + bufPtr = bufEnd = buf; +} + +void FileStream::moveStart(Goffset delta) { + start += delta; + bufPtr = bufEnd = buf; + bufPos = start; +} + +//------------------------------------------------------------------------ +// CachedFileStream +//------------------------------------------------------------------------ + +CachedFileStream::CachedFileStream(CachedFile *ccA, Goffset startA, + GBool limitedA, Goffset 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(); +} + +BaseStream *CachedFileStream::copy() { + cc->incRefCnt(); + return new CachedFileStream(cc, start, limited, length, &dict); +} + +Stream *CachedFileStream::makeSubStream(Goffset startA, GBool limitedA, + Goffset 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); + } + n = cc->read(buf, 1, n); + bufEnd = buf + n; + if (bufPtr >= bufEnd) { + return gFalse; + } + return gTrue; +} + +void CachedFileStream::setPos(Goffset 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(Goffset delta) +{ + start += delta; + bufPtr = bufEnd = buf; + bufPos = start; +} + +//------------------------------------------------------------------------ +// MemStream +//------------------------------------------------------------------------ + +MemStream::MemStream(char *bufA, Goffset startA, Goffset 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); + } +} + +BaseStream *MemStream::copy() { + return new MemStream(buf, start, length, &dict); +} + +Stream *MemStream::makeSubStream(Goffset startA, GBool limited, + Goffset lengthA, Object *dictA) { + MemStream *subStr; + Goffset 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(Goffset 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(Goffset delta) { + start += delta; + length -= delta; + bufPtr = buf + start; +} + +//------------------------------------------------------------------------ +// EmbedStream +//------------------------------------------------------------------------ + +EmbedStream::EmbedStream(Stream *strA, Object *dictA, + GBool limitedA, Goffset lengthA): + BaseStream(dictA, lengthA) { + str = strA; + limited = limitedA; + length = lengthA; +} + +EmbedStream::~EmbedStream() { +} + +BaseStream *EmbedStream::copy() { + error(errInternal, -1, "Called copy() on EmbedStream"); + return NULL; +} + +Stream *EmbedStream::makeSubStream(Goffset start, GBool limitedA, + Goffset 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 < nChars) { + nChars = length; + } + return str->doGetChars(nChars, buffer); +} + +void EmbedStream::setPos(Goffset pos, int dir) { + error(errInternal, -1, "Internal: called setPos() on EmbedStream"); +} + +Goffset EmbedStream::getStart() { + error(errInternal, -1, "Internal: called getStart() on EmbedStream"); + return 0; +} + +void EmbedStream::moveStart(Goffset 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; i < columns && codingLine[i] < columns; ++i) { + refLine[i] = codingLine[i]; + } + for (; i < columns + 2; ++i) { + 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 && !err) { + 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; + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + } + break; + case twoDimVertR3: + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + addPixels(refLine[b1i] + 3, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + } + } + break; + case twoDimVertR2: + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + addPixels(refLine[b1i] + 2, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + } + } + break; + case twoDimVertR1: + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + addPixels(refLine[b1i] + 1, blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + } + } + break; + case twoDimVert0: + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + addPixels(refLine[b1i], blackPixels); + blackPixels ^= 1; + if (codingLine[a0i] < columns) { + ++b1i; + while (refLine[b1i] <= codingLine[a0i] && refLine[b1i] < columns) { + b1i += 2; + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + } + } + break; + case twoDimVertL3: + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + 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; + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + } + } + break; + case twoDimVertL2: + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + 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; + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + } + } + break; + case twoDimVertL1: + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + 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; + if (unlikely(b1i > columns + 1)) { + error(errSyntaxError, getPos(), + "Bad 2D code {0:04x} in CCITTFax stream", code1); + err = gTrue; + break; + } + } + } + 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; + if (unlikely(a0i > columns)) { + error(errSyntaxError, getPos(), + "Bad bits {0:04x} in CCITTFax stream", bits); + err = gTrue; + break; + } + 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 +#define dctClipLength 768 +static Guchar dctClip[dctClipLength]; +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, Object *dict, int recursion): + 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) { + const int ix = dctClipOffset + 128 + ((dataIn[i] + 8) >> 4); + if (unlikely(ix < 0 || ix >= dctClipLength)) { + dataOut[i] = 0; + } else { + dataOut[i] = dctClip[ix]; + } + } +} + +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::flateReset(GBool unfiltered) { + if (unfiltered) + str->unfilteredReset(); + else + str->reset(); + + index = 0; + remain = 0; + codeBuf = 0; + codeSize = 0; + compressedBlock = gFalse; + endOfBlock = gTrue; + eof = gTrue; +} + +void FlateStream::unfilteredReset() { + flateReset(gTrue); +} + +void FlateStream::reset() { + int cmf, flg; + + flateReset(gFalse); + + // 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/Build/source/libs/poppler/poppler-0.36.0/poppler/Stream.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/Stream.h new file mode 100644 index 00000000000..00b2925b3d5 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/Stream.h @@ -0,0 +1,1258 @@ +//======================================================================== +// +// 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, 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Peter Breitenlohner <peb@mppmu.mpg.de> +// Copyright (C) 2013 Adam Reichold <adamreichold@myopera.com> +// Copyright (C) 2013 Pino Toscano <pino@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_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" +#include "goo/GooMutex.h" + +class GooFile; +class BaseStream; +class CachedFile; + +//------------------------------------------------------------------------ + +enum StreamKind { + strFile, + strCachedFile, + strASCIIHex, + strASCII85, + strLZW, + strRunLength, + strCCITTFax, + strDCT, + strFlate, + strJBIG2, + strJPX, + strWeird, // internal-use stream types + strCrypt // internal-use to detect decode streams +}; + +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(); + int decRef(); + + // 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 Goffset 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(Goffset 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, int recursion = 0); + +private: + virtual GBool hasGetChars() { return false; } + virtual int getChars(int nChars, Guchar *buffer); + + Stream *makeFilter(char *name, Stream *str, Object *params, int recursion = 0, Object *dict = NULL); + + int ref; // reference count +#if MULTITHREADED + GooMutex mutex; +#endif +}; + + + //------------------------------------------------------------------------ +// 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 Goffset getPos() = 0; + + // Put a char in the stream + virtual void put (char c) = 0; + + virtual void printf (const char *format, ...) GCC_PRINTF_FORMAT(2,3) = 0; + +private: + int ref; // reference count + +}; + +//------------------------------------------------------------------------ +// FileOutStream +//------------------------------------------------------------------------ +class FileOutStream : public OutStream { +public: + FileOutStream (FILE* fa, Goffset startA); + + virtual ~FileOutStream (); + + virtual void close(); + + virtual Goffset getPos(); + + virtual void put (char c); + + virtual void printf (const char *format, ...); +private: + FILE *f; + Goffset start; + +}; + + +//------------------------------------------------------------------------ +// BaseStream +// +// This is the base class for all streams that read directly from a file. +//------------------------------------------------------------------------ + +class BaseStream: public Stream { +public: + + BaseStream(Object *dictA, Goffset lengthA); + virtual ~BaseStream(); + virtual BaseStream *copy() = 0; + virtual Stream *makeSubStream(Goffset start, GBool limited, + Goffset length, Object *dict) = 0; + virtual void setPos(Goffset 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 Goffset getLength() { return length; } + + // Get/set position of first byte of stream within the file. + virtual Goffset getStart() = 0; + virtual void moveStart(Goffset delta) = 0; + +protected: + + Goffset length; + 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 Goffset getPos() { return str->getPos(); } + virtual void setPos(Goffset 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(GooFile* fileA, Goffset startA, GBool limitedA, + Goffset lengthA, Object *dictA); + virtual ~FileStream(); + virtual BaseStream *copy(); + virtual Stream *makeSubStream(Goffset startA, GBool limitedA, + Goffset 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 Goffset getPos() { return bufPos + (bufPtr - buf); } + virtual void setPos(Goffset pos, int dir = 0); + virtual Goffset getStart() { return start; } + virtual void moveStart(Goffset 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; + } + +private: + GooFile* file; + Goffset offset; + Goffset start; + GBool limited; + char buf[fileStreamBufSize]; + char *bufPtr; + char *bufEnd; + Goffset bufPos; + Goffset savePos; + GBool saved; +}; + +//------------------------------------------------------------------------ +// CachedFileStream +//------------------------------------------------------------------------ + +#define cachedStreamBufSize 1024 + +class CachedFileStream: public BaseStream { +public: + + CachedFileStream(CachedFile *ccA, Goffset startA, GBool limitedA, + Goffset lengthA, Object *dictA); + virtual ~CachedFileStream(); + virtual BaseStream *copy(); + virtual Stream *makeSubStream(Goffset startA, GBool limitedA, + Goffset 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 Goffset getPos() { return bufPos + (bufPtr - buf); } + virtual void setPos(Goffset pos, int dir = 0); + virtual Goffset getStart() { return start; } + virtual void moveStart(Goffset delta); + + virtual int getUnfilteredChar () { return getChar(); } + virtual void unfilteredReset () { reset(); } + +private: + + GBool fillBuf(); + + CachedFile *cc; + Goffset 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, Goffset startA, Goffset lengthA, Object *dictA); + virtual ~MemStream(); + virtual BaseStream *copy(); + virtual Stream *makeSubStream(Goffset start, GBool limited, + Goffset 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 Goffset getPos() { return (int)(bufPtr - buf); } + virtual void setPos(Goffset pos, int dir = 0); + virtual Goffset getStart() { return start; } + virtual void moveStart(Goffset 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; + Goffset 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, Goffset lengthA); + virtual ~EmbedStream(); + virtual BaseStream *copy(); + virtual Stream *makeSubStream(Goffset start, GBool limitedA, + Goffset lengthA, Object *dictA); + virtual StreamKind getKind() { return str->getKind(); } + virtual void reset() {} + virtual int getChar(); + virtual int lookChar(); + virtual Goffset getPos() { return str->getPos(); } + virtual void setPos(Goffset pos, int dir = 0); + virtual Goffset getStart(); + virtual void moveStart(Goffset 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 (); + + int getEncoding() { return encoding; } + GBool getEndOfLine() { return endOfLine; } + int getColumns() { return columns; } + GBool getBlackIs1() { return black; } + +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, Object *dict, int recursion); + 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: + void flateReset(GBool unfiltered); + 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/Build/source/libs/poppler/poppler-0.36.0/poppler/StructElement.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/StructElement.cc new file mode 100644 index 00000000000..c6688208fee --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/StructElement.cc @@ -0,0 +1,1409 @@ +//======================================================================== +// +// StructElement.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2013, 2014 Igalia S.L. +// Copyright 2014 Luigi Scarso <luigi.scarso@gmail.com> +// Copyright 2014 Albert Astals Cid <aacid@kde.org> +// Copyright 2015 Dmytro Morgun <lztoad@gmail.com> +// +//======================================================================== + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "StructElement.h" +#include "StructTreeRoot.h" +#include "GlobalParams.h" +#include "UnicodeMap.h" +#include "PDFDoc.h" +#include "Dict.h" + +#include <assert.h> + +class GfxState; + + +static GBool isPlacementName(Object *value) +{ + return value->isName("Block") + || value->isName("Inline") + || value->isName("Before") + || value->isName("Start") + || value->isName("End"); +} + +static GBool isWritingModeName(Object *value) +{ + return value->isName("LrTb") + || value->isName("RlTb") + || value->isName("TbRl"); +} + +static GBool isBorderStyleName(Object *value) +{ + return value->isName("None") + || value->isName("Hidden") + || value->isName("Dotted") + || value->isName("Dashed") + || value->isName("Solid") + || value->isName("Double") + || value->isName("Groove") + || value->isName("Ridge") + || value->isName("Inset") + || value->isName("Outset"); +} + +static GBool isTextAlignName(Object *value) +{ + return value->isName("Start") + || value->isName("End") + || value->isName("Center") + || value->isName("Justify"); +} + +static GBool isBlockAlignName(Object *value) +{ + return value->isName("Before") + || value->isName("Middle") + || value->isName("After") + || value->isName("Justify"); +} + +static GBool isInlineAlignName(Object *value) +{ + return value->isName("Start") + || value->isName("End") + || value->isName("Center"); +} + +static GBool isNumber(Object *value) +{ + return value->isNum(); +} + +static GBool isLineHeight(Object *value) +{ + return value->isName("Normal") + || value->isName("Auto") + || isNumber(value); +} + +static GBool isTextDecorationName(Object *value) +{ + return value->isName("None") + || value->isName("Underline") + || value->isName("Overline") + || value->isName("LineThrough"); +} + +static GBool isRubyAlignName(Object *value) +{ + return value->isName("Start") + || value->isName("End") + || value->isName("Center") + || value->isName("Justify") + || value->isName("Distribute"); +} + +static GBool isRubyPositionName(Object *value) +{ + return value->isName("Before") + || value->isName("After") + || value->isName("Warichu") + || value->isName("Inline"); +} + +static GBool isGlyphOrientationName(Object *value) +{ + return value->isName("Auto") + || value->isName("90") + || value->isName("180") + || value->isName("270") + || value->isName("360") + || value->isName("-90") + || value->isName("-180"); +} + +static GBool isListNumberingName(Object *value) +{ + return value->isName("None") + || value->isName("Disc") + || value->isName("Circle") + || value->isName("Square") + || value->isName("Decimal") + || value->isName("UpperRoman") + || value->isName("LowerRoman") + || value->isName("UpperAlpha") + || value->isName("LowerAlpha"); +} + +static GBool isFieldRoleName(Object *value) +{ + return value->isName("rb") + || value->isName("cb") + || value->isName("pb") + || value->isName("tv"); +} + +static GBool isFieldCheckedName(Object *value) +{ + return value->isName("on") + || value->isName("off") + || value->isName("neutral"); +} + +static GBool isTableScopeName(Object *value) +{ + return value->isName("Row") + || value->isName("Column") + || value->isName("Both"); +} + +static GBool isRGBColor(Object *value) +{ + if (!(value->isArray() && value->arrayGetLength() == 3)) + return gFalse; + + GBool okay = gTrue; + for (int i = 0; i < 3; i++) { + Object obj; + if (!value->arrayGet(i, &obj)->isNum()) { + okay = gFalse; + obj.free(); + break; + } + if (obj.getNum() < 0.0 || obj.getNum() > 1.0) { + okay = gFalse; + obj.free(); + break; + } + obj.free(); + } + + return okay; +} + +static GBool isNatural(Object *value) +{ + return (value->isInt() && value->getInt() > 0) + || (value->isInt64() && value->getInt64() > 0); +} + +static GBool isPositive(Object *value) +{ + return value->isNum() && value->getNum() >= 0.0; +} + +static GBool isNumberOrAuto(Object *value) +{ + return isNumber(value) || value->isName("Auto"); +} + +static GBool isTextString(Object *value) +{ + // XXX: Shall isName() also be checked? + return value->isString(); +} + + +#define ARRAY_CHECKER(name, checkItem, length, allowSingle, allowNulls) \ + static GBool name(Object *value) { \ + if (!value->isArray()) \ + return allowSingle ? checkItem(value) : gFalse; \ + \ + if (length && value->arrayGetLength() != length) \ + return gFalse; \ + \ + GBool okay = gTrue; \ + for (int i = 0; i < value->arrayGetLength(); i++) { \ + Object obj; \ + value->arrayGet(i, &obj); \ + if ((!allowNulls && obj.isNull()) || !checkItem(&obj)) { \ + okay = gFalse; \ + obj.free(); \ + break; \ + } \ + obj.free(); \ + } \ + return okay; \ + } + +ARRAY_CHECKER(isRGBColorOrOptionalArray4, isRGBColor, 4, gTrue, gTrue ); +ARRAY_CHECKER(isPositiveOrOptionalArray4, isPositive, 4, gTrue, gTrue ); +ARRAY_CHECKER(isPositiveOrArray4, isPositive, 4, gTrue, gFalse); +ARRAY_CHECKER(isBorderStyle, isBorderStyleName, 4, gTrue, gTrue ); +ARRAY_CHECKER(isNumberArray4, isNumber, 4, gFalse, gFalse); +ARRAY_CHECKER(isNumberOrArrayN, isNumber, 0, gTrue, gFalse); +ARRAY_CHECKER(isTableHeaders, isTextString, 0, gFalse, gFalse); + + +// Type of functions used to do type-checking on attribute values +typedef GBool (*AttributeCheckFunc)(Object*); + +// Maps attributes to their names and whether the attribute can be inherited. +struct AttributeMapEntry { + Attribute::Type type; + const char *name; + const Object *defval; + GBool inherit; + AttributeCheckFunc check; +}; + +struct AttributeDefaults { + Object Inline; + Object LrTb; + Object Normal; + Object Distribute; + Object off; + Object Zero; + Object Auto; + Object Start; + Object None; + Object Before; + Object Nat1; + + AttributeDefaults() { + Inline.initName("Inline"); + LrTb.initName("LrTb"); + Normal.initName("Normal"); + Distribute.initName("Distribute"); + off.initName("off"); + + Zero.initReal(0.0); + Auto.initName("Auto"); + Start.initName("Start"); + None.initName("None"); + Before.initName("Before"); + Nat1.initInt(1); + } + + ~AttributeDefaults() { + Inline.free(); + LrTb.free(); + Normal.free(); + Distribute.free(); + off.free(); + Zero.free(); + Auto.free(); + Start.free(); + None.free(); + Before.free(); + Nat1.free(); + } +}; + +static const AttributeDefaults attributeDefaults; + + +#define ATTR_LIST_END \ + { Attribute::Unknown, NULL, NULL, gFalse, NULL } + +#define ATTR_WITH_DEFAULT(name, inherit, check, defval) \ + { Attribute::name, \ + #name, \ + &attributeDefaults.defval, \ + inherit, \ + check } + +#define ATTR(name, inherit, check) \ + { Attribute::name, \ + #name, \ + NULL, \ + inherit, \ + check } + +static const AttributeMapEntry attributeMapCommonShared[] = +{ + ATTR_WITH_DEFAULT(Placement, gFalse, isPlacementName, Inline), + ATTR_WITH_DEFAULT(WritingMode, gTrue, isWritingModeName, LrTb), + ATTR (BackgroundColor, gFalse, isRGBColor), + ATTR (BorderColor, gTrue, isRGBColorOrOptionalArray4), + ATTR_WITH_DEFAULT(BorderStyle, gFalse, isBorderStyle, None), + ATTR (BorderThickness, gTrue, isPositiveOrOptionalArray4), + ATTR_WITH_DEFAULT(Padding, gFalse, isPositiveOrArray4, Zero), + ATTR (Color, gTrue, isRGBColor), + ATTR_LIST_END +}; + +static const AttributeMapEntry attributeMapCommonBlock[] = +{ + ATTR_WITH_DEFAULT(SpaceBefore, gFalse, isPositive, Zero), + ATTR_WITH_DEFAULT(SpaceAfter, gFalse, isPositive, Zero), + ATTR_WITH_DEFAULT(StartIndent, gTrue, isNumber, Zero), + ATTR_WITH_DEFAULT(EndIndent, gTrue, isNumber, Zero), + ATTR_WITH_DEFAULT(TextIndent, gTrue, isNumber, Zero), + ATTR_WITH_DEFAULT(TextAlign, gTrue, isTextAlignName, Start), + ATTR (BBox, gFalse, isNumberArray4), + ATTR_WITH_DEFAULT(Width, gFalse, isNumberOrAuto, Auto), + ATTR_WITH_DEFAULT(Height, gFalse, isNumberOrAuto, Auto), + ATTR_WITH_DEFAULT(BlockAlign, gTrue, isBlockAlignName, Before), + ATTR_WITH_DEFAULT(InlineAlign, gTrue, isInlineAlignName, Start), + ATTR_LIST_END +}; + +static const AttributeMapEntry attributeMapCommonInline[] = +{ + ATTR_WITH_DEFAULT(BaselineShift, gFalse, isNumber, Zero), + ATTR_WITH_DEFAULT(LineHeight, gTrue, isLineHeight, Normal), + ATTR (TextDecorationColor, gTrue, isRGBColor), + ATTR (TextDecorationThickness, gTrue, isPositive), + ATTR_WITH_DEFAULT(TextDecorationType, gFalse, isTextDecorationName, None), + ATTR_WITH_DEFAULT(GlyphOrientationVertical, gTrue, isGlyphOrientationName, Auto), + ATTR_LIST_END +}; + +static const AttributeMapEntry attributeMapCommonRubyText[] = +{ + ATTR_WITH_DEFAULT(RubyPosition, gTrue, isRubyPositionName, Before), + ATTR_WITH_DEFAULT(RubyAlign, gTrue, isRubyAlignName, Distribute), + ATTR_LIST_END +}; + +static const AttributeMapEntry attributeMapCommonColumns[] = +{ + ATTR_WITH_DEFAULT(ColumnCount, gFalse, isNatural, Nat1), + ATTR (ColumnGap, gFalse, isNumberOrArrayN), + ATTR (ColumnWidths, gFalse, isNumberOrArrayN), + ATTR_LIST_END +}; + +static const AttributeMapEntry attributeMapCommonList[] = { + ATTR_WITH_DEFAULT(ListNumbering, gTrue, isListNumberingName, None), + ATTR_LIST_END +}; + +static const AttributeMapEntry attributeMapCommonPrintField[] = +{ + ATTR (Role, gFalse, isFieldRoleName), + ATTR_WITH_DEFAULT(checked, gFalse, isFieldCheckedName, off), + ATTR (Desc, gFalse, isTextString), + ATTR_LIST_END +}; + +static const AttributeMapEntry attributeMapCommonTable[] = +{ + ATTR(Headers, gFalse, isTableHeaders), + ATTR(Scope, gFalse, isTableScopeName), + ATTR(Summary, gFalse, isTextString), + ATTR_LIST_END +}; + +static const AttributeMapEntry attributeMapCommonTableCell[] = +{ + ATTR_WITH_DEFAULT(RowSpan, gFalse, isNatural, Nat1), + ATTR_WITH_DEFAULT(ColSpan, gFalse, isNatural, Nat1), + ATTR_WITH_DEFAULT(TBorderStyle, gTrue, isBorderStyle, None), + ATTR_WITH_DEFAULT(TPadding, gTrue, isPositiveOrArray4, Zero), + ATTR_LIST_END +}; + +#undef ATTR_WITH_DEFAULT +#undef ATTR + + +static const AttributeMapEntry *attributeMapAll[] = { + attributeMapCommonShared, + attributeMapCommonBlock, + attributeMapCommonInline, + attributeMapCommonRubyText, + attributeMapCommonColumns, + attributeMapCommonList, + attributeMapCommonPrintField, + attributeMapCommonTable, + attributeMapCommonTableCell, + NULL, +}; + +static const AttributeMapEntry *attributeMapShared[] = { + attributeMapCommonShared, + NULL, +}; + +static const AttributeMapEntry *attributeMapBlock[] = { + attributeMapCommonShared, + attributeMapCommonBlock, + NULL, +}; + +static const AttributeMapEntry *attributeMapInline[] = { + attributeMapCommonShared, + attributeMapCommonInline, + NULL, +}; + +static const AttributeMapEntry *attributeMapTableCell[] = { + attributeMapCommonShared, + attributeMapCommonBlock, + attributeMapCommonTable, + attributeMapCommonTableCell, + NULL, +}; + +static const AttributeMapEntry *attributeMapRubyText[] = { + attributeMapCommonShared, + attributeMapCommonInline, + attributeMapCommonRubyText, + NULL, +}; + +static const AttributeMapEntry *attributeMapColumns[] = { + attributeMapCommonShared, + attributeMapCommonInline, + attributeMapCommonColumns, + NULL, +}; + +static const AttributeMapEntry *attributeMapList[] = { + attributeMapCommonShared, + attributeMapCommonList, + NULL, +}; + +static const AttributeMapEntry *attributeMapTable[] = { + attributeMapCommonShared, + attributeMapCommonBlock, + attributeMapCommonTable, + NULL, +}; + +static const AttributeMapEntry *attributeMapIllustration[] = { + // XXX: Illustrations may have some attributes from the "shared", "inline", + // the "block" sets. This is a loose specification; making it better + // means duplicating entries from the sets. This seems good enough... + attributeMapCommonShared, + attributeMapCommonBlock, + attributeMapCommonInline, + NULL, +}; + +// Table mapping owners of attributes to their names. +static const struct OwnerMapEntry { + Attribute::Owner owner; + const char *name; +} ownerMap[] = { + // XXX: Those are sorted in the owner priority resolution order. If the + // same attribute is defined with two owners, the order in the table + // can be used to know which one has more priority. + { Attribute::XML_1_00, "XML-1.00" }, + { Attribute::HTML_3_20, "HTML-3.20" }, + { Attribute::HTML_4_01, "HTML-4.01" }, + { Attribute::OEB_1_00, "OEB-1.00" }, + { Attribute::RTF_1_05, "RTF-1.05" }, + { Attribute::CSS_1_00, "CSS-1.00" }, + { Attribute::CSS_2_00, "CSS-2.00" }, + { Attribute::Layout, "Layout" }, + { Attribute::PrintField, "PrintField" }, + { Attribute::Table, "Table" }, + { Attribute::List, "List" }, + { Attribute::UserProperties, "UserProperties" }, +}; + + +static GBool ownerHasMorePriority(Attribute::Owner a, Attribute::Owner b) +{ + unsigned aIndex, bIndex; + + for (unsigned i = aIndex = bIndex = 0; i < sizeof(ownerMap) / sizeof(ownerMap[0]); i++) { + if (ownerMap[i].owner == a) + aIndex = i; + if (ownerMap[i].owner == b) + bIndex = i; + } + + return aIndex < bIndex; +} + + +// Maps element types to their names and also serves as lookup table +// for additional element type attributes. + +enum ElementType { + elementTypeUndefined, + elementTypeGrouping, + elementTypeInline, + elementTypeBlock, +}; + +static const struct TypeMapEntry { + StructElement::Type type; + const char *name; + ElementType elementType; + const AttributeMapEntry **attributes; +} typeMap[] = { + { StructElement::Document, "Document", elementTypeGrouping, attributeMapShared }, + { StructElement::Part, "Part", elementTypeGrouping, attributeMapShared }, + { StructElement::Art, "Art", elementTypeGrouping, attributeMapColumns }, + { StructElement::Sect, "Sect", elementTypeGrouping, attributeMapColumns }, + { StructElement::Div, "Div", elementTypeGrouping, attributeMapColumns }, + { StructElement::BlockQuote, "BlockQuote", elementTypeGrouping, attributeMapInline }, + { StructElement::Caption, "Caption", elementTypeGrouping, attributeMapInline }, + { StructElement::NonStruct, "NonStruct", elementTypeGrouping, attributeMapInline }, + { StructElement::Index, "Index", elementTypeGrouping, attributeMapInline }, + { StructElement::Private, "Private", elementTypeGrouping, attributeMapInline }, + { StructElement::Span, "Span", elementTypeInline, attributeMapInline }, + { StructElement::Quote, "Quote", elementTypeInline, attributeMapInline }, + { StructElement::Note, "Note", elementTypeInline, attributeMapInline }, + { StructElement::Reference, "Reference", elementTypeInline, attributeMapInline }, + { StructElement::BibEntry, "BibEntry", elementTypeInline, attributeMapInline }, + { StructElement::Code, "Code", elementTypeInline, attributeMapInline }, + { StructElement::Link, "Link", elementTypeInline, attributeMapInline }, + { StructElement::Annot, "Annot", elementTypeInline, attributeMapInline }, + { StructElement::Ruby, "Ruby", elementTypeInline, attributeMapRubyText }, + { StructElement::RB, "RB", elementTypeUndefined, attributeMapRubyText }, + { StructElement::RT, "RT", elementTypeUndefined, attributeMapRubyText }, + { StructElement::RP, "RP", elementTypeUndefined, attributeMapShared }, + { StructElement::Warichu, "Warichu", elementTypeInline, attributeMapRubyText }, + { StructElement::WT, "WT", elementTypeUndefined, attributeMapShared }, + { StructElement::WP, "WP", elementTypeUndefined, attributeMapShared }, + { StructElement::P, "P", elementTypeBlock, attributeMapBlock }, + { StructElement::H, "H", elementTypeBlock, attributeMapBlock }, + { StructElement::H1, "H1", elementTypeBlock, attributeMapBlock }, + { StructElement::H2, "H2", elementTypeBlock, attributeMapBlock }, + { StructElement::H3, "H3", elementTypeBlock, attributeMapBlock }, + { StructElement::H4, "H4", elementTypeBlock, attributeMapBlock }, + { StructElement::H5, "H5", elementTypeBlock, attributeMapBlock }, + { StructElement::H6, "H6", elementTypeBlock, attributeMapBlock }, + { StructElement::L, "L", elementTypeBlock, attributeMapList }, + { StructElement::LI, "LI", elementTypeBlock, attributeMapBlock }, + { StructElement::Lbl, "Lbl", elementTypeBlock, attributeMapBlock }, + { StructElement::LBody, "LBody", elementTypeBlock, attributeMapBlock }, + { StructElement::Table, "Table", elementTypeBlock, attributeMapTable }, + { StructElement::TR, "TR", elementTypeUndefined, attributeMapShared }, + { StructElement::TH, "TH", elementTypeUndefined, attributeMapTableCell }, + { StructElement::TD, "TD", elementTypeUndefined, attributeMapTableCell }, + { StructElement::THead, "THead", elementTypeUndefined, attributeMapShared }, + { StructElement::TFoot, "TFoot", elementTypeUndefined, attributeMapShared }, + { StructElement::TBody, "TBody", elementTypeUndefined, attributeMapShared }, + { StructElement::Figure, "Figure", elementTypeUndefined, attributeMapIllustration }, + { StructElement::Formula, "Formula", elementTypeUndefined, attributeMapIllustration }, + { StructElement::Form, "Form", elementTypeUndefined, attributeMapIllustration }, + { StructElement::TOC, "TOC", elementTypeGrouping, attributeMapShared }, + { StructElement::TOCI, "TOCI", elementTypeGrouping, attributeMapShared }, +}; + + +//------------------------------------------------------------------------ +// Helpers for the attribute and structure type tables +//------------------------------------------------------------------------ + +static inline const AttributeMapEntry * +getAttributeMapEntry(const AttributeMapEntry **entryList, Attribute::Type type) +{ + assert(entryList); + while (*entryList) { + const AttributeMapEntry *entry = *entryList; + while (entry->type != Attribute::Unknown) { + assert(entry->name); + if (type == entry->type) + return entry; + entry++; + } + entryList++; + } + return NULL; +} + +static inline const AttributeMapEntry * +getAttributeMapEntry(const AttributeMapEntry **entryList, const char *name) +{ + assert(entryList); + while (*entryList) { + const AttributeMapEntry *entry = *entryList; + while (entry->type != Attribute::Unknown) { + assert(entry->name); + if (strcmp(name, entry->name) == 0) + return entry; + entry++; + } + entryList++; + } + return NULL; +} + +static inline const OwnerMapEntry *getOwnerMapEntry(Attribute::Owner owner) +{ + for (unsigned i = 0; i < sizeof(ownerMap) / sizeof(ownerMap[0]); i++) { + if (owner == ownerMap[i].owner) + return &ownerMap[i]; + } + return NULL; +} + +static inline const OwnerMapEntry *getOwnerMapEntry(const char *name) +{ + for (unsigned i = 0; i < sizeof(ownerMap) / sizeof(ownerMap[0]); i++) { + if (strcmp(name, ownerMap[i].name) == 0) + return &ownerMap[i]; + } + return NULL; +} + +static const char *ownerToName(Attribute::Owner owner) +{ + const OwnerMapEntry *entry = getOwnerMapEntry(owner); + return entry ? entry->name : "UnknownOwner"; +} + +static Attribute::Owner nameToOwner(const char *name) +{ + const OwnerMapEntry *entry = getOwnerMapEntry(name); + return entry ? entry->owner : Attribute::UnknownOwner; +} + +static inline const TypeMapEntry *getTypeMapEntry(StructElement::Type type) +{ + for (unsigned i = 0; i < sizeof(typeMap) / sizeof(typeMap[0]); i++) { + if (type == typeMap[i].type) + return &typeMap[i]; + } + return NULL; +} + +static inline const TypeMapEntry *getTypeMapEntry(const char *name) +{ + for (unsigned i = 0; i < sizeof(typeMap) / sizeof(typeMap[0]); i++) { + if (strcmp(name, typeMap[i].name) == 0) + return &typeMap[i]; + } + return NULL; +} + +static const char *typeToName(StructElement::Type type) +{ + if (type == StructElement::MCID) + return "MarkedContent"; + if (type == StructElement::OBJR) + return "ObjectReference"; + + const TypeMapEntry *entry = getTypeMapEntry(type); + return entry ? entry->name : "Unknown"; +} + +static StructElement::Type nameToType(const char *name) +{ + const TypeMapEntry *entry = getTypeMapEntry(name); + return entry ? entry->type : StructElement::Unknown; +} + + +//------------------------------------------------------------------------ +// Attribute +//------------------------------------------------------------------------ + +Attribute::Attribute(const char *nameA, int nameLenA, Object *valueA): + type(UserProperty), + owner(UserProperties), + revision(0), + name(nameA, nameLenA), + value(), + hidden(gFalse), + formatted(NULL) +{ + assert(valueA); + valueA->copy(&value); +} + +Attribute::Attribute(Type type, Object *valueA): + type(type), + owner(UserProperties), // TODO: Determine corresponding owner from Type + revision(0), + name(), + value(), + hidden(gFalse), + formatted(NULL) +{ + assert(valueA); + + valueA->copy(&value); + + if (!checkType()) + type = Unknown; +} + +Attribute::~Attribute() +{ + delete formatted; + value.free(); +} + +const char *Attribute::getTypeName() const +{ + if (type == UserProperty) + return name.getCString(); + + const AttributeMapEntry *entry = getAttributeMapEntry(attributeMapAll, type); + if (entry) + return entry->name; + + return "Unknown"; +} + +const char *Attribute::getOwnerName() const +{ + return ownerToName(owner); +} + +Object *Attribute::getDefaultValue(Attribute::Type type) +{ + const AttributeMapEntry *entry = getAttributeMapEntry(attributeMapAll, type); + return entry ? const_cast<Object*>(entry->defval) : NULL; +} + +void Attribute::setFormattedValue(const char *formattedA) +{ + if (formattedA) { + if (formatted) + formatted->Set(formattedA); + else + formatted = new GooString(formattedA); + } else { + delete formatted; + formatted = NULL; + } +} + +GBool Attribute::checkType(StructElement *element) +{ + // If an element is passed, tighther type-checking can be done. + if (!element) + return gTrue; + + const TypeMapEntry *elementTypeEntry = getTypeMapEntry(element->getType()); + if (elementTypeEntry && elementTypeEntry->attributes) { + const AttributeMapEntry *entry = getAttributeMapEntry(elementTypeEntry->attributes, type); + if (entry) { + if (entry->check && !((*entry->check)(&value))) { + return gFalse; + } + } else { + // No entry: the attribute is not valid for the containing element. + return gFalse; + } + } + + return gTrue; +} + +Attribute::Type Attribute::getTypeForName(const char *name, StructElement *element) +{ + const AttributeMapEntry **attributes = attributeMapAll; + if (element) { + const TypeMapEntry *elementTypeEntry = getTypeMapEntry(element->getType()); + if (elementTypeEntry && elementTypeEntry->attributes) { + attributes = elementTypeEntry->attributes; + } + } + + const AttributeMapEntry *entry = getAttributeMapEntry(attributes, name); + return entry ? entry->type : Unknown; +} + +Attribute *Attribute::parseUserProperty(Dict *property) +{ + Object obj, value; + const char *name = NULL; + int nameLen = GooString::CALC_STRING_LEN; + + if (property->lookup("N", &obj)->isString()) { + GooString *s = obj.getString(); + name = s->getCString(); + nameLen = s->getLength(); + } else if (obj.isName()) + name = obj.getName(); + else { + error(errSyntaxError, -1, "N object is wrong type ({0:s})", obj.getTypeName()); + obj.free(); + return NULL; + } + + if (property->lookup("V", &value)->isNull()) { + error(errSyntaxError, -1, "V object is wrong type ({0:s})", value.getTypeName()); + value.free(); + obj.free(); + return NULL; + } + + Attribute *attribute = new Attribute(name, nameLen, &value); + value.free(); + obj.free(); + + if (property->lookup("F", &obj)->isString()) { + attribute->setFormattedValue(obj.getString()->getCString()); + } else if (!obj.isNull()) { + error(errSyntaxWarning, -1, "F object is wrong type ({0:s})", obj.getTypeName()); + } + obj.free(); + + if (property->lookup("H", &obj)->isBool()) { + attribute->setHidden(obj.getBool()); + } else if (!obj.isNull()) { + error(errSyntaxWarning, -1, "H object is wrong type ({0:s})", obj.getTypeName()); + } + obj.free(); + + return attribute; +} + + +//------------------------------------------------------------------------ +// StructElement +//------------------------------------------------------------------------ + +StructElement::StructData::StructData(): + altText(0), + actualText(0), + id(0), + title(0), + expandedAbbr(0), + language(0), + revision(0) +{ +} + +StructElement::StructData::~StructData() +{ + delete altText; + delete actualText; + delete id; + delete title; + delete language; + parentRef.free(); + for (ElemPtrArray::iterator i = elements.begin(); i != elements.end(); ++i) delete *i; + for (AttrPtrArray::iterator i = attributes.begin(); i != attributes.end(); ++i) delete *i; +} + + +StructElement::StructElement(Dict *element, + StructTreeRoot *treeRootA, + StructElement *parentA, + std::set<int> &seen): + type(Unknown), + treeRoot(treeRootA), + parent(parentA), + s(new StructData()) +{ + assert(treeRoot); + assert(element); + + parse(element); + parseChildren(element, seen); +} + +StructElement::StructElement(int mcid, StructTreeRoot *treeRootA, StructElement *parentA): + type(MCID), + treeRoot(treeRootA), + parent(parentA), + c(new ContentData(mcid)) +{ + assert(treeRoot); + assert(parent); +} + +StructElement::StructElement(const Ref& ref, StructTreeRoot *treeRootA, StructElement *parentA): + type(OBJR), + treeRoot(treeRootA), + parent(parentA), + c(new ContentData(ref)) +{ + assert(treeRoot); + assert(parent); +} + +StructElement::~StructElement() +{ + if (isContent()) + delete c; + else + delete s; + pageRef.free(); +} + +GBool StructElement::isBlock() const +{ + const TypeMapEntry *entry = getTypeMapEntry(type); + return entry ? (entry->elementType == elementTypeBlock) : gFalse; +} + +GBool StructElement::isInline() const +{ + const TypeMapEntry *entry = getTypeMapEntry(type); + return entry ? (entry->elementType == elementTypeInline) : gFalse; +} + +GBool StructElement::isGrouping() const +{ + const TypeMapEntry *entry = getTypeMapEntry(type); + return entry ? (entry->elementType == elementTypeGrouping) : gFalse; +} + +GBool StructElement::hasPageRef() const +{ + return pageRef.isRef() || (parent && parent->hasPageRef()); +} + +bool StructElement::getPageRef(Ref& ref) const +{ + if (pageRef.isRef()) { + ref = pageRef.getRef(); + return gTrue; + } + + if (parent) + return parent->getPageRef(ref); + + return gFalse; +} + +const char *StructElement::getTypeName() const +{ + return typeToName(type); +} + +const Attribute *StructElement::findAttribute(Attribute::Type attributeType, GBool inherit, + Attribute::Owner attributeOwner) const +{ + if (isContent()) + return parent->findAttribute(attributeType, inherit, attributeOwner); + + if (attributeType == Attribute::Unknown || attributeType == Attribute::UserProperty) + return NULL; + + const Attribute *result = NULL; + + if (attributeOwner == Attribute::UnknownOwner) { + // Search for the attribute, no matter who the owner is + for (unsigned i = 0; i < getNumAttributes(); i++) { + const Attribute *attr = getAttribute(i); + if (attributeType == attr->getType()) { + if (!result || ownerHasMorePriority(attr->getOwner(), result->getOwner())) + result = attr; + } + } + } else { + // Search for the attribute, with a specific owner + for (unsigned i = 0; i < getNumAttributes(); i++) { + const Attribute *attr = getAttribute(i); + if (attributeType == attr->getType() && attributeOwner == attr->getOwner()) { + result = attr; + break; + } + } + } + + if (result) + return result; + + if (inherit && parent) { + const AttributeMapEntry *entry = getAttributeMapEntry(attributeMapAll, attributeType); + assert(entry); + // TODO: Take into account special inheritance cases, for example: + // inline elements which have been changed to be block using + // "/Placement/Block" have slightly different rules. + if (entry->inherit) + return parent->findAttribute(attributeType, inherit, attributeOwner); + } + + return NULL; +} + +GooString* StructElement::appendSubTreeText(GooString *string, GBool recursive) const +{ + if (isContent() && !isObjectRef()) { + MarkedContentOutputDev mcdev(getMCID()); + const TextSpanArray& spans(getTextSpansInternal(mcdev)); + + if (!string) + string = new GooString(); + + for (TextSpanArray::const_iterator i = spans.begin(); i != spans.end(); ++i) + string->append(i->getText()); + + return string; + } + + if (!recursive) + return NULL; + + // Do a depth-first traversal, to get elements in logical order + if (!string) + string = new GooString(); + + for (unsigned i = 0; i < getNumChildren(); i++) + getChild(i)->appendSubTreeText(string, recursive); + + return string; +} + +const TextSpanArray& StructElement::getTextSpansInternal(MarkedContentOutputDev& mcdev) const +{ + assert(isContent()); + + int startPage = 0, endPage = 0; + + Ref ref; + if (getPageRef(ref)) { + startPage = endPage = treeRoot->getDoc()->findPage(ref.num, ref.gen); + } + + if (!(startPage && endPage)) { + startPage = 1; + endPage = treeRoot->getDoc()->getNumPages(); + } + + treeRoot->getDoc()->displayPages(&mcdev, startPage, endPage, 72.0, 72.0, 0, gTrue, gFalse, gFalse); + return mcdev.getTextSpans(); +} + +static StructElement::Type roleMapResolve(Dict *roleMap, const char *name, const char *curName, Object *resolved) +{ + // Circular reference + if (curName && !strcmp(name, curName)) + return StructElement::Unknown; + + if (roleMap->lookup(curName ? curName : name, resolved)->isName()) { + StructElement::Type type = nameToType(resolved->getName()); + return type == StructElement::Unknown + ? roleMapResolve(roleMap, name, resolved->getName(), resolved) + : type; + } + + if (!resolved->isNull()) + error(errSyntaxWarning, -1, "RoleMap entry is wrong type ({0:s})", resolved->getTypeName()); + return StructElement::Unknown; +} + +void StructElement::parse(Dict *element) +{ + Object obj; + + // Type is optional, but if present must be StructElem + if (!element->lookup("Type", &obj)->isNull() && !obj.isName("StructElem")) { + error(errSyntaxError, -1, "Type of StructElem object is wrong"); + obj.free(); + return; + } + obj.free(); + + // Parent object reference (required). + if (!element->lookupNF("P", &s->parentRef)->isRef()) { + error(errSyntaxError, -1, "P object is wrong type ({0:s})", obj.getTypeName()); + return; + } + + // Check whether the S-type is valid for the top level + // element and create a node of the appropriate type. + if (!element->lookup("S", &obj)->isName()) { + error(errSyntaxError, -1, "S object is wrong type ({0:s})", obj.getTypeName()); + obj.free(); + return; + } + + // Type name may not be standard, resolve through RoleMap first. + if (treeRoot->getRoleMap()) { + Object resolvedName; + type = roleMapResolve(treeRoot->getRoleMap(), obj.getName(), NULL, &resolvedName); + } + + // Resolving through RoleMap may leave type as Unknown, e.g. for types + // which are not present in it, yet they are standard element types. + if (type == Unknown) + type = nameToType(obj.getName()); + + // At this point either the type name must have been resolved. + if (type == Unknown) { + error(errSyntaxError, -1, "StructElem object is wrong type ({0:s})", obj.getName()); + obj.free(); + return; + } + obj.free(); + + // Object ID (optional), to be looked at the IDTree in the tree root. + if (element->lookup("ID", &obj)->isString()) { + s->id = obj.takeString(); + } + obj.free(); + + // Page reference (optional) in which at least one of the child items + // is to be rendered in. Note: each element stores only the /Pg value + // contained by it, and StructElement::getPageRef() may look in parent + // elements to find the page where an element belongs. + element->lookupNF("Pg", &pageRef); + + // Revision number (optional). + if (element->lookup("R", &obj)->isInt()) { + s->revision = obj.getInt(); + } + obj.free(); + + // Element title (optional). + if (element->lookup("T", &obj)->isString()) { + s->title = obj.takeString(); + } + obj.free(); + + // Language (optional). + if (element->lookup("Lang", &obj)->isString()) { + s->language = obj.takeString(); + } + obj.free(); + + // Alternative text (optional). + if (element->lookup("Alt", &obj)->isString()) { + s->altText = obj.takeString(); + } + obj.free(); + + // Expanded form of an abbreviation (optional). + if (element->lookup("E", &obj)->isString()) { + s->expandedAbbr = obj.takeString(); + } + obj.free(); + + // Actual text (optional). + if (element->lookup("ActualText", &obj)->isString()) { + s->actualText = obj.takeString(); + } + obj.free(); + + // Attributes directly attached to the element (optional). + if (element->lookup("A", &obj)->isDict()) { + parseAttributes(obj.getDict()); + } else if (obj.isArray()) { + Object iobj; + unsigned attrIndex = getNumAttributes(); + for (int i = 0; i < obj.arrayGetLength(); i++) { + if (obj.arrayGet(i, &iobj)->isDict()) { + attrIndex = getNumAttributes(); + parseAttributes(iobj.getDict()); + } else if (iobj.isInt()) { + const int revision = iobj.getInt(); + // Set revision numbers for the elements previously created. + for (unsigned j = attrIndex; j < getNumAttributes(); j++) + getAttribute(j)->setRevision(revision); + } else { + error(errSyntaxWarning, -1, "A item is wrong type ({0:s})", iobj.getTypeName()); + } + iobj.free(); + } + } else if (!obj.isNull()) { + error(errSyntaxWarning, -1, "A is wrong type ({0:s})", obj.getTypeName()); + } + obj.free(); + + // Attributes referenced indirectly through the ClassMap (optional). + if (treeRoot->getClassMap()) { + Object classes; + if (element->lookup("C", &classes)->isName()) { + Object attr; + if (treeRoot->getClassMap()->lookup(classes.getName(), &attr)->isDict()) { + parseAttributes(attr.getDict(), gTrue); + } else if (attr.isArray()) { + for (int i = 0; i < attr.arrayGetLength(); i++) { + Object iobj; + unsigned attrIndex = getNumAttributes(); + if (attr.arrayGet(i, &iobj)->isDict()) { + attrIndex = getNumAttributes(); + parseAttributes(iobj.getDict(), gTrue); + } else if (iobj.isInt()) { + // Set revision numbers for the elements previously created. + const int revision = iobj.getInt(); + for (unsigned j = attrIndex; j < getNumAttributes(); j++) + getAttribute(j)->setRevision(revision); + } else { + error(errSyntaxWarning, -1, "C item is wrong type ({0:s})", iobj.getTypeName()); + } + iobj.free(); + } + } else if (!attr.isNull()) { + error(errSyntaxWarning, -1, "C object is wrong type ({0:s})", classes.getTypeName()); + } + classes.free(); + attr.free(); + } + } +} + +StructElement *StructElement::parseChild(Object *ref, + Object *childObj, + std::set<int> &seen) +{ + assert(childObj); + assert(ref); + + StructElement *child = NULL; + + if (childObj->isInt()) { + child = new StructElement(childObj->getInt(), treeRoot, this); + } else if (childObj->isDict("MCR")) { + /* + * TODO: The optional Stm/StwOwn attributes are not handled, so all the + * page will be always scanned when calling StructElement::getText(). + */ + Object mcidObj; + Object pageRefObj; + + if (!childObj->dictLookup("MCID", &mcidObj)->isInt()) { + error(errSyntaxError, -1, "MCID object is wrong type ({0:s})", mcidObj.getTypeName()); + mcidObj.free(); + return NULL; + } + + child = new StructElement(mcidObj.getInt(), treeRoot, this); + mcidObj.free(); + + if (childObj->dictLookupNF("Pg", &pageRefObj)->isRef()) { + child->pageRef = pageRefObj; + } else { + pageRefObj.free(); + } + } else if (childObj->isDict("OBJR")) { + Object refObj; + + if (childObj->dictLookupNF("Obj", &refObj)->isRef()) { + Object pageRefObj; + + child = new StructElement(refObj.getRef(), treeRoot, this); + + if (childObj->dictLookupNF("Pg", &pageRefObj)->isRef()) { + child->pageRef = pageRefObj; + } else { + pageRefObj.free(); + } + } else { + error(errSyntaxError, -1, "Obj object is wrong type ({0:s})", refObj.getTypeName()); + } + refObj.free(); + } else if (childObj->isDict()) { + if (!ref->isRef()) { + error(errSyntaxError, -1, + "Structure element dictionary is not an indirect reference ({0:s})", + ref->getTypeName()); + } else if (seen.find(ref->getRefNum()) == seen.end()) { + seen.insert(ref->getRefNum()); + child = new StructElement(childObj->getDict(), treeRoot, this, seen); + } else { + error(errSyntaxWarning, -1, + "Loop detected in structure tree, skipping subtree at object {0:d}:{1:d}", + ref->getRefNum(), ref->getRefGen()); + } + } else { + error(errSyntaxWarning, -1, "K has a child of wrong type ({0:s})", childObj->getTypeName()); + } + + if (child) { + if (child->isOk()) { + appendChild(child); + if (ref->isRef()) + treeRoot->parentTreeAdd(ref->getRef(), child); + } else { + delete child; + child = NULL; + } + } + + return child; +} + +void StructElement::parseChildren(Dict *element, std::set<int> &seen) +{ + Object kids; + + if (element->lookup("K", &kids)->isArray()) { + for (int i = 0; i < kids.arrayGetLength(); i++) { + Object obj, ref; + parseChild(kids.arrayGetNF(i, &ref), kids.arrayGet(i, &obj), seen); + obj.free(); + ref.free(); + } + } else if (kids.isDict() || kids.isInt()) { + Object ref; + parseChild(element->lookupNF("K", &ref), &kids, seen); + ref.free(); + } + + kids.free(); +} + +void StructElement::parseAttributes(Dict *attributes, GBool keepExisting) +{ + Object owner; + if (attributes->lookup("O", &owner)->isName("UserProperties")) { + // In this case /P is an array of UserProperty dictionaries + Object userProperties; + if (attributes->lookup("P", &userProperties)->isArray()) { + for (int i = 0; i < userProperties.arrayGetLength(); i++) { + Object property; + if (userProperties.arrayGet(i, &property)->isDict()) { + Attribute *attribute = Attribute::parseUserProperty(property.getDict()); + if (attribute && attribute->isOk()) { + appendAttribute(attribute); + } else { + error(errSyntaxWarning, -1, "Item in P is invalid"); + delete attribute; + } + } else { + error(errSyntaxWarning, -1, "Item in P is wrong type ({0:s})", property.getTypeName()); + } + property.free(); + } + } + userProperties.free(); + } else if (owner.isName()) { + // In this case /P contains standard attributes. + // Check first if the owner is a valid standard one. + Attribute::Owner ownerValue = nameToOwner(owner.getName()); + if (ownerValue != Attribute::UnknownOwner) { + // Iterate over the entries of the "attributes" dictionary. + // The /O entry (owner) is skipped. + for (int i = 0; i < attributes->getLength(); i++) { + const char *key = attributes->getKey(i); + if (strcmp(key, "O") != 0) { + Attribute::Type type = Attribute::getTypeForName(key, this); + + // Check if the attribute is already defined. + if (keepExisting) { + GBool exists = gFalse; + for (unsigned j = 0; j < getNumAttributes(); j++) { + if (getAttribute(j)->getType() == type) { + exists = gTrue; + break; + } + } + if (exists) + continue; + } + + if (type != Attribute::Unknown) { + Object value; + GBool typeCheckOk = gTrue; + Attribute *attribute = new Attribute(type, attributes->getVal(i, &value)); + value.free(); + + if (attribute->isOk() && (typeCheckOk = attribute->checkType(this))) { + appendAttribute(attribute); + } else { + // It is not needed to free "value", the Attribute instance + // owns the contents, so deleting "attribute" is enough. + if (!typeCheckOk) { + error(errSyntaxWarning, -1, "Attribute {0:s} value is of wrong type ({1:s})", + attribute->getTypeName(), attribute->getValue()->getTypeName()); + } + delete attribute; + } + } else { + error(errSyntaxWarning, -1, "Wrong Attribute '{0:s}' in element {1:s}", key, getTypeName()); + } + } + } + } else { + error(errSyntaxWarning, -1, "O object is invalid value ({0:s})", owner.getName()); + } + } else if (!owner.isNull()) { + error(errSyntaxWarning, -1, "O is wrong type ({0:s})", owner.getTypeName()); + } + owner.free(); +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/StructElement.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/StructElement.h new file mode 100644 index 00000000000..cd89a970ddb --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/StructElement.h @@ -0,0 +1,310 @@ +//======================================================================== +// +// StructElement.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2013, 2014 Igalia S.L. +// Copyright 2014 Luigi Scarso <luigi.scarso@gmail.com> +// Copyright 2014 Albert Astals Cid <aacid@kde.org> +// +//======================================================================== + +#ifndef STRUCTELEMENT_H +#define STRUCTELEMENT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "goo/GooString.h" +#include "MarkedContentOutputDev.h" +#include "Object.h" +#include <vector> +#include <set> + +class GooString; +class Dict; +class StructElement; +class StructTreeRoot; + + +class Attribute { +public: + enum Type { + Unknown = 0, // Uninitialized, parsing error, etc. + UserProperty, // User defined attribute (i.e. non-standard) + + // Common standard attributes + Placement, WritingMode, BackgroundColor, BorderColor, BorderStyle, + BorderThickness, Color, Padding, + + // Block element standard attributes + SpaceBefore, SpaceAfter, StartIndent, EndIndent, TextIndent, TextAlign, + BBox, Width, Height, BlockAlign, InlineAlign, TBorderStyle, TPadding, + + // Inline element standard attributes + BaselineShift, LineHeight, TextDecorationColor, TextDecorationThickness, + TextDecorationType, RubyAlign, RubyPosition, GlyphOrientationVertical, + + // Column-only standard attributes + ColumnCount, ColumnGap, ColumnWidths, + + // List-only standard attributes + ListNumbering, + + // PrintField-only standard attributes + Role, checked, Desc, + + // Table-only standard attributes + RowSpan, ColSpan, Headers, Scope, Summary, + }; + + enum Owner { + UnknownOwner = 0, + // User-defined attributes + UserProperties, + // Standard attributes + Layout, List, PrintField, Table, + // Translation to other formats + XML_1_00, HTML_3_20, HTML_4_01, OEB_1_00, RTF_1_05, CSS_1_00, CSS_2_00, + }; + + // Creates a standard attribute. The name is predefined, and the + // value is type-checked to conform to the PDF specification. + Attribute(Type type, Object *value); + + // Creates an UserProperty attribute, with an arbitrary name and value. + Attribute(const char *name, int nameLen, Object *value); + + GBool isOk() const { return type != Unknown; } + + // Name, type and value can be set only on construction. + Type getType() const { return type; } + Owner getOwner() const { return owner; } + const char *getTypeName() const; + const char *getOwnerName() const; + Object *getValue() const { return &value; } + static Object *getDefaultValue(Type type); + + // The caller gets the ownership of the return GooString and is responsible of deleting it + GooString *getName() const { return type == UserProperty ? name.copy() : new GooString(getTypeName()); } + + // The revision is optional, and defaults to zero. + Guint getRevision() const { return revision; } + void setRevision(Guint revisionA) { revision = revisionA; } + + // Hidden elements should not be displayed by the user agent + GBool isHidden() const { return hidden; } + void setHidden(GBool hiddenA) { hidden = hiddenA; } + + // The formatted value may be in the PDF, or be left undefined (NULL). + // In the later case the user agent should provide a default representation. + const char *getFormattedValue() const { return formatted ? formatted->getCString() : NULL; } + void setFormattedValue(const char *formattedA); + + ~Attribute(); + +private: + Type type; + Owner owner; + Guint revision; + mutable GooString name; + mutable Object value; + GBool hidden; + GooString *formatted; + + GBool checkType(StructElement *element = NULL); + static Type getTypeForName(const char *name, StructElement *element = NULL); + static Attribute *parseUserProperty(Dict *property); + + friend class StructElement; +}; + + +class StructElement { +public: + enum Type { + Unknown = 0, + MCID, // MCID reference, used internally + OBJR, // Object reference, used internally + + Document, Part, Art, Sect, Div, // Structural elements + + Span, Quote, Note, Reference, BibEntry, // Inline elements + Code, Link, Annot, + BlockQuote, Caption, NonStruct, + TOC, TOCI, Index, Private, + + P, H, H1, H2, H3, H4, H5, H6, // Paragraph-like + + L, LI, Lbl, LBody, // List elements + + Table, TR, TH, TD, THead, TFoot, TBody, // Table elements + + Ruby, RB, RT, RP, // Ruby text elements + Warichu, WT, WP, + + Figure, Formula, Form, // Illustration-like elements + }; + + static const Ref InvalidRef; + + const char *getTypeName() const; + Type getType() const { return type; } + GBool isOk() const { return type != Unknown; } + GBool isBlock() const; + GBool isInline() const; + GBool isGrouping() const; + + inline GBool isContent() const { return (type == MCID) || isObjectRef(); } + inline GBool isObjectRef() const { return (type == OBJR && c->ref.num != -1 && c->ref.gen != -1); } + + int getMCID() const { return c->mcid; } + Ref getObjectRef() const { return c->ref; } + Ref getParentRef() { return isContent() ? parent->getParentRef() : s->parentRef.getRef(); } + GBool hasPageRef() const; + GBool getPageRef(Ref& ref) const; + StructTreeRoot *getStructTreeRoot() { return treeRoot; } + + // Optional element identifier. + const GooString *getID() const { return isContent() ? NULL : s->id; } + GooString *getID() { return isContent() ? NULL : s->id; } + + // Optional ISO language name, e.g. en_US + GooString *getLanguage() { + if (!isContent() && s->language) return s->language; + return parent ? parent->getLanguage() : NULL; + } + const GooString *getLanguage() const { + if (!isContent() && s->language) return s->language; + return parent ? parent->getLanguage() : NULL; + } + + // Optional revision number, defaults to zero. + Guint getRevision() const { return isContent() ? 0 : s->revision; } + void setRevision(Guint revision) { if (isContent()) s->revision = revision; } + + // Optional element title, in human-readable form. + const GooString *getTitle() const { return isContent() ? NULL : s->title; } + GooString *getTitle() { return isContent() ? NULL : s->title; } + + // Optional element expanded abbreviation text. + const GooString *getExpandedAbbr() const { return isContent() ? NULL : s->expandedAbbr; } + GooString *getExpandedAbbr() { return isContent() ? NULL : s->expandedAbbr; } + + unsigned getNumChildren() const { return isContent() ? 0 : s->elements.size(); } + const StructElement *getChild(int i) const { return isContent() ? NULL : s->elements.at(i); } + StructElement *getChild(int i) { return isContent() ? NULL : s->elements.at(i); } + + void appendChild(StructElement *element) { + if (!isContent() && element && element->isOk()) { + s->elements.push_back(element); + } + } + + unsigned getNumAttributes() const { return isContent() ? 0 : s->attributes.size(); } + const Attribute *getAttribute(int i) const { return isContent() ? NULL : s->attributes.at(i); } + Attribute *getAttribute(int i) { return isContent() ? NULL : s->attributes.at(i); } + + void appendAttribute(Attribute *attribute) { + if (!isContent() && attribute) { + s->attributes.push_back(attribute); + } + } + + const Attribute* findAttribute(Attribute::Type attributeType, GBool inherit = gFalse, + Attribute::Owner owner = Attribute::UnknownOwner) const; + + const GooString *getAltText() const { return isContent() ? NULL : s->altText; } + GooString *getAltText() { return isContent() ? NULL : s->altText; } + + const GooString *getActualText() const { return isContent() ? NULL : s->actualText; } + GooString *getActualText() { return isContent() ? NULL : s->actualText; } + + // Content text referenced by the element: + // + // - For MCID reference elements, this is just the text of the + // corresponding marked content object in the page stream, regardless + // of the setting of the "recursive" flag. + // - For other elements, if the "recursive" flag is set, the text + // enclosed by *all* the child MCID reference elements of the subtree + // is returned. The text is assembled by traversing the leaf MCID + // reference elements in logical order. + // - In any other case, the function returns NULL. + // + // A new string is returned, and the ownership passed to the caller. + // + GooString *getText(GBool recursive = gTrue) const { + return appendSubTreeText(NULL, recursive); + } + + const TextSpanArray getTextSpans() const { + if (!isContent()) + return TextSpanArray(); + MarkedContentOutputDev mcdev(getMCID()); + return getTextSpansInternal(mcdev); + } + + ~StructElement(); + +private: + GooString* appendSubTreeText(GooString *string, GBool recursive) const; + const TextSpanArray& getTextSpansInternal(MarkedContentOutputDev& mcdev) const; + + typedef std::vector<Attribute*> AttrPtrArray; + typedef std::vector<StructElement*> ElemPtrArray; + + struct StructData { + Object parentRef; + GooString *altText; + GooString *actualText; + GooString *id; + GooString *title; + GooString *expandedAbbr; + GooString *language; + Guint revision; + ElemPtrArray elements; + AttrPtrArray attributes; + + StructData(); + ~StructData(); + }; + + // Data in content elements (MCID, MCR) + struct ContentData { + union { + int mcid; + Ref ref; + }; + + ContentData(int mcidA): mcid(mcidA) {} + ContentData(const Ref& r) { ref.num = r.num; ref.gen = r.gen; } + }; + + // Common data + Type type; + StructTreeRoot *treeRoot; + StructElement *parent; + mutable Object pageRef; + + union { + StructData *s; + ContentData *c; + }; + + StructElement(Dict *elementDict, StructTreeRoot *treeRootA, StructElement *parentA, std::set<int> &seen); + StructElement(int mcid, StructTreeRoot *treeRootA, StructElement *parentA); + StructElement(const Ref &ref, StructTreeRoot *treeRootA, StructElement *parentA); + + void parse(Dict* elementDict); + StructElement* parseChild(Object *ref, Object* childObj, std::set<int> &seen); + void parseChildren(Dict* element, std::set<int> &seen); + void parseAttributes(Dict *element, GBool keepExisting = gFalse); + + friend class StructTreeRoot; +}; + +#endif + diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/StructTreeRoot.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/StructTreeRoot.cc new file mode 100644 index 00000000000..e46e3e28388 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/StructTreeRoot.cc @@ -0,0 +1,175 @@ +//======================================================================== +// +// StructTreeRoot.cc +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2013, 2014 Igalia S.L. +// Copyright 2014 Fabio D'Urso <fabiodurso@hotmail.it> +// +//======================================================================== + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/GooString.h" +#include "StructTreeRoot.h" +#include "StructElement.h" +#include "PDFDoc.h" +#include "Object.h" +#include "Dict.h" +#include <set> +#include <assert.h> + + +StructTreeRoot::StructTreeRoot(PDFDoc *docA, Dict *structTreeRootDict): + doc(docA) +{ + assert(doc); + assert(structTreeRootDict); + parse(structTreeRootDict); +} + +StructTreeRoot::~StructTreeRoot() +{ + for (ElemPtrArray::iterator i = elements.begin(); i != elements.end(); ++i) + delete *i; + classMap.free(); + roleMap.free(); +} + +void StructTreeRoot::parse(Dict *root) +{ + // The RoleMap/ClassMap dictionaries are needed by all the parsing + // functions, which will resolve the custom names to canonical + // standard names. + root->lookup("RoleMap", &roleMap); + root->lookup("ClassMap", &classMap); + + // ParentTree (optional). If present, it must be a number tree, + // otherwise it is not possible to map stream objects to their + // corresponsing structure element. Here only the references are + // loaded into the array, the pointers to the StructElements will + // be filled-in later when parsing them. + Object obj; + if (root->lookup("ParentTree", &obj)->isDict()) { + Object nums; + if (obj.dictLookup("Nums", &nums)->isArray()) { + if (nums.arrayGetLength() % 2 == 0) { + parentTree.resize(nums.arrayGetLength() / 2); + // Index numbers in even positions, references in odd ones + for (int i = 0; i < nums.arrayGetLength(); i += 2) { + Object index, value; + + if (!nums.arrayGet(i, &index)->isInt()) { + error(errSyntaxError, -1, "Nums item at position {0:d} is wrong type ({1:s})", i, index.getTypeName()); + index.free(); + continue; + } + if (index.getInt() < 0) { + error(errSyntaxError, -1, "Nums item at position {0:d} is invalid value ({1:d})", i, index.getInt()); + index.free(); + continue; + } + + const unsigned idx = index.getInt(); + if (nums.arrayGetNF(i + 1, &value)->isRef()) { + parentTree[idx].resize(1); + parentTree[idx][0].ref = value.getRef(); + } else if (nums.arrayGet(i + 1, &value)->isArray()) { + parentTree[idx].resize(value.arrayGetLength()); + for (int j = 0; j < value.arrayGetLength(); j++) { + Object itemvalue; + if (value.arrayGetNF(j, &itemvalue)->isRef()) + parentTree[idx][j].ref = itemvalue.getRef(); + else + error(errSyntaxError, -1, "Nums array item at position {0:d}/{1:d} is invalid type ({2:s})", i, j, itemvalue.getTypeName()); + itemvalue.free(); + } + } else { + error(errSyntaxError, -1, "Nums item at position {0:d} is wrong type ({1:s})", i + 1, value.getTypeName()); + } + + value.free(); + index.free(); + } + } else { + error(errSyntaxError, -1, "Nums array length is not a even ({0:d})", nums.arrayGetLength()); + } + } else { + error(errSyntaxError, -1, "Nums object is wrong type ({0:s})", nums.getTypeName()); + } + nums.free(); + } + obj.free(); + + std::set<int> seenElements; + + // Parse the children StructElements + const GBool marked = doc->getCatalog()->getMarkInfo() & Catalog::markInfoMarked; + Object kids; + if (root->lookup("K", &kids)->isArray()) { + if (marked && kids.arrayGetLength() > 1) { + error(errSyntaxWarning, -1, "K in StructTreeRoot has more than one children in a tagged PDF"); + } + for (int i = 0; i < kids.arrayGetLength(); i++) { + Object obj, ref; + kids.arrayGetNF(i, &ref); + if (ref.isRef()) { + seenElements.insert(ref.getRefNum()); + } + if (kids.arrayGet(i, &obj)->isDict()) { + StructElement *child = new StructElement(obj.getDict(), this, NULL, seenElements); + if (child->isOk()) { + if (marked && !(child->getType() == StructElement::Document || + child->getType() == StructElement::Part || + child->getType() == StructElement::Art || + child->getType() == StructElement::Div)) { + error(errSyntaxWarning, -1, "StructTreeRoot element of tagged PDF is wrong type ({0:s})", child->getTypeName()); + } + appendChild(child); + if (ref.isRef()) { + parentTreeAdd(ref.getRef(), child); + } + } else { + error(errSyntaxWarning, -1, "StructTreeRoot element could not be parsed"); + delete child; + } + } else { + error(errSyntaxWarning, -1, "K has a child of wrong type ({0:s})", obj.getTypeName()); + } + obj.free(); + ref.free(); + } + } else if (kids.isDict()) { + if (marked) { + error(errSyntaxWarning, -1, "K has a child of wrong type for a tagged PDF ({0:s})", kids.getTypeName()); + } + StructElement *child = new StructElement(kids.getDict(), this, NULL, seenElements); + if (child->isOk()) { + appendChild(child); + Object ref; + if (root->lookupNF("K", &ref)->isRef()) + parentTreeAdd(ref.getRef(), child); + ref.free(); + } else { + error(errSyntaxWarning, -1, "StructTreeRoot element could not be parsed"); + delete child; + } + } else if (!kids.isNull()) { + error(errSyntaxWarning, -1, "K in StructTreeRoot is wrong type ({0:s})", kids.getTypeName()); + } + + kids.free(); +} + +void StructTreeRoot::parentTreeAdd(const Ref &objectRef, StructElement *element) +{ + for (std::vector< std::vector<Parent> >::iterator i = parentTree.begin(); i != parentTree.end(); ++i) { + for (std::vector<Parent>::iterator j = i->begin(); j != i->end(); ++j) { + if (j->ref.num == objectRef.num && j->ref.gen == objectRef.gen) + j->element = element; + } + } +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/StructTreeRoot.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/StructTreeRoot.h new file mode 100644 index 00000000000..3b1f3c84421 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/StructTreeRoot.h @@ -0,0 +1,83 @@ +//======================================================================== +// +// StructTreeRoot.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright 2013, 2014 Igalia S.L. +// +//======================================================================== + +#ifndef STRUCTTREEROOT_H +#define STRUCTTREEROOT_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "goo/gtypes.h" +#include "Object.h" +#include "StructElement.h" +#include <vector> + +class Dict; +class PDFDoc; + + +class StructTreeRoot +{ +public: + StructTreeRoot(PDFDoc *docA, Dict *rootDict); + ~StructTreeRoot(); + + PDFDoc *getDoc() { return doc; } + Dict *getRoleMap() { return roleMap.isDict() ? roleMap.getDict() : NULL; } + Dict *getClassMap() { return classMap.isDict() ? classMap.getDict() : NULL; } + unsigned getNumChildren() const { return elements.size(); } + const StructElement *getChild(int i) const { return elements.at(i); } + StructElement *getChild(int i) { return elements.at(i); } + + void appendChild(StructElement *element) { + if (element && element->isOk()) { + elements.push_back(element); + } + } + + const StructElement *findParentElement(unsigned index) const { + if (index < parentTree.size() && parentTree[index].size() == 1) { + return parentTree[index][0].element; + } + return NULL; + } + +private: + typedef std::vector<StructElement*> ElemPtrArray; + + // Structure for items in /ParentTree, it keeps a mapping of + // object references and pointers to StructElement objects. + struct Parent { + Ref ref; + StructElement *element; + + Parent(): element(NULL) { ref.num = ref.gen = -1; } + Parent(const Parent &p): element(p.element) { + ref.num = p.ref.num; + ref.gen = p.ref.gen; + } + ~Parent() {} + }; + + PDFDoc *doc; + Object roleMap; + Object classMap; + ElemPtrArray elements; + std::vector< std::vector<Parent> > parentTree; + + void parse(Dict *rootDict); + void parentTreeAdd(const Ref &objectRef, StructElement *element); + + friend class StructElement; +}; + +#endif + diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/TextOutputDev.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/TextOutputDev.cc new file mode 100644 index 00000000000..bbb371a30b8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/TextOutputDev.cc @@ -0,0 +1,5818 @@ +//======================================================================== +// +// 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-2013 Carlos Garcia Campos <carlosgc@gnome.org> +// Copyright (C) 2006, 2007, 2013 Ed Catmur <ed@catmur.co.uk> +// Copyright (C) 2006 Jeff Muizelaar <jeff@infidigm.net> +// Copyright (C) 2007, 2008, 2012 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2008 Koji Otani <sho@bbr.jp> +// Copyright (C) 2008, 2010-2012, 2014, 2015 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 Marek Kasik <mkasik@redhat.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> +// Copyright (C) 2012, 2013-2015 Jason Crain <jason@aquaticape.us> +// Copyright (C) 2012 Peter Breitenlohner <peb@mppmu.mpg.de> +// Copyright (C) 2013 José Aliste <jaliste@src.gnome.org> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2013 Ed Catmur <ed@catmur.co.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> + +#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 "UTF.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.5 + +// 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 + +// Max distance between characters when combining a base character and +// combining character +#define combMaxMidDelta 0.3 +#define combMaxBaseDelta 0.4 + +//------------------------------------------------------------------------ +// 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; +} + +double TextFontInfo::getAscent() { + return gfxFont ? gfxFont->getAscent() : 0.95; +} + +double TextFontInfo::getDescent() { + return gfxFont ? gfxFont->getDescent() : -0.35; +} + +int TextFontInfo::getWMode() { + return gfxFont ? gfxFont->getWMode() : 0; +} + +//------------------------------------------------------------------------ +// TextWord +//------------------------------------------------------------------------ + +TextWord::TextWord(GfxState *state, int rotA, double fontSizeA) { + rot = rotA; + fontSize = fontSizeA; + text = NULL; + charcode = NULL; + edge = NULL; + charPos = NULL; + font = NULL; + textMat = 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); + gfree(font); + gfree(textMat); +} + +void TextWord::addChar(GfxState *state, TextFontInfo *fontA, double x, double y, + double dx, double dy, int charPosA, int charLen, + CharCode c, Unicode u, const Matrix &textMatA) { + ensureCapacity(len+1); + text[len] = u; + charcode[len] = c; + charPos[len] = charPosA; + charPos[len + 1] = charPosA + charLen; + font[len] = fontA; + textMat[len] = textMatA; + + if (len == 0) + setInitialBounds(fontA, x, y); + + 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: + edge[len] = x - fontSize; + xMax = edge[len+1] = x; + break; + case 1: + edge[len] = y - fontSize; + yMax = edge[len+1] = y; + break; + case 2: + edge[len] = x + fontSize; + xMin = edge[len+1] = x; + break; + case 3: + edge[len] = y + fontSize; + yMin = edge[len+1] = y; + break; + } + } else { // horizontal writing mode + switch (rot) { + case 0: + edge[len] = x; + xMax = edge[len+1] = x + dx; + break; + case 1: + edge[len] = y; + yMax = edge[len+1] = y + dy; + break; + case 2: + edge[len] = x; + xMin = edge[len+1] = x + dx; + break; + case 3: + edge[len] = y; + yMin = edge[len+1] = y + dy; + break; + } + } + ++len; +} + +void TextWord::setInitialBounds(TextFontInfo *fontA, double x, double y) { + double ascent = fontA->getAscent() * fontSize; + double descent = fontA->getDescent() * fontSize; + wMode = fontA->getWMode(); + + 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: + xMin = x - fontSize; + yMin = y - fontSize; + yMax = y; + base = y; + break; + case 1: + xMin = x; + yMin = y - fontSize; + xMax = x + fontSize; + base = x; + break; + case 2: + yMin = y; + xMax = x + fontSize; + yMax = y + fontSize; + base = y; + break; + case 3: + xMin = x - fontSize; + xMax = x; + yMax = y + fontSize; + base = x; + break; + } + } else { // horizontal writing mode + switch (rot) { + case 0: + xMin = x; + 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; + yMin = y; + 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; + xMax = x; + 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; + yMax = y; + 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; + } + } +} + +void TextWord::ensureCapacity(int capacity) { + if (capacity > size) { + size = std::max(size + 16, capacity); + 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)); + font = (TextFontInfo **)greallocn(font, size, sizeof(TextFontInfo *)); + textMat = (Matrix *)greallocn(textMat, size, sizeof(Matrix)); + } +} + +struct CombiningTable { + Unicode base; + Unicode comb; +}; + +static struct CombiningTable combiningTable[] = { + {0x0060, 0x0300}, // grave + {0x00a8, 0x0308}, // dieresis + {0x00af, 0x0304}, // macron + {0x00b4, 0x0301}, // acute + {0x00b8, 0x0327}, // cedilla + {0x02c6, 0x0302}, // circumflex + {0x02c7, 0x030c}, // caron + {0x02d8, 0x0306}, // breve + {0x02d9, 0x0307}, // dotaccent + {0x02da, 0x030a}, // ring + {0x02dc, 0x0303}, // tilde + {0x02dd, 0x030b} // hungarumlaut (double acute accent) +}; + +// returning combining versions of characters +Unicode getCombiningChar(Unicode u) { + int len = sizeof(combiningTable) / sizeof(combiningTable[0]); + for (int i = 0; i < len; ++i) { + if (u == combiningTable[i].base) + return combiningTable[i].comb; + } + return 0; +} + +GBool TextWord::addCombining(GfxState *state, TextFontInfo *fontA, double fontSizeA, double x, double y, + double dx, double dy, int charPosA, int charLen, + CharCode c, Unicode u, const Matrix &textMatA) { + if (len == 0 || wMode != 0 || fontA->getWMode() != 0) + return gFalse; + + Unicode cCurrent = getCombiningChar(u); + Unicode cPrev = getCombiningChar(text[len-1]); + double edgeMid = (edge[len-1] + edge[len]) / 2; + double charMid, maxScaledMidDelta, charBase, maxScaledBaseDelta; + + if (cCurrent != 0 && unicodeTypeAlphaNum(text[len-1])) { + // Current is a combining character, previous is base character + maxScaledMidDelta = fabs(edge[len] - edge[len-1]) * combMaxMidDelta; + charMid = charBase = maxScaledBaseDelta = 0; + + // Test if characters overlap + if (rot == 0 || rot == 2) { + charMid = x + (dx / 2); + charBase = y; + maxScaledBaseDelta = (yMax - yMin) * combMaxBaseDelta; + } else { + charMid = y + (dy / 2); + charBase = x; + maxScaledBaseDelta = (xMax - xMin) * combMaxBaseDelta; + } + + if (fabs(charMid - edgeMid) >= maxScaledMidDelta || + fabs(charBase - base) >= maxScaledBaseDelta) + return gFalse; + + // Add character, but don't adjust edge / bounding box because + // combining character's positioning could be odd. + ensureCapacity(len+1); + text[len] = cCurrent; + charcode[len] = c; + charPos[len] = charPosA; + charPos[len+1] = charPosA + charLen; + font[len] = fontA; + textMat[len] = textMatA; + edge[len+1] = edge[len]; + edge[len] = (edge[len+1] + edge[len-1]) / 2; + ++len; + return gTrue; + } + + if (cPrev != 0 && unicodeTypeAlphaNum(u)) { + // Previous is a combining character, current is base character + maxScaledBaseDelta = (fontA->getAscent() - fontA->getDescent()) * fontSizeA * combMaxBaseDelta; + charMid = charBase = maxScaledMidDelta = 0; + + // Test if characters overlap + if (rot == 0 || rot == 2) { + charMid = x + (dx / 2); + charBase = y; + maxScaledMidDelta = fabs(dx * combMaxMidDelta); + } else { + charMid = y + (dy / 2); + charBase = x; + maxScaledMidDelta = fabs(dy * combMaxMidDelta); + } + + if (fabs(charMid - edgeMid) >= maxScaledMidDelta || + fabs(charBase - base) >= maxScaledBaseDelta) + return gFalse; + + // move combining character to after base character + ensureCapacity(len+1); + fontSize = fontSizeA; + text[len] = cPrev; + charcode[len] = charcode[len-1]; + charPos[len] = charPosA; + charPos[len+1] = charPosA + charLen; + font[len] = font[len-1]; + textMat[len] = textMat[len-1]; + + text[len-1] = u; + charcode[len-1] = c; + font[len-1] = fontA; + textMat[len-1] = textMatA; + + if (len == 1) + setInitialBounds(fontA, x, y); + + // Updated edges / bounding box because we changed the base + // character. + if (wMode) { + switch (rot) { + case 0: + edge[len-1] = x - fontSize; + xMax = edge[len+1] = x; + break; + case 1: + edge[len-1] = y - fontSize; + yMax = edge[len+1] = y; + break; + case 2: + edge[len-1] = x + fontSize; + xMin = edge[len+1] = x; + break; + case 3: + edge[len-1] = y + fontSize; + yMin = edge[len+1] = y; + break; + } + } else { + switch (rot) { + case 0: + edge[len-1] = x; + xMax = edge[len+1] = x + dx; + break; + case 1: + edge[len-1] = y; + yMax = edge[len+1] = y + dy; + break; + case 2: + edge[len-1] = x; + xMin = edge[len+1] = x + dx; + break; + case 3: + edge[len-1] = y; + yMin = edge[len+1] = y + dy; + break; + } + } + + edge[len] = (edge[len+1] + edge[len-1]) / 2; + ++len; + return gTrue; + } + return gFalse; +} + +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; + } + ensureCapacity(len + word->len); + 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]; + font[len + i] = word->font[i]; + textMat[len + i] = word->textMat[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 + if (unlikely((word->base / textPoolStep) > INT_MAX)) { + error(errSyntaxWarning, -1, "word->base / textPoolStep > INT_MAX"); + return; + } + 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[word0->len - 1] == word1->font[0] && + 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(); + mergeCombining = gTrue; +} + +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); + int nameLen = name ? strlen(name) : 0; + GBool nameOneChar = nameLen == 1 || (nameLen > 1 && name[1] == '\0'); + if (nameOneChar && name[0] == 'm') { + mCode = code; + } + if (letterCode < 0 && nameOneChar && + ((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) { + 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 (gfxFont && gfxFont->getWMode()) { + rot = (rot + 1) & 3; + } + + curWord = new TextWord(state, rot, 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; + int wMode; + Matrix mat; + + // 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 || + x1 != x1 || y1 != y1 || // IEEE way of checking for isnan + w1 != w1 || h1 != h1) { + 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; + } + + state->getFontTransMat(&mat.m[0], &mat.m[1], &mat.m[2], &mat.m[3]); + mat.m[4] = x1; + mat.m[5] = y1; + + if (mergeCombining && curWord && uLen == 1 && + curWord->addCombining(state, curFont, curFontSize, x1, y1, w1, h1, charPos, nBytes, c, + u[0], mat)) { + charPos += nBytes; + 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 + // (5) the WMode 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; + wMode = curFont->getWMode(); + if (overlap || lastCharOverlap || + sp < -minDupBreakOverlap * curWord->fontSize || + sp > minWordBreakSpace * curWord->fontSize || + fabs(base - curWord->base) > 0.5 || + curFontSize != curWord->fontSize || + wMode != curWord->wMode) { + endWord(); + } + lastCharOverlap = overlap; + } else { + lastCharOverlap = gFalse; + } + + if (uLen != 0) { + // start a new word if needed + if (!curWord) { + beginWord(state); + } + + // 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); + 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) { + curWord->addChar(state, curFont, x1 + i*w1, y1 + i*h1, w1, h1, charPos, nBytes, c, u[i], mat); + } + } + 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) { + if (!wholeWord || + ((j == 0 || !unicodeTypeAlphaNum(txt[j - 1])) && + (j + len == m || !unicodeTypeAlphaNum(txt[j + 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); + void endPage(); + + GooString *getText(void); + GooList **takeWordList(int *nLines); + +private: + + void startLine(); + void finishLine(); + + GooList **lines; + int nLines, linesSize; + GooList *words; + int tableId; + TextBlock *currentBlock; +}; + +TextSelectionDumper::TextSelectionDumper(TextPage *page) + : TextSelectionVisitor(page) +{ + linesSize = 256; + lines = (GooList **)gmallocn(linesSize, sizeof(GooList *)); + nLines = 0; + + tableId = -1; + currentBlock = NULL; + words = NULL; +} + +TextSelectionDumper::~TextSelectionDumper() +{ + for (int i = 0; i < nLines; i++) + deleteGooList(lines[i], TextWordSelection); + gfree(lines); +} + +void TextSelectionDumper::startLine() +{ + finishLine(); + words = new GooList(); +} + +void TextSelectionDumper::finishLine() +{ + if (nLines == linesSize) { + linesSize *= 2; + lines = (GooList **)grealloc(lines, linesSize * sizeof(GooList *)); + } + + if (words && words->getLength() > 0) + lines[nLines++] = words; + else if (words) + delete words; + words = NULL; +} + +void TextSelectionDumper::visitLine (TextLine *line, + TextWord *begin, + TextWord *end, + int edge_begin, + int edge_end, + PDFRectangle *selection) +{ + TextLineFrag frag; + + frag.init(line, edge_begin, edge_end - edge_begin); + + if (tableId >= 0 && frag.line->blk->tableId < 0) { + finishLine(); + + tableId = -1; + currentBlock = NULL; + } + + if (frag.line->blk->tableId >= 0) { // a table + if (tableId == -1) { + tableId = frag.line->blk->tableId; + currentBlock = frag.line->blk; + } + + if (currentBlock == frag.line->blk) { // the same block + startLine(); + } else { // another block + if (currentBlock->tableEnd) { // previous block ended its row + startLine(); + } + currentBlock = frag.line->blk; + } + } else { // not a table + startLine(); + } +} + +void TextSelectionDumper::visitWord (TextWord *word, int begin, int end, + PDFRectangle *selection) +{ + words->append(new TextWordSelection(word, begin, end)); +} + +void TextSelectionDumper::endPage() +{ + finishLine(); +} + +GooString *TextSelectionDumper::getText (void) +{ + GooString *text; + int i, j; + UnicodeMap *uMap; + char space[8], eol[16]; + int spaceLen, eolLen; + + text = new GooString(); + + if (!(uMap = globalParams->getTextEncoding())) + return text; + + spaceLen = uMap->mapUnicode(0x20, space, sizeof(space)); + eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol)); + + for (i = 0; i < nLines; i++) { + GooList *lineWords = lines[i]; + for (j = 0; j < lineWords->getLength(); j++) { + TextWordSelection *sel = (TextWordSelection *)lineWords->get(j); + + page->dumpFragment (sel->word->text + sel->begin, sel->end - sel->begin, uMap, text); + if (j < lineWords->getLength() - 1) + text->append(space, spaceLen); + } + if (i < nLines - 1) + text->append(eol, eolLen); + } + + uMap->decRefCnt(); + + return text; +} + +GooList **TextSelectionDumper::takeWordList(int *nLinesOut) +{ + GooList **returnValue = lines; + + *nLinesOut = nLines; + if (nLines == 0) + return NULL; + + nLines = 0; + lines = NULL; + + return returnValue; +} + +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); + void endPage(); + +private: + OutputDev *out; + GfxColor *box_color, *glyph_color; + GfxState *state; + GooList *selectionList; + Matrix ctm, ictm; +}; + +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); + + selectionList = new GooList(); + state = new GfxState(72 * scale, 72 * scale, &box, rotation, gFalse); + + state->getCTM(&ctm); + ctm.invertTo(&ictm); + + out->startPage(0, state, NULL); + out->setDefaultCTM (state->getCTM()); + + state->setFillColorSpace(new GfxDeviceRGBColorSpace()); + state->setFillColor(box_color); + out->updateFillColor(state); +} + +TextSelectionPainter::~TextSelectionPainter() +{ + deleteGooList(selectionList, TextWordSelection); + 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; + + 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); + + 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); + + 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(); +} + +void TextSelectionPainter::visitWord (TextWord *word, int begin, int end, + PDFRectangle *selection) +{ + selectionList->append(new TextWordSelection(word, begin, end)); +} + +void TextSelectionPainter::endPage() +{ + out->fill(state); + + out->saveState(state); + out->clip(state); + + state->clearPath(); + + state->setFillColor(glyph_color); + out->updateFillColor(state); + + for (int i = 0; i < selectionList->getLength(); i++) { + TextWordSelection *sel = (TextWordSelection *) selectionList->get(i); + int begin = sel->begin; + + while (begin < sel->end) { + TextFontInfo *font = sel->word->font[begin]; + font->gfxFont->incRefCnt(); + Matrix *mat = &sel->word->textMat[begin]; + + state->setTextMat(mat->m[0], mat->m[1], mat->m[2], mat->m[3], 0, 0); + state->setFont(font->gfxFont, 1); + out->updateFont(state); + + int fEnd = begin + 1; + while (fEnd < sel->end && font->matches(sel->word->font[fEnd]) && + mat->m[0] == sel->word->textMat[fEnd].m[0] && + mat->m[1] == sel->word->textMat[fEnd].m[1] && + mat->m[2] == sel->word->textMat[fEnd].m[2] && + mat->m[3] == sel->word->textMat[fEnd].m[3]) + fEnd++; + + /* The only purpose of this string is to let the output device query + * it's length. Might want to change this interface later. */ + GooString *string = new GooString ((char *) sel->word->charcode, fEnd - begin); + out->beginString(state, string); + + for (int i = begin; i < fEnd; i++) { + if (i != begin && sel->word->charPos[i] == sel->word->charPos[i - 1]) + continue; + + out->drawChar(state, sel->word->textMat[i].m[4], sel->word->textMat[i].m[5], 0, 0, 0, 0, + sel->word->charcode[i], 1, NULL, 0); + } + out->endString(state); + delete string; + begin = fEnd; + } + } + + out->restoreState(state); + out->endPage (); +} + +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] >= fmin(xMax, pageWidth) && + y[i] >= fmin(yMax, pageHeight))) { + 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); + painter.endPage(); +} + +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); + dumper.endPage(); + + return dumper.getText(); +} + +GooList **TextPage::getSelectionWords(PDFRectangle *selection, + SelectionStyle style, + int *nLines) +{ + TextSelectionDumper dumper(this); + + visitSelection(&dumper, selection, style); + dumper.endPage(); + + return dumper.takeWordList(nLines); +} + +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::setMergeCombining(GBool merge) { + mergeCombining = merge; +} + +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) { + Unicode *uni = NULL; + int length; + + // 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() + length = TextStringToUCS4(actualText, &uni); + text->addChar(state, actualTextX0, actualTextY0, + actualTextX1 - actualTextX0, actualTextY1 - actualTextY0, + 0, actualTextNBytes, uni, length); + gfree(uni); + } + + 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, XRef *xref) { + 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); +} + +void TextOutputDev::setMergeCombining(GBool merge) { + text->setMergeCombining(merge); +} + +#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/Build/source/libs/poppler/poppler-0.36.0/poppler/TextOutputDev.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/TextOutputDev.h new file mode 100644 index 00000000000..2aab94f5d15 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/TextOutputDev.h @@ -0,0 +1,880 @@ +//======================================================================== +// +// 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, 2013 Carlos Garcia Campos <carlosgc@gnome.org> +// Copyright (C) 2007 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2008, 2010, 2015 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2010 Brian Ewins <brian.ewins@gmail.com> +// Copyright (C) 2012, 2013, 2015 Jason Crain <jason@aquaticape.us> +// Copyright (C) 2013 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 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); + + // Get the font ascent, or a default value if the font is not set + double getAscent(); + + // Get the font descent, or a default value if the font is not set + double getDescent(); + + // Get the writing mode (0 or 1), or 0 if the font is not set + int getWMode(); + +#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 fontSize); + + // Destructor. + ~TextWord(); + + // Add a character to the word. + void addChar(GfxState *state, TextFontInfo *fontA, double x, double y, + double dx, double dy, int charPosA, int charLen, + CharCode c, Unicode u, const Matrix &textMatA); + + // Attempt to add a character to the word as a combining character. + // Either character u or the last character in the word must be an + // acute, dieresis, or other combining character. Returns true if + // the character was added. + GBool addCombining(GfxState *state, TextFontInfo *fontA, double fontSizeA, double x, double y, + double dx, double dy, int charPosA, int charLen, + CharCode c, Unicode u, const Matrix &textMatA); + + // 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 a character. + TextFontInfo *getFontInfo(int idx) { return font[idx]; } + + // 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(int idx) { return font[idx]->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: + void ensureCapacity(int capacity); + void setInitialBounds(TextFontInfo *fontA, double x, double y); + + 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/font arrays + int size; // size of text/edge/charPos/font arrays + TextFontInfo **font; // font information for each char + Matrix *textMat; // transformation matrix for each char + 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 + int wMode; // horizontal (0) or vertical (1) writing mode + +#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 + +class TextWordSelection { +public: + TextWordSelection(TextWord *word, int begin, int end) + : word(word), begin(begin), end(end) + { + } + + TextWord * getWord() const { return word; } + int getBegin() const { return begin; } + int getEnd() const { return end; } + +private: + TextWord *word; + int begin; + int end; + + friend class TextSelectionPainter; + friend class TextSelectionDumper; +}; + +//------------------------------------------------------------------------ +// 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); + + // 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); + + GooList **getSelectionWords(PDFRectangle *selection, + SelectionStyle style, + int *nLines); + + // 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 true, will combine characters when a base and combining + // character are drawn on eachother. + void setMergeCombining(GBool merge); + +#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 + GBool mergeCombining; // merge when combining and base characters + // are drawn on top of each other + + 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, XRef *xref); + + // 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 true, will combine characters when a base and combining + // character are drawn on eachother. + void setMergeCombining(GBool merge); + +#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/Build/source/libs/poppler/poppler-0.36.0/poppler/UTF.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/UTF.cc new file mode 100644 index 00000000000..46007b73006 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UTF.cc @@ -0,0 +1,116 @@ +//======================================================================== +// +// UTF.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) 2012 Adrian Johnson <ajohnson@redneon.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 "goo/gmem.h" +#include "PDFDocEncoding.h" +#include "UTF.h" + +bool UnicodeIsValid(Unicode ucs4) +{ + return (ucs4 < 0x110000) && + ((ucs4 & 0xfffff800) != 0xd800) && + (ucs4 < 0xfdd0 || ucs4 > 0xfdef) && + ((ucs4 & 0xfffe) != 0xfffe); +} + +int UTF16toUCS4(const Unicode *utf16, int utf16Len, Unicode **ucs4) +{ + int i, n, len; + Unicode *u; + + // count characters + len = 0; + for (i = 0; i < utf16Len; i++) { + if (utf16[i] >= 0xd800 && utf16[i] < 0xdc00 && i + 1 < utf16Len && + utf16[i+1] >= 0xdc00 && utf16[i+1] < 0xe000) { + i++; /* surrogate pair */ + } + len++; + } + if (ucs4 == NULL) + return len; + + u = (Unicode*)gmallocn(len, sizeof(Unicode)); + n = 0; + // convert string + for (i = 0; i < utf16Len; i++) { + if (utf16[i] >= 0xd800 && utf16[i] < 0xdc00) { /* surrogate pair */ + if (i + 1 < utf16Len && utf16[i+1] >= 0xdc00 && utf16[i+1] < 0xe000) { + /* next code is a low surrogate */ + u[n] = (((utf16[i] & 0x3ff) << 10) | (utf16[i+1] & 0x3ff)) + 0x10000; + ++i; + } else { + /* missing low surrogate + replace it with REPLACEMENT CHARACTER (U+FFFD) */ + u[n] = 0xfffd; + } + } else if (utf16[i] >= 0xdc00 && utf16[i] < 0xe000) { + /* invalid low surrogate + replace it with REPLACEMENT CHARACTER (U+FFFD) */ + u[n] = 0xfffd; + } else { + u[n] = utf16[i]; + } + if (!UnicodeIsValid(u[n])) { + u[n] = 0xfffd; + } + n++; + } + *ucs4 = u; + return len; +} + +int TextStringToUCS4(GooString *textStr, Unicode **ucs4) +{ + int i, len; + const char *s; + Unicode *u; + + len = textStr->getLength(); + s = textStr->getCString(); + if (len == 0) + return 0; + + if (textStr->hasUnicodeMarker()) { + Unicode *utf16; + len = len/2 - 1; + if (len > 0) { + utf16 = new Unicode[len]; + for (i = 0 ; i < len; i++) { + utf16[i] = (s[2 + i*2] & 0xff) << 8 | (s[3 + i*2] & 0xff); + } + len = UTF16toUCS4(utf16, len, &u); + delete[] utf16; + } else { + u = NULL; + } + } else { + u = (Unicode*)gmallocn(len, sizeof(Unicode)); + for (i = 0 ; i < len; i++) { + u[i] = pdfDocEncoding[s[i] & 0xff]; + } + } + *ucs4 = u; + return len; +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/UTF.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/UTF.h new file mode 100644 index 00000000000..248c168cca5 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UTF.h @@ -0,0 +1,39 @@ +//======================================================================== +// +// UTF.h +// +// This file is licensed under the GPLv2 or later +// +// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> +// +//======================================================================== + +#ifndef UTF_H +#define UTF_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "goo/GooString.h" +#include "CharTypes.h" + +// Convert a UTF-16 string to a UCS-4 +// utf16 - utf16 bytes +// utf16_len - number of UTF-16 characters +// ucs4_out - if not NULL, allocates and returns UCS-4 string. Free with gfree. +// returns number of UCS-4 characters +int UTF16toUCS4(const Unicode *utf16, int utf16_len, Unicode **ucs4_out); + +// Convert a PDF Text String to UCS-4 +// s - PDF text string +// ucs4 - if the number of UCS-4 characters is > 0, allocates and +// returns UCS-4 string. Free with gfree. +// returns number of UCS-4 characters +int TextStringToUCS4(GooString *textStr, Unicode **ucs4); + +// check if UCS-4 character is valid +bool UnicodeIsValid(Unicode ucs4); + + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/UTF8.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/UTF8.h new file mode 100644 index 00000000000..34a07d4082f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UTF8.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeCClassTables.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeCClassTables.h new file mode 100644 index 00000000000..62f9ecc3657 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeCClassTables.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeCompTables.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeCompTables.h new file mode 100644 index 00000000000..68e2f86aee9 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeCompTables.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeDecompTables.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeDecompTables.h new file mode 100644 index 00000000000..4bc34b18d99 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeDecompTables.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMap.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMap.cc new file mode 100644 index 00000000000..1319666779b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMap.cc @@ -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 <jwilk@jwilk.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/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMap.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMap.h new file mode 100644 index 00000000000..ba7df2cfb99 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMap.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMapTables.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMapTables.h new file mode 100644 index 00000000000..073e474e6be --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeMapTables.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeTypeTable.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeTypeTable.cc new file mode 100644 index 00000000000..721af9db6e5 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeTypeTable.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeTypeTable.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeTypeTable.h new file mode 100644 index 00000000000..869aad9e6c6 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/UnicodeTypeTable.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/ViewerPreferences.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/ViewerPreferences.cc new file mode 100644 index 00000000000..cba8d0ac512 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/ViewerPreferences.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/ViewerPreferences.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/ViewerPreferences.h new file mode 100644 index 00000000000..8cdc4d40a73 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/ViewerPreferences.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/XRef.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/XRef.cc new file mode 100644 index 00000000000..1bbbdc51c25 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/XRef.cc @@ -0,0 +1,1740 @@ +//======================================================================== +// +// 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-2014 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, 2013 Thomas Freitag <Thomas.Freitag@kabelmail.de> +// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013, 2014 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2013 Pino Toscano <pino@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 <stddef.h> +#include <string.h> +#include <math.h> +#include <ctype.h> +#include <limits.h> +#include <float.h> +#include "goo/gfile.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 + +#if MULTITHREADED +# define xrefLocker() MutexLocker locker(&mutex) +# define xrefCondLocker(X) MutexLocker locker(&mutex, (X)) +#else +# define xrefLocker() +# define xrefCondLocker(X) +#endif + +//------------------------------------------------------------------------ +// ObjectStream +//------------------------------------------------------------------------ + +class ObjectStream { +public: + + // Create an object stream, using object number <objStrNum>, + // generation 0. + ObjectStream(XRef *xref, int objStrNumA, int recursion = 0); + + 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, int recursion) { + Stream *str; + Parser *parser; + Goffset *offsets; + Object objStr, obj1, obj2; + Goffset first; + int i; + + objStrNum = objStrNumA; + nObjects = 0; + objs = NULL; + objNums = NULL; + ok = gFalse; + + if (!xref->fetch(objStrNum, 0, &objStr, recursion)->isStream()) { + goto err1; + } + + if (!objStr.streamGetDict()->lookup("N", &obj1, recursion)->isInt()) { + obj1.free(); + goto err1; + } + nObjects = obj1.getInt(); + obj1.free(); + if (nObjects <= 0) { + goto err1; + } + + objStr.streamGetDict()->lookup("First", &obj1, recursion); + if (!obj1.isInt() && !obj1.isInt64()) { + obj1.free(); + goto err1; + } + if (obj1.isInt()) + first = obj1.getInt(); + else + first = obj1.getInt64(); + 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 = (Goffset *)gmallocn(nObjects, sizeof(Goffset)); + + // 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() || obj2.isInt64())) { + obj1.free(); + obj2.free(); + delete parser; + gfree(offsets); + goto err1; + } + objNums[i] = obj1.getInt(); + if (obj2.isInt()) + offsets[i] = obj2.getInt(); + else + offsets[i] = obj2.getInt64(); + 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 (Goffset pos = first; pos < offsets[0]; ++pos) { + 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() { +#if MULTITHREADED + gInitMutex(&mutex); +#endif + ok = gTrue; + errCode = errNone; + entries = NULL; + capacity = 0; + size = 0; + streamEnds = NULL; + streamEndsLen = 0; + objStrs = new PopplerCache(5); + mainXRefEntriesOffset = 0; + xRefStream = gFalse; + scannedSpecialFlags = gFalse; + encrypted = gFalse; + permFlags = defPermFlags; + ownerPasswordOk = gFalse; + rootNum = -1; + strOwner = gFalse; +} + +XRef::XRef() { + init(); +} + +XRef::XRef(Object *trailerDictA) { + init(); + + if (trailerDictA->isDict()) + trailerDict.initDict(trailerDictA->getDict()); +} + +XRef::XRef(BaseStream *strA, Goffset pos, Goffset mainXRefEntriesOffsetA, GBool *wasReconstructed, GBool reconstruct) { + Object obj; + + init(); + mainXRefEntriesOffset = mainXRefEntriesOffsetA; + + // read the trailer + str = strA; + start = str->getStart(); + prevXRefOffset = mainXRefOffset = 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<Goffset> followedXRefStm; + readXRef(&prevXRefOffset, &followedXRefStm, NULL); + + // 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; + } + if (strOwner) { + delete str; + } +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif +} + +XRef *XRef::copy() { + XRef *xref = new XRef(); + xref->str = str->copy(); + xref->strOwner = gTrue; + xref->encrypted = encrypted; + xref->permFlags = permFlags; + xref->ownerPasswordOk = ownerPasswordOk; + xref->rootGen = rootGen; + xref->rootNum = rootNum; + + xref->start = start; + xref->prevXRefOffset = prevXRefOffset; + xref->mainXRefEntriesOffset = mainXRefEntriesOffset; + xref->xRefStream = xRefStream; + trailerDict.copy(&xref->trailerDict); + xref->encAlgorithm = encAlgorithm; + xref->encRevision = encRevision; + xref->encVersion = encVersion; + xref->permFlags = permFlags; + xref->keyLength = keyLength; + xref->permFlags = permFlags; + for (int i = 0; i < 32; i++) { + xref->fileKey[i] = fileKey[i]; + } + + if (xref->reserve(size) == 0) { + error(errSyntaxError, -1, "unable to allocate {0:d} entries", size); + delete xref; + return NULL; + } + xref->size = size; + for (int i = 0; i < size; ++i) { + xref->entries[i].offset = entries[i].offset; + xref->entries[i].type = entries[i].type; + xref->entries[i].obj.initNull (); + xref->entries[i].flags = entries[i].flags; + xref->entries[i].gen = entries[i].gen; + } + xref->streamEndsLen = streamEndsLen; + if (streamEndsLen != 0) { + xref->streamEnds = (Goffset *)gmalloc(streamEndsLen * sizeof(Goffset)); + for (int i = 0; i < streamEndsLen; i++) { + xref->streamEnds[i] = streamEnds[i]; + } + } + return xref; +} + +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 = -1; + entries[i].type = xrefEntryNone; + entries[i].obj.initNull (); + entries[i].flags = 0; + 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). + * Arguments: + * pos Points to a Goffset containing the offset of the XRef + * section to be read. If a prev pointer is found, *pos is + * updated with its value + * followedXRefStm Used in case of nested readXRef calls to spot circular + * references in XRefStm pointers + * xrefStreamObjsNum If not NULL, every time a XRef stream is encountered, + * its object number is appended + * Return value: + * gTrue if a prev pointer is found, otherwise gFalse + */ +GBool XRef::readXRef(Goffset *pos, std::vector<Goffset> *followedXRefStm, std::vector<int> *xrefStreamObjsNum) { + 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, xrefStreamObjsNum); + + // parse an xref stream + } else if (obj.isInt()) { + const int objNum = obj.getInt(); + 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; + } + if (xrefStreamObjsNum) { + xrefStreamObjsNum->push_back(objNum); + } + 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, Goffset *pos, std::vector<Goffset> *followedXRefStm, std::vector<int> *xrefStreamObjsNum) { + XRefEntry entry; + GBool more; + Object obj, obj2; + Goffset 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) { + parser->getObj(&obj, gTrue); + if (obj.isInt()) { + entry.offset = obj.getInt(); + } else if (obj.isInt64()) { + entry.offset = obj.getInt64(); + } else { + goto err1; + } + obj.free(); + if (!parser->getObj(&obj, gTrue)->isInt()) { + goto err1; + } + entry.gen = obj.getInt(); + entry.obj.initNull (); + entry.flags = 0; + 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 == -1) { + 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 = -1; + } + } + } + } + + // read the trailer dictionary + if (!parser->getObj(&obj)->isDict()) { + goto err1; + } + + // get the 'Prev' pointer + obj.getDict()->lookupNF("Prev", &obj2); + if (obj2.isInt() || obj2.isInt64()) { + if (obj2.isInt()) + pos2 = obj2.getInt(); + else + pos2 = obj2.getInt64(); + 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 + obj.getDict()->lookup("XRefStm", &obj2); + if (obj2.isInt() || obj2.isInt64()) { + if (obj2.isInt()) + pos2 = obj2.getInt(); + else + pos2 = obj2.getInt64(); + 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, xrefStreamObjsNum); + } + 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, Goffset *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) { + goto err1; + } + } + obj.free(); + if (w[0] > (int)sizeof(int) || w[1] > (int)sizeof(long long) || w[2] > (int)sizeof(int)) { + goto err1; + } + + 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 = obj.getInt(); + more = gTrue; + } else if (obj.isInt64()) { + *pos = obj.getInt64(); + 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) { + unsigned long long 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; + } + if (offset > (unsigned long long)GoffsetMax()) { + error(errSyntaxError, -1, "Offset inside xref table too large for fseek"); + return gFalse; + } + for (gen = 0, j = 0; j < w[2]; ++j) { + if ((c = xrefStr->getChar()) == EOF) { + return gFalse; + } + gen = (gen << 8) + c; + } + if (entries[i].offset == -1) { + 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]; + Goffset 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 = (Goffset *)greallocn(streamEnds, + streamEndsSize, sizeof(Goffset)); + } + 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; +} + +void XRef::getEncryptionParameters(Guchar **fileKeyA, CryptAlgorithm *encAlgorithmA, + int *keyLengthA) { + if (encrypted) { + *fileKeyA = fileKey; + *encAlgorithmA = encAlgorithm; + *keyLengthA = keyLength; + } else { + // null encryption parameters + *fileKeyA = NULL; + *encAlgorithmA = cryptRC4; + *keyLengthA = 0; + } +} + +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; + + xrefLocker(); + // 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 && !e->getFlag(XRefEntry::Unencrypted)) ? fileKey : 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, recursion + 1); + 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(); +} + +void XRef::lock() { +#if MULTITHREADED + gLockMutex(&mutex); +#endif +} + +void XRef::unlock() { +#if MULTITHREADED + gUnlockMutex(&mutex); +#endif +} + +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(Goffset streamStart, Goffset *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(Goffset offset) +{ + if (size > 0) + { + int res = 0; + Goffset 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, Goffset offs, GBool used) { + xrefLocker(); + 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 = -1; + entries[i].type = xrefEntryFree; + entries[i].obj.initNull (); + entries[i].flags = 0; + entries[i].gen = 0; + } + size = num + 1; + } + XRefEntry *e = getEntry(num); + e->gen = gen; + e->obj.initNull (); + e->flags = 0; + if (used) { + e->type = xrefEntryUncompressed; + e->offset = offs; + } else { + e->type = xrefEntryFree; + e->offset = 0; + } +} + +void XRef::setModifiedObject (Object* o, Ref r) { + xrefLocker(); + 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->setFlag(XRefEntry::Updated, gTrue); +} + +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->setFlag(XRefEntry::Updated, gTrue); + + Ref r; + r.num = entryIndexToUse; + r.gen = e->gen; + return r; +} + +void XRef::removeIndirectObject(Ref r) { + xrefLocker(); + 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->setFlag(XRefEntry::Updated, gTrue); +} + +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; + } + } + getEntry(lastFreeEntry)->offset = 0; + + 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(Goffset offset, int gen, XRefEntryType type) { + outStr->printf("%010lli %05i %c\r\n", (long long)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, int offsetSizeA) { + index = indexA; + stmBuf = stmBufA; + offsetSize = offsetSizeA; +} + +void XRef::XRefStreamWriter::startSection(int first, int count) { + Object obj; + index->arrayAdd( obj.initInt(first) ); + index->arrayAdd( obj.initInt(count) ); +} + +void XRef::XRefStreamWriter::writeEntry(Goffset offset, int gen, XRefEntryType type) { + const int entryTotalSize = 1 + offsetSize + 2; /* type + offset + gen */ + char data[16]; + data[0] = (type==xrefEntryFree) ? 0 : 1; + for (int i = offsetSize; i > 0; i--) { + data[i] = offset & 0xff; + offset >>= 8; + } + data[offsetSize + 1] = (gen >> 8) & 0xff; + data[offsetSize + 2] = gen & 0xff; + stmBuf->append(data, entryTotalSize); +} + +XRef::XRefPreScanWriter::XRefPreScanWriter() { + hasOffsetsBeyond4GB = gFalse; +} + +void XRef::XRefPreScanWriter::startSection(int first, int count) { +} + +void XRef::XRefPreScanWriter::writeEntry(Goffset offset, int gen, XRefEntryType type) { + if (offset >= 0x100000000ll) + hasOffsetsBeyond4GB = gTrue; +} + +void XRef::writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref) { + Object index; + index.initArray(xref); + stmBuf->clear(); + + // First pass: determine whether all offsets fit in 4 bytes or not + XRefPreScanWriter prescan; + writeXRef(&prescan, gFalse); + const int offsetSize = prescan.hasOffsetsBeyond4GB ? sizeof(Goffset) : 4; + + // Second pass: actually write the xref stream + XRefStreamWriter writer(&index, stmBuf, offsetSize); + 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(offsetSize) ); + obj2.arrayAdd( obj1.initInt(2) ); + xrefDict->set("W", &obj2); +} + +GBool XRef::parseEntry(Goffset 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(&obj1)->isInt64()) && + (parser.getObj(&obj2)->isInt()) && + (parser.getObj(&obj3)->isCmd("n") || obj3.isCmd("f"))) { + if (obj1.isInt64()) + entry->offset = obj1.getInt64(); + else + entry->offset = obj1.getInt(); + entry->gen = obj2.getInt(); + entry->type = obj3.isCmd("n") ? xrefEntryUncompressed : xrefEntryFree; + entry->obj.initNull (); + entry->flags = 0; + r = gTrue; + } else { + r = gFalse; + } + obj1.free(); + obj2.free(); + obj3.free(); + + return r; +} + +/* Traverse all XRef tables and, if untilEntryNum != -1, stop as soon as + * untilEntryNum is found, or try to reconstruct the xref table if it's not + * present in any xref. + * If xrefStreamObjsNum is not NULL, it is filled with the list of the object + * numbers of the XRef streams that have been traversed */ +void XRef::readXRefUntil(int untilEntryNum, std::vector<int> *xrefStreamObjsNum) +{ + std::vector<Goffset> followedPrev; + while (prevXRefOffset && (untilEntryNum == -1 || (untilEntryNum < size && entries[untilEntryNum].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<Goffset> followedXRefStm; + if (!readXRef(&prevXRefOffset, &followedXRefStm, xrefStreamObjsNum)) { + prevXRefOffset = 0; + } + + // if there was a problem with the xref table, or we haven't found the entry + // we were looking for, try to reconstruct the xref + if (!ok || (!prevXRefOffset && untilEntryNum != -1 && entries[untilEntryNum].type == xrefEntryNone)) { + GBool wasReconstructed = false; + if (!(ok = constructXRef(&wasReconstructed))) { + errCode = errDamaged; + break; + } + break; + } + } +} + +XRefEntry *XRef::getEntry(int i, GBool complainIfMissing) +{ + if (i >= size || 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 { + // Read XRef tables until the entry we're looking for is found + readXRefUntil(i); + + // 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.flags = 0; + return &dummy; + } + + if (entries[i].type == xrefEntryNone) { + if (complainIfMissing) { + error(errSyntaxError, -1, "Invalid XRef entry"); + } + entries[i].type = xrefEntryFree; + } + } + } + + return &entries[i]; +} + +// Recursively sets the Unencrypted flag in all referenced xref entries +void XRef::markUnencrypted(Object *obj) { + Object obj1; + + switch (obj->getType()) { + case objArray: + { + Array *array = obj->getArray(); + for (int i = 0; i < array->getLength(); i++) { + markUnencrypted(array->getNF(i, &obj1)); + obj1.free(); + } + break; + } + case objStream: + case objDict: + { + Dict *dict; + if (obj->getType() == objStream) { + Stream *stream = obj->getStream(); + dict = stream->getDict(); + } else { + dict = obj->getDict(); + } + for (int i = 0; i < dict->getLength(); i++) { + markUnencrypted(dict->getValNF(i, &obj1)); + obj1.free(); + } + break; + } + case objRef: + { + Ref ref = obj->getRef(); + XRefEntry *e = getEntry(ref.num); + if (e->getFlag(XRefEntry::Unencrypted)) + return; // We've already been here: prevent infinite recursion + e->setFlag(XRefEntry::Unencrypted, gTrue); + fetch(ref.num, ref.gen, &obj1); + markUnencrypted(&obj1); + obj1.free(); + break; + } + default: + break; + } +} + +void XRef::scanSpecialFlags() { + if (scannedSpecialFlags) { + return; + } + scannedSpecialFlags = gTrue; + + // "Rewind" the XRef linked list, so that readXRefUntil re-reads all XRef + // tables/streams, even those that had already been parsed + prevXRefOffset = mainXRefOffset; + + std::vector<int> xrefStreamObjNums; + if (!streamEndsLen) { // don't do it for already reconstructed xref + readXRefUntil(-1 /* read all xref sections */, &xrefStreamObjNums); + } + + // Mark object streams as DontRewrite, because we write each object + // individually in full rewrite mode. + for (int i = 0; i < size; ++i) { + if (entries[i].type == xrefEntryCompressed) { + const int objStmNum = entries[i].offset; + if (unlikely(objStmNum < 0 || objStmNum >= size)) { + error(errSyntaxError, -1, "Compressed object offset out of xref bounds"); + } else { + getEntry(objStmNum)->setFlag(XRefEntry::DontRewrite, gTrue); + } + } + } + + // Mark XRef streams objects as Unencrypted and DontRewrite + for (size_t i = 0; i < xrefStreamObjNums.size(); ++i) { + const int objNum = xrefStreamObjNums.at(i); + getEntry(objNum)->setFlag(XRefEntry::Unencrypted, gTrue); + getEntry(objNum)->setFlag(XRefEntry::DontRewrite, gTrue); + } + + // Mark objects referred from the Encrypt dict as Unencrypted + Object obj; + markUnencrypted(trailerDict.dictLookupNF("Encrypt", &obj)); + obj.free(); +} + +void XRef::markUnencrypted() { + // Mark objects referred from the Encrypt dict as Unencrypted + Object obj; + trailerDict.dictLookupNF("Encrypt", &obj); + if (obj.isRef()) { + XRefEntry *e = getEntry(obj.getRefNum()); + e->setFlag(XRefEntry::Unencrypted, gTrue); + } + obj.free(); +} + diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/XRef.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/XRef.h new file mode 100644 index 00000000000..70065d8963e --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/XRef.h @@ -0,0 +1,281 @@ +//======================================================================== +// +// 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-2013 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, 2013 Thomas Freitag <Thomas.Freitag@kabelmail.de> +// Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso@hotmail.it> +// Copyright (C) 2013 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 XREF_H +#define XREF_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include "goo/gtypes.h" +#include "goo/GooMutex.h" +#include "Object.h" +#include "Stream.h" + +#include <vector> + +class Dict; +class Stream; +class Parser; +class PopplerCache; + +//------------------------------------------------------------------------ +// XRef +//------------------------------------------------------------------------ + +enum XRefEntryType { + xrefEntryFree, + xrefEntryUncompressed, + xrefEntryCompressed, + xrefEntryNone +}; + +struct XRefEntry { + Goffset offset; + int gen; + XRefEntryType type; + int flags; + Object obj; //if this entry was updated, obj will contains the updated object + + enum Flag { + // Regular flags + Updated, // Entry was modified + + // Special flags -- available only after xref->scanSpecialFlags() is run + Unencrypted, // Entry is stored in unencrypted form (meaningless in unencrypted documents) + DontRewrite // Entry must not be written back in case of full rewrite + }; + + inline GBool getFlag(Flag flag) { + const int mask = (1 << (int)flag); + return (flags & mask) != 0; + } + + inline void setFlag(Flag flag, GBool value) { + const int mask = (1 << (int)flag); + if (value) { + flags |= mask; + } else { + flags &= ~mask; + } + } +}; + +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, Goffset pos, Goffset mainXRefEntriesOffsetA = 0, GBool *wasReconstructed = NULL, GBool reconstruct = false); + + // Destructor. + ~XRef(); + + // Copy xref but with new base stream! + XRef *copy(); + + // 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); + // Mark Encrypt entry as Unencrypted + void markUnencrypted(); + + void getEncryptionParameters(Guchar **fileKeyA, CryptAlgorithm *encAlgorithmA, int *keyLengthA); + + // 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(Goffset streamStart, Goffset *streamEnd); + + // Retuns the entry that belongs to the offset + int getNumEntry(Goffset offset); + + // Scans the document and sets special flags in all xref entries. One of those + // flags is Unencrypted, which affects how the object is fetched. Therefore, + // this function must be called before fetching unencrypted objects (e.g. + // Encrypt dictionary, XRef streams). Note that the code that initializes + // decryption doesn't need to call this function, because it runs before + // decryption is enabled, and therefore the Unencrypted flag is ignored. + void scanSpecialFlags(); + + // 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, Goffset 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); + + // to be thread safe during write where changes are not allowed + void lock(); + void unlock(); + +private: + + BaseStream *str; // input stream + Goffset 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 + Goffset *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 + Goffset prevXRefOffset; // position of prev XRef section (= next to read) + Goffset mainXRefEntriesOffset; // offset of entries in main XRef table + GBool xRefStream; // true if last XRef section is a stream + Goffset mainXRefOffset; // position of the main XRef table/stream + GBool scannedSpecialFlags; // true if scanSpecialFlags has been called + GBool strOwner; // true if str is owned by the instance +#if MULTITHREADED + GooMutex mutex; +#endif + + void init(); + int reserve(int newSize); + int resize(int newSize); + GBool readXRef(Goffset *pos, std::vector<Goffset> *followedXRefStm, std::vector<int> *xrefStreamObjsNum); + GBool readXRefTable(Parser *parser, Goffset *pos, std::vector<Goffset> *followedXRefStm, std::vector<int> *xrefStreamObjsNum); + GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n); + GBool readXRefStream(Stream *xrefStr, Goffset *pos); + GBool constructXRef(GBool *wasReconstructed, GBool needCatalogDict = gFalse); + GBool parseEntry(Goffset offset, XRefEntry *entry); + void readXRefUntil(int untilEntryNum, std::vector<int> *xrefStreamObjsNum = NULL); + void markUnencrypted(Object *obj); + + class XRefWriter { + public: + virtual void startSection(int first, int count) = 0; + virtual void writeEntry(Goffset offset, int gen, XRefEntryType type) = 0; + virtual ~XRefWriter() {}; + }; + + // XRefWriter subclass that writes a XRef table + class XRefTableWriter: public XRefWriter { + public: + XRefTableWriter(OutStream* outStrA); + void startSection(int first, int count); + void writeEntry(Goffset offset, int gen, XRefEntryType type); + private: + OutStream* outStr; + }; + + // XRefWriter subclass that writes a XRef stream + class XRefStreamWriter: public XRefWriter { + public: + XRefStreamWriter(Object *index, GooString *stmBuf, int offsetSize); + void startSection(int first, int count); + void writeEntry(Goffset offset, int gen, XRefEntryType type); + private: + Object *index; + GooString *stmBuf; + int offsetSize; + }; + + // Dummy XRefWriter subclass that only checks if all offsets fit in 4 bytes + class XRefPreScanWriter: public XRefWriter { + public: + XRefPreScanWriter(); + void startSection(int first, int count); + void writeEntry(Goffset offset, int gen, XRefEntryType type); + + GBool hasOffsetsBeyond4GB; + }; + + void writeXRef(XRefWriter *writer, GBool writeAllEntries); +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/XpdfPluginAPI.cc b/Build/source/libs/poppler/poppler-0.36.0/poppler/XpdfPluginAPI.cc new file mode 100644 index 00000000000..834c681d991 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/XpdfPluginAPI.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/XpdfPluginAPI.h b/Build/source/libs/poppler/poppler-0.36.0/poppler/XpdfPluginAPI.h new file mode 100644 index 00000000000..6ed890a8f1f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/XpdfPluginAPI.h @@ -0,0 +1,342 @@ +/* + * 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> +// Copyright (C) 2014 Bogdan Cristea <cristeab@gmail.com> +// Copyright (C) 2014 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 +// +//======================================================================== + +#ifndef XPDFPLUGINAPI_H +#define XPDFPLUGINAPI_H + +#ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif +#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/Build/source/libs/poppler/poppler-0.36.0/poppler/gen-unicode-tables.py b/Build/source/libs/poppler/poppler-0.36.0/poppler/gen-unicode-tables.py new file mode 100644 index 00000000000..282f6e52518 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/gen-unicode-tables.py @@ -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/Build/source/libs/poppler/poppler-0.36.0/poppler/poppler-config.h.cmake b/Build/source/libs/poppler/poppler-0.36.0/poppler/poppler-config.h.cmake new file mode 100644 index 00000000000..b087a693f92 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/poppler-config.h.cmake @@ -0,0 +1,195 @@ +//================================================= -*- mode: c++ -*- ==== +// +// poppler-config.h +// +// Copyright 1996-2011 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) 2014 Bogdan Cristea <cristeab@gmail.com> +// Copyright (C) 2014 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 POPPLER_CONFIG_H +#define POPPLER_CONFIG_H + +#include <stdio.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 + +/* 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-2015 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__ && !defined(__WINPTHREADS_VERSION) +char * strtok_r (char *s, const char *delim, char **save_ptr); +#endif +#endif + +//------------------------------------------------------------------------ +// Compiler +//------------------------------------------------------------------------ + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) +#ifdef __MINGW_PRINTF_FORMAT +#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ + __attribute__((__format__(__MINGW_PRINTF_FORMAT, fmt_index, va_index))) +#else +#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ + __attribute__((__format__(__printf__, fmt_index, va_index))) +#endif +#else +#define GCC_PRINTF_FORMAT(fmt_index, va_index) +#endif + +#if defined(_MSC_VER) +#define fmax(a, b) std::max(a, b) +#define fmin(a, b) std::min(a, b) +#endif + + +#endif /* POPPLER_CONFIG_H */ diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/poppler-config.h.in b/Build/source/libs/poppler/poppler-0.36.0/poppler/poppler-config.h.in new file mode 100644 index 00000000000..f73d0f66ee9 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/poppler-config.h.in @@ -0,0 +1,195 @@ +//================================================= -*- mode: c++ -*- ==== +// +// poppler-config.h +// +// Copyright 1996-2011 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) 2014 Bogdan Cristea <cristeab@gmail.com> +// Copyright (C) 2014 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 POPPLER_CONFIG_H +#define POPPLER_CONFIG_H + +#include <stdio.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 + +/* 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-2015 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__ && !defined(__WINPTHREADS_VERSION) +char * strtok_r (char *s, const char *delim, char **save_ptr); +#endif +#endif + +//------------------------------------------------------------------------ +// Compiler +//------------------------------------------------------------------------ + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) +#ifdef __MINGW_PRINTF_FORMAT +#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ + __attribute__((__format__(__MINGW_PRINTF_FORMAT, fmt_index, va_index))) +#else +#define GCC_PRINTF_FORMAT(fmt_index, va_index) \ + __attribute__((__format__(__printf__, fmt_index, va_index))) +#endif +#else +#define GCC_PRINTF_FORMAT(fmt_index, va_index) +#endif + +#if defined(_MSC_VER) +#define fmax(a, b) std::max(a, b) +#define fmin(a, b) std::min(a, b) +#endif + + +#endif /* POPPLER_CONFIG_H */ diff --git a/Build/source/libs/poppler/poppler-0.36.0/poppler/strtok_r.cpp b/Build/source/libs/poppler/poppler-0.36.0/poppler/strtok_r.cpp new file mode 100644 index 00000000000..6483e0f7be9 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/poppler/strtok_r.cpp @@ -0,0 +1,92 @@ +/* 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. */ + +//======================================================================== +// +// 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 Alexey Pavlov <alexpux@gmail.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 +// +//======================================================================== + +#if defined(__MINGW32__) && !defined(__WINPTHREADS_VERSION) +#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/Build/source/libs/poppler/poppler-0.36.0/splash/Makefile.am b/Build/source/libs/poppler/poppler-0.36.0/splash/Makefile.am new file mode 100644 index 00000000000..5c265d6360c --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/Makefile.am @@ -0,0 +1,73 @@ +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 + +# 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 + +libsplash_la_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/goo \ + $(libjpeg_includes) \ + $(libtiff_includes) \ + $(libpng_includes) \ + $(FREETYPE_CFLAGS) diff --git a/Build/source/libs/poppler/poppler-0.36.0/splash/Splash.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/Splash.cc new file mode 100644 index 00000000000..7453822d291 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/Splash.cc @@ -0,0 +1,6461 @@ +//======================================================================== +// +// 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-2015 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com> +// Copyright (C) 2010-2015 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.com> +// Copyright (C) 2011-2013, 2015 William Bader <williambader@hotmail.com> +// Copyright (C) 2012 Markus Trippelsdorf <markus@trippelsdorf.de> +// Copyright (C) 2012 Adrian Johnson <ajohnson@redneon.com> +// Copyright (C) 2012 Matthias Kramm <kramm@quiss.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 <limits.h> +#include <assert.h> +#include <math.h> +#include "goo/gmem.h" +#include "goo/GooLikely.h" +#include "goo/GooList.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, + splashPipeResultColorNoAlphaBlendDeviceN +#endif +}; + +SplashPipeResultColorCtrl Splash::pipeResultColorAlphaNoBlend[] = { + splashPipeResultColorAlphaNoBlendMono, + splashPipeResultColorAlphaNoBlendMono, + splashPipeResultColorAlphaNoBlendRGB, + splashPipeResultColorAlphaNoBlendRGB, + splashPipeResultColorAlphaNoBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorAlphaNoBlendCMYK, + splashPipeResultColorAlphaNoBlendDeviceN +#endif +}; + +SplashPipeResultColorCtrl Splash::pipeResultColorAlphaBlend[] = { + splashPipeResultColorAlphaBlendMono, + splashPipeResultColorAlphaBlendMono, + splashPipeResultColorAlphaBlendRGB, + splashPipeResultColorAlphaBlendRGB, + splashPipeResultColorAlphaBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorAlphaBlendCMYK, + splashPipeResultColorAlphaBlendDeviceN +#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; + pipe->shape = 0; + + // 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; + } else if (bitmap->mode == splashModeDeviceN8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunSimpleDeviceN8; +#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; + } else if (bitmap->mode == splashModeDeviceN8 && pipe->destAlphaPtr) { + pipe->run = &Splash::pipeRunAADeviceN8; +#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; +#if SPLASH_CMYK + int cp, mask; + Guchar cResult[SPOT_NCOMPS+4]; +#endif + + //----- 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 SPLASH_CMYK + if (bitmap->mode == splashModeCMYK8 || bitmap->mode == splashModeDeviceN8) { + if (state->fillOverprint && state->overprintMode && pipe->pattern->isCMYK()) { + Guint mask = 15; + if (pipe->cSrcVal[0] == 0) { + mask &= ~1; + } + if (pipe->cSrcVal[1] == 0) { + mask &= ~2; + } + if (pipe->cSrcVal[2] == 0) { + mask &= ~4; + } + if (pipe->cSrcVal[3] == 0) { + mask &= ~8; + } + state->overprintMask = mask; + } + } +#endif + } + + 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; + case splashModeDeviceN8: + mask = 1; + for (cp = 0; cp < SPOT_NCOMPS + 4; cp ++) { + if (state->overprintMask & mask) { + pipe->destColorPtr[cp] = state->deviceNTransfer[cp][pipe->cSrc[cp]]; + } + mask <<= 1; + } + pipe->destColorPtr += (SPOT_NCOMPS+4); + break; +#endif + } + if (pipe->destAlphaPtr) { + *pipe->destAlphaPtr++ = 255; + } + + } else { + + //----- read destination pixel + + Guchar *destColorPtr; + if (pipe->shape && state->blendFunc && pipe->knockout && alpha0Bitmap != NULL) { + destColorPtr = alpha0Bitmap->data + (alpha0Y+pipe->y)*alpha0Bitmap->rowSize; + switch (bitmap->mode) { + case splashModeMono1: + destColorPtr += (alpha0X+pipe->x) / 8; + break; + case splashModeMono8: + destColorPtr += (alpha0X+pipe->x); + break; + case splashModeRGB8: + case splashModeBGR8: + destColorPtr += (alpha0X+pipe->x) * 3; + break; + case splashModeXBGR8: +#if SPLASH_CMYK + case splashModeCMYK8: +#endif + destColorPtr += (alpha0X+pipe->x) * 4; + break; +#if SPLASH_CMYK + case splashModeDeviceN8: + destColorPtr += (alpha0X+pipe->x) * (SPOT_NCOMPS + 4); + break; +#endif + } + } else { + destColorPtr = pipe->destColorPtr; + } + switch (bitmap->mode) { + case splashModeMono1: + cDest[0] = (*destColorPtr & pipe->destColorMask) ? 0xff : 0x00; + break; + case splashModeMono8: + cDest[0] = *destColorPtr; + break; + case splashModeRGB8: + cDest[0] = destColorPtr[0]; + cDest[1] = destColorPtr[1]; + cDest[2] = destColorPtr[2]; + break; + case splashModeXBGR8: + cDest[0] = destColorPtr[2]; + cDest[1] = destColorPtr[1]; + cDest[2] = destColorPtr[0]; + cDest[3] = 255; + break; + case splashModeBGR8: + cDest[0] = destColorPtr[2]; + cDest[1] = destColorPtr[1]; + cDest[2] = destColorPtr[0]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + cDest[0] = destColorPtr[0]; + cDest[1] = destColorPtr[1]; + cDest[2] = destColorPtr[2]; + cDest[3] = destColorPtr[3]; + break; + case splashModeDeviceN8: + for (cp = 0; cp < SPOT_NCOMPS + 4; cp++) + cDest[cp] = destColorPtr[cp]; + 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 splashModeDeviceN8: + for (cp = 0; cp < SPOT_NCOMPS + 4; cp++) + cSrcNonIso[cp] = clip255(pipe->cSrc[cp] + + ((pipe->cSrc[cp] - cDest[cp]) * t) / 255); + break; + case splashModeCMYK8: + for (cp = 0; cp < 4; cp++) + cSrcNonIso[cp] = clip255(pipe->cSrc[cp] + + ((pipe->cSrc[cp] - cDest[cp]) * t) / 255); + break; +#endif + case splashModeXBGR8: + cSrcNonIso[3] = 255; + case splashModeRGB8: + 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) { +#if SPLASH_CMYK + if (bitmap->mode == splashModeDeviceN8) { + for (int k = 4; k < 4 + SPOT_NCOMPS; k++) { + cBlend[k] = 0; + } + } +#endif + (*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; + case splashPipeResultColorNoAlphaBlendDeviceN: + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + cResult[cp] = state->deviceNTransfer[cp][div255((255 - aDest) * cSrc[cp] + + aDest * cBlend[cp])]; + 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; + case splashPipeResultColorAlphaNoBlendDeviceN: + if (alphaI == 0) { + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + cResult[cp] = 0; + } else { + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + cResult[cp] = state->deviceNTransfer[cp][((alphaI - aSrc) * cDest[cp] + + aSrc * cSrc[cp]) / 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; + case splashPipeResultColorAlphaBlendDeviceN: + if (alphaI == 0) { + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + cResult[cp] = 0; + } else { + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + cResult[cp] = state->deviceNTransfer[cp][((alphaI - aSrc) * cDest[cp] + + aSrc * ((255 - alphaIm1) * cSrc[cp] + + alphaIm1 * cBlend[cp]) / 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; + case splashModeDeviceN8: + mask = 1; + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) { + if (state->overprintMask & mask) { + pipe->destColorPtr[cp] = cResult[cp]; + } + mask <<=1; + } + pipe->destColorPtr += (SPOT_NCOMPS+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; +} + +// special case: +// !pipe->pattern && pipe->noTransparency && !state->blendFunc && +// bitmap->mode == splashModeDeviceN8 && pipe->destAlphaPtr) { +void Splash::pipeRunSimpleDeviceN8(SplashPipe *pipe) { + //----- write destination pixel + int mask = 1; + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) { + if (state->overprintMask & mask) { + pipe->destColorPtr[cp] = state->deviceNTransfer[cp][pipe->cSrc[cp]]; + } + mask <<=1; + } + pipe->destColorPtr += (SPOT_NCOMPS+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; +} + +// special case: +// !pipe->pattern && !pipe->noTransparency && !state->softMask && +// pipe->usesShape && !pipe->alpha0Ptr && !state->blendFunc && +// !pipe->nonIsolatedGroup && +// bitmap->mode == splashModeDeviceN8 && pipe->destAlphaPtr +void Splash::pipeRunAADeviceN8(SplashPipe *pipe) { + Guchar aSrc, aDest, alpha2, aResult; + SplashColor cDest; + Guchar cResult[SPOT_NCOMPS+4]; + int cp, mask; + + //----- read destination pixel + for (cp=0; cp < SPOT_NCOMPS+4; cp++) + cDest[cp] = pipe->destColorPtr[cp]; + 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) { + for (cp=0; cp < SPOT_NCOMPS+4; cp++) + cResult[cp] = 0; + } else { + for (cp=0; cp < SPOT_NCOMPS+4; cp++) + cResult[cp] = state->deviceNTransfer[cp][(Guchar)(((alpha2 - aSrc) * cDest[cp] + + aSrc * pipe->cSrc[cp]) / alpha2)]; + } + + //----- write destination pixel + mask = 1; + for (cp=0; cp < SPOT_NCOMPS+4; cp++) { + if (state->overprintMask & mask) { + pipe->destColorPtr[cp] = cResult[cp]; + } + mask <<= 1; + } + pipe->destColorPtr += (SPOT_NCOMPS+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; + case splashModeDeviceN8: + pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + (SPOT_NCOMPS + 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; + case splashModeDeviceN8: + pipe->destColorPtr += (SPOT_NCOMPS+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, GBool adjustLine, Guchar lineOpacity) { +#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 = (adjustLine) ? div255((int) lineOpacity * (double)aaGamma[t]) : (double)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; + thinLineMode = splashThinLineDefault; + clearModRegion(); + debugMode = gFalse; + alpha0Bitmap = NULL; +} + +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; + thinLineMode = splashThinLineDefault; + clearModRegion(); + debugMode = gFalse; + alpha0Bitmap = NULL; +} + +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; + case splashModeDeviceN8: + row = bitmap->data; + for (y = 0; y < bitmap->height; ++y) { + p = row; + for (x = 0; x < bitmap->width; ++x) { + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *p++ = color[cp]; + } + 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 * state->lineWidth <= 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 (lineDashStartIdx < state->lineDashLength && lineDashStartPhase >= state->lineDash[lineDashStartIdx]) { + lineDashStartOn = !lineDashStartOn; + lineDashStartPhase -= state->lineDash[lineDashStartIdx]; + ++lineDashStartIdx; + } + if (unlikely(lineDashStartIdx == state->lineDashLength)) { + return new SplashPath(); + } + } + + 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); +} + +inline void Splash::getBBoxFP(SplashPath *path, SplashCoord *xMinA, SplashCoord *yMinA, + SplashCoord *xMaxA, SplashCoord *yMaxA) { + SplashCoord xMinFP, yMinFP, xMaxFP, yMaxFP, tx, ty; + + // make compiler happy: + xMinFP = xMaxFP = yMinFP = yMaxFP = 0; + for (int i = 0; i < path->length; ++i) { + transform(state->matrix, path->pts[i].x, path->pts[i].y, &tx, &ty); + if (i == 0) { + xMinFP = xMaxFP = tx; + yMinFP = yMaxFP = ty; + } else { + if (tx < xMinFP) xMinFP = tx; + if (tx > xMaxFP) xMaxFP = tx; + if (ty < yMinFP) yMinFP = ty; + if (ty > yMaxFP) yMaxFP = ty; + } + } + + *xMinA = xMinFP; + *yMinA = yMinFP; + *xMaxA = xMaxFP; + *yMaxA = yMaxFP; +} + +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; + GBool adjustLine = gFalse; + int linePosI = 0; + + 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); + } + } + + if (thinLineMode != splashThinLineDefault) { + if (state->clip->getXMinI() == state->clip->getXMaxI()) { + linePosI = state->clip->getXMinI(); + adjustLine = gTrue; + } else if (state->clip->getXMinI() == state->clip->getXMaxI() - 1) { + adjustLine = gTrue; + linePosI = splashFloor(state->clip->getXMin() + state->lineWidth); + } else if (state->clip->getYMinI() == state->clip->getYMaxI()) { + linePosI = state->clip->getYMinI(); + adjustLine = gTrue; + } else if (state->clip->getYMinI() == state->clip->getYMaxI() - 1) { + adjustLine = gTrue; + linePosI = splashFloor(state->clip->getYMin() + state->lineWidth); + } + } + + xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue, + adjustLine, linePosI); + 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); + } + + if (eo && (yMinI == yMaxI || xMinI == xMaxI) && thinLineMode != splashThinLineDefault) { + SplashCoord delta, xMinFP, yMinFP, xMaxFP, yMaxFP; + getBBoxFP(path, &xMinFP, &yMinFP, &xMaxFP, &yMaxFP); + delta = (yMinI == yMaxI) ? yMaxFP - yMinFP : xMaxFP - xMinFP; + if (delta < 0.2) { + opClipRes = splashClipAllOutside; + delete scanner; + delete xPath; + return splashOk; + } + } + + // 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, thinLineMode != splashThinLineDefault && xMinI == xMaxI); + if (clipRes != splashClipAllInside) { + state->clip->clipAALine(aaBuf, &x0, &x1, y, thinLineMode != splashThinLineDefault && xMinI == xMaxI); + } + Guchar lineShape = 255; + GBool adjustLine = gFalse; + if (thinLineMode == splashThinLineShape && (xMinI == xMaxI || yMinI == yMaxI)) { + // compute line shape for thin lines: + SplashCoord mx, my, delta; + transform(state->matrix, 0, 0, &mx, &my); + transform(state->matrix, state->lineWidth, 0, &delta, &my); + adjustLine = gTrue; + lineShape = clip255((delta - mx) * 255); + } + drawAALine(&pipe, x0, x1, y, adjustLine, lineShape); + } + } 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); + if (scaledMask->data == NULL) { + error(errInternal, -1, "scaledMask->data is NULL in Splash::arbitraryTransformMask"); + delete scaledMask; + return; + } + + // 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); + if (unlikely(xa < 0)) + xa = 0; + // 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; + + destPtr = dest->data; + if (destPtr == NULL) { + error(errInternal, -1, "dest->data is NULL in Splash::scaleMaskYdXu"); + return; + } + + // 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; + + 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; + + destPtr0 = dest->data; + if (destPtr0 == NULL) { + error(errInternal, -1, "dest->data is NULL in Splash::scaleMaskYuXd"); + return; + } + + // 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; + + 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; + + destPtr0 = dest->data; + if (destPtr0 == NULL) { + error(errInternal, -1, "dest->data is NULL in Splash::scaleMaskYuXu"); + return; + } + + // 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; + + 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(); + p = src->getDataPtr(); + if (p == NULL) { + error(errInternal, -1, "src->getDataPtr() is NULL in Splash::blitMask"); + return; + } + if (vectorAntialias && clipRes != splashClipAllInside) { + pipeInit(&pipe, xDest, yDest, state->fillPattern, NULL, + (Guchar)splashRound(state->fillAlpha * 255), gTrue, gFalse); + drawAAPixelInit(); + 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); + 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, SplashICCTransform tf, void *srcData, + SplashColorMode srcMode, GBool srcAlpha, + int w, int h, SplashCoord *mat, GBool interpolate, + 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; + case splashModeDeviceN8: + ok = srcMode == splashModeDeviceN8; + nComps = SPOT_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, interpolate, tilingPattern); + if (scaledImg == NULL) { + return splashErrBadArg; + } + if (tf != NULL) { + (*tf)(srcData, scaledImg); + } + 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, interpolate, tilingPattern); + if (scaledImg == NULL) { + return splashErrBadArg; + } + if (tf != NULL) { + (*tf)(srcData, scaledImg); + } + vertFlipImage(scaledImg, scaledWidth, scaledHeight, nComps); + blitImage(scaledImg, srcAlpha, x0, y0, clipRes); + delete scaledImg; + } + + // all other cases + } else { + return arbitraryTransformImage(src, tf, srcData, srcMode, nComps, srcAlpha, + w, h, mat, interpolate, tilingPattern); + } + + return splashOk; +} + +SplashError Splash::arbitraryTransformImage(SplashImageSource src, SplashICCTransform tf, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, + int srcWidth, int srcHeight, + SplashCoord *mat, GBool interpolate, + 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, yMax); + 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 || scaledWidth <= 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, interpolate); + + if (scaledImg == NULL) { + return splashErrBadArg; + } + + if (tf != NULL) { + (*tf)(srcData, scaledImg); + } + // 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); + if (unlikely(xa < 0)) + xa = 0; + 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; +} + +// determine if a scaled image requires interpolation based on the scale and +// the interpolate flag from the image dictionary +static GBool isImageInterpolationRequired(int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + GBool interpolate) { + if (interpolate) + return gTrue; + + /* When scale factor is >= 400% we don't interpolate. See bugs #25268, #9860 */ + if (scaledWidth / srcWidth >= 4 || scaledHeight / srcHeight >= 4) + return gFalse; + + return gTrue; +} + +// 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, GBool interpolate, GBool tilingPattern) { + SplashBitmap *dest; + + dest = new SplashBitmap(scaledWidth, scaledHeight, 1, srcMode, srcAlpha, gTrue, bitmap->getSeparationList()); + 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 { + if (!tilingPattern && isImageInterpolationRequired(srcWidth, srcHeight, scaledWidth, scaledHeight, interpolate)) { + scaleImageYuXuBilinear(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; + Guint pix[SPOT_NCOMPS+4], cp; +#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; + case splashModeDeviceN8: + + // compute the final pixel + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + pix[cp] = 0; + for (i = 0; i < xStep; ++i) { + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) { + pix[cp] += pixBuf[xx + cp]; + } + xx += (SPOT_NCOMPS+4); + } + // pix / xStep * yStep + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + pix[cp] = (pix[cp] * d) >> 23; + + // store the pixel + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + *destPtr++ = (Guchar)pix[cp]; + 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; + case splashModeDeviceN8: + for (i = 0; i < xStep; ++i) { + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *destPtr++ = (Guchar)pix[cp]; + } + 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_checkoverflow(srcWidth, nComps); + if (unlikely(!lineBuf)) + return; + 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; + case splashModeDeviceN8: + for (i = 0; i < yStep; ++i) { + destPtr = destPtr0 + (i * scaledWidth + x) * nComps; + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *destPtr++ = (Guchar)pix[cp]; + } + 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; + case splashModeDeviceN8: + for (i = 0; i < yStep; ++i) { + for (j = 0; j < xStep; ++j) { + destPtr = destPtr0 + (i * scaledWidth + xx + j) * nComps; + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *destPtr++ = (Guchar)pix[cp]; + } + } + 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); +} + +// expand source row to scaledWidth using linear interpolation +static void expandRow(Guchar *srcBuf, Guchar *dstBuf, int srcWidth, int scaledWidth, int nComps) +{ + double xStep = (double)srcWidth/scaledWidth; + double xSrc = 0.0; + double xFrac, xInt; + int p; + + // pad the source with an extra pixel equal to the last pixel + // so that when xStep is inside the last pixel we still have two + // pixels to interpolate between. + for (int i = 0; i < nComps; i++) + srcBuf[srcWidth*nComps + i] = srcBuf[(srcWidth-1)*nComps + i]; + + for (int x = 0; x < scaledWidth; x++) { + xFrac = modf(xSrc, &xInt); + p = (int)xInt; + for (int c = 0; c < nComps; c++) { + dstBuf[nComps*x + c] = srcBuf[nComps*p + c]*(1.0 - xFrac) + srcBuf[nComps*(p+1) + c]*xFrac; + } + xSrc += xStep; + } +} + +// Scale up image using bilinear interpolation +void Splash::scaleImageYuXuBilinear(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, + SplashBitmap *dest) { + Guchar *srcBuf, *lineBuf1, *lineBuf2, *alphaSrcBuf, *alphaLineBuf1, *alphaLineBuf2; + Guint pix[splashMaxColorComps]; + Guchar *destPtr0, *destPtr, *destAlphaPtr0, *destAlphaPtr; + int i; + + if (srcWidth < 1 || srcHeight < 1) + return; + + // allocate buffers + srcBuf = (Guchar *)gmallocn(srcWidth+1, nComps); // + 1 pixel of padding + lineBuf1 = (Guchar *)gmallocn(scaledWidth, nComps); + lineBuf2 = (Guchar *)gmallocn(scaledWidth, nComps); + if (srcAlpha) { + alphaSrcBuf = (Guchar *)gmalloc(srcWidth+1); // + 1 pixel of padding + alphaLineBuf1 = (Guchar *)gmalloc(scaledWidth); + alphaLineBuf2 = (Guchar *)gmalloc(scaledWidth); + } else { + alphaSrcBuf = NULL; + alphaLineBuf1 = NULL; + alphaLineBuf2 = NULL; + } + + double ySrc = 0.0; + double yStep = (double)srcHeight/scaledHeight; + double yFrac, yInt; + int currentSrcRow = -1; + (*src)(srcData, srcBuf, alphaSrcBuf); + expandRow(srcBuf, lineBuf2, srcWidth, scaledWidth, nComps); + if (srcAlpha) + expandRow(alphaSrcBuf, alphaLineBuf2, srcWidth, scaledWidth, 1); + + destPtr0 = dest->data; + destAlphaPtr0 = dest->alpha; + for (int y = 0; y < scaledHeight; y++) { + yFrac = modf(ySrc, &yInt); + if ((int)yInt > currentSrcRow) { + currentSrcRow++; + // Copy line2 data to line1 and get next line2 data. + // If line2 already contains the last source row we don't touch it. + // This effectively adds an extra row of padding for interpolating the + // last source row with. + memcpy(lineBuf1, lineBuf2, scaledWidth * nComps); + if (srcAlpha) + memcpy(alphaLineBuf1, alphaLineBuf2, scaledWidth); + if (currentSrcRow < srcHeight) { + (*src)(srcData, srcBuf, alphaSrcBuf); + expandRow(srcBuf, lineBuf2, srcWidth, scaledWidth, nComps); + if (srcAlpha) + expandRow(alphaSrcBuf, alphaLineBuf2, srcWidth, scaledWidth, 1); + } + } + + // write row y using linear interpolation on lineBuf1 and lineBuf2 + for (int x = 0; x < scaledWidth; ++x) { + // compute the final pixel + for (i = 0; i < nComps; ++i) { + pix[i] = lineBuf1[x*nComps + i]*(1.0 - yFrac) + lineBuf2[x*nComps + i]*yFrac; + } + + // store the pixel + destPtr = destPtr0 + (y * scaledWidth + x) * nComps; + switch (srcMode) { + case splashModeMono1: // mono1 is not allowed + break; + case splashModeMono8: + *destPtr++ = (Guchar)pix[0]; + break; + case splashModeRGB8: + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[2]; + break; + case splashModeXBGR8: + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)255; + break; + case splashModeBGR8: + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[0]; + break; +#if SPLASH_CMYK + case splashModeCMYK8: + *destPtr++ = (Guchar)pix[0]; + *destPtr++ = (Guchar)pix[1]; + *destPtr++ = (Guchar)pix[2]; + *destPtr++ = (Guchar)pix[3]; + break; + case splashModeDeviceN8: + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + *destPtr++ = (Guchar)pix[cp]; + break; +#endif + } + + // process alpha + if (srcAlpha) { + destAlphaPtr = destAlphaPtr0 + y*scaledWidth + x; + *destAlphaPtr = alphaLineBuf1[x]*(1.0 - yFrac) + alphaLineBuf2[x]*yFrac; + } + } + + ySrc += yStep; + } + + gfree(alphaSrcBuf); + gfree(alphaLineBuf1); + gfree(alphaLineBuf2); + gfree(srcBuf); + gfree(lineBuf1); + gfree(lineBuf2); +} + +void Splash::vertFlipImage(SplashBitmap *img, int width, int height, + int nComps) { + Guchar *lineBuf; + Guchar *p0, *p1; + int w; + + if (unlikely(img->data == NULL)) { + error(errInternal, -1, "img->data is NULL in Splash::vertFlipImage"); + return; + } + + 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 = state->clip->testRect(xDest, yDest, xDest + src->getWidth() - 1, yDest + src->getHeight() - 1); + if (clipRes != splashClipAllOutside) { + blitImage(src, srcAlpha, xDest, yDest, clipRes); + } +} + +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 (unlikely(!bitmap->data)) { + return splashErrZeroImage; + } + + if(src->getSeparationList()->getLength() > bitmap->getSeparationList()->getLength()) { + for (x = bitmap->getSeparationList()->getLength(); x < src->getSeparationList()->getLength(); x++) + bitmap->getSeparationList()->append(((GfxSeparationColorSpace *)src->getSeparationList()->get(x))->copy()); + } + 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; + Guchar colorsp[SPOT_NCOMPS+4], cp; +#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; + case splashModeDeviceN8: + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + colorsp[cp] = color[cp]; + 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) + { + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + p[cp] = colorsp[cp]; + } + else if (alpha != 255) + { + alpha1 = 255 - alpha; + for (cp = 0; cp < SPOT_NCOMPS+4; cp++) + p[cp] = div255(alpha1 * colorsp[cp] + alpha * p[cp]); + } + p += (SPOT_NCOMPS+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(); + int bitmapOffLimit = bitmap->getHeight() * bitmap->getRowSize(); + 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; + case splashModeDeviceN8: + colorComps=SPOT_NCOMPS+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 && bitmapOff + colorComps <= bitmapOffLimit; ++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; + } + + if (unlikely(!bitmap->data)) { + return splashErrZeroImage; + } + + 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; + case splashModeDeviceN8: + for (y = 0; y < h; ++y) { + p = &bitmap->data[(yDest + y) * bitmap->rowSize + (SPOT_NCOMPS+4) * xDest]; + sp = &src->data[(ySrc + y) * src->rowSize + (SPOT_NCOMPS+4) * xSrc]; + for (x = 0; x < w; ++x) { + for (int cp=0; cp < SPOT_NCOMPS+4; cp++) + *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/Build/source/libs/poppler/poppler-0.36.0/splash/Splash.h b/Build/source/libs/poppler/poppler-0.36.0/splash/Splash.h new file mode 100644 index 00000000000..75764544fed --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/Splash.h @@ -0,0 +1,429 @@ +//======================================================================== +// +// 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-2013, 2015 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2010 Christian Feuersänger <cfeuersaenger@googlemail.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 +// +//======================================================================== + +#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); + +// Use ICCColorSpace to transform a bitmap +typedef void (*SplashICCTransform)(void *data, SplashBitmap *bitmap); + +//------------------------------------------------------------------------ + +enum SplashPipeResultColorCtrl { +#if SPLASH_CMYK + splashPipeResultColorNoAlphaBlendCMYK, + splashPipeResultColorNoAlphaBlendDeviceN, +#endif + splashPipeResultColorNoAlphaBlendRGB, + splashPipeResultColorNoAlphaBlendMono, + splashPipeResultColorAlphaNoBlendMono, + splashPipeResultColorAlphaNoBlendRGB, +#if SPLASH_CMYK + splashPipeResultColorAlphaNoBlendCMYK, + splashPipeResultColorAlphaNoBlendDeviceN, +#endif + splashPipeResultColorAlphaBlendMono, + splashPipeResultColorAlphaBlendRGB +#if SPLASH_CMYK + , + splashPipeResultColorAlphaBlendCMYK, + splashPipeResultColorAlphaBlendDeviceN +#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, SplashICCTransform tf, void *srcData, + SplashColorMode srcMode, GBool srcAlpha, + int w, int h, SplashCoord *mat, GBool interpolate, + 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); + void blitImage(SplashBitmap *src, GBool srcAlpha, int xDest, int yDest); + + //----- 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; } + + // Setter/Getter for thin line mode + void setThinLineMode(SplashThinLineMode thinLineModeA) { thinLineMode = thinLineModeA; } + SplashThinLineMode getThinLineMode() { return thinLineMode; } + + // 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); + void pipeRunSimpleDeviceN8(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); + void pipeRunAADeviceN8(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, GBool adjustLine = gFalse, Guchar lineOpacity = 0); + 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); + void getBBoxFP(SplashPath *path, SplashCoord *xMinA, SplashCoord *yMinA, SplashCoord *xMaxA, SplashCoord *yMaxA); + 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, SplashICCTransform tf, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, + int srcWidth, int srcHeight, + SplashCoord *mat, GBool interpolate, GBool tilingPattern = gFalse); + SplashBitmap *scaleImage(SplashImageSource src, void *srcData, + SplashColorMode srcMode, int nComps, + GBool srcAlpha, int srcWidth, int srcHeight, + int scaledWidth, int scaledHeight, GBool interpolate, GBool tilingPattern = gFalse); + 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 scaleImageYuXuBilinear(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; + SplashThinLineMode thinLineMode; + int modXMin, modYMin, modXMax, modYMax; + SplashClipResult opClipRes; + GBool vectorAntialias; + GBool inShading; + GBool debugMode; +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/splash/SplashBitmap.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashBitmap.cc new file mode 100644 index 00000000000..7c14b3161b1 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashBitmap.cc @@ -0,0 +1,795 @@ +//======================================================================== +// +// 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, 2015 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, 2012 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, 2015 William Bader <williambader@hotmail.com> +// Copyright (C) 2011-2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2012 Anthony Wesley <awesley@smartnetworks.com.au> +// Copyright (C) 2015 Adam Reichold <adamreichold@myopera.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 <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" +#include "goo/GooList.h" + +//------------------------------------------------------------------------ +// SplashBitmap +//------------------------------------------------------------------------ + +SplashBitmap::SplashBitmap(int widthA, int heightA, int rowPadA, + SplashColorMode modeA, GBool alphaA, + GBool topDown, GooList *separationListA) { + 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; + case splashModeDeviceN8: + if (width > 0 && width <= INT_MAX / 4) { + rowSize = width * (SPOT_NCOMPS + 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; + } + separationList = new GooList(); + if (separationListA != NULL) + for (int i = 0; i < separationListA->getLength(); i++) + separationList->append(((GfxSeparationColorSpace *) separationListA->get(i))->copy()); +} + +SplashBitmap *SplashBitmap::copy(SplashBitmap *src) { + SplashBitmap *result = new SplashBitmap(src->getWidth(), src->getHeight(), src->getRowPad(), + src->getMode(), src->getAlphaPtr() != NULL, src->getRowSize() >= 0, src->getSeparationList()); + 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); + deleteGooList(separationList, GfxSeparationColorSpace); +} + + +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: + case splashModeDeviceN8: + // 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 || !data) { + 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; + case splashModeDeviceN8: + p = &data[y * rowSize + (SPOT_NCOMPS + 4) * x]; + for (int cp = 0; cp < SPOT_NCOMPS + 4; cp++) + pixel[cp] = p[cp]; + 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 + #if SPLASH_CMYK + case splashFormatJpegCMYK: + writer = new JpegWriter(JpegWriter::CMYK); + break; + #endif + case splashFormatJpeg: + writer = new JpegWriter(); + break; + #endif + + #ifdef ENABLE_LIBTIFF + case splashFormatTiff: + switch (mode) { + case splashModeMono1: + writer = new TiffWriter(TiffWriter::MONOCHROME); + break; + case splashModeMono8: + writer = new TiffWriter(TiffWriter::GRAY); + break; + case splashModeRGB8: + case splashModeBGR8: + writer = new TiffWriter(TiffWriter::RGB); + break; +#if SPLASH_CMYK + case splashModeCMYK8: + case splashModeDeviceN8: + writer = new TiffWriter(TiffWriter::CMYK); + break; +#endif + default: + fprintf(stderr, "TiffWriter: Mode %d not supported\n", mode); + writer = new TiffWriter(); + } + if (writer) { + ((TiffWriter *)writer)->setCompressionString(compressionString); + } + 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]); +#if SPLASH_CMYK + if (separationList->getLength() > 0) { + for (int i = 0; i < separationList->getLength(); i++) { + if (col[i+4] > 0) { + GfxCMYK cmyk; + GfxColor input; + input.c[0] = byteToCol(col[i+4]); + GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(i); + sepCS->getCMYK(&input, &cmyk); + col[0] = colToByte(cmyk.c); + col[1] = colToByte(cmyk.m); + col[2] = colToByte(cmyk.y); + col[3] = colToByte(cmyk.k); + c += byteToDbl(col[0]); + m += byteToDbl(col[1]); + y += byteToDbl(col[2]); + k += byteToDbl(col[3]); + } + } + if (c > 1) c = 1; + if (m > 1) m = 1; + if (y > 1) y = 1; + if (k > 1) k = 1; + } +#endif + 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)); + } +} + +void SplashBitmap::getXBGRLine(int yl, SplashColorPtr line, ConversionMode conversionMode) { + 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]); +#if SPLASH_CMYK + if (separationList->getLength() > 0) { + for (int i = 0; i < separationList->getLength(); i++) { + if (col[i+4] > 0) { + GfxCMYK cmyk; + GfxColor input; + input.c[0] = byteToCol(col[i+4]); + GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(i); + sepCS->getCMYK(&input, &cmyk); + col[0] = colToByte(cmyk.c); + col[1] = colToByte(cmyk.m); + col[2] = colToByte(cmyk.y); + col[3] = colToByte(cmyk.k); + c += byteToDbl(col[0]); + m += byteToDbl(col[1]); + y += byteToDbl(col[2]); + k += byteToDbl(col[3]); + } + } + if (c > 1) c = 1; + if (m > 1) m = 1; + if (y > 1) y = 1; + if (k > 1) k = 1; + } +#endif + c1 = 1 - c; + m1 = 1 - m; + y1 = 1 - y; + k1 = 1 - k; + cmykToRGBMatrixMultiplication(c, m, y, k, c1, m1, y1, k1, r, g, b); + + if (conversionMode == conversionAlphaPremultiplied) { + const double a = getAlpha(x, yl) / 255.0; + + *line++ = dblToByte(clip01(b * a)); + *line++ = dblToByte(clip01(g * a)); + *line++ = dblToByte(clip01(r * a)); + } else { + *line++ = dblToByte(clip01(b)); + *line++ = dblToByte(clip01(g)); + *line++ = dblToByte(clip01(r)); + } + + if (conversionMode != conversionOpaque) { + *line++ = getAlpha(x, yl); + } else { + *line++ = 255; + } + } +} + +static inline Guchar div255(int x) { + return (Guchar)((x + (x >> 8) + 0x80) >> 8); +} + +GBool SplashBitmap::convertToXBGR(ConversionMode conversionMode) { + if (mode == splashModeXBGR8) { + if (conversionMode != conversionOpaque) { + // Copy the alpha channel into the fourth component so that XBGR becomes ABGR. + const SplashColorPtr dbegin = data; + const SplashColorPtr dend = data + rowSize * height; + + Guchar *const abegin = alpha; + Guchar *const aend = alpha + width * height; + + SplashColorPtr d = dbegin; + Guchar *a = abegin; + + if (conversionMode == conversionAlphaPremultiplied) { + for (; d < dend && a < aend; d += 4, a += 1) { + d[0] = div255(d[0] * *a); + d[1] = div255(d[1] * *a); + d[2] = div255(d[2] * *a); + d[3] = *a; + } + } else { + for (d += 3; d < dend && a < aend; d += 4, a += 1) { + *d = *a; + } + } + } + + return gTrue; + } + + int newrowSize = width * 4; + SplashColorPtr newdata = (SplashColorPtr)gmallocn_checkoverflow(newrowSize, height); + if (newdata != NULL) { + for (int y = 0; y < height; y++) { + unsigned char *row = newdata + y * newrowSize; + getXBGRLine(y, row, conversionMode); + } + if (rowSize < 0) { + gfree(data + (height - 1) * rowSize); + } else { + gfree(data); + } + data = newdata; + rowSize = newrowSize; + mode = splashModeXBGR8; + } + return newdata != NULL; +} + +#if SPLASH_CMYK +void SplashBitmap::getCMYKLine(int yl, SplashColorPtr line) { + SplashColor col; + + for (int x = 0; x < width; x++) { + getPixel(x, yl, col); + if (separationList->getLength() > 0) { + double c, m, y, k; + c = byteToDbl(col[0]); + m = byteToDbl(col[1]); + y = byteToDbl(col[2]); + k = byteToDbl(col[3]); + for (int i = 0; i < separationList->getLength(); i++) { + if (col[i+4] > 0) { + GfxCMYK cmyk; + GfxColor input; + input.c[0] = byteToCol(col[i+4]); + GfxSeparationColorSpace *sepCS = (GfxSeparationColorSpace *)separationList->get(i); + sepCS->getCMYK(&input, &cmyk); + col[0] = colToByte(cmyk.c); + col[1] = colToByte(cmyk.m); + col[2] = colToByte(cmyk.y); + col[3] = colToByte(cmyk.k); + c += byteToDbl(col[0]); + m += byteToDbl(col[1]); + y += byteToDbl(col[2]); + k += byteToDbl(col[3]); + } + } + col[0] = dblToByte(clip01(c)); + col[1] = dblToByte(clip01(m)); + col[2] = dblToByte(clip01(y)); + col[3] = dblToByte(clip01(k)); + } + *line++ = col[0]; + *line++ = col[1]; + *line++ = col[2]; + *line++ = col[3]; + } +} +#endif + +SplashError SplashBitmap::writeImgFile(ImgWriter *writer, FILE *f, int hDPI, int vDPI) { + if (mode != splashModeRGB8 && mode != splashModeMono8 && mode != splashModeMono1 && mode != splashModeXBGR8 && mode != splashModeBGR8 +#if SPLASH_CMYK + && mode != splashModeCMYK8 && mode != splashModeDeviceN8 +#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; + case splashModeDeviceN8: + if (writer->supportCMYK()) { + unsigned char *row = new unsigned char[4 * width]; + for (int y = 0; y < height; y++) { + getCMYKLine(y, row); + if (!writer->writeRow(&row)) { + delete[] row; + return splashErrGeneric; + } + } + delete[] row; + } 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 splashModeBGR8: + { + 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 * 3 + 2]; + row[3*x+1] = data[y * rowSize + x * 3 + 1]; + row[3*x+2] = data[y * rowSize + x * 3]; + } + + if (!writer->writeRow(&row)) { + delete[] row; + return splashErrGeneric; + } + } + delete[] row; + } + 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashBitmap.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashBitmap.h new file mode 100644 index 00000000000..4417af73375 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashBitmap.h @@ -0,0 +1,116 @@ +//======================================================================== +// +// 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, 2012 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> +// Copyright (C) 2015 Adam Reichold <adamreichold@myopera.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 SPLASHBITMAP_H +#define SPLASHBITMAP_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" +#include "poppler/GfxState.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, GooList *separationList = NULL); + 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; } + GooList *getSeparationList() { return separationList; } + + 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); + + enum ConversionMode + { + conversionOpaque, + conversionAlpha, + conversionAlphaPremultiplied + }; + + GBool convertToXBGR(ConversionMode conversionMode = conversionOpaque); + + void getPixel(int x, int y, SplashColorPtr pixel); + void getRGBLine(int y, SplashColorPtr line); + void getXBGRLine(int y, SplashColorPtr line, ConversionMode conversionMode = conversionOpaque); +#if SPLASH_CMYK + void getCMYKLine(int y, SplashColorPtr line); +#endif + 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) + GooList *separationList; // list of spot colorants and their mapping functions + + friend class Splash; +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/splash/SplashClip.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashClip.cc new file mode 100644 index 00000000000..85c6b11473d --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashClip.cc @@ -0,0 +1,411 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 "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, GBool adjustVertLine) { + 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 && !adjustVertLine) { + *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 && !adjustVertLine) { + 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashClip.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashClip.h new file mode 100644 index 00000000000..5c0fdba99a7 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashClip.h @@ -0,0 +1,152 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 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, + GBool adjustVertLine = gFalse); + + // 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashErrorCodes.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashErrorCodes.h new file mode 100644 index 00000000000..d1f81f85dd8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashErrorCodes.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFont.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFont.cc new file mode 100644 index 00000000000..b785826d66b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFont.cc @@ -0,0 +1,513 @@ +//======================================================================== +// +// 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, 2014 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> +// 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> + +#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 && c >= 0) { + 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 (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 && c >= 0) { + gid = ff->codeToGID[c]; + } else { + gid = (FT_UInt)c; + } + 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; + } + if (FT_Outline_Check(&((FT_OutlineGlyph)glyph)->outline)) { + 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFont.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFont.h new file mode 100644 index 00000000000..98cb29dfbba --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFont.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontEngine.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontEngine.cc new file mode 100644 index 00000000000..9fef8f007d1 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontEngine.cc @@ -0,0 +1,180 @@ +//======================================================================== +// +// 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, 2012 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 + +//------------------------------------------------------------------------ +// 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) { + SplashFontFile *ret; + ret = SplashFTFontFile::loadTrueTypeFont(this, idA, src, + codeToGID, codeToGIDLen, + faceIndex); + return ret; +} + +#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H diff --git a/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontEngine.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontEngine.h new file mode 100644 index 00000000000..11bbea74a80 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontEngine.h @@ -0,0 +1,81 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 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); + GBool getAA() { return aa; } + void setAA(GBool aaA) { aa = aaA; } + +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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontFile.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontFile.cc new file mode 100644 index 00000000000..f0dcf50384b --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontFile.cc @@ -0,0 +1,148 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2014 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> + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "goo/gmem.h" +#include "goo/GooString.h" +#include "poppler/GfxFont.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); + if (codeToGIDA[i] == 0) { + name = GfxFont::getAlternateName(name); + if (name) { + codeToGIDA[i] = 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontFile.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontFile.h new file mode 100644 index 00000000000..d642af0a0ab --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFTFontFile.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFont.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFont.cc new file mode 100644 index 00000000000..3d6d6b2343e --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFont.cc @@ -0,0 +1,224 @@ +//======================================================================== +// +// 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, 2014 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 <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 (glyphW > INT_MAX / glyphH) { + glyphSize = -1; + } else { + 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFont.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFont.h new file mode 100644 index 00000000000..78b00d2dcaf --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFont.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontEngine.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontEngine.cc new file mode 100644 index 00000000000..73ef8de0877 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontEngine.cc @@ -0,0 +1,337 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 Thomas Freitag <Thomas.Freitag@alfa.de> +// Copyright (C) 2015 Dmytro Morgun <lztoad@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 + + // 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::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 + + // 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::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 + + // 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::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); + } + + // 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; +} + +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H +GBool SplashFontEngine::getAA() { + return (ftEngine == NULL) ? gFalse : ftEngine->getAA(); +} + +void SplashFontEngine::setAA(GBool aa) { + if (ftEngine != NULL) { + ftEngine->setAA(aa); + } +} +#endif + +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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontEngine.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontEngine.h new file mode 100644 index 00000000000..6502ea5a7fa --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontEngine.h @@ -0,0 +1,110 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 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); +#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H + GBool getAA(); + void setAA(GBool aa); +#endif + +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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFile.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFile.cc new file mode 100644 index 00000000000..68e8608b6a7 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFile.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFile.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFile.h new file mode 100644 index 00000000000..ec87504b9bc --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFile.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFileID.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFileID.cc new file mode 100644 index 00000000000..a66dabf61e3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFileID.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFileID.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFileID.h new file mode 100644 index 00000000000..cfd89ebb56a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashFontFileID.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashGlyphBitmap.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashGlyphBitmap.h new file mode 100644 index 00000000000..c062c106e6a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashGlyphBitmap.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashMath.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashMath.h new file mode 100644 index 00000000000..ca73c2bd1f3 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashMath.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPath.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPath.cc new file mode 100644 index 00000000000..bc4ccd524a4 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPath.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPath.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPath.h new file mode 100644 index 00000000000..81273c613e5 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPath.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPattern.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPattern.cc new file mode 100644 index 00000000000..28ca4995882 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPattern.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPattern.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPattern.h new file mode 100644 index 00000000000..e678c9e20e6 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashPattern.h @@ -0,0 +1,104 @@ +//======================================================================== +// +// 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, 2014 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; + + // Returns true if this pattern colorspace is CMYK. + virtual GBool isCMYK() = 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; } + + virtual GBool isCMYK() { return gFalse; } + +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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashScreen.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashScreen.cc new file mode 100644 index 00000000000..68ccd7ddda0 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashScreen.cc @@ -0,0 +1,387 @@ +//======================================================================== +// +// 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> +// 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 <string.h> +#include <algorithm> +#include "goo/gmem.h" +#include "goo/grandom.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; + + // 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) * grandom_double()); + 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashScreen.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashScreen.h new file mode 100644 index 00000000000..a7fc4559148 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashScreen.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashState.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashState.cc new file mode 100644 index 00000000000..fd2789d02f9 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashState.cc @@ -0,0 +1,263 @@ +//======================================================================== +// +// 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, 4 + SPOT_NCOMPS +#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; +#if SPLASH_CMYK + cmykTransferC[i] = (Guchar)i; + cmykTransferM[i] = (Guchar)i; + cmykTransferY[i] = (Guchar)i; + cmykTransferK[i] = (Guchar)i; + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + deviceNTransfer[cp][i] = (Guchar)i; +#endif + } + 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; +#if SPLASH_CMYK + cmykTransferC[i] = (Guchar)i; + cmykTransferM[i] = (Guchar)i; + cmykTransferY[i] = (Guchar)i; + cmykTransferK[i] = (Guchar)i; + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + deviceNTransfer[cp][i] = (Guchar)i; +#endif + } + 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); +#if SPLASH_CMYK + memcpy(cmykTransferC, state->cmykTransferC, 256); + memcpy(cmykTransferM, state->cmykTransferM, 256); + memcpy(cmykTransferY, state->cmykTransferY, 256); + memcpy(cmykTransferK, state->cmykTransferK, 256); + for (int cp = 0; cp < SPOT_NCOMPS+4; cp++) + memcpy(deviceNTransfer[cp], state->deviceNTransfer[cp], 256); +#endif + 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) { +#if SPLASH_CMYK + int i; + + 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]; + } + for (i = 0; i < 256; ++i) { + deviceNTransfer[0][i] = 255 - rgbTransferR[255 - i]; + deviceNTransfer[1][i] = 255 - rgbTransferG[255 - i]; + deviceNTransfer[2][i] = 255 - rgbTransferB[255 - i]; + deviceNTransfer[3][i] = 255 - grayTransfer[255 - i]; + } +#endif + memcpy(rgbTransferR, red, 256); + memcpy(rgbTransferG, green, 256); + memcpy(rgbTransferB, blue, 256); + memcpy(grayTransfer, gray, 256); +} diff --git a/Build/source/libs/poppler/poppler-0.36.0/splash/SplashState.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashState.h new file mode 100644 index 00000000000..2c603531cfd --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashState.h @@ -0,0 +1,139 @@ +//======================================================================== +// +// SplashState.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) 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 +// +//======================================================================== + +#ifndef SPLASHSTATE_H +#define SPLASHSTATE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "SplashTypes.h" + +class SplashPattern; +class SplashScreen; +class SplashClip; +class SplashBitmap; + +//------------------------------------------------------------------------ +// line cap values +//------------------------------------------------------------------------ + +#define splashLineCapButt 0 +#define splashLineCapRound 1 +#define splashLineCapProjecting 2 + +//------------------------------------------------------------------------ +// line join values +//------------------------------------------------------------------------ + +#define splashLineJoinMiter 0 +#define splashLineJoinRound 1 +#define splashLineJoinBevel 2 + +//------------------------------------------------------------------------ +// SplashState +//------------------------------------------------------------------------ + +class SplashState { +public: + + // Create a new state object, initialized with default settings. + SplashState(int width, int height, GBool vectorAntialias, + SplashScreenParams *screenParams); + SplashState(int width, int height, GBool vectorAntialias, + SplashScreen *screenA); + + // Copy a state object. + SplashState *copy() { return new SplashState(this); } + + ~SplashState(); + + // Set the stroke pattern. This does not copy <strokePatternA>. + void setStrokePattern(SplashPattern *strokePatternA); + + // Set the fill pattern. This does not copy <fillPatternA>. + void setFillPattern(SplashPattern *fillPatternA); + + // Set the screen. This does not copy <screenA>. + void setScreen(SplashScreen *screenA); + + // Set the line dash pattern. This copies the <lineDashA> array. + void setLineDash(SplashCoord *lineDashA, int lineDashLengthA, + SplashCoord lineDashPhaseA); + + // Set the soft mask bitmap. + void setSoftMask(SplashBitmap *softMaskA); + + // Set the overprint parametes. + void setFillOverprint(GBool fillOverprintA) { fillOverprint = fillOverprintA; } + void setStrokeOverprint(GBool strokeOverprintA) { strokeOverprint = strokeOverprintA; } + void setOverprintMode(int overprintModeA) { overprintMode = overprintModeA; } + + // Set the transfer function. + void setTransfer(Guchar *red, Guchar *green, Guchar *blue, Guchar *gray); + +private: + + SplashState(SplashState *state); + + SplashCoord matrix[6]; + SplashPattern *strokePattern; + SplashPattern *fillPattern; + SplashScreen *screen; + SplashBlendFunc blendFunc; + SplashCoord strokeAlpha; + SplashCoord fillAlpha; + SplashCoord lineWidth; + int lineCap; + int lineJoin; + SplashCoord miterLimit; + SplashCoord flatness; + SplashCoord *lineDash; + int lineDashLength; + SplashCoord lineDashPhase; + GBool strokeAdjust; + SplashClip *clip; + SplashBitmap *softMask; + GBool deleteSoftMask; + GBool inNonIsolatedGroup; + GBool fillOverprint; + GBool strokeOverprint; + int overprintMode; + Guchar rgbTransferR[256], + rgbTransferG[256], + rgbTransferB[256]; + Guchar grayTransfer[256]; +#if SPLASH_CMYK + Guchar cmykTransferC[256], + cmykTransferM[256], + cmykTransferY[256], + cmykTransferK[256]; + Guchar deviceNTransfer[SPOT_NCOMPS+4][256]; +#endif + Guint overprintMask; + GBool overprintAdditive; + + SplashState *next; // used by Splash class + + friend class Splash; +}; + +#endif diff --git a/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1Font.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1Font.cc new file mode 100644 index 00000000000..0fdfaaf5150 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1Font.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1Font.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1Font.h new file mode 100644 index 00000000000..1dbe66cd7fc --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1Font.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontEngine.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontEngine.cc new file mode 100644 index 00000000000..fb4b38dae88 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontEngine.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontEngine.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontEngine.h new file mode 100644 index 00000000000..268a01479b0 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontEngine.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontFile.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontFile.cc new file mode 100644 index 00000000000..1832a916d9a --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontFile.cc @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontFile.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontFile.h new file mode 100644 index 00000000000..c094b6d8b29 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashT1FontFile.h @@ -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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashTypes.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashTypes.h new file mode 100644 index 00000000000..5ea816007f8 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashTypes.h @@ -0,0 +1,199 @@ +//======================================================================== +// +// 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-2013 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 + +#ifndef SPOT_NCOMPS +#define SPOT_NCOMPS 4 +#endif + +//------------------------------------------------------------------------ +// 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... + splashModeDeviceN8 // 1 byte per component, + // 4 bytes + n bytes spot colors per pixel: + // CMYKSSSSCMYKSSSS... +#endif +}; + +enum SplashThinLineMode { + splashThinLineDefault, // if SA on: draw solid if requested line width, transformed into + // device space, is less than half a pixel and a shaped line else + splashThinLineSolid, // draw line solid at least with 1 pixel + splashThinLineShape // draw line shaped at least with 1 pixel +}; +// number of components in each color mode +// (defined in SplashState.cc) +extern int splashColorModeNComps[]; + +// max number of components in any SplashColor +#if SPLASH_CMYK +#define splashMaxColorComps SPOT_NCOMPS+4 +#else +#define splashMaxColorComps 4 +#endif + +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]; } + +// DEVICEN8 +static inline Guchar splashDeviceN8C(SplashColorPtr deviceN8) { return deviceN8[0]; } +static inline Guchar splashDeviceN8M(SplashColorPtr deviceN8) { return deviceN8[1]; } +static inline Guchar splashDeviceN8Y(SplashColorPtr deviceN8) { return deviceN8[2]; } +static inline Guchar splashDeviceN8K(SplashColorPtr deviceN8) { return deviceN8[3]; } +static inline Guchar splashDeviceN8S(SplashColorPtr deviceN8, int nSpot) { return deviceN8[4 + nSpot]; } +#endif + +static inline void splashClearColor(SplashColorPtr dest) { + dest[0] = 0; + dest[1] = 0; + dest[2] = 0; +#if SPLASH_CMYK + dest[3] = 0; + for (int i = SPOT_NCOMPS; i < SPOT_NCOMPS + 4; i++) + dest[i] = 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]; + for (int i = SPOT_NCOMPS; i < SPOT_NCOMPS + 4; i++) + dest[i] = src[i]; +#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]; + for (int i = SPOT_NCOMPS; i < SPOT_NCOMPS + 4; i++) + dest[i] ^= src[i]; +#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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPath.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPath.cc new file mode 100644 index 00000000000..27106ee3d14 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPath.cc @@ -0,0 +1,472 @@ +//======================================================================== +// +// 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> +// Copyright (C) 2013 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 <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, + GBool adjustLines, int linePosI) { + 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) { + if (adjustLines) { + // the adjustment moves thin lines (clip rectangle with + // empty width or height) out of clip area, here we need + // a special adjustment: + x0 = linePosI; + x1 = x0 + 1; + } else { + 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPath.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPath.h new file mode 100644 index 00000000000..1c7040daa23 --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPath.h @@ -0,0 +1,107 @@ +//======================================================================== +// +// SplashXPath.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) 2013 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 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, + GBool adjustLines = gFalse, int linePosI = 0); + + // 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPathScanner.cc b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPathScanner.cc new file mode 100644 index 00000000000..ac47881cb4f --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPathScanner.cc @@ -0,0 +1,544 @@ +//======================================================================== +// +// 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, 2014 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2010 PaweÅ‚ Wiejacha <pawel.wiejacha@gmail.com> +// Copyright (C) 2013, 2014 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 <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) { + if (!addIntersection(segYMin, segYMax, seg->flags, + y, splashFloor(seg->x0), splashFloor(seg->x1))) + break; + } + } 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) { + if (!addIntersection(segYMin, segYMax, seg->flags, y, x, x)) + break; + } + } 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; + } + if (!addIntersection(segYMin, segYMax, seg->flags, y, + splashFloor(xx0), splashFloor(xx1))) + break; + } + } + } + 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; +} + +GBool SplashXPathScanner::addIntersection(double segYMin, double segYMax, + Guint segFlags, + int y, int x0, int x1) { + if (allInterLen == allInterSize) { + unsigned int newInterSize = ((unsigned int) allInterSize * 2 > INT_MAX / sizeof(SplashIntersect)) ? allInterSize + 32768 : allInterSize * 2; + if (newInterSize >= INT_MAX / sizeof(SplashIntersect)) { + error(errInternal, -1, "Bogus memory allocation size in SplashXPathScanner::addIntersection {0:d}", newInterSize); + return gFalse; + } + allInterSize = newInterSize; + allInter = (SplashIntersect *)greallocn(allInter, newInterSize, + 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; + return gTrue; +} + +void SplashXPathScanner::renderAALine(SplashBitmap *aaBuf, + int *x0, int *x1, int y, GBool adjustVertLine) { + 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 = adjustVertLine ? 0xff : 0xff >> (xx & 7); + if (!adjustVertLine && (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 |= adjustVertLine ? 0xff : (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 && xx >= 0) { + 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/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPathScanner.h b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPathScanner.h new file mode 100644 index 00000000000..cc295cb68fe --- /dev/null +++ b/Build/source/libs/poppler/poppler-0.36.0/splash/SplashXPathScanner.h @@ -0,0 +1,108 @@ +//======================================================================== +// +// SplashXPathScanner.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) 2013, 2014 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 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, + GBool adjustVertLine = gFalse); + + // 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(); + GBool 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/Build/source/libs/poppler/version.ac b/Build/source/libs/poppler/version.ac index 33891de21b1..686a3c38eec 100644 --- a/Build/source/libs/poppler/version.ac +++ b/Build/source/libs/poppler/version.ac @@ -8,4 +8,4 @@ dnl dnl -------------------------------------------------------- dnl dnl m4-include this file to define the current poppler version -m4_define([poppler_version], [0.35.0]) +m4_define([poppler_version], [0.36.0]) -- cgit v1.2.3