From 9b6356b3990dbab1de12792c4ac2b90a03c9749c Mon Sep 17 00:00:00 2001 From: Luigi Scarso <luigi.scarso@gmail.com> Date: Mon, 23 Oct 2017 09:28:37 +0000 Subject: [PATCH] sync with experimental --- manual/luatex-modifications.tex | 3 +- manual/luatex-tex.tex | 16 +- manual/luatex.pdf | Bin 1101374 -> 1154955 bytes manual/luatex.tex | 2 +- source/libs/poppler/ChangeLog | 8 + source/libs/poppler/Makefile.am | 27 +- source/libs/poppler/Makefile.in | 126 +- source/libs/poppler/TLpatches/ChangeLog | 7 + source/libs/poppler/TLpatches/TL-Changes | 2 +- .../TLpatches/patch-03-Object-functions | 32 +- source/libs/poppler/configure | 22 +- .../libs/poppler/poppler-src/CMakeLists.txt | 99 +- source/libs/poppler/poppler-src/COPYING3 | 674 ++ source/libs/poppler/poppler-src/ChangeLog | 858 +++ source/libs/poppler/poppler-src/INSTALL | 244 +- source/libs/poppler/poppler-src/Makefile.am | 133 - .../poppler/poppler-src/README.contributors | 21 + source/libs/poppler/poppler-src/TODO | 40 - .../libs/poppler/poppler-src/config.h.cmake | 255 - source/libs/poppler/poppler-src/config.h.in | 290 - source/libs/poppler/poppler-src/configure.ac | 1154 --- .../poppler/poppler-src/fofi/FoFiTrueType.cc | 6 +- .../poppler/poppler-src/fofi/FoFiType1C.cc | 438 +- .../libs/poppler/poppler-src/fofi/Makefile.am | 28 - .../libs/poppler/poppler-src/goo/GooString.cc | 10 +- .../libs/poppler/poppler-src/goo/GooString.h | 5 +- .../poppler/poppler-src/goo/JpegWriter.cc | 3 +- .../libs/poppler/poppler-src/goo/Makefile.am | 69 - source/libs/poppler/poppler-src/goo/glibc.h | 2 +- source/libs/poppler/poppler-src/goo/gmem.h | 4 +- source/libs/poppler/poppler-src/gtk-doc.make | 305 - .../poppler-cairo-uninstalled.pc.in | 6 - .../poppler-src/poppler-cairo.pc.cmake | 9 - .../poppler/poppler-src/poppler-cairo.pc.in | 9 - .../poppler-src/poppler-cpp-uninstalled.pc.in | 7 - .../poppler/poppler-src/poppler-cpp.pc.cmake | 13 - .../poppler/poppler-src/poppler-cpp.pc.in | 13 - .../poppler-glib-uninstalled.pc.in | 7 - .../poppler/poppler-src/poppler-glib.pc.cmake | 13 - .../poppler/poppler-src/poppler-glib.pc.in | 13 - .../poppler-src/poppler-qt4-uninstalled.pc.in | 7 - .../poppler/poppler-src/poppler-qt4.pc.cmake | 13 - .../poppler/poppler-src/poppler-qt4.pc.in | 13 - .../poppler-src/poppler-qt5-uninstalled.pc.in | 7 - .../poppler/poppler-src/poppler-qt5.pc.cmake | 13 - .../poppler/poppler-src/poppler-qt5.pc.in | 13 - .../poppler-splash-uninstalled.pc.in | 7 - .../poppler-src/poppler-splash.pc.cmake | 9 - .../poppler/poppler-src/poppler-splash.pc.in | 9 - .../poppler-src/poppler-uninstalled.pc.in | 6 - .../libs/poppler/poppler-src/poppler.pc.cmake | 11 - source/libs/poppler/poppler-src/poppler.pc.in | 11 - .../libs/poppler/poppler-src/poppler/Annot.cc | 91 +- .../libs/poppler/poppler-src/poppler/Array.cc | 8 +- .../libs/poppler/poppler-src/poppler/Array.h | 12 +- .../poppler-src/poppler/CairoOutputDev.cc | 20 +- .../poppler-src/poppler/CurlPDFDocBuilder.cc | 8 +- .../poppler/poppler-src/poppler/Decrypt.cc | 4 +- .../libs/poppler/poppler-src/poppler/Dict.cc | 18 +- .../libs/poppler/poppler-src/poppler/Dict.h | 26 +- .../libs/poppler/poppler-src/poppler/Form.cc | 107 +- .../libs/poppler/poppler-src/poppler/Form.h | 16 + .../libs/poppler/poppler-src/poppler/Gfx.cc | 71 +- source/libs/poppler/poppler-src/poppler/Gfx.h | 1 + .../poppler/poppler-src/poppler/GfxFont.cc | 56 +- .../poppler/poppler-src/poppler/GfxFont.h | 1 + .../poppler/poppler-src/poppler/GfxState.cc | 33 +- .../poppler/poppler-src/poppler/GfxState.h | 17 +- .../poppler-src/poppler/GlobalParams.cc | 145 +- .../poppler-src/poppler/GlobalParams.h | 36 - .../poppler-src/poppler/GlobalParamsWin.cc | 2 +- .../poppler-src/poppler/JBIG2Stream.cc | 4 +- .../poppler/poppler-src/poppler/Makefile.am | 348 - .../poppler/poppler-src/poppler/Object.cc | 4 +- .../libs/poppler/poppler-src/poppler/Object.h | 152 +- .../poppler-src/poppler/PSOutputDev.cc | 24 +- .../poppler/poppler-src/poppler/PSOutputDev.h | 3 +- .../poppler-src/poppler/SplashOutputDev.cc | 14 +- .../poppler/poppler-src/poppler/Stream.cc | 5 +- .../libs/poppler/poppler-src/poppler/Stream.h | 2 +- .../poppler-src/poppler/StructElement.cc | 16 +- .../poppler-src/poppler/TextOutputDev.cc | 2 +- .../poppler/poppler-src/poppler/UnicodeMap.cc | 4 +- .../libs/poppler/poppler-src/poppler/XRef.cc | 3 + .../poppler-src/poppler/poppler-config.h.in | 8 +- .../poppler/poppler-src/splash/Makefile.am | 73 - .../libs/poppler/poppler-src/splash/Splash.cc | 6477 ----------------- .../libs/poppler/poppler-src/splash/Splash.h | 431 -- .../poppler-src/splash/SplashBitmap.cc | 853 --- .../poppler/poppler-src/splash/SplashBitmap.h | 126 - .../poppler/poppler-src/splash/SplashClip.cc | 411 -- .../poppler/poppler-src/splash/SplashClip.h | 152 - .../poppler-src/splash/SplashErrorCodes.h | 50 - .../poppler-src/splash/SplashFTFont.cc | 513 -- .../poppler/poppler-src/splash/SplashFTFont.h | 80 - .../poppler-src/splash/SplashFTFontEngine.cc | 180 - .../poppler-src/splash/SplashFTFontEngine.h | 81 - .../poppler-src/splash/SplashFTFontFile.cc | 148 - .../poppler-src/splash/SplashFTFontFile.h | 86 - .../poppler/poppler-src/splash/SplashFont.cc | 224 - .../poppler/poppler-src/splash/SplashFont.h | 121 - .../poppler-src/splash/SplashFontEngine.cc | 337 - .../poppler-src/splash/SplashFontEngine.h | 110 - .../poppler-src/splash/SplashFontFile.cc | 124 - .../poppler-src/splash/SplashFontFile.h | 95 - .../poppler-src/splash/SplashFontFileID.cc | 23 - .../poppler-src/splash/SplashFontFileID.h | 28 - .../poppler-src/splash/SplashGlyphBitmap.h | 24 - .../poppler/poppler-src/splash/SplashMath.h | 245 - .../poppler/poppler-src/splash/SplashPath.cc | 185 - .../poppler/poppler-src/splash/SplashPath.h | 123 - .../poppler-src/splash/SplashPattern.cc | 55 - .../poppler-src/splash/SplashPattern.h | 104 - .../poppler-src/splash/SplashScreen.cc | 390 - .../poppler/poppler-src/splash/SplashScreen.h | 80 - .../poppler/poppler-src/splash/SplashState.cc | 272 - .../poppler/poppler-src/splash/SplashState.h | 142 - .../poppler-src/splash/SplashT1Font.cc | 309 - .../poppler/poppler-src/splash/SplashT1Font.h | 69 - .../poppler-src/splash/SplashT1FontEngine.cc | 138 - .../poppler-src/splash/SplashT1FontEngine.h | 50 - .../poppler-src/splash/SplashT1FontFile.cc | 134 - .../poppler-src/splash/SplashT1FontFile.h | 70 - .../poppler/poppler-src/splash/SplashXPath.cc | 472 -- .../poppler/poppler-src/splash/SplashXPath.h | 107 - .../poppler-src/splash/SplashXPathScanner.cc | 544 -- .../poppler-src/splash/SplashXPathScanner.h | 108 - source/libs/poppler/version.ac | 2 +- source/texk/web2c/luatexdir/font/writefont.w | 2 +- source/texk/web2c/luatexdir/font/writetype2.w | 34 +- source/texk/web2c/luatexdir/image/image.h | 2 + source/texk/web2c/luatexdir/image/pdftoepdf.w | 12 +- source/texk/web2c/luatexdir/image/writeimg.w | 5 +- .../texk/web2c/luatexdir/image/writejbig2.w | 2 +- source/texk/web2c/luatexdir/image/writejpg.w | 14 +- source/texk/web2c/luatexdir/lua/lpdflib.c | 21 + source/texk/web2c/luatexdir/lua/ltexlib.c | 141 +- source/texk/web2c/luatexdir/luapeg/lpeg.h | 2 +- source/texk/web2c/luatexdir/luatex.c | 4 +- .../texk/web2c/luatexdir/luatex_svnversion.h | 2 +- source/texk/web2c/luatexdir/pdf/pdfgen.h | 2 +- source/texk/web2c/luatexdir/pdf/pdfgen.w | 74 +- source/texk/web2c/luatexdir/pdf/pdftables.h | 3 + source/texk/web2c/luatexdir/pdf/pdftypes.h | 1 + source/texk/web2c/luatexdir/pdf/pdfxform.h | 4 +- source/texk/web2c/luatexdir/pdf/pdfxform.w | 6 + source/texk/web2c/luatexdir/tex/dumpdata.w | 2 +- source/texk/web2c/luatexdir/tex/linebreak.w | 13 +- source/texk/web2c/luatexdir/tex/maincontrol.w | 4 +- source/texk/web2c/luatexdir/tex/texnodes.w | 33 +- source/texk/web2c/luatexdir/tex/textoken.w | 1 + 151 files changed, 2748 insertions(+), 18335 deletions(-) create mode 100644 source/libs/poppler/poppler-src/COPYING3 delete mode 100644 source/libs/poppler/poppler-src/Makefile.am create mode 100644 source/libs/poppler/poppler-src/README.contributors delete mode 100644 source/libs/poppler/poppler-src/TODO delete mode 100644 source/libs/poppler/poppler-src/config.h.cmake delete mode 100644 source/libs/poppler/poppler-src/config.h.in delete mode 100644 source/libs/poppler/poppler-src/configure.ac delete mode 100644 source/libs/poppler/poppler-src/fofi/Makefile.am delete mode 100644 source/libs/poppler/poppler-src/goo/Makefile.am delete mode 100644 source/libs/poppler/poppler-src/gtk-doc.make delete mode 100644 source/libs/poppler/poppler-src/poppler-cairo-uninstalled.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-cairo.pc.cmake delete mode 100644 source/libs/poppler/poppler-src/poppler-cairo.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-cpp-uninstalled.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-cpp.pc.cmake delete mode 100644 source/libs/poppler/poppler-src/poppler-cpp.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-glib-uninstalled.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-glib.pc.cmake delete mode 100644 source/libs/poppler/poppler-src/poppler-glib.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-qt4-uninstalled.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-qt4.pc.cmake delete mode 100644 source/libs/poppler/poppler-src/poppler-qt4.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-qt5-uninstalled.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-qt5.pc.cmake delete mode 100644 source/libs/poppler/poppler-src/poppler-qt5.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-splash-uninstalled.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-splash.pc.cmake delete mode 100644 source/libs/poppler/poppler-src/poppler-splash.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler-uninstalled.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler.pc.cmake delete mode 100644 source/libs/poppler/poppler-src/poppler.pc.in delete mode 100644 source/libs/poppler/poppler-src/poppler/Makefile.am delete mode 100644 source/libs/poppler/poppler-src/splash/Makefile.am delete mode 100644 source/libs/poppler/poppler-src/splash/Splash.cc delete mode 100644 source/libs/poppler/poppler-src/splash/Splash.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashBitmap.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashBitmap.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashClip.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashClip.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashErrorCodes.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFTFont.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFTFont.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFTFontEngine.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFTFontEngine.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFTFontFile.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFTFontFile.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFont.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFont.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFontEngine.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFontEngine.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFontFile.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFontFile.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFontFileID.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashFontFileID.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashGlyphBitmap.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashMath.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashPath.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashPath.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashPattern.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashPattern.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashScreen.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashScreen.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashState.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashState.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashT1Font.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashT1Font.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashT1FontEngine.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashT1FontEngine.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashT1FontFile.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashT1FontFile.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashXPath.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashXPath.h delete mode 100644 source/libs/poppler/poppler-src/splash/SplashXPathScanner.cc delete mode 100644 source/libs/poppler/poppler-src/splash/SplashXPathScanner.h diff --git a/manual/luatex-modifications.tex b/manual/luatex-modifications.tex index af2c69363..ee9a51de6 100644 --- a/manual/luatex-modifications.tex +++ b/manual/luatex-modifications.tex @@ -1082,8 +1082,7 @@ difference. Watch your spaces. \NC \NC \NR \HL } - -\starttabulate[|l|pT(0pt)|w(5em)|pT(0pt)|p|] +\starttabulate[|l|Tp(0pt)|w(5em)|Tp(0pt)|p|] \HL \BC \type{\breakafterdirmode} \BC \type{0} diff --git a/manual/luatex-tex.tex b/manual/luatex-tex.tex index 4e8418d55..250c2cbe6 100644 --- a/manual/luatex-tex.tex +++ b/manual/luatex-tex.tex @@ -225,10 +225,13 @@ is a \type {glue_spec} node btu when you pass \type {false} as last argument to \type {tex.get} you get the width of the glue and when you pass \type {true} you get all five values. Otherwise you get a node which is a copy of the internal value so you are responsible for its freeing at the \LUA\ end. When you set a -glue quantity you can either pass a \type {glue_spec} or upto five numbers. +glue quantity you can either pass a \type {glue_spec} or upto five numbers. If +you pass \type {true} to \type {get} you get 5 values returned for a glue and +when you pass \type {false} you only get the width returned. For the registers you can use \type {getskip} (node), \type {getglue} (numbers) -\type {setskip} (node) and \type {setglue} (numbers). +\type {setskip} (node) and \type {setglue} (numbers). If you pass \type {false} +as second argument to \type {getglue} you only get the width returned. There are also dedicated setters, getters and checkers: @@ -776,13 +779,14 @@ called xforms in \PDF). You can (re)use the box with \type {\useboxresource} or by creating a rule node with subtype~2. \starttyping -local index = tex.saveboxresource(n,attributes,resources,immediate,type) +local index = tex.saveboxresource(n,attributes,resources,immediate,type,margin) \stoptyping The optional second and third arguments are strings, the fourth is a boolean. The fifth argument is a type. When set to non|-|zero the \type {/Type} entry is omitted. A value of 1 or 3 still writes a \type {/BBox}, while 2 or 3 will write -a \type {/Matrix}. +a \type {/Matrix}. The sixth argument is the (virtual) margin that extends beyond +the effective boundingbox as seen by \TEX. You can generate the reference (a rule type) with: @@ -795,9 +799,11 @@ following is just a bonus (no dimensions returned means that the resource is unknown): \starttyping -local w, h, d = tex.getboxresourcedimensions(n) +local w, h, d, m = tex.getboxresourcedimensions(n) \stoptyping +This returns the width, height, depth and margin of the resource. + You can split a box: \starttyping diff --git a/manual/luatex.pdf b/manual/luatex.pdf index 39b903d44be1cf025df4fae9b4046b97837fc2f4..5dc9ebba2e091d48a3acff0e2210c7490700da7a 100644 GIT binary patch delta 259916 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Μ4Gefqtl#8) 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%0D$+LhTgWbQkryDB~$)07`a@*JMer*VJf5T#@p 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∾e;S^~SL(03KJs#w&63@vEvNO3 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 Wvv=T7P*7G;QC8v*6Vo%%=lDO{4~c02 delta 206257 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%0DO6kMST~Auku=SpUeG&5{0hC#RS2sGCWi$bM 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 diff --git a/manual/luatex.tex b/manual/luatex.tex index 68f88ed08..4a9489865 100644 --- a/manual/luatex.tex +++ b/manual/luatex.tex @@ -45,7 +45,7 @@ \startdocument [status=beta, - version=1.06.1] + version=1.06.2] \startnotmode[*export] \component luatex-titlepage diff --git a/source/libs/poppler/ChangeLog b/source/libs/poppler/ChangeLog index 02dd81b55..5faeaf54d 100644 --- a/source/libs/poppler/ChangeLog +++ b/source/libs/poppler/ChangeLog @@ -1,3 +1,11 @@ +2017-10-04 Luigi Scarso <luigi.scarso@gmail.com> + + Import poppler-0.60.0. + * version.ac: Adjust. + * manually created poppler-config.h.in from poppler-config.h.cmake + * deleted useless files from splash folder + + 2017-02-17 Akira Kakuto <kakuto@fuk.kindai.ac.jp> Import poppler-0.52.0. diff --git a/source/libs/poppler/Makefile.am b/source/libs/poppler/Makefile.am index 627f70c5d..c145329ee 100644 --- a/source/libs/poppler/Makefile.am +++ b/source/libs/poppler/Makefile.am @@ -41,17 +41,22 @@ nodist_libpoppler_a_SOURCES = \ $(poppler_libpoppler_a_sources) goo_libGoo_a_sources = \ + @POPPLER_TREE@/goo/FixedPoint.cc \ + @POPPLER_TREE@/goo/GooHash.cc \ + @POPPLER_TREE@/goo/GooList.cc \ + @POPPLER_TREE@/goo/GooString.cc \ + @POPPLER_TREE@/goo/GooTimer.cc \ + @POPPLER_TREE@/goo/ImgWriter.cc \ + @POPPLER_TREE@/goo/JpegWriter.cc \ + @POPPLER_TREE@/goo/NetPBMWriter.cc \ + @POPPLER_TREE@/goo/PNGWriter.cc \ + @POPPLER_TREE@/goo/TiffWriter.cc \ @POPPLER_TREE@/goo/gfile.cc \ @POPPLER_TREE@/goo/glibc.cc \ @POPPLER_TREE@/goo/gmem.cc \ @POPPLER_TREE@/goo/gmempp.cc \ @POPPLER_TREE@/goo/grandom.cc \ - @POPPLER_TREE@/goo/gstrtod.cc \ - @POPPLER_TREE@/goo/FixedPoint.cc \ - @POPPLER_TREE@/goo/GooHash.cc \ - @POPPLER_TREE@/goo/GooList.cc \ - @POPPLER_TREE@/goo/GooString.cc \ - @POPPLER_TREE@/goo/GooTimer.cc + @POPPLER_TREE@/goo/gstrtod.cc fofi_libfofi_a_sources = \ @POPPLER_TREE@/fofi/FoFiBase.cc \ @@ -59,9 +64,7 @@ fofi_libfofi_a_sources = \ @POPPLER_TREE@/fofi/FoFiIdentifier.cc \ @POPPLER_TREE@/fofi/FoFiTrueType.cc \ @POPPLER_TREE@/fofi/FoFiType1.cc \ - @POPPLER_TREE@/fofi/FoFiType1C.cc - - + @POPPLER_TREE@/fofi/FoFiType1C.cc poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/Annot.cc \ @@ -77,6 +80,7 @@ poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/Dict.cc \ @POPPLER_TREE@/poppler/Error.cc \ @POPPLER_TREE@/poppler/FileSpec.cc \ + @POPPLER_TREE@/poppler/FlateEncoder.cc \ @POPPLER_TREE@/poppler/FlateStream.cc \ @POPPLER_TREE@/poppler/FontEncodingTables.cc \ @POPPLER_TREE@/poppler/FontInfo.cc \ @@ -93,6 +97,7 @@ poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/Lexer.cc \ @POPPLER_TREE@/poppler/Linearization.cc \ @POPPLER_TREE@/poppler/Link.cc \ + @POPPLER_TREE@/poppler/LocalPDFDocBuilder.cc \ @POPPLER_TREE@/poppler/MarkedContentOutputDev.cc \ @POPPLER_TREE@/poppler/Movie.cc \ @POPPLER_TREE@/poppler/NameToCharCode.cc \ @@ -103,6 +108,7 @@ poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/PDFDoc.cc \ @POPPLER_TREE@/poppler/PDFDocEncoding.cc \ @POPPLER_TREE@/poppler/PDFDocFactory.cc \ + @POPPLER_TREE@/poppler/PSOutputDev.cc \ @POPPLER_TREE@/poppler/PSTokenizer.cc \ @POPPLER_TREE@/poppler/Page.cc \ @POPPLER_TREE@/poppler/PageLabelInfo.cc \ @@ -125,8 +131,7 @@ poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/UnicodeTypeTable.cc \ @POPPLER_TREE@/poppler/ViewerPreferences.cc \ @POPPLER_TREE@/poppler/XRef.cc \ - @POPPLER_TREE@/poppler/XpdfPluginAPI.cc \ - @POPPLER_TREE@/poppler/strtok_r.cpp + @POPPLER_TREE@/poppler/XpdfPluginAPI.cc $(libpoppler_a_OBJECTS): config.force diff --git a/source/libs/poppler/Makefile.in b/source/libs/poppler/Makefile.in index b32e442d3..ebb0426b2 100644 --- a/source/libs/poppler/Makefile.in +++ b/source/libs/poppler/Makefile.in @@ -114,17 +114,22 @@ am__v_AR_1 = libpoppler_a_AR = $(AR) $(ARFLAGS) libpoppler_a_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp -am__objects_1 = @POPPLER_TREE@/goo/gfile.$(OBJEXT) \ +am__objects_1 = @POPPLER_TREE@/goo/FixedPoint.$(OBJEXT) \ + @POPPLER_TREE@/goo/GooHash.$(OBJEXT) \ + @POPPLER_TREE@/goo/GooList.$(OBJEXT) \ + @POPPLER_TREE@/goo/GooString.$(OBJEXT) \ + @POPPLER_TREE@/goo/GooTimer.$(OBJEXT) \ + @POPPLER_TREE@/goo/ImgWriter.$(OBJEXT) \ + @POPPLER_TREE@/goo/JpegWriter.$(OBJEXT) \ + @POPPLER_TREE@/goo/NetPBMWriter.$(OBJEXT) \ + @POPPLER_TREE@/goo/PNGWriter.$(OBJEXT) \ + @POPPLER_TREE@/goo/TiffWriter.$(OBJEXT) \ + @POPPLER_TREE@/goo/gfile.$(OBJEXT) \ @POPPLER_TREE@/goo/glibc.$(OBJEXT) \ @POPPLER_TREE@/goo/gmem.$(OBJEXT) \ @POPPLER_TREE@/goo/gmempp.$(OBJEXT) \ @POPPLER_TREE@/goo/grandom.$(OBJEXT) \ - @POPPLER_TREE@/goo/gstrtod.$(OBJEXT) \ - @POPPLER_TREE@/goo/FixedPoint.$(OBJEXT) \ - @POPPLER_TREE@/goo/GooHash.$(OBJEXT) \ - @POPPLER_TREE@/goo/GooList.$(OBJEXT) \ - @POPPLER_TREE@/goo/GooString.$(OBJEXT) \ - @POPPLER_TREE@/goo/GooTimer.$(OBJEXT) + @POPPLER_TREE@/goo/gstrtod.$(OBJEXT) am__objects_2 = @POPPLER_TREE@/fofi/FoFiBase.$(OBJEXT) \ @POPPLER_TREE@/fofi/FoFiEncodings.$(OBJEXT) \ @POPPLER_TREE@/fofi/FoFiIdentifier.$(OBJEXT) \ @@ -144,6 +149,7 @@ am__objects_3 = @POPPLER_TREE@/poppler/Annot.$(OBJEXT) \ @POPPLER_TREE@/poppler/Dict.$(OBJEXT) \ @POPPLER_TREE@/poppler/Error.$(OBJEXT) \ @POPPLER_TREE@/poppler/FileSpec.$(OBJEXT) \ + @POPPLER_TREE@/poppler/FlateEncoder.$(OBJEXT) \ @POPPLER_TREE@/poppler/FlateStream.$(OBJEXT) \ @POPPLER_TREE@/poppler/FontEncodingTables.$(OBJEXT) \ @POPPLER_TREE@/poppler/FontInfo.$(OBJEXT) \ @@ -160,6 +166,7 @@ am__objects_3 = @POPPLER_TREE@/poppler/Annot.$(OBJEXT) \ @POPPLER_TREE@/poppler/Lexer.$(OBJEXT) \ @POPPLER_TREE@/poppler/Linearization.$(OBJEXT) \ @POPPLER_TREE@/poppler/Link.$(OBJEXT) \ + @POPPLER_TREE@/poppler/LocalPDFDocBuilder.$(OBJEXT) \ @POPPLER_TREE@/poppler/MarkedContentOutputDev.$(OBJEXT) \ @POPPLER_TREE@/poppler/Movie.$(OBJEXT) \ @POPPLER_TREE@/poppler/NameToCharCode.$(OBJEXT) \ @@ -170,6 +177,7 @@ am__objects_3 = @POPPLER_TREE@/poppler/Annot.$(OBJEXT) \ @POPPLER_TREE@/poppler/PDFDoc.$(OBJEXT) \ @POPPLER_TREE@/poppler/PDFDocEncoding.$(OBJEXT) \ @POPPLER_TREE@/poppler/PDFDocFactory.$(OBJEXT) \ + @POPPLER_TREE@/poppler/PSOutputDev.$(OBJEXT) \ @POPPLER_TREE@/poppler/PSTokenizer.$(OBJEXT) \ @POPPLER_TREE@/poppler/Page.$(OBJEXT) \ @POPPLER_TREE@/poppler/PageLabelInfo.$(OBJEXT) \ @@ -192,8 +200,7 @@ am__objects_3 = @POPPLER_TREE@/poppler/Annot.$(OBJEXT) \ @POPPLER_TREE@/poppler/UnicodeTypeTable.$(OBJEXT) \ @POPPLER_TREE@/poppler/ViewerPreferences.$(OBJEXT) \ @POPPLER_TREE@/poppler/XRef.$(OBJEXT) \ - @POPPLER_TREE@/poppler/XpdfPluginAPI.$(OBJEXT) \ - @POPPLER_TREE@/poppler/strtok_r.$(OBJEXT) + @POPPLER_TREE@/poppler/XpdfPluginAPI.$(OBJEXT) nodist_libpoppler_a_OBJECTS = $(am__objects_1) $(am__objects_2) \ $(am__objects_3) libpoppler_a_OBJECTS = $(nodist_libpoppler_a_OBJECTS) @@ -452,17 +459,22 @@ nodist_libpoppler_a_SOURCES = \ $(poppler_libpoppler_a_sources) goo_libGoo_a_sources = \ + @POPPLER_TREE@/goo/FixedPoint.cc \ + @POPPLER_TREE@/goo/GooHash.cc \ + @POPPLER_TREE@/goo/GooList.cc \ + @POPPLER_TREE@/goo/GooString.cc \ + @POPPLER_TREE@/goo/GooTimer.cc \ + @POPPLER_TREE@/goo/ImgWriter.cc \ + @POPPLER_TREE@/goo/JpegWriter.cc \ + @POPPLER_TREE@/goo/NetPBMWriter.cc \ + @POPPLER_TREE@/goo/PNGWriter.cc \ + @POPPLER_TREE@/goo/TiffWriter.cc \ @POPPLER_TREE@/goo/gfile.cc \ @POPPLER_TREE@/goo/glibc.cc \ @POPPLER_TREE@/goo/gmem.cc \ @POPPLER_TREE@/goo/gmempp.cc \ @POPPLER_TREE@/goo/grandom.cc \ - @POPPLER_TREE@/goo/gstrtod.cc \ - @POPPLER_TREE@/goo/FixedPoint.cc \ - @POPPLER_TREE@/goo/GooHash.cc \ - @POPPLER_TREE@/goo/GooList.cc \ - @POPPLER_TREE@/goo/GooString.cc \ - @POPPLER_TREE@/goo/GooTimer.cc + @POPPLER_TREE@/goo/gstrtod.cc fofi_libfofi_a_sources = \ @POPPLER_TREE@/fofi/FoFiBase.cc \ @@ -470,7 +482,7 @@ fofi_libfofi_a_sources = \ @POPPLER_TREE@/fofi/FoFiIdentifier.cc \ @POPPLER_TREE@/fofi/FoFiTrueType.cc \ @POPPLER_TREE@/fofi/FoFiType1.cc \ - @POPPLER_TREE@/fofi/FoFiType1C.cc + @POPPLER_TREE@/fofi/FoFiType1C.cc poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/Annot.cc \ @@ -486,6 +498,7 @@ poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/Dict.cc \ @POPPLER_TREE@/poppler/Error.cc \ @POPPLER_TREE@/poppler/FileSpec.cc \ + @POPPLER_TREE@/poppler/FlateEncoder.cc \ @POPPLER_TREE@/poppler/FlateStream.cc \ @POPPLER_TREE@/poppler/FontEncodingTables.cc \ @POPPLER_TREE@/poppler/FontInfo.cc \ @@ -502,6 +515,7 @@ poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/Lexer.cc \ @POPPLER_TREE@/poppler/Linearization.cc \ @POPPLER_TREE@/poppler/Link.cc \ + @POPPLER_TREE@/poppler/LocalPDFDocBuilder.cc \ @POPPLER_TREE@/poppler/MarkedContentOutputDev.cc \ @POPPLER_TREE@/poppler/Movie.cc \ @POPPLER_TREE@/poppler/NameToCharCode.cc \ @@ -512,6 +526,7 @@ poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/PDFDoc.cc \ @POPPLER_TREE@/poppler/PDFDocEncoding.cc \ @POPPLER_TREE@/poppler/PDFDocFactory.cc \ + @POPPLER_TREE@/poppler/PSOutputDev.cc \ @POPPLER_TREE@/poppler/PSTokenizer.cc \ @POPPLER_TREE@/poppler/Page.cc \ @POPPLER_TREE@/poppler/PageLabelInfo.cc \ @@ -534,8 +549,7 @@ poppler_libpoppler_a_sources = \ @POPPLER_TREE@/poppler/UnicodeTypeTable.cc \ @POPPLER_TREE@/poppler/ViewerPreferences.cc \ @POPPLER_TREE@/poppler/XRef.cc \ - @POPPLER_TREE@/poppler/XpdfPluginAPI.cc \ - @POPPLER_TREE@/poppler/strtok_r.cpp + @POPPLER_TREE@/poppler/XpdfPluginAPI.cc # Reconfig @@ -550,7 +564,7 @@ all: config.h poppler-config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: -.SUFFIXES: .cc .cpp .o .obj +.SUFFIXES: .cc .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../../am/dist_hook.am $(srcdir)/../../am/reconfig.am $(srcdir)/../../am/rebuild.am $(am__configure_deps) @@ -617,36 +631,51 @@ clean-noinstLIBRARIES: @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) @POPPLER_TREE@/goo/$(DEPDIR) @: > @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/gfile.$(OBJEXT): \ +@POPPLER_TREE@/goo/FixedPoint.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/glibc.$(OBJEXT): \ +@POPPLER_TREE@/goo/GooHash.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/gmem.$(OBJEXT): @POPPLER_TREE@/goo/$(am__dirstamp) \ +@POPPLER_TREE@/goo/GooList.$(OBJEXT): \ + @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/gmempp.$(OBJEXT): \ +@POPPLER_TREE@/goo/GooString.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/grandom.$(OBJEXT): \ +@POPPLER_TREE@/goo/GooTimer.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/gstrtod.$(OBJEXT): \ +@POPPLER_TREE@/goo/ImgWriter.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/FixedPoint.$(OBJEXT): \ +@POPPLER_TREE@/goo/JpegWriter.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/GooHash.$(OBJEXT): \ +@POPPLER_TREE@/goo/NetPBMWriter.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/GooList.$(OBJEXT): \ +@POPPLER_TREE@/goo/PNGWriter.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/GooString.$(OBJEXT): \ +@POPPLER_TREE@/goo/TiffWriter.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/goo/GooTimer.$(OBJEXT): \ +@POPPLER_TREE@/goo/gfile.$(OBJEXT): \ + @POPPLER_TREE@/goo/$(am__dirstamp) \ + @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) +@POPPLER_TREE@/goo/glibc.$(OBJEXT): \ + @POPPLER_TREE@/goo/$(am__dirstamp) \ + @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) +@POPPLER_TREE@/goo/gmem.$(OBJEXT): @POPPLER_TREE@/goo/$(am__dirstamp) \ + @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) +@POPPLER_TREE@/goo/gmempp.$(OBJEXT): \ + @POPPLER_TREE@/goo/$(am__dirstamp) \ + @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) +@POPPLER_TREE@/goo/grandom.$(OBJEXT): \ + @POPPLER_TREE@/goo/$(am__dirstamp) \ + @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) +@POPPLER_TREE@/goo/gstrtod.$(OBJEXT): \ @POPPLER_TREE@/goo/$(am__dirstamp) \ @POPPLER_TREE@/goo/$(DEPDIR)/$(am__dirstamp) @POPPLER_TREE@/fofi/$(am__dirstamp): @@ -718,6 +747,9 @@ clean-noinstLIBRARIES: @POPPLER_TREE@/poppler/FileSpec.$(OBJEXT): \ @POPPLER_TREE@/poppler/$(am__dirstamp) \ @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) +@POPPLER_TREE@/poppler/FlateEncoder.$(OBJEXT): \ + @POPPLER_TREE@/poppler/$(am__dirstamp) \ + @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) @POPPLER_TREE@/poppler/FlateStream.$(OBJEXT): \ @POPPLER_TREE@/poppler/$(am__dirstamp) \ @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) @@ -766,6 +798,9 @@ clean-noinstLIBRARIES: @POPPLER_TREE@/poppler/Link.$(OBJEXT): \ @POPPLER_TREE@/poppler/$(am__dirstamp) \ @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) +@POPPLER_TREE@/poppler/LocalPDFDocBuilder.$(OBJEXT): \ + @POPPLER_TREE@/poppler/$(am__dirstamp) \ + @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) @POPPLER_TREE@/poppler/MarkedContentOutputDev.$(OBJEXT): \ @POPPLER_TREE@/poppler/$(am__dirstamp) \ @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) @@ -796,6 +831,9 @@ clean-noinstLIBRARIES: @POPPLER_TREE@/poppler/PDFDocFactory.$(OBJEXT): \ @POPPLER_TREE@/poppler/$(am__dirstamp) \ @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) +@POPPLER_TREE@/poppler/PSOutputDev.$(OBJEXT): \ + @POPPLER_TREE@/poppler/$(am__dirstamp) \ + @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) @POPPLER_TREE@/poppler/PSTokenizer.$(OBJEXT): \ @POPPLER_TREE@/poppler/$(am__dirstamp) \ @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) @@ -865,9 +903,6 @@ clean-noinstLIBRARIES: @POPPLER_TREE@/poppler/XpdfPluginAPI.$(OBJEXT): \ @POPPLER_TREE@/poppler/$(am__dirstamp) \ @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) -@POPPLER_TREE@/poppler/strtok_r.$(OBJEXT): \ - @POPPLER_TREE@/poppler/$(am__dirstamp) \ - @POPPLER_TREE@/poppler/$(DEPDIR)/$(am__dirstamp) libpoppler.a: $(libpoppler_a_OBJECTS) $(libpoppler_a_DEPENDENCIES) $(EXTRA_libpoppler_a_DEPENDENCIES) $(AM_V_at)-rm -f libpoppler.a @@ -894,6 +929,11 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/GooList.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/GooString.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/GooTimer.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/ImgWriter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/JpegWriter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/NetPBMWriter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/PNGWriter.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/TiffWriter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/gfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/glibc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/goo/$(DEPDIR)/gmem.Po@am__quote@ @@ -913,6 +953,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/Dict.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/Error.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/FileSpec.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/FlateEncoder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/FlateStream.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/FontEncodingTables.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/FontInfo.Po@am__quote@ @@ -929,6 +970,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/Lexer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/Linearization.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/Link.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/LocalPDFDocBuilder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/MarkedContentOutputDev.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/Movie.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/NameToCharCode.Po@am__quote@ @@ -939,6 +981,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/PDFDoc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/PDFDocEncoding.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/PDFDocFactory.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/PSOutputDev.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/PSTokenizer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/Page.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/PageLabelInfo.Po@am__quote@ @@ -962,7 +1005,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/ViewerPreferences.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/XRef.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/XpdfPluginAPI.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@@POPPLER_TREE@/poppler/$(DEPDIR)/strtok_r.Po@am__quote@ .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @@ -980,22 +1022,6 @@ distclean-compile: @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` -.cpp.o: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< - -.cpp.obj: -@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, diff --git a/source/libs/poppler/TLpatches/ChangeLog b/source/libs/poppler/TLpatches/ChangeLog index c11001c10..8b900ff4d 100644 --- a/source/libs/poppler/TLpatches/ChangeLog +++ b/source/libs/poppler/TLpatches/ChangeLog @@ -1,3 +1,10 @@ +2017-10-04 Luigi Scarso <luigi.scarso@gmail.com> + + Imported poppler-0.60.0 source tree from: + http://poppler.freedesktop.org/ + * patch-02-LLONG_MAX, patch-03-Object-functions: Adapted. + * removed all files but SplashTypes.h in the splash/ directory + 2017-09-25 Luigi Scarso <luigi.scarso@gmail.com> Imported poppler-0.59.0 source tree from: diff --git a/source/libs/poppler/TLpatches/TL-Changes b/source/libs/poppler/TLpatches/TL-Changes index 883eb5f75..9a1ab73cd 100644 --- a/source/libs/poppler/TLpatches/TL-Changes +++ b/source/libs/poppler/TLpatches/TL-Changes @@ -1,4 +1,4 @@ -Changes applied to the poppler-0.52.0 tree as obtained from: +Changes applied to the poppler-0.60.0 tree as obtained from: http://poppler.freedesktop.org/ Removed: diff --git a/source/libs/poppler/TLpatches/patch-03-Object-functions b/source/libs/poppler/TLpatches/patch-03-Object-functions index 9a5a41107..03511d2af 100644 --- a/source/libs/poppler/TLpatches/patch-03-Object-functions +++ b/source/libs/poppler/TLpatches/patch-03-Object-functions @@ -1,35 +1,33 @@ -diff -u Object.h.std Object.h ---- Object.h.std 2017-09-18 19:14:36.231203342 +0200 -+++ Object.h 2017-09-18 19:15:49.387200342 +0200 +--- Object.h.std 2017-10-02 23:29:21.000000000 +0200 ++++ Object.h 2017-10-03 10:13:36.496259318 +0200 @@ -207,7 +207,7 @@ - GBool isName(const char *nameA) + GBool isName(const char *nameA) const { return type == objName && !strcmp(cString, nameA); } - GBool isDict(const char *dictType); -- GBool isStream(char *dictType); -+ GBool isStream(const char *dictType); - GBool isCmd(const char *cmdA) + GBool isDict(const char *dictType) const; +- GBool isStream(char *dictType) const; ++ GBool isStream(const char *dictType) const; + GBool isCmd(const char *cmdA) const { return type == objCmd && !strcmp(cString, cmdA); } @@ -264,7 +264,7 @@ - Object dictGetValNF(int i); + Object dictGetValNF(int i) const; // Stream accessors. -- GBool streamIs(char *dictType); -+ GBool streamIs(const char *dictType); +- GBool streamIs(char *dictType) const; ++ GBool streamIs(const char *dictType) const; void streamReset(); void streamClose(); - int streamGetChar(); + int streamGetChar() const; @@ -379,10 +379,10 @@ #include "Stream.h" --inline GBool Object::streamIs(char *dictType) -+inline GBool Object::streamIs(const char *dictType) +-inline GBool Object::streamIs(char *dictType) const ++inline GBool Object::streamIs(const char *dictType) const { OBJECT_TYPE_CHECK(objStream); return stream->getDict()->is(dictType); } --inline GBool Object::isStream(char *dictType) -+inline GBool Object::isStream(const char *dictType) +-inline GBool Object::isStream(char *dictType) const ++inline GBool Object::isStream(const char *dictType) const { return type == objStream && streamIs(dictType); } inline void Object::streamReset() - diff --git a/source/libs/poppler/configure b/source/libs/poppler/configure index d8480aad6..4b6fd0880 100755 --- a/source/libs/poppler/configure +++ b/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.59.0. +# Generated by GNU Autoconf 2.69 for poppler (TeX Live) 0.60.0. # # Report bugs to <tex-k@tug.org>. # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='poppler (TeX Live)' PACKAGE_TARNAME='poppler--tex-live-' -PACKAGE_VERSION='0.59.0' -PACKAGE_STRING='poppler (TeX Live) 0.59.0' +PACKAGE_VERSION='0.60.0' +PACKAGE_STRING='poppler (TeX Live) 0.60.0' PACKAGE_BUGREPORT='tex-k@tug.org' PACKAGE_URL='' @@ -1319,7 +1319,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.59.0 to adapt to many kinds of systems. +\`configure' configures poppler (TeX Live) 0.60.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1387,7 +1387,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of poppler (TeX Live) 0.59.0:";; + short | recursive ) echo "Configuration of poppler (TeX Live) 0.60.0:";; esac cat <<\_ACEOF @@ -1502,7 +1502,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -poppler (TeX Live) configure 0.59.0 +poppler (TeX Live) configure 0.60.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2092,7 +2092,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.59.0, which was +It was created by poppler (TeX Live) $as_me 0.60.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -4015,7 +4015,7 @@ fi # Define the identity of the package. PACKAGE='poppler--tex-live-' - VERSION='0.59.0' + VERSION='0.60.0' # Some tools Automake needs. @@ -6624,7 +6624,7 @@ ac_config_headers="$ac_config_headers poppler-config.h:poppler-src/poppler/poppl cat >>confdefs.h <<_ACEOF -#define POPPLER_VERSION "0.59.0" +#define POPPLER_VERSION "0.60.0" _ACEOF @@ -7318,7 +7318,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.59.0, which was +This file was extended by poppler (TeX Live) $as_me 0.60.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -7384,7 +7384,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.59.0 +poppler (TeX Live) config.status 0.60.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/source/libs/poppler/poppler-src/CMakeLists.txt b/source/libs/poppler/poppler-src/CMakeLists.txt index a5b0a5be5..887b0cc7f 100644 --- a/source/libs/poppler/poppler-src/CMakeLists.txt +++ b/source/libs/poppler/poppler-src/CMakeLists.txt @@ -38,20 +38,26 @@ option(BUILD_CPP_TESTS "Whether compile the CPP test programs." ON) option(ENABLE_SPLASH "Build the Splash graphics backend." ON) option(ENABLE_UTILS "Compile poppler command line utils." ON) option(ENABLE_CPP "Compile poppler cpp wrapper." ON) +option(ENABLE_GLIB "Compile poppler glib wrapper." ON) +option(ENABLE_GTK_DOC "Whether to generate glib API documentation." OFF) +option(ENABLE_QT4 "Compile poppler qt4 wrapper." ON) +option(ENABLE_QT5 "Compile poppler qt5 wrapper." ON) set(ENABLE_LIBOPENJPEG "auto" CACHE STRING "Use libopenjpeg for JPX streams. Possible values: auto, openjpeg1, openjpeg2, unmaintained, none. 'auto' prefers openjpeg2 over openjpeg1 if both are available. 'unmaintained' gives you the internal unmaintained decoder. Use at your own risk. 'none' compiles no JPX decoder at all. Default: auto") 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.") set(ENABLE_DCTDECODER "libjpeg" CACHE STRING "Use libjpeg for DCT streams. Possible values: libjpeg, unmaintained, none. will use libjpeg if available or fail if not. 'unmaintained' gives you the internal unmaintained decoder. Use at your own risk. 'none' compiles no DCT decoder at all. Default: libjpeg") -option(ENABLE_LIBCURL "Build libcurl based HTTP support." OFF) +option(ENABLE_LIBCURL "Build libcurl based HTTP support." ON) option(ENABLE_ZLIB "Build with zlib." ON) option(ENABLE_ZLIB_UNCOMPRESS "Use zlib to uncompress flate streams (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) +option(BUILD_SHARED_LIBS "Build poppler as a shared library" ON) if(WIN32) option(ENABLE_RELOCATABLE "Do not hardcode the poppler library location (on Windows)." ON) else() set(ENABLE_RELOCATABLE OFF) endif() +option(EXTRA_WARN "Enable extra compile warnings" OFF) 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") @@ -129,17 +135,24 @@ elseif(ENABLE_DCTDECODER STREQUAL "none") else() message(FATAL_ERROR "Invalid ENABLE_DCTDECODER value.") endif() -macro_optional_find_package(Qt4) -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) + +if (ENABLE_QT4) + macro_optional_find_package(Qt4) + if (NOT QT4_FOUND) + set(ENABLE_QT4 OFF) + endif() +endif() + +if (ENABLE_QT5) + find_package(Qt5Core) + find_package(Qt5Gui) + find_package(Qt5Xml) + find_package(Qt5Widgets) + find_package(Qt5Test) + if (NOT (Qt5Core_FOUND AND Qt5Gui_FOUND AND Qt5Xml_FOUND AND Qt5Widgets_FOUND AND Qt5Test_FOUND)) + message("-- Package Qt5Core or Qt5Gui or Qt5Xml or Qt5Widgets or Qt5Test not found") + set(ENABLE_QT5 OFF) + endif() endif() macro_optional_find_package(Cairo ${CAIRO_VERSION}) @@ -149,9 +162,13 @@ if(CAIRO_FOUND) 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) + if(ENABLE_GLIB) + macro_optional_find_package(GLIB) + if(NOT GLIB_FOUND) + set(ENABLE_GLIB OFF) + endif() + endif() + if(ENABLE_GLIB) # Check for introspection macro_optional_find_package(GObjectIntrospection 0.9.12) set(HAVE_INTROSPECTION ${INTROSPECTION_FOUND}) @@ -161,6 +178,7 @@ if(CAIRO_FOUND) endif() else() set(CAIRO_FEATURE "#undef POPPLER_HAS_CAIRO") + set(ENABLE_GLIB OFF) endif() if(ENABLE_CPP) macro_optional_find_package(Iconv) @@ -238,8 +256,12 @@ elseif(ENABLE_CMS STREQUAL "lcms2") endif() if(ENABLE_LIBCURL) find_package(CURL) - include_directories(${CURL_INCLUDE_DIR}) - set(POPPLER_HAS_CURL_SUPPORT ON) + if(CURL_FOUND) + include_directories(${CURL_INCLUDE_DIR}) + set(POPPLER_HAS_CURL_SUPPORT ON) + else() + set(ENABLE_LIBCURL OFF) + endif() endif() add_definitions(-DHAVE_CONFIG_H=1) @@ -319,21 +341,12 @@ if(NOT DEFINED POPPLER_DATADIR) set(POPPLER_DATADIR "${CMAKE_INSTALL_PREFIX}/share/poppler") endif() -if(DEFINED COMPILE_WARNINGS) -else() - set(COMPILE_WARNINGS "yes") -endif() -string(TOLOWER "${COMPILE_WARNINGS}" _comp_warnings) -if(_comp_warnings STREQUAL "no") - set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_NO} ${CMAKE_CXX_FLAGS}") -endif() -if(_comp_warnings STREQUAL "yes") +if(EXTRA_WARN) set(CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_YES} ${CMAKE_CXX_FLAGS}") -endif() -if(_comp_warnings STREQUAL "kde") + set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_EXTRA} ${CMAKE_CXX_FLAGS}") +else() set(CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS}") - set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_KDE} ${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS} ${CMAKE_CXX_FLAGS}") endif() @@ -535,7 +548,7 @@ add_definitions(-D_CRT_SECURE_NO_WARNINGS) set(CMAKE_CXX_FLAGS "/Zc:wchar_t- ${CMAKE_CXX_FLAGS}") add_library(poppler STATIC ${poppler_SRCS}) else() -add_library(poppler SHARED ${poppler_SRCS}) +add_library(poppler ${poppler_SRCS}) endif() set_target_properties(poppler PROPERTIES VERSION 70.0.0 SOVERSION 70) target_link_libraries(poppler LINK_PRIVATE ${poppler_LIBS}) @@ -716,10 +729,10 @@ if(ENABLE_GLIB) add_subdirectory(glib) endif() add_subdirectory(test) -if(QT4_FOUND) +if(ENABLE_QT4) add_subdirectory(qt4) endif() -if(QT5_FOUND) +if(ENABLE_QT5) add_subdirectory(qt5) endif() if(ENABLE_CPP) @@ -743,10 +756,10 @@ 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() -if(QT4_FOUND) +if(ENABLE_QT4) poppler_create_install_pkgconfig(poppler-qt4.pc lib${LIB_SUFFIX}/pkgconfig) endif() -if(QT5_FOUND) +if(ENABLE_QT5) poppler_create_install_pkgconfig(poppler-qt5.pc lib${LIB_SUFFIX}/pkgconfig) endif() if(ENABLE_GLIB) @@ -767,12 +780,12 @@ 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("qt4 wrapper" ENABLE_QT4) +show_end_message_yesno("qt5 wrapper" ENABLE_QT5) show_end_message_yesno("glib wrapper" ENABLE_GLIB) show_end_message_yesno(" introspection" INTROSPECTION_FOUND) +show_end_message_yesno(" gtk-doc" ENABLE_GTK_DOC) 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) @@ -824,3 +837,13 @@ endif() if(NOT HAVE_JPX_DECODER) message("Warning: You're not compiling any JPX decoder. Some files will fail to display properly.") endif() + +set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${POPPLER_VERSION}) +add_custom_target(dist + COMMAND + COMMAND git log --stat | fmt --split-only > ${CMAKE_BINARY_DIR}/ChangeLog + COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar + COMMAND tar -C ${CMAKE_BINARY_DIR} -rf ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar ChangeLog --transform='s,,${ARCHIVE_NAME}/,' + COMMAND tar -C ${CMAKE_BINARY_DIR} -rf ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar glib/reference/html --transform='s,,${ARCHIVE_NAME}/,' + COMMAND xz -9 ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) diff --git a/source/libs/poppler/poppler-src/COPYING3 b/source/libs/poppler/poppler-src/COPYING3 new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/source/libs/poppler/poppler-src/COPYING3 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU 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. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/source/libs/poppler/poppler-src/ChangeLog b/source/libs/poppler/poppler-src/ChangeLog index a0b4add84..00799729a 100644 --- a/source/libs/poppler/poppler-src/ChangeLog +++ b/source/libs/poppler/poppler-src/ChangeLog @@ -1,3 +1,861 @@ +commit 9432e0bfc4c4f2e16b7c152aa8b04d6d19ed4898 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Oct 2 23:29:21 2017 +0200 + + Add missing (C) + + cpp/poppler-private.cpp | 1 + + fofi/FoFiTrueType.cc | 2 +- + goo/GooString.cc | 2 +- + goo/GooString.h | 2 +- + goo/JpegWriter.cc | 1 + + goo/gmem.h | 2 +- + poppler/CairoOutputDev.cc | 2 +- + poppler/CurlPDFDocBuilder.cc | 2 +- + poppler/Decrypt.cc | 2 +- + poppler/GfxState.h | 2 +- + poppler/GlobalParams.cc | 2 +- + poppler/PSOutputDev.cc | 2 +- + poppler/PSOutputDev.h | 2 +- + poppler/UnicodeMap.cc | 1 + + qt4/src/poppler-link.cc | 2 +- + qt4/src/poppler-private.cc | 2 +- + qt5/src/poppler-link.cc | 2 +- + qt5/src/poppler-private.cc | 2 +- + qt5/src/poppler-qt5.h | 1 + + splash/Splash.cc | 2 +- + splash/SplashFTFontFile.cc | 1 + + splash/SplashFTFontFile.h | 1 + + utils/pdfseparate.cc | 2 +- + 23 files changed, 23 insertions(+), 17 deletions(-) + +commit da02d7c683f1788d38cccb3716edd1ba011cb94c +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Oct 2 23:05:59 2017 +0200 + + remove m4 gtk-doc.make and add comments to poppler-features.h.cmake + + glib/poppler-features.h.cmake | 55 ++++++++ + gtk-doc.make | 305 + ---------------------------------------- + m4/.gitignore | 5 - + m4/ax_pthread.m4 | 317 + ------------------------------------------ + m4/define-dir.m4 | 34 ----- + m4/gtk-doc.m4 | 88 ------------ + m4/iconv.m4 | 180 ------------------------ + m4/introspection.m4 | 94 ------------- + m4/libjpeg.m4 | 114 --------------- + 9 files changed, 55 insertions(+), 1137 deletions(-) + +commit f871b82edfd632f79ec7bdd0b4d560cd348d8b1a +Author: Oliver Sander <oliver.sander@tu-dresden.de> +Date: Fri Sep 8 23:27:45 2017 +0200 + + qt5: ArthurOutputDev: Fix several small bugs related to dash pattern + handling + + qt5/src/ArthurOutputDev.cc | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +commit 3ec5e86ca000653525650a99755c85e512a04bdc +Author: Oliver Sander <oliver.sander@tu-dresden.de> +Date: Fri Sep 29 21:24:23 2017 +0200 + + qt5: ArthurOutputDev: Implement the drawSoftMaskedImage method + + qt5/src/ArthurOutputDev.cc | 67 + ++++++++++++++++++++++++++++++++++++++++++++++ + qt5/src/ArthurOutputDev.h | 9 +++++++ + 2 files changed, 76 insertions(+) + +commit 376ae2f8b8a92fd7bd751fbfcd0aa46530b59ca4 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 30 11:27:44 2017 +0200 + + Remove the gir-girs target + + It depends on the same files (subset) as the gir-typelibs target + meaning that sometimes when doing a parallel build you'd get the + two commands trying to generate the same file at once and bad + things happen + + cmake/modules/GObjectIntrospectionMacros.cmake | 1 - + 1 file changed, 1 deletion(-) + +commit 19eedc6fb693a62f305e13079501e3105f869f3c +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 30 11:12:31 2017 +0200 + + Fix crash in broken files + + Bug #103045 + + fofi/FoFiTrueType.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 5df4a8b0ad56b11c9be3b362e33810c5af57952b +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 26 23:49:41 2017 +0200 + + Enable libcurl support by default + + CMakeLists.txt | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +commit 2c92c7b6a828c9db8a38f079ea7a3d51c12a481d +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 25 19:33:44 2017 +0200 + + Fix infinite recursion on broken files + + Bug #102969 + + poppler/Gfx.cc | 46 ++++++++++++++++++++++++++++++++++------------ + poppler/GfxState.cc | 33 ++++++++++++++++++--------------- + poppler/GfxState.h | 15 +++++++++------ + 3 files changed, 61 insertions(+), 33 deletions(-) + +commit d3f12611b30e6421f05603a9838ed9131b1aa61e +Author: Bernd Kuhls <berndkuhls@hotmail.com> +Date: Sun Sep 24 23:56:29 2017 +0200 + + include ctype.h for isdigit + + Bug #102951 + + poppler/Form.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit a1a4be92323ae45f1ecc16595438520309554eb0 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Sep 24 13:21:58 2017 +0200 + + cairo: do not use the custom downscaling for rendering images when + using cairo >= 1.14 + + poppler/CairoOutputDev.cc | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +commit 3b64fc488e7ff10634aa2dd76ad4f152ebfe7edc +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Sep 24 12:39:06 2017 +0200 + + regtest: change default value of utils dir to ../build/utils + + regtest/main.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit deba5f3c57929a96105d822c8cba46e5334694c7 +Author: Carlos Garcia Campos <carlosgc@gnome.org> +Date: Sun Sep 24 12:31:43 2017 +0200 + + cairo: Do not extend the pattern in drawImageMaskRegular + + This is causing some documents with tiling patterns to take ages + to render, + since we switched to use drawImageMaskRegular in 00a536a4. This patch + applies the same changes made in 7d8dfb09 and db87dc7f for + drawImageMaskPrescaled to drawImageMaskRegular. + + poppler/CairoOutputDev.cc | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +commit cceb80b353ca748d1e04373d238195fd548319b8 +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Sun Sep 24 08:24:44 2017 +0200 + + glib: Make g-ir-scanner always link to the libs in build directory + + It was using the installed libraries, causing a build failure when + there's new API added to the poppler core. + + glib/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 2afde7084ab55893182c2da59c429b48eb5d5a35 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 22 18:18:54 2017 +0200 + + Remove GlobalParams::splashResolution + + Noone was setting or getting the variable + + poppler/GlobalParams.h | 1 - + 1 file changed, 1 deletion(-) + +commit df783c5d10490e94e911316a6f42bb2d91a22dea +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 22 18:18:50 2017 +0200 + + Add a const to the static structure + + poppler/GlobalParamsWin.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit a309cbfdd831b37461284b95763ca5a872e6af2b +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 22 18:18:46 2017 +0200 + + Remove GlobalParams::setPSFile + + It had a setter but not a getter so wasn't used for anything + + poppler/GlobalParams.cc | 13 ------------- + poppler/GlobalParams.h | 2 -- + 2 files changed, 15 deletions(-) + +commit 7af5f7cadbdb89e0eaab148940c2c65cb12cc6d6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 22 18:18:42 2017 +0200 + + Remove GlobalParams::ccFontFiles + + it was never filled so it was basically a noop + + poppler/GfxFont.cc | 10 ---------- + poppler/GlobalParams.cc | 14 -------------- + poppler/GlobalParams.h | 3 --- + 3 files changed, 27 deletions(-) + +commit b5f8be7ede64e55d44ed484797a66ca068ba955f +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 22 18:18:39 2017 +0200 + + Remove GlobalParams::fontDirs + + It was only read but never filled so it was basically a noop + + poppler/GlobalParams.cc | 31 +------------------------------ + poppler/GlobalParams.h | 1 - + 2 files changed, 1 insertion(+), 31 deletions(-) + +commit 3463537624a24e3bdcaa42c135d337c6cd452ea5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 22 18:18:22 2017 +0200 + + Remove GlobalParams::getPSResidentFont* + + There was no way to set its contents so it's basically a noop + + poppler/GfxFont.cc | 38 ---------------------- + poppler/GlobalParams.cc | 85 + ------------------------------------------------- + poppler/GlobalParams.h | 29 ----------------- + poppler/PSOutputDev.cc | 6 ---- + 4 files changed, 158 deletions(-) + +commit 851bc59c6f4b007333d064af5c6992702b92cdf6 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 21 20:45:52 2017 +0200 + + Remove the autotools based build system + + .gitignore | 20 +- + INSTALL | 244 ++------ + INSTALL.cmake | 76 --- + Makefile.am | 133 ----- + autogen.sh | 117 ---- + configure.ac | 1154 + -------------------------------------- + cpp/Makefile.am | 74 --- + cpp/tests/Makefile.am | 21 - + fofi/Makefile.am | 28 - + glib/Makefile.am | 122 ---- + glib/demo/Makefile.am | 56 -- + glib/poppler-features.h.in | 88 --- + glib/reference/Makefile.am | 92 --- + glib/reference/version.xml.in | 1 - + goo/Makefile.am | 69 --- + poppler-cairo-uninstalled.pc.in | 6 - + poppler-cairo.pc.in | 9 - + poppler-cpp-uninstalled.pc.in | 7 - + poppler-cpp.pc.in | 13 - + poppler-glib-uninstalled.pc.in | 7 - + poppler-glib.pc.in | 13 - + poppler-qt4-uninstalled.pc.in | 7 - + poppler-qt4.pc.in | 13 - + poppler-qt5-uninstalled.pc.in | 7 - + poppler-qt5.pc.in | 13 - + poppler-splash-uninstalled.pc.in | 7 - + poppler-splash.pc.in | 9 - + poppler-uninstalled.pc.in | 6 - + poppler.pc.in | 11 - + poppler/Makefile.am | 348 ------------ + poppler/poppler-config.h.in | 196 ------- + qt4/Makefile.am | 1 - + qt4/demos/Makefile.am | 65 --- + qt4/src/Makefile.am | 76 --- + qt4/tests/Makefile.am | 141 ----- + qt5/Makefile.am | 1 - + qt5/demos/Makefile.am | 65 --- + qt5/src/Makefile.am | 78 --- + qt5/tests/Makefile.am | 141 ----- + splash/Makefile.am | 73 --- + test/Makefile.am | 67 --- + utils/Makefile.am | 155 ----- + 42 files changed, 43 insertions(+), 3787 deletions(-) + +commit 1a33f60da2996ea64c1b903580885697940cf046 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 21 20:32:25 2017 +0200 + + Add some constness to the basic classes + + goo/GooString.cc | 2 +- + goo/GooString.h | 2 +- + poppler/Array.cc | 8 +-- + poppler/Array.h | 12 ++--- + poppler/Dict.cc | 18 +++---- + poppler/Dict.h | 26 +++++----- + poppler/Object.cc | 4 +- + poppler/Object.h | 152 + +++++++++++++++++++++++++++--------------------------- + 8 files changed, 112 insertions(+), 112 deletions(-) + +commit 135843fa8398364e0559c2b0b96f9be4a44572c5 +Author: Carlos Garcia Campos <cgarcia@igalia.com> +Date: Wed Sep 20 19:38:14 2017 +0200 + + Add gtk-doc support to CMake build + + CMakeLists.txt | 4 +- + glib/CMakeLists.txt | 4 + + glib/reference/CMakeLists.txt | 12 ++ + gtkdoc.py | 440 + ++++++++++++++++++++++++++++++++++++++++++ + make-glib-api-docs | 66 +++++++ + 5 files changed, 525 insertions(+), 1 deletion(-) + +commit e51db61a33cdbe6307f048b65912a85f6cd1ec5b +Author: William Bader <william@newspapersystems.com> +Date: Wed Sep 20 19:36:46 2017 +0200 + + PSOutputDev: Fix wrong text generation + + This patch moves the code to update the max valid glyph hash into its + own function and updates the max valid glyph only if the new value is + higher than the previous value. + This fixes a problem with pages that have multiple copies of the same + font with different glyph counts. If poppler processed the font + with the + smaller count last, and then the PDF wrote text in the font with the + larger count, pdftops would not show the glyphs above the maximum + of the + smaller font. + + Bug #102760 + + poppler/PSOutputDev.cc | 16 ++++++++++------ + poppler/PSOutputDev.h | 1 + + 2 files changed, 11 insertions(+), 6 deletions(-) + +commit 6665839b5ce2e4f6fb2acc682ce2f91ed2404ce8 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 20 19:36:29 2017 +0200 + + qt5: The tests don't need GUI + + qt5/tests/check_actualtext.cpp | 2 +- + qt5/tests/check_attachments.cpp | 2 +- + qt5/tests/check_dateConversion.cpp | 2 +- + qt5/tests/check_fonts.cpp | 2 +- + qt5/tests/check_goostring.cpp | 2 +- + qt5/tests/check_lexer.cpp | 2 +- + qt5/tests/check_links.cpp | 2 +- + qt5/tests/check_metadata.cpp | 2 +- + qt5/tests/check_optcontent.cpp | 2 +- + qt5/tests/check_pagelabelinfo.cpp | 2 +- + qt5/tests/check_pagelayout.cpp | 2 +- + qt5/tests/check_pagemode.cpp | 2 +- + qt5/tests/check_password.cpp | 2 +- + qt5/tests/check_permissions.cpp | 2 +- + qt5/tests/check_search.cpp | 2 +- + qt5/tests/check_strings.cpp | 2 +- + 16 files changed, 16 insertions(+), 16 deletions(-) + +commit 26a067d4a84f80eeb892e30a5ab608d0fbea1de5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 20 10:36:04 2017 +0200 + + Remove the moc includes + + Some people are having trouble with them and automoc really should + be taking care of this so no need to have the include. Let's hope this + doesn't break some other people :D + + qt5/demos/abstractinfodock.cpp | 1 - + qt5/demos/embeddedfiles.cpp | 1 - + qt5/demos/fonts.cpp | 1 - + qt5/demos/info.cpp | 1 - + qt5/demos/metadata.cpp | 1 - + qt5/demos/navigationtoolbar.cpp | 1 - + qt5/demos/optcontent.cpp | 1 - + qt5/demos/pageview.cpp | 1 - + qt5/demos/permissions.cpp | 1 - + qt5/demos/thumbnails.cpp | 1 - + qt5/demos/toc.cpp | 1 - + qt5/demos/viewer.cpp | 1 - + qt5/src/poppler-optcontent.cc | 1 - + 13 files changed, 13 deletions(-) + +commit 939465c40902d72e0c05d4f3a27ee67e4a007ed7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 19 21:19:03 2017 +0200 + + Fix crash in broken files + + Bug #102854 + + poppler/Stream.cc | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +commit a8aa61f774503c9ebd840e148c4fa31a6959600d +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 19 21:17:49 2017 +0200 + + autotools: Fix build + + qt5/src/Makefile.am | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 6b82904b717994c887f33bfc72e4999363fc8e72 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 17 23:03:48 2017 +0200 + + Fix printf-like format warnings + + poppler/Stream.h | 2 +- + test/perf-test.cc | 2 ++ + 2 files changed, 3 insertions(+), 1 deletion(-) + +commit b26924e32128b7ba57260e9fdc54be1893bcff77 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 17 02:06:32 2017 +0200 + + A few more static markers + + test/perf-test.cc | 2 +- + utils/pdftocairo-win32.cc | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +commit 4a4e291246f238731429729e10633ee1f627eb77 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 17 01:58:36 2017 +0200 + + Make newer gcc happy about fallthrough + + on HtmlOutputDev.cc fixes a leak when printHtml is false + + fofi/FoFiTrueType.cc | 2 ++ + poppler/Annot.cc | 4 ++-- + poppler/SplashOutputDev.cc | 8 ++++++++ + splash/Splash.cc | 2 ++ + utils/HtmlOutputDev.cc | 9 ++++----- + 5 files changed, 18 insertions(+), 7 deletions(-) + +commit 0790dd3afb8370aebca8e7e154bbd2b5ae5cd5a2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 16 18:01:49 2017 +0200 + + Fix missing-declarations warnings + + ... and add it to default warning set + + cmake/modules/PopplerMacros.cmake | 2 +- + cpp/tests/poppler-dump.cpp | 2 +- + glib/poppler-action.cc | 1 + + goo/JpegWriter.cc | 2 +- + goo/gmem.h | 2 +- + poppler/Annot.cc | 6 ++-- + poppler/Decrypt.cc | 2 +- + poppler/TextOutputDev.cc | 2 +- + qt4/src/poppler-link.cc | 2 +- + qt4/src/poppler-private.cc | 6 ++-- + qt4/tests/check_links.cpp | 4 +-- + qt4/tests/poppler-forms.cpp | 14 ++++----- + qt5/src/poppler-link.cc | 2 +- + qt5/src/poppler-private.cc | 6 ++-- + qt5/tests/check_links.cpp | 4 +-- + qt5/tests/poppler-forms.cpp | 18 ++++++------ + test/perf-test-preview-dummy.cc | 4 +++ + test/perf-test.cc | 62 + +++++++++++++++++++-------------------- + utils/pdfinfo.cc | 4 +-- + utils/pdfseparate.cc | 2 +- + utils/pdfsig.cc | 6 ++-- + utils/pdftotext.cc | 2 +- + utils/pdfunite.cc | 6 ++-- + 23 files changed, 83 insertions(+), 78 deletions(-) + +commit afd91b148d3d0ba025821740ff4c075b1de2fdc5 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 16 17:47:42 2017 +0200 + + Fix warning: format ‘%x’ expects argument of type ‘unsigned + int*’, but argument 3 has type ‘int*’ + + poppler/UnicodeMap.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit a0ed20f3fb8025706ad9a580f6a692316bf6df66 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 16 17:45:42 2017 +0200 + + -Woverflow fixes + + cpp/poppler-private.cpp | 4 ++-- + glib/poppler-document.cc | 3 +-- + goo/GooString.cc | 6 ++++++ + goo/GooString.h | 1 + + poppler/Annot.cc | 9 +++------ + poppler/Form.cc | 13 +++++-------- + qt4/src/poppler-private.cc | 4 ++-- + qt5/src/poppler-private.cc | 4 ++-- + 8 files changed, 22 insertions(+), 22 deletions(-) + +commit d51cc34d7d51b6ddb7bfba318ed12bcbe763be6a +Author: Albert Astals Cid <aacid@kde.org> +Date: Sat Sep 16 17:35:15 2017 +0200 + + -pedantic fixes + + glib/poppler-media.cc | 2 +- + glib/poppler-movie.cc | 2 +- + glib/poppler-structure-element.cc | 2 +- + goo/glibc.h | 2 +- + poppler/StructElement.cc | 14 +++++++------- + utils/JSInfo.cc | 2 +- + 6 files changed, 12 insertions(+), 12 deletions(-) + +commit 804a823a67fedc3e633e89f817232d3c15715b56 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Sat Sep 16 20:16:58 2017 +0930 + + cmake: restructure the warnings into a "default" and "extra" group + + Most of the previous warnings are now in default. Extra warnings that + should be fixed but currently result in a lot of warnings are in the + extra group. + + The old no/yes/kde COMPILE_WARNINGS option has been replaced with the + boolean option EXTRA_WARN (default off) to enable the extra warnings. + + CMakeLists.txt | 18 +++++------------- + cmake/modules/PopplerMacros.cmake | 32 ++++++++++++++++++++++++-------- + 2 files changed, 29 insertions(+), 21 deletions(-) + +commit 6d40d4bad46ce1b53624feca7410b35e4fe0048d +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 15 01:07:59 2017 +0200 + + CurlPDFDocBuilder don't crash if given a url that doesn't exist + + poppler/CurlPDFDocBuilder.cc | 6 ++++++ + 1 file changed, 6 insertions(+) + +commit cc43c720e857548175a9e35b0686a1a7a8957f50 +Author: Oliver Sander <oliver.sander@tu-dresden.de> +Date: Fri Aug 18 11:51:06 2017 +0200 + + Replace Splash font rendering by Qt font rendering + + Previously, the Arthur backend would use Splash code to do + its font rendering. That was not a satisfactory solution: + Qt can do font rendering directly. Also, the Splash font + rendering in the Arthur code had a few bugs, which lead + to legible-but-not-pretty fonts. + + This patch replaces the Splash font rendering by Qt font + rendering. Some Splash code will have to remain, because + Qt seems unable to do the proper charcode-to-glyph-index + transformations. + + I took a lot of inspiration from Mihai Niculescu's patch at + + https://lists.freedesktop.org/archives/poppler/2013-June/010370.html + + That's why the patch adds Mihai's name in the copyright list. + + qt5/src/ArthurOutputDev.cc | 254 + +++++++++++++++++++++++++-------------------- + qt5/src/ArthurOutputDev.h | 31 +++++- + splash/SplashFTFontFile.cc | 4 + + splash/SplashFTFontFile.h | 3 + + 4 files changed, 177 insertions(+), 115 deletions(-) + +commit da63c35549e8852a410946ab016a3f25ac701bdf +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 14 19:14:41 2017 +0200 + + FoFiType1C::convertToType0: Fix crash in broken files + + Bug #102724 + + fofi/FoFiType1C.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 504b3590182175390f474657a372e78fb1508262 +Author: Albert Astals Cid <aacid@kde.org> +Date: Thu Sep 14 19:14:23 2017 +0200 + + Splash::scaleImage: Do not try to scale if srcHeight or srcWidth + are < 1 + + Bug #102719 + + splash/Splash.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 500ce88a3b5b0bd556ac6941ba66a86cae44663a +Author: Oliver Sander <oliver.sander@tu-dresden.de> +Date: Wed Sep 13 12:12:29 2017 +0200 + + Fix two minor typos + + qt5/tests/test-render-to-file.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit 80f9819b6233f9f9b5fd44f0e4cad026e5d048c2 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 13 23:09:45 2017 +0200 + + isImageInterpolationRequired: Fix divide by 0 on broken documents + + Bug #102688 + + splash/Splash.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit aaf5327649e8f7371c9d3270e7813c43ddfd47ee +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 13 23:01:03 2017 +0200 + + Gfx::doShowText: Fix infinite recursion on broken files + + Bug #102701 + + poppler/Gfx.cc | 25 +++++++++++++++++++++++-- + poppler/Gfx.h | 1 + + poppler/GfxFont.cc | 8 ++++++++ + poppler/GfxFont.h | 1 + + 4 files changed, 33 insertions(+), 2 deletions(-) + +commit 476394e7a025e02e4897da2e765df2c895d0708f +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 13 22:58:14 2017 +0200 + + XRef::parseEntry: Fix crash in broken file + + Bug #102687 + + poppler/XRef.cc | 3 +++ + 1 file changed, 3 insertions(+) + +commit 0f891b85169dabd3d23348aba40266547bd4bcf6 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Sep 13 20:12:52 2017 +0930 + + pdfinfo: don't truncate dest name + + utils/pdfinfo.cc | 1 - + 1 file changed, 1 deletion(-) + +commit 951e7b3c1f337ceaf490edce3c575f89c45cb6d4 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Wed Sep 13 19:24:07 2017 +0930 + + cmake: ensure user cflags/cxxflags are appended to end + + cmake/modules/PopplerMacros.cmake | 44 + +++++++++++++++++++++------------------ + 1 file changed, 24 insertions(+), 20 deletions(-) + +commit a5c616a65a77bf597836cced6f987e5b93480ca5 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Mon Sep 11 20:55:01 2017 +0930 + + cmake INSTALL file + + INSTALL.cmake | 76 + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 76 insertions(+) + +commit a5e5649ecf16fa05770620dbbd4985935dc2bbff +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 11 12:35:16 2017 +0200 + + Fix crash in FoFiType1C::convertToType0 in broken files + + Bug #102653 + + fofi/FoFiType1C.cc | 435 + +++++++++++++++++++++++++++-------------------------- + 1 file changed, 220 insertions(+), 215 deletions(-) + +commit 325887ebef8ea1c6ef9d3607a59d95ffea383986 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 10 17:41:47 2017 +0200 + + Make JBIG2Stream::readGenericBitmap return cleanly on error + + instead of causing abort + + Also fixes warning when compiled with newer gcc + + poppler/JBIG2Stream.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +commit f253a28f4c5bb65c363d31b8b46f984c660499ee +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 8 19:05:36 2017 +0200 + + qt5: in development -> is stable + + The API itself is done-ish even if it gets improvements from time to + time. In development seems to imply "don't use me yet" + + qt5/src/Mainpage.dox | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +commit 1316c7a41f4dd7276f404f775ebb5fef2d24ab1c +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 8 18:29:42 2017 +0200 + + Annot: Fix crash on broken files + + Bug #102607 + + poppler/Annot.cc | 42 +++++++++++++++++++++++------------------- + 1 file changed, 23 insertions(+), 19 deletions(-) + +commit 2532df6060092e9fab7f041ae9598aff9cdd94bb +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 8 18:28:15 2017 +0200 + + Annot: Fix crash on broken files + + Bug #102601 + + poppler/Annot.cc | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +commit 6472d8493f7e82cc78b41da20a2bf19fcb4e0a7d +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 8 18:26:05 2017 +0200 + + SplashOutputDev: Fix crash on broken files + + Bug #102604 + + poppler/SplashOutputDev.cc | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +commit 3ab44e2a77b560198c1e1616cfb39c1ac7374e29 +Author: Albert Astals Cid <aacid@kde.org> +Date: Fri Sep 8 18:21:40 2017 +0200 + + Remove unmaintained TODO file + + TODO | 40 ---------------------------------------- + 1 file changed, 40 deletions(-) + +commit dfcf997e6fbca31dbe051fbd9c32aca818825e38 +Author: Hans-Ulrich Jüttner <huj@froreich-bioscientia.de> +Date: Wed Sep 6 11:03:52 2017 +0200 + + Added methods to get and set the font size of text fields + + Fixes bug #101692 + + poppler/Annot.cc | 24 +++---------- + poppler/Form.cc | 92 + +++++++++++++++++++++++++++++++++++++++++++++++++ + poppler/Form.h | 16 +++++++++ + qt5/src/poppler-form.cc | 12 ++++++- + qt5/src/poppler-form.h | 10 ++++++ + 5 files changed, 134 insertions(+), 20 deletions(-) + +commit 0bda8bb8eda838316a61238441665abfd24eb020 +Author: Oliver Sander <oliver.sander@tu-dresden.de> +Date: Thu Sep 7 19:55:54 2017 +0200 + + Disable glib if cairo is not found + + CMakeLists.txt | 1 + + 1 file changed, 1 insertion(+) + +commit 118cd73a3c4eba78bbfed16cfc2996dec5491944 +Author: Albert Astals Cid <aacid@kde.org> +Date: Wed Sep 6 19:42:26 2017 +0200 + + cmake: Give people the option to build poppler as a static library + + CMakeLists.txt | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +commit 766a32ff59dadd9ae4639d8a79861a17be6aec52 +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 5 20:55:45 2017 +0930 + + cmake: add options to disable glib/qt4/qt5 + + CMakeLists.txt | 54 + ++++++++++++++++++++++++++++++++++-------------------- + 1 file changed, 34 insertions(+), 20 deletions(-) + +commit 101aba9a8d6623bca419946262fea6b46a790454 +Author: Albert Astals Cid <aacid@kde.org> +Date: Tue Sep 5 19:34:12 2017 +0200 + + cmake: Fix build when using a cairo different than the system one + + glib/demo/CMakeLists.txt | 2 +- + test/CMakeLists.txt | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +commit 1d3f00e8c53dbbd3a8409993b7b66667df434b5d +Author: Adrian Johnson <ajohnson@redneon.com> +Date: Tue Sep 5 06:39:49 2017 +0930 + + ignore build directory + + .gitignore | 1 + + 1 file changed, 1 insertion(+) + +commit 340a99f580b9f7b6add831e9a0252574bfea66f2 +Author: Oliver Sander <oliver.sander@tu-dresden.de> +Date: Fri Sep 1 22:16:49 2017 +0200 + + Control whether renderToImage shows annotations + + I'd like to control whether the renderToImage and renderToPainter + methods show annotations or not. To this end, this patch introduces + a new value 'HideAnnotations' to the Document::RenderHint enum. + + qt5/src/poppler-page.cc | 36 ++++++++++++++++++++++++++++++++++-- + qt5/src/poppler-qt5.h | 3 ++- + 2 files changed, 36 insertions(+), 3 deletions(-) + +commit dd80c182cbcb188af0dd590f222ba9bbb31e3fb7 +Author: Albert Astals Cid <aacid@kde.org> +Date: Mon Sep 4 19:36:06 2017 +0200 + + Fix building with old clang + + poppler/StructElement.cc | 2 ++ + 1 file changed, 2 insertions(+) + +commit a22cd0badbc177f8a2eedb0386895ddf3379c618 +Author: Albert Astals Cid <aacid@kde.org> +Date: Sun Sep 3 23:35:08 2017 +0200 + + Initial make dist support in cmake + + .gitattributes | 5 +++++ + CMakeLists.txt | 9 +++++++++ + 2 files changed, 14 insertions(+) + commit 85bfedad416906b1a5dff377d470387692b5ca70 Author: Albert Astals Cid <aacid@kde.org> Date: Sun Sep 3 22:54:32 2017 +0200 diff --git a/source/libs/poppler/poppler-src/INSTALL b/source/libs/poppler/poppler-src/INSTALL index 56b077d6a..7b5d65856 100644 --- a/source/libs/poppler/poppler-src/INSTALL +++ b/source/libs/poppler/poppler-src/INSTALL @@ -1,236 +1,76 @@ 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'. +mkdir build +cd build +cmake .. +make +make install - 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. +CMake configuration options can be set using the -D option. eg - 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 -================= + cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=release -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. +Build Options +============= -Specifying the System Type -========================== +Set install prefix: -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: + -DCMAKE_INSTALL_PREFIX=<path> - CPU-COMPANY-SYSTEM +Set build type. This sets the standard compiler flags for the build +type. -where SYSTEM can have one of these forms: + -DCMAKE_BUILD_TYPE=debug or -DCMAKE_BUILD_TYPE=release - OS KERNEL-OS +Set compiler flags: - 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. + -DCMAKE_CXX_FLAGS=<flags> or set CXXFLAGS environment variable - 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. +Set linker flags: - 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'. + -DCMAKE_LD_FLAGS=<flags> or set LDFLAGS environment variable -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 +Optional Features +================= -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: + -D<FEATURE>=<ON|OFF> - /bin/bash ./configure CONFIG_SHELL=/bin/bash +eg -Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent -configuration-related scripts to be executed by `/bin/bash'. + -DENABLE_SPLASH=ON -DBUILD_GTK_TESTS=OFF -`configure' Invocation -====================== +A list of all options can be display with the commmand: -`configure' recognizes the following options to control how it operates. + egrep '^ *(option|set.*STRING)' CMakeLists.txt -`--help' -`-h' - Print a summary of the options to `configure', and exit. +Alternatively, the options can be edited by running "ccmake ." in the +build directory. -`--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. +Cross Compiling +=============== -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. +A toolchain file is required to specify the target specific compiler +tools. Run cmake with the option: -`--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). + -DCMAKE_TOOLCHAIN_FILE=<Toolchain file> -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. +A sample toolchain for a 64-bit mingw build is shown below. Replace +/path/to/win/root with the install prefix for the target environment. -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. + SET(CMAKE_SYSTEM_NAME Windows) + SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) + SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) + SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32 /path/to/win/root ) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/source/libs/poppler/poppler-src/Makefile.am b/source/libs/poppler/poppler-src/Makefile.am deleted file mode 100644 index bf878bad4..000000000 --- a/source/libs/poppler/poppler-src/Makefile.am +++ /dev/null @@ -1,133 +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/FindNSS3.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 \ - cmake/modules/FindLIBOPENJPEG2.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/source/libs/poppler/poppler-src/README.contributors b/source/libs/poppler/poppler-src/README.contributors new file mode 100644 index 000000000..5e45331e6 --- /dev/null +++ b/source/libs/poppler/poppler-src/README.contributors @@ -0,0 +1,21 @@ +If you want to become or are a poppler contributor, this is a README for you, keep reading! + +Licensing +--------- +Only send patches to poppler if you agree to license (or relicense) them under +GPLv2 and later (or something more permissive that can be "upgraded" to GPLv2 +and later). If you do not agree to this license, please explain the problem / bug +and how you would solve it in words instead of code. + +By default all patches attached to the bugzilla or sent to the mailing list will +be assumed to agree with the licensing expressed here. + +Channels of contact +------------------- +Poppler has three main channels of contact: + * The poppler mailing list http://lists.freedesktop.org/mailman/listinfo/poppler + * The poppler bug tracker (bugzilla) http://bugs.freedesktop.org + * The #poppler channel at the freenode network +Do not hesitate to drop by talk to people there. + +And keep hacking on poppler! diff --git a/source/libs/poppler/poppler-src/TODO b/source/libs/poppler/poppler-src/TODO deleted file mode 100644 index e067c2a31..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/config.h.cmake b/source/libs/poppler/poppler-src/config.h.cmake deleted file mode 100644 index a8e1bbd7a..000000000 --- a/source/libs/poppler/poppler-src/config.h.cmake +++ /dev/null @@ -1,255 +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 - -/* Build against zlib. */ -#cmakedefine ENABLE_ZLIB 1 - -/* Use zlib instead of builtin zlib decoder to uncompress flate streams. */ -#cmakedefine ENABLE_ZLIB_UNCOMPRESS 1 - -/* Build against libnss3 for digital signature validation */ -#cmakedefine ENABLE_NSS3 1 - -/* Use cairo for rendering. */ -#cmakedefine HAVE_CAIRO 1 - -/* Do we have any DCT decoder?. */ -#cmakedefine HAVE_DCT_DECODER 1 - -/* Do we have any JPX decoder?. */ -#cmakedefine HAVE_JPX_DECODER 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 - -/* Defines if timegm is available on your system */ -#cmakedefine HAVE_TIMEGM 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 `strcpy_s' function. */ -#cmakedefine HAVE_STRCPY_S 1 - -/* Define to 1 if you have the `strcat_s' function. */ -#cmakedefine HAVE_STRCAT_S 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 defined snprintf as deprecated but then added it in Visual Studio 2015. */ -#if defined(_MSC_VER) && _MSC_VER < 1900 -#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/source/libs/poppler/poppler-src/config.h.in b/source/libs/poppler/poppler-src/config.h.in deleted file mode 100644 index 57479a799..000000000 --- a/source/libs/poppler/poppler-src/config.h.in +++ /dev/null @@ -1,290 +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 unmaintained 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 - -/* Build Poppler against NSS for digital signature support. */ -#undef ENABLE_NSS3 - -/* Do not hardcode the library location */ -#undef ENABLE_RELOCATABLE - -/* Build against zlib. */ -#undef ENABLE_ZLIB - -/* Use zlib instead of builtin zlib decoder to uncompress flate streams. */ -#undef ENABLE_ZLIB_UNCOMPRESS - -/* Use cairo for rendering. */ -#undef HAVE_CAIRO - -/* Do we have any DCT decoder?. */ -#undef HAVE_DCT_DECODER - -/* 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 - -/* Do we have any JPX decoder?. */ -#undef HAVE_JPX_DECODER - -/* 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 - -/* Defines if timegm is available on your system */ -#undef HAVE_TIMEGM - -/* 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 where 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/source/libs/poppler/poppler-src/configure.ac b/source/libs/poppler/poppler-src/configure.ac deleted file mode 100644 index e4054581e..000000000 --- a/source/libs/poppler/poppler-src/configure.ac +++ /dev/null @@ -1,1154 +0,0 @@ -m4_define([poppler_version_major],[0]) -m4_define([poppler_version_minor],[59]) -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 -CXXFLAGS="$CXXFLAGS -std=c++11 -D_DEFAULT_SOURCE" - -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, - AC_HELP_STRING([--enable-single-precision], - [use single precision arithmetic (instead of double - precision) in the Splash backend]), - enable_single_precision=$enableval, - enable_single_precision=no) -if test x$enable_single_precision != xno; then - AC_DEFINE(USE_FLOAT, [1], [Use single precision arithmetic in the Splash backend]) -fi - -AC_ARG_ENABLE(fixedpoint, - AC_HELP_STRING([--enable-fixedpoint], - [use fixed point (instead of double precision) arithmetic - in the Splash backend]), - enable_fixedpoint=$enableval, - enable_fixedpoint=no) -if test x$enable_fixedpoint != xno; then - if test x$enable_single_precision != xno; then - AC_MSG_ERROR([Choose only one of --enable-single-precision or --enable-fixedpoint!]) - fi - AC_DEFINE(USE_FIXEDPOINT, [1], [Use fixed point arithmetic in the Splash backend]) -fi - -AC_ARG_ENABLE(cmyk, - AC_HELP_STRING([--enable-cmyk], - [Include support for CMYK rasterization]), - enable_cmyk=$enableval, - enable_cmyk=no) -if test x$enable_cmyk != xno; then - AC_DEFINE(SPLASH_CMYK, [1], [Include support for CMYK rasterization]) -fi - -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(timegm, AC_DEFINE(HAVE_TIMEGM, 1, [Defines if timegm 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(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/unmaintained/none@:>@], - [Use openjpeg for JPEG2000 images. 'auto' prefers openjpeg2 over openjpeg1 if both are available. 'unmaintained' gives you the internal unmaintained decoder. Use at your own risk. 'none' compiles no JPX decoder at all. [[default=auto]]]), - [enable_libopenjpeg=$enableval], - [enable_libopenjpeg="auto"]) - -openjpeg_header=yes - -dnl test for libopenjpeg2 -if test x$enable_libopenjpeg = xopenjpeg2 || test x$enable_libopenjpeg = xauto; then - PKG_CHECK_MODULES(LIBOPENJPEG, libopenjp2, - [openjpeg2=yes],[openjpeg2=no]) -fi - -dnl test for libopenjpeg1 -if test x$openjpeg2 = xno; then - 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_header="no"])]) - 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.])], - []) - ]) - have_jpx_decoder=yes - AC_DEFINE(HAVE_JPX_DECODER) -else - if test x$enable_libopenjpeg = xunmaintained; then - enable_libopenjpeg=no - have_jpx_decoder=yes - AC_DEFINE(HAVE_JPX_DECODER) - elif test x$enable_libopenjpeg = xnone; then - enable_libopenjpeg=no - have_jpx_decoder=no - else - if test x$enable_libopenjpeg = xopenjpeg2 || test x$enable_libopenjpeg = xopenjpeg1 || test x$enable_libopenjpeg = xauto; then - AC_MSG_ERROR([Install libopenjpeg2 or libopenjpeg1 before trying to build poppler. You can also decide to use the internal unmaintained JPX decoder or none at all. See --help.]) - else - AC_MSG_ERROR([Invalid --enable-libopenjpeg value. See --help.]) - fi - fi -fi - -AH_TEMPLATE([HAVE_JPX_DECODER], [Do we have any JPX decoder?.]) - -dnl Test for NSS -AC_ARG_ENABLE(libnss, - AC_HELP_STRING([--disable-libnss], - [Do not build against libnss3.]), - enable_libnss=$enableval, - enable_libnss="try") - -if test x$enable_libnss != xno; then - PKG_CHECK_MODULES(NSS3, nss, [enable_nss="yes"], - [enable_nss="no"]) -fi - -if test x$enable_nss = xyes; then - AC_DEFINE(ENABLE_NSS3, 1, [Build against NSS.]) -fi - -AM_CONDITIONAL(BUILD_LIBOPENJPEG, test x$openjpeg1 = xyes || test x$openjpeg2 = xyes) -AH_TEMPLATE([ENABLE_LIBOPENJPEG], - [Use libopenjpeg instead of builtin jpeg2000 decoder.]) - -AM_CONDITIONAL(BUILD_NSS, test x$enable_nss = xyes) -AH_TEMPLATE([ENABLE_NSS3], [Build Poppler against NSS for digital signature support.]) - -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, - AC_HELP_STRING([--disable-zlib], - [Don't build against zlib.]), - enable_zlib=$enableval, - enable_zlib="try") - -AC_ARG_ENABLE([zlib_uncompress], - AS_HELP_STRING([--enable-zlib-uncompress], - [Use zlib to uncompress flate streams (not totally safe)]), - enable_zlib_uncompress=$enableval, - enable_zlib_uncompress="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, 1, [Build against zlib.]) - - if test x$enable_zlib_uncompress = xyes; then - AC_DEFINE(ENABLE_ZLIB_UNCOMPRESS, 1, - [Use zlib instead of builtin zlib decoder to uncompress flate streams.]) - fi -else - if test x$enable_zlib_uncompress = xyes; then - echo " Warning: --enable-zlib-uncompress is incompatible with --disable-zlib." - fi - enable_zlib_uncompress="no" -fi - -AM_CONDITIONAL(BUILD_ZLIB, test x$enable_zlib = xyes) -AH_TEMPLATE([ENABLE_ZLIB], - [Build against zlib.]) -AM_CONDITIONAL(BUILD_ZLIB_UNCOMPRESS, test x$enable_zlib_uncompress = xyes) -AH_TEMPLATE([ENABLE_ZLIB_UNCOMPRESS], - [Use zlib instead of builtin zlib decoder to uncompress flate streams.]) - -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 dct decoder -AC_ARG_ENABLE(dctdecoder, - AC_HELP_STRING([--enable-dctdecoder=@<:@libjpeg/unmaintained/none@:>@], - [Decides which DCT decoder to use. 'libjpeg' will use libjpeg if available or fail if not. 'unmaintained' gives you the internal unmaintained decoder. Use at your own risk. 'none' compiles no DCT decoder at all. [[default=libjpeg]]]), - [dctdecoder=$enableval], - [dctdecoder="libjpeg"]) - -AC_ARG_VAR([LIBJPEG_CFLAGS], [C compiler flags for LIBJPEG]) -if test x$dctdecoder = x"libjpeg"; 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" - - if test x$enable_libjpeg != x"yes"; then - AC_MSG_ERROR([Install libjpeg before trying to build poppler. You can also decide to use the internal unmaintained DCT decoder or none at all. See --help.]) - fi - have_dct_decoder="yes" - AC_DEFINE(HAVE_DCT_DECODER) -elif test x$dctdecoder = x"unmaintained"; then - enable_libjpeg="no" - have_dct_decoder="yes" - AC_DEFINE(HAVE_DCT_DECODER) -elif test x$dctdecoder = x"none"; then - enable_libjpeg="no" - have_dct_decoder="no" -else - AC_MSG_ERROR([Invalid --enable-dctdecoder value. See --help.]) -fi - -AH_TEMPLATE([HAVE_DCT_DECODER], [Do we have any DCT decoder?.]) - -AM_CONDITIONAL(BUILD_LIBJPEG, test x$enable_libjpeg = xyes) -AH_TEMPLATE([ENABLE_LIBJPEG], - [Use libjpeg instead of builtin unmaintained 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.41 - 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 -E "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 -E "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 -E "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*|cygwin*) - # mingw and cygwin print "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 compress: $enable_zlib" -echo " use zlib uncompress: $enable_zlib_uncompress" -echo " use nss: $enable_nss" -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 -a x$have_dct_decoder = xyes; then - echo " Warning: Using libjpeg is recommended. The internal DCT decoder is unmaintained." -fi - -if test x$have_dct_decoder = xno; then - echo " Warning: You're not compiling any DCT decoder. Some files will fail to display properly." -fi - -if test x$enable_zlib_uncompress != xno; then - echo " Warning: Using zlib for decompression is not totally safe" -fi - -if test x$enable_libopenjpeg != xyes -a x$have_jpx_decoder = xyes; then - echo " Warning: Using libopenjpeg2 is recommended. The internal JPX decoder is unmaintained." -fi - -if test x$have_jpx_decoder = xno; then - echo " Warning: You're not compiling any JPX decoder. Some files will fail to display properly." -fi diff --git a/source/libs/poppler/poppler-src/fofi/FoFiTrueType.cc b/source/libs/poppler/poppler-src/fofi/FoFiTrueType.cc index f1a15e004..291329568 100644 --- a/source/libs/poppler/poppler-src/fofi/FoFiTrueType.cc +++ b/source/libs/poppler/poppler-src/fofi/FoFiTrueType.cc @@ -16,7 +16,7 @@ // 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-2016 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2008, 2009, 2012, 2014-2017 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> @@ -451,7 +451,7 @@ int FoFiTrueType::mapNameToGID(char *name) { GBool FoFiTrueType::getCFFBlock(char **start, int *length) { int i; - if (!openTypeCFF) { + if (!openTypeCFF || !tables) { return gFalse; } i = seekTable("CFF "); @@ -1307,8 +1307,10 @@ Guint FoFiTrueType::computeTableChecksum(Guchar *data, int length) { switch (length & 3) { case 3: word |= (data[i+2] & 0xff) << 8; + // fallthrough case 2: word |= (data[i+1] & 0xff) << 16; + // fallthrough case 1: word |= (data[i ] & 0xff) << 24; break; diff --git a/source/libs/poppler/poppler-src/fofi/FoFiType1C.cc b/source/libs/poppler/poppler-src/fofi/FoFiType1C.cc index c4595a326..7c9494f57 100644 --- a/source/libs/poppler/poppler-src/fofi/FoFiType1C.cc +++ b/source/libs/poppler/poppler-src/fofi/FoFiType1C.cc @@ -13,7 +13,7 @@ // 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) 2009, 2010, 2017 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 @@ -33,6 +33,7 @@ #include "goo/gmem.h" #include "goo/gstrtod.h" #include "goo/GooString.h" +#include "poppler/Error.h" #include "FoFiEncodings.h" #include "FoFiType1C.h" @@ -879,253 +880,260 @@ void FoFiType1C::convertToType0(char *psName, int *codeMap, int nCodes, } } + if (privateDicts) { // 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; - } + 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); + if (fd >= nFDs) + continue; + + // 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, "/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, "/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; - } - if (j < 256) { - buf = GooString::format("{0:d} 1 255 {{ 1 index exch /.notdef put }} for\n", - j); + buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType); (*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]); + 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; } - 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]); + if (privateDicts[fd].blueShift != 7) { + buf = GooString::format("/BlueShift {0:d} def\n", + privateDicts[fd].blueShift); 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]); + if (privateDicts[fd].blueFuzz != 1) { + buf = GooString::format("/BlueFuzz {0:d} def\n", + privateDicts[fd].blueFuzz); 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]); + if (privateDicts[fd].hasStdHW) { + buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[fd].stdHW); 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]); + if (privateDicts[fd].hasStdVW) { + buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[fd].stdVW); 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]); + 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; } - 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; - } + // 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"); + // 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; - } + // write the .notdef CharString + ok = gTrue; + getIndexVal(&charStringsIdx, 0, &val, &ok); + if (ok) { + eexecCvtGlyph(&eb, ".notdef", val.pos, val.len, + &subrIdx, &privateDicts[fd]); } - } - 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); + // 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); } - (*outputFunc)(outputStream, "cleartomark\n", 12); + } else { + error(errSyntaxError, -1, "FoFiType1C::convertToType0 without privateDicts"); } // write the Type 0 parent font diff --git a/source/libs/poppler/poppler-src/fofi/Makefile.am b/source/libs/poppler/poppler-src/fofi/Makefile.am deleted file mode 100644 index 4deb7d5e0..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/goo/GooString.cc b/source/libs/poppler/poppler-src/goo/GooString.cc index 12592e490..f055b37f4 100644 --- a/source/libs/poppler/poppler-src/goo/GooString.cc +++ b/source/libs/poppler/poppler-src/goo/GooString.cc @@ -18,7 +18,7 @@ // 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, 2016 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2008-2011, 2016, 2017 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> @@ -917,7 +917,13 @@ GBool GooString::hasUnicodeMarker(void) const return length > 1 && (s[0] & 0xff) == 0xfe && (s[1] & 0xff) == 0xff; } -GooString *GooString::sanitizedName(GBool psmode) +void GooString::prependUnicodeMarker() +{ + insert(0, (char)0xff); + insert(0, (char)0xfe); +} + +GooString *GooString::sanitizedName(GBool psmode) const { GooString *name; char buf[8]; diff --git a/source/libs/poppler/poppler-src/goo/GooString.h b/source/libs/poppler/poppler-src/goo/GooString.h index 70cfe3b47..167ea1ab6 100644 --- a/source/libs/poppler/poppler-src/goo/GooString.h +++ b/source/libs/poppler/poppler-src/goo/GooString.h @@ -17,7 +17,7 @@ // // 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) 2008-2010, 2012, 2014, 2017 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> @@ -176,13 +176,14 @@ public: GBool endsWith(const char *suffix) const; GBool hasUnicodeMarker(void) const; + void prependUnicodeMarker(); GBool hasJustUnicodeMarker(void) const { return length == 2 && hasUnicodeMarker(); } // 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); + GooString *sanitizedName(GBool psmode) const; private: GooString(const GooString &other); diff --git a/source/libs/poppler/poppler-src/goo/JpegWriter.cc b/source/libs/poppler/poppler-src/goo/JpegWriter.cc index a5a4d5a6f..37c15c2ab 100644 --- a/source/libs/poppler/poppler-src/goo/JpegWriter.cc +++ b/source/libs/poppler/poppler-src/goo/JpegWriter.cc @@ -9,6 +9,7 @@ // 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> +// Copyright (C) 2017 Albert Astals Cid <aacid@kde.org> // //======================================================================== @@ -30,7 +31,7 @@ struct JpegWriterPrivate { struct jpeg_error_mgr jerr; }; -void outputMessage(j_common_ptr cinfo) +static void outputMessage(j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; diff --git a/source/libs/poppler/poppler-src/goo/Makefile.am b/source/libs/poppler/poppler-src/goo/Makefile.am deleted file mode 100644 index 004775a48..000000000 --- a/source/libs/poppler/poppler-src/goo/Makefile.am +++ /dev/null @@ -1,69 +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 \ - glibc.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) - -EXTRA_DIST = glibc.h \ No newline at end of file diff --git a/source/libs/poppler/poppler-src/goo/glibc.h b/source/libs/poppler/poppler-src/goo/glibc.h index 49479e9d2..45aff9df0 100644 --- a/source/libs/poppler/poppler-src/goo/glibc.h +++ b/source/libs/poppler/poppler-src/goo/glibc.h @@ -31,7 +31,7 @@ struct tm *localtime_r(const time_t *timep, struct tm *result); time_t timegm(struct tm *tm); #endif -}; +} #endif // GLIBC_H diff --git a/source/libs/poppler/poppler-src/goo/gmem.h b/source/libs/poppler/poppler-src/goo/gmem.h index 898f33933..4c76f0fb6 100644 --- a/source/libs/poppler/poppler-src/goo/gmem.h +++ b/source/libs/poppler/poppler-src/goo/gmem.h @@ -14,7 +14,7 @@ // 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) 2007-2010, 2017 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 @@ -44,7 +44,7 @@ extern void *gmalloc_checkoverflow(size_t size); * 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); +extern void *grealloc_checkoverflow(void *p, size_t size); /* * These are similar to gmalloc and grealloc, but take an object count diff --git a/source/libs/poppler/poppler-src/gtk-doc.make b/source/libs/poppler/poppler-src/gtk-doc.make deleted file mode 100644 index 2454c2857..000000000 --- a/source/libs/poppler/poppler-src/gtk-doc.make +++ /dev/null @@ -1,305 +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) \ - $(expand_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) $(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) $(HFILE_GLOB) $(CFILE_GLOB) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) xml/gtkdocentities.ent - $(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 - -xml/gtkdocentities.ent: Makefile - $(GTK_DOC_V_XML)$(MKDIR_P) $(@D) && ( \ - echo "<!ENTITY package \"$(PACKAGE)\">"; \ - echo "<!ENTITY package_bugreport \"$(PACKAGE_BUGREPORT)\">"; \ - echo "<!ENTITY package_name \"$(PACKAGE_NAME)\">"; \ - echo "<!ENTITY package_string \"$(PACKAGE_STRING)\">"; \ - echo "<!ENTITY package_tarname \"$(PACKAGE_TARNAME)\">"; \ - echo "<!ENTITY package_url \"$(PACKAGE_URL)\">"; \ - echo "<!ENTITY package_version \"$(PACKAGE_VERSION)\">"; \ - ) > $@ - -#### 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) $(expand_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; \ - test -f $$file && cp $$file $(abs_builddir)/html; \ - 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) $(expand_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 - @if echo $(SCAN_OPTIONS) | grep -q "\-\-rebuild-sections" ; then \ - rm -f $(DOC_MODULE)-sections.txt; \ - 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) $(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/source/libs/poppler/poppler-src/poppler-cairo-uninstalled.pc.in b/source/libs/poppler/poppler-src/poppler-cairo-uninstalled.pc.in deleted file mode 100644 index 2458eb20d..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-cairo.pc.cmake b/source/libs/poppler/poppler-src/poppler-cairo.pc.cmake deleted file mode 100644 index b32f11831..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-cairo.pc.in b/source/libs/poppler/poppler-src/poppler-cairo.pc.in deleted file mode 100644 index 367a5b690..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-cpp-uninstalled.pc.in b/source/libs/poppler/poppler-src/poppler-cpp-uninstalled.pc.in deleted file mode 100644 index af3640eb2..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-cpp.pc.cmake b/source/libs/poppler/poppler-src/poppler-cpp.pc.cmake deleted file mode 100644 index 3f56b3d9d..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-cpp.pc.in b/source/libs/poppler/poppler-src/poppler-cpp.pc.in deleted file mode 100644 index a7e97c25d..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-glib-uninstalled.pc.in b/source/libs/poppler/poppler-src/poppler-glib-uninstalled.pc.in deleted file mode 100644 index 5506c4e53..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-glib.pc.cmake b/source/libs/poppler/poppler-src/poppler-glib.pc.cmake deleted file mode 100644 index e15e6699a..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-glib.pc.in b/source/libs/poppler/poppler-src/poppler-glib.pc.in deleted file mode 100644 index cd30feb72..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-qt4-uninstalled.pc.in b/source/libs/poppler/poppler-src/poppler-qt4-uninstalled.pc.in deleted file mode 100644 index 3a336c6c2..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-qt4.pc.cmake b/source/libs/poppler/poppler-src/poppler-qt4.pc.cmake deleted file mode 100644 index b17fd5d84..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-qt4.pc.in b/source/libs/poppler/poppler-src/poppler-qt4.pc.in deleted file mode 100644 index 306ae46e0..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-qt5-uninstalled.pc.in b/source/libs/poppler/poppler-src/poppler-qt5-uninstalled.pc.in deleted file mode 100644 index a91e1d5a3..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-qt5.pc.cmake b/source/libs/poppler/poppler-src/poppler-qt5.pc.cmake deleted file mode 100644 index b4d87b766..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-qt5.pc.in b/source/libs/poppler/poppler-src/poppler-qt5.pc.in deleted file mode 100644 index cda4c6f80..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-splash-uninstalled.pc.in b/source/libs/poppler/poppler-src/poppler-splash-uninstalled.pc.in deleted file mode 100644 index 436ecdb8f..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-splash.pc.cmake b/source/libs/poppler/poppler-src/poppler-splash.pc.cmake deleted file mode 100644 index cb95b3d2d..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-splash.pc.in b/source/libs/poppler/poppler-src/poppler-splash.pc.in deleted file mode 100644 index cf3491fc7..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler-uninstalled.pc.in b/source/libs/poppler/poppler-src/poppler-uninstalled.pc.in deleted file mode 100644 index 6076e80c5..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler.pc.cmake b/source/libs/poppler/poppler-src/poppler.pc.cmake deleted file mode 100644 index f1aebedbe..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler.pc.in b/source/libs/poppler/poppler-src/poppler.pc.in deleted file mode 100644 index 8605b2867..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/poppler/Annot.cc b/source/libs/poppler/poppler-src/poppler/Annot.cc index bda5a9059..1474c2cfe 100644 --- a/source/libs/poppler/poppler-src/poppler/Annot.cc +++ b/source/libs/poppler/poppler-src/poppler/Annot.cc @@ -35,6 +35,7 @@ // 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> +// Copyright (C) 2017 Hans-Ulrich Jüttner <huj@froreich-bioscientia.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 @@ -112,7 +113,7 @@ // = (4 * (sqrt(2) - 1) / 3) * r #define bezierCircle 0.55228475 -AnnotLineEndingStyle parseAnnotLineEndingStyle(GooString *string) { +static AnnotLineEndingStyle parseAnnotLineEndingStyle(GooString *string) { if (string != NULL) { if (!string->cmp("Square")) { return annotLineEndingSquare; @@ -140,7 +141,7 @@ AnnotLineEndingStyle parseAnnotLineEndingStyle(GooString *string) { } } -const char* convertAnnotLineEndingStyle(AnnotLineEndingStyle style) { +static const char* convertAnnotLineEndingStyle(AnnotLineEndingStyle style) { switch (style) { case annotLineEndingSquare: return "Square"; @@ -184,7 +185,7 @@ static AnnotExternalDataType parseAnnotExternalData(Dict* dict) { return type; } -PDFRectangle *parseDiffRectangle(Array *array, PDFRectangle *rect) { +static PDFRectangle *parseDiffRectangle(Array *array, PDFRectangle *rect) { PDFRectangle *newRect = NULL; if (array->getLength() == 4) { // deltas @@ -1397,8 +1398,7 @@ void Annot::setContents(GooString *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); + contents->prependUnicodeMarker(); } } else { contents = new GooString(); @@ -1986,8 +1986,7 @@ void AnnotMarkup::setLabel(GooString *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); + label->prependUnicodeMarker(); } } else { label = new GooString(); @@ -2763,8 +2762,7 @@ void AnnotFreeText::setStyleString(GooString *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); + styleString->prependUnicodeMarker(); } } else { styleString = new GooString(); @@ -2839,29 +2837,14 @@ void AnnotFreeText::parseAppearanceString(GooString *da, double &fontsize, Annot fontcolor = NULL; if (da) { GooList * daToks = new GooList(); - int j, i = 0; + int i = FormFieldText::tokenizeDA(da, daToks, "Tf"); - // 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; - } + if (i >= 1) { + fontsize = gatof(( (GooString *)daToks->get(i-1) )->getCString()); + // TODO: Font name } - // 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())); @@ -4698,7 +4681,7 @@ void AnnotWidget::drawBorder() { appearBuf->appendf(" {0:.2f}", dash[i]); } appearBuf->append("] 0 d\n"); - // fall through to the solid case + // fallthrough case AnnotBorder::borderSolid: case AnnotBorder::borderUnderlined: appearBuf->appendf("{0:.2f} w\n", w); @@ -4730,7 +4713,7 @@ void AnnotWidget::drawBorder() { appearBuf->appendf(" {0:.2f}", dash[i]); } appearBuf->append("] 0 d\n"); - // fall through to the solid case + // fallthrough case AnnotBorder::borderSolid: appearBuf->appendf("{0:.2f} w\n", w); setColor(aColor, gFalse); @@ -6573,11 +6556,11 @@ AnnotRichMedia::Content::Content(Dict *dict) { assets = (Asset **)gmallocn(nAssets, sizeof(Asset *)); int counter = 0; - for (int i = 0; i < obj2.arrayGetLength(); i += 2) { + for (int i = 0; i < nAssets; ++i) { assets[counter] = new AnnotRichMedia::Asset; - Object objKey = obj2.arrayGet(i); - assets[counter]->fileSpec = obj2.arrayGet(i + 1); + Object objKey = obj2.arrayGet(i * 2); + assets[counter]->fileSpec = obj2.arrayGet(i * 2 + 1); assets[counter]->name = new GooString( objKey.getString() ); ++counter; @@ -6681,26 +6664,30 @@ AnnotRichMedia::Configuration::Configuration(Dict *dict) } else if (!strcmp(name, "Video")) { type = typeVideo; } else { - // determine from first instance + // determine from first non null instance + type = typeFlash; // default in case all instances are null 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; - } + for (int i = 0; i < nInstances; ++i) { + AnnotRichMedia::Instance *instance = instances[i]; + if (instance) { + 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; + } + // break the loop since we found the first non null instance + break; + } + } } } } diff --git a/source/libs/poppler/poppler-src/poppler/Array.cc b/source/libs/poppler/poppler-src/poppler/Array.cc index c2c4040d9..94b8d66af 100644 --- a/source/libs/poppler/poppler-src/poppler/Array.cc +++ b/source/libs/poppler/poppler-src/poppler/Array.cc @@ -65,7 +65,7 @@ Array::~Array() { #endif } -Object Array::copy(XRef *xrefA) { +Object Array::copy(XRef *xrefA) const { arrayLocker(); Array *a = new Array(xrefA); for (int i = 0; i < length; ++i) { @@ -114,7 +114,7 @@ void Array::remove(int i) { memmove( elems + i, elems + i + 1, sizeof(elems[0]) * (length - i) ); } -Object Array::get(int i, int recursion) { +Object Array::get(int i, int recursion) const { if (i < 0 || i >= length) { #ifdef DEBUG_MEM abort(); @@ -125,7 +125,7 @@ Object Array::get(int i, int recursion) { return elems[i].fetch(xref, recursion); } -Object Array::getNF(int i) { +Object Array::getNF(int i) const { if (i < 0 || i >= length) { #ifdef DEBUG_MEM abort(); @@ -136,7 +136,7 @@ Object Array::getNF(int i) { return elems[i].copy(); } -GBool Array::getString(int i, GooString *string) +GBool Array::getString(int i, GooString *string) const { Object obj = getNF(i); if (obj.isString()) { diff --git a/source/libs/poppler/poppler-src/poppler/Array.h b/source/libs/poppler/poppler-src/poppler/Array.h index 8043c830b..d2cdf65ff 100644 --- a/source/libs/poppler/poppler-src/poppler/Array.h +++ b/source/libs/poppler/poppler-src/poppler/Array.h @@ -50,10 +50,10 @@ public: ~Array(); // Get number of elements. - int getLength() { return length; } + int getLength() const { return length; } // Copy array with new xref - Object copy(XRef *xrefA); + Object copy(XRef *xrefA) const; // Add an element // elem becomes a dead object after this call @@ -63,9 +63,9 @@ public: void remove(int i); // Accessors. - Object get(int i, int resursion = 0); - Object getNF(int i); - GBool getString(int i, GooString *string); + Object get(int i, int resursion = 0) const; + Object getNF(int i) const; + GBool getString(int i, GooString *string) const; private: friend class Object; // for incRef/decRef @@ -80,7 +80,7 @@ private: int length; // number of elements in array int ref; // reference count #if MULTITHREADED - GooMutex mutex; + mutable GooMutex mutex; #endif }; diff --git a/source/libs/poppler/poppler-src/poppler/CairoOutputDev.cc b/source/libs/poppler/poppler-src/poppler/CairoOutputDev.cc index 24b9e65e6..ffd39ef77 100644 --- a/source/libs/poppler/poppler-src/poppler/CairoOutputDev.cc +++ b/source/libs/poppler/poppler-src/poppler/CairoOutputDev.cc @@ -18,7 +18,7 @@ // Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com> // Copyright (C) 2005, 2009, 2012, 2017 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) 2006-2011, 2013, 2014, 2017 Carlos Garcia Campos <carlosgc@gnome.org> // Copyright (C) 2008 Carl Worth <cworth@cworth.org> // Copyright (C) 2008-2017 Adrian Johnson <ajohnson@redneon.com> // Copyright (C) 2008 Michael Vrable <mvrable@cs.ucsd.edu> @@ -2178,9 +2178,6 @@ void CairoOutputDev::drawImageMaskRegular(GfxState *state, Object *ref, Stream * 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); @@ -2196,6 +2193,11 @@ void CairoOutputDev::drawImageMaskRegular(GfxState *state, Object *ref, Stream * cairo_save (cairo); cairo_rectangle (cairo, 0., 0., 1., 1.); cairo_clip (cairo); + if (strokePathClip) { + cairo_push_group (cairo); + fillToStrokePathClip (state); + cairo_pop_group_to_source (cairo); + } cairo_mask (cairo, pattern); cairo_restore (cairo); } else { @@ -3075,7 +3077,13 @@ public: } } - if (printing || scaledWidth >= width || scaledHeight >= height) { +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) + bool needsCustomDownscaling = false; +#else + bool needsCustomDownscaling = true; +#endif + + if (!needsCustomDownscaling || printing || scaledWidth >= width || scaledHeight >= height) { // No downscaling. Create cairo image containing the source image data. unsigned char *buffer; int stride; @@ -3189,7 +3197,7 @@ void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, cairo_matrix_t matrix; int width, height; int scaledWidth, scaledHeight; - cairo_filter_t filter = CAIRO_FILTER_BILINEAR; + cairo_filter_t filter = CAIRO_FILTER_BEST; RescaleDrawImage rescale; LOG (printf ("drawImage %dx%d\n", widthA, heightA)); diff --git a/source/libs/poppler/poppler-src/poppler/CurlPDFDocBuilder.cc b/source/libs/poppler/poppler-src/poppler/CurlPDFDocBuilder.cc index 91d4c3070..4dae58e7e 100644 --- a/source/libs/poppler/poppler-src/poppler/CurlPDFDocBuilder.cc +++ b/source/libs/poppler/poppler-src/poppler/CurlPDFDocBuilder.cc @@ -5,7 +5,7 @@ // 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, 2017 Albert Astals Cid <aacid@kde.org> // //======================================================================== @@ -15,6 +15,7 @@ #include "CachedFile.h" #include "CurlCachedFile.h" +#include "ErrorCodes.h" //------------------------------------------------------------------------ // CurlPDFDocBuilder @@ -27,6 +28,11 @@ CurlPDFDocBuilder::buildPDFDoc(const GooString &uri, CachedFile *cachedFile = new CachedFile( new CurlCachedFileLoader(), uri.copy()); + if (cachedFile->getLength() == ((Guint) -1)) { + cachedFile->decRefCnt(); + return PDFDoc::ErrorPDFDoc(errOpenFile, uri.copy()); + } + BaseStream *str = new CachedFileStream( cachedFile, 0, gFalse, cachedFile->getLength(), Object(objNull)); diff --git a/source/libs/poppler/poppler-src/poppler/Decrypt.cc b/source/libs/poppler/poppler-src/poppler/Decrypt.cc index c8246fab7..5d24d0a90 100644 --- a/source/libs/poppler/poppler-src/poppler/Decrypt.cc +++ b/source/libs/poppler/poppler-src/poppler/Decrypt.cc @@ -14,7 +14,7 @@ // under GPL version 2 or later // // Copyright (C) 2008 Julien Rebetez <julien@fhtagn.net> -// Copyright (C) 2008, 2010, 2016 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2008, 2010, 2016, 2017 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> @@ -1345,7 +1345,7 @@ static inline Guint sha256sigma1(Guint x) { return rotr(x, 17) ^ rotr(x, 19) ^ (x >> 10); } -void sha256HashBlock(Guchar *blk, Guint *H) { +static void sha256HashBlock(Guchar *blk, Guint *H) { Guint W[64]; Guint a, b, c, d, e, f, g, h; Guint T1, T2; diff --git a/source/libs/poppler/poppler-src/poppler/Dict.cc b/source/libs/poppler/poppler-src/poppler/Dict.cc index 5c231d14f..2bd86abf4 100644 --- a/source/libs/poppler/poppler-src/poppler/Dict.cc +++ b/source/libs/poppler/poppler-src/poppler/Dict.cc @@ -163,7 +163,7 @@ void Dict::add(char *key, Object &&val) { ++length; } -inline DictEntry *Dict::find(const char *key) { +inline DictEntry *Dict::find(const char *key) const { if (!sorted && length >= SORT_LENGTH_LOWER_LIMIT) { dictLocker(); @@ -187,7 +187,7 @@ inline DictEntry *Dict::find(const char *key) { return NULL; } -GBool Dict::hasKey(const char *key) { +GBool Dict::hasKey(const char *key) const { return find(key) != NULL; } @@ -247,25 +247,25 @@ void Dict::set(const char *key, Object &&val) { } -GBool Dict::is(const char *type) { +GBool Dict::is(const char *type) const { DictEntry *e; return (e = find("Type")) && e->val.isName(type); } -Object Dict::lookup(const char *key, int recursion) { +Object Dict::lookup(const char *key, int recursion) const { DictEntry *e; return (e = find(key)) ? e->val.fetch(xref, recursion) : Object(objNull); } -Object Dict::lookupNF(const char *key) { +Object Dict::lookupNF(const char *key) const { DictEntry *e; return (e = find(key)) ? e->val.copy() : Object(objNull); } -GBool Dict::lookupInt(const char *key, const char *alt_key, int *value) +GBool Dict::lookupInt(const char *key, const char *alt_key, int *value) const { GBool success = gFalse; Object obj1 = lookup ((char *) key); @@ -283,14 +283,14 @@ GBool Dict::lookupInt(const char *key, const char *alt_key, int *value) return success; } -char *Dict::getKey(int i) { +char *Dict::getKey(int i) const { return entries[i].key; } -Object Dict::getVal(int i) { +Object Dict::getVal(int i) const { return entries[i].val.fetch(xref); } -Object Dict::getValNF(int i) { +Object Dict::getValNF(int i) const { return entries[i].val.copy(); } diff --git a/source/libs/poppler/poppler-src/poppler/Dict.h b/source/libs/poppler/poppler-src/poppler/Dict.h index b775a574d..1b922b0e8 100644 --- a/source/libs/poppler/poppler-src/poppler/Dict.h +++ b/source/libs/poppler/poppler-src/poppler/Dict.h @@ -57,7 +57,7 @@ public: ~Dict(); // Get number of entries. - int getLength() { return length; } + int getLength() const { return length; } // Add an entry. NB: does not copy key. // val becomes a dead object after the call @@ -70,27 +70,27 @@ public: void remove(const char *key); // Check if dictionary is of specified type. - GBool is(const char *type); + GBool is(const char *type) const; // Look up an entry and return the value. Returns a null object // if <key> is not in the dictionary. - Object lookup(const char *key, int recursion = 0); - Object lookupNF(const char *key); - GBool lookupInt(const char *key, const char *alt_key, int *value); + Object lookup(const char *key, int recursion = 0) const; + Object lookupNF(const char *key) const; + GBool lookupInt(const char *key, const char *alt_key, int *value) const; // Iterative accessors. - char *getKey(int i); - Object getVal(int i); - Object getValNF(int i); + char *getKey(int i) const; + Object getVal(int i) const; + Object getValNF(int i) const; // 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; } + XRef *getXRef() const { return xref; } - GBool hasKey(const char *key); + GBool hasKey(const char *key) const; private: friend class Object; // for incRef/decRef @@ -99,17 +99,17 @@ private: int incRef(); int decRef(); - GBool sorted; + mutable 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; + mutable GooMutex mutex; #endif - DictEntry *find(const char *key); + DictEntry *find(const char *key) const; }; #endif diff --git a/source/libs/poppler/poppler-src/poppler/Form.cc b/source/libs/poppler/poppler-src/poppler/Form.cc index 0f4718ed0..62bba1032 100644 --- a/source/libs/poppler/poppler-src/poppler/Form.cc +++ b/source/libs/poppler/poppler-src/poppler/Form.cc @@ -18,6 +18,7 @@ // Copyright 2015 André Guerreiro <aguerreiro1985@gmail.com> // Copyright 2015 André Esser <bepandre@hotmail.com> // Copyright 2017 Hans-Ulrich Jüttner <huj@froreich-bioscientia.de> +// Copyright 2017 Bernd Kuhls <berndkuhls@hotmail.com> // //======================================================================== @@ -30,7 +31,9 @@ #include <set> #include <limits> #include <stddef.h> +#include <stdlib.h> #include <string.h> +#include <ctype.h> #include "goo/gmem.h" #include "goo/GooString.h" #include "Error.h" @@ -49,6 +52,7 @@ #include "PDFDocEncoding.h" #include "Annot.h" #include "Link.h" +#include "Lexer.h" //return a newly allocated char* containing an UTF16BE string of size length char* pdfDocEncodingToUTF16 (GooString* orig, int* length) @@ -58,8 +62,8 @@ char* pdfDocEncodingToUTF16 (GooString* orig, int* length) char *result = new char[(*length)]; char *cstring = orig->getCString(); //unicode marker - result[0] = 0xfe; - result[1] = 0xff; + result[0] = (char)0xfe; + result[1] = (char)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; @@ -312,6 +316,16 @@ int FormWidgetText::getMaxLen () const return parent()->getMaxLen (); } +double FormWidgetText::getTextFontSize() +{ + return parent()->getTextFontSize(); +} + +void FormWidgetText::setTextFontSize(int fontSize) +{ + parent()->setTextFontSize(fontSize); +} + void FormWidgetText::setContent(GooString* new_content) { parent()->setContentCopy(new_content); @@ -906,8 +920,7 @@ GooString* FormField::getFullyQualifiedName() { } if (unicode_encoded) { - full_name->insert(0, 0xff); - full_name->insert(0, 0xfe); + full_name->prependUnicodeMarker(); } fullyQualifiedName = full_name; @@ -1170,8 +1183,7 @@ void FormFieldText::setContentCopy (GooString* new_content) //append the unicode marker <FE FF> if needed if (!content->hasUnicodeMarker()) { - content->insert(0, 0xff); - content->insert(0, 0xfe); + content->prependUnicodeMarker(); } } @@ -1185,6 +1197,86 @@ FormFieldText::~FormFieldText() delete content; } +double FormFieldText::getTextFontSize() +{ + GooList* daToks = new GooList(); + int idx = parseDA(daToks); + double fontSize = -1; + if (idx >= 0) { + char* p = nullptr; + fontSize = strtod(static_cast<GooString*>(daToks->get(idx))->getCString(), &p); + if (!p || *p) + fontSize = -1; + } + deleteGooList(daToks, GooString); + return fontSize; +} + +void FormFieldText::setTextFontSize(int fontSize) +{ + if (fontSize > 0 && obj.isDict()) { + GooList* daToks = new GooList(); + int idx = parseDA(daToks); + if (idx == -1) { + error(errSyntaxError, -1, "FormFieldText:: invalid DA object\n"); + return; + } + if (defaultAppearance) + delete defaultAppearance; + defaultAppearance = new GooString; + for (int i = 0; i < daToks->getLength(); ++i) { + if (i > 0) + defaultAppearance->append(' '); + if (i == idx) { + defaultAppearance->appendf("{0:d}", fontSize); + } else { + defaultAppearance->append(static_cast<GooString*>(daToks->get(i))); + } + } + deleteGooList(daToks, GooString); + obj.dictSet("DA", Object(defaultAppearance->copy())); + xref->setModifiedObject(&obj, ref); + updateChildrenAppearance(); + } +} + +int FormFieldText::tokenizeDA(GooString* da, GooList* daToks, const char* searchTok) +{ + int idx = -1; + if(da && daToks) { + int i = 0; + int j = 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) { + } + GooString* tok = new GooString(da, i, j - i); + if (searchTok && !tok->cmp(searchTok)) + idx = daToks->getLength(); + daToks->append(tok); + i = j; + } + } + } + return idx; +} + +int FormFieldText::parseDA(GooList* daToks) +{ + int idx = -1; + if (obj.isDict()) { + Object objDA(obj.dictLookup("DA")); + if (objDA.isString()) { + GooString* da = objDA.getString(); + idx = tokenizeDA(da, daToks, "Tf") - 1; + } + } + return idx; +} + //------------------------------------------------------------------------ // FormFieldChoice @@ -1447,8 +1539,7 @@ void FormFieldChoice::setEditChoice (GooString* new_content) //append the unicode marker <FE FF> if needed if (!editedChoice->hasUnicodeMarker()) { - editedChoice->insert(0, 0xff); - editedChoice->insert(0, 0xfe); + editedChoice->prependUnicodeMarker(); } } updateSelection(); diff --git a/source/libs/poppler/poppler-src/poppler/Form.h b/source/libs/poppler/poppler-src/poppler/Form.h index 8498752e6..8e72334d0 100644 --- a/source/libs/poppler/poppler-src/poppler/Form.h +++ b/source/libs/poppler/poppler-src/poppler/Form.h @@ -25,6 +25,7 @@ #pragma interface #endif +#include "goo/GooList.h" #include "Object.h" #include "Annot.h" @@ -206,6 +207,11 @@ public: bool isComb () const; bool isRichText () const; int getMaxLen () const; + //return the font size of the field's text + double getTextFontSize(); + //set the font size of the field's text (currently only integer values) + void setTextFontSize(int fontSize); + protected: FormFieldText *parent() const; }; @@ -421,10 +427,20 @@ public: int getMaxLen () const { return maxLen; } + //return the font size of the field's text + double getTextFontSize(); + //set the font size of the field's text (currently only integer values) + void setTextFontSize(int fontSize); + #ifdef DEBUG_FORMS void print(int indent = 0); #endif + + static int tokenizeDA(GooString* daString, GooList* daToks, const char* searchTok); + protected: + int parseDA(GooList* daToks); + GooString* content; bool multiline; bool password; diff --git a/source/libs/poppler/poppler-src/poppler/Gfx.cc b/source/libs/poppler/poppler-src/poppler/Gfx.cc index 6ffb7bcf2..eaef798f3 100644 --- a/source/libs/poppler/poppler-src/poppler/Gfx.cc +++ b/source/libs/poppler/poppler-src/poppler/Gfx.cc @@ -458,9 +458,15 @@ GfxPattern *GfxResources::lookupPattern(char *name, OutputDev *out, GfxState *st for (resPtr = this; resPtr; resPtr = resPtr->next) { if (resPtr->patternDict.isDict()) { - Object obj = resPtr->patternDict.dictLookup(name); + Object obj = resPtr->patternDict.dictLookupNF(name); if (!obj.isNull()) { - pattern = GfxPattern::parse(resPtr, &obj, out, state); + Ref patternRef = { -1, -1 }; + if (obj.isRef()) { + patternRef = obj.getRef(); + obj = obj.fetch(resPtr->patternDict.getDict()->getXRef()); + } + + pattern = GfxPattern::parse(resPtr, &obj, out, state, patternRef.num); return pattern; } } @@ -2224,18 +2230,34 @@ void Gfx::doTilingPatternFill(GfxTilingPattern *tPat, xi0, yi0, xi1, yi1, xstep, ystep)) { goto restore; } else { - out->updatePatternOpacity(state); - 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()); + bool shouldDrawForm = gTrue; + std::set<int>::iterator patternRefIt; + const int patternRefNum = tPat->getPatternRefNum(); + if (patternRefNum != -1) { + if (formsDrawing.find(patternRefNum) == formsDrawing.end()) { + patternRefIt = formsDrawing.insert(patternRefNum).first; + } else { + shouldDrawForm = gFalse; + } + } + + if (shouldDrawForm) { + out->updatePatternOpacity(state); + 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()); + } + } + out->clearPatternOpacity(state); + if (patternRefNum != -1) { + formsDrawing.erase(patternRefIt); } } - out->clearPatternOpacity(state); } // restore graphics state @@ -3953,12 +3975,33 @@ void Gfx::doShowText(GooString *s) { state->transformDelta(dx, dy, &ddx, &ddy); if (!out->beginType3Char(state, curX + riseX, curY + riseY, ddx, ddy, code, u, uLen)) { - Object charProc = ((Gfx8BitFont *)font)->getCharProc(code); + Object charProc = ((Gfx8BitFont *)font)->getCharProcNF(code); + int refNum = -1; + if (charProc.isRef()) { + refNum = charProc.getRef().num; + charProc = charProc.fetch(((Gfx8BitFont *)font)->getCharProcs()->getXRef()); + } if ((resDict = ((Gfx8BitFont *)font)->getResources())) { pushResources(resDict); } if (charProc.isStream()) { - display(&charProc, gFalse); + std::set<int>::iterator charProcDrawingIt; + bool displayCharProc = true; + if (refNum != -1) { + if (charProcDrawing.find(refNum) == charProcDrawing.end()) { + charProcDrawingIt = charProcDrawing.insert(refNum).first; + } else { + displayCharProc = false; + error(errSyntaxError, -1, "CharProc wants to draw a CharProc that is already beign drawn"); + } + } + if (displayCharProc) { + display(&charProc, gFalse); + + if (refNum != -1) { + charProcDrawing.erase(charProcDrawingIt); + } + } } else { error(errSyntaxError, getPos(), "Missing or bad Type3 CharProc entry"); } diff --git a/source/libs/poppler/poppler-src/poppler/Gfx.h b/source/libs/poppler/poppler-src/poppler/Gfx.h index 00eaec494..293f4551e 100644 --- a/source/libs/poppler/poppler-src/poppler/Gfx.h +++ b/source/libs/poppler/poppler-src/poppler/Gfx.h @@ -228,6 +228,7 @@ private: Parser *parser; // parser for page content stream(s) std::set<int> formsDrawing; // the forms that are being drawn + std::set<int> charProcDrawing; // the charProc that are being drawn GBool // callback to check for an abort (*abortCheckCbk)(void *data); diff --git a/source/libs/poppler/poppler-src/poppler/GfxFont.cc b/source/libs/poppler/poppler-src/poppler/GfxFont.cc index d95f8f7c1..04431b3c4 100644 --- a/source/libs/poppler/poppler-src/poppler/GfxFont.cc +++ b/source/libs/poppler/poppler-src/poppler/GfxFont.cc @@ -594,7 +594,6 @@ GfxFontLoc *GfxFont::locateFont(XRef *xref, PSOutputDev *ps) { GfxFontLoc *fontLoc; SysFontType sysFontType; GooString *path, *base14Name, *substName; - PSFontParam16 *psFont16; int substIdx, fontNum; GBool embed; @@ -715,17 +714,6 @@ GfxFontLoc *GfxFont::locateFont(XRef *xref, PSOutputDev *ps) { 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; @@ -768,42 +756,6 @@ GfxFontLoc *GfxFont::locateFont(XRef *xref, PSOutputDev *ps) { 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; } @@ -1759,6 +1711,14 @@ Object Gfx8BitFont::getCharProc(int code) { } } +Object Gfx8BitFont::getCharProcNF(int code) { + if (enc[code] && charProcs.isDict()) { + return charProcs.dictLookupNF(enc[code]); + } else { + return Object(objNull); + } +} + Dict *Gfx8BitFont::getResources() { return resources.isDict() ? resources.getDict() : (Dict *)NULL; } diff --git a/source/libs/poppler/poppler-src/poppler/GfxFont.h b/source/libs/poppler/poppler-src/poppler/GfxFont.h index 06c1df6d6..5985912a8 100644 --- a/source/libs/poppler/poppler-src/poppler/GfxFont.h +++ b/source/libs/poppler/poppler-src/poppler/GfxFont.h @@ -353,6 +353,7 @@ public: // Return the Type 3 CharProc for the character associated with <code>. Object getCharProc(int code); + Object getCharProcNF(int code); // Return the Type 3 Resources dictionary, or NULL if none. Dict *getResources(); diff --git a/source/libs/poppler/poppler-src/poppler/GfxState.cc b/source/libs/poppler/poppler-src/poppler/GfxState.cc index b2971ec05..3e30edf02 100644 --- a/source/libs/poppler/poppler-src/poppler/GfxState.cc +++ b/source/libs/poppler/poppler-src/poppler/GfxState.cc @@ -3351,14 +3351,17 @@ void GfxPatternColorSpace::getDefaultColor(GfxColor *color) { // Pattern //------------------------------------------------------------------------ -GfxPattern::GfxPattern(int typeA) { - type = typeA; +GfxPattern::GfxPattern(int typeA, int patternRefNumA) + : type(typeA) + , patternRefNum(patternRefNumA) +{ + } GfxPattern::~GfxPattern() { } -GfxPattern *GfxPattern::parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state) { +GfxPattern *GfxPattern::parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state, int patternRefNum) { GfxPattern *pattern; Object obj1; @@ -3371,9 +3374,9 @@ GfxPattern *GfxPattern::parse(GfxResources *res, Object *obj, OutputDev *out, Gf } pattern = NULL; if (obj1.isInt() && obj1.getInt() == 1) { - pattern = GfxTilingPattern::parse(obj); + pattern = GfxTilingPattern::parse(obj, patternRefNum); } else if (obj1.isInt() && obj1.getInt() == 2) { - pattern = GfxShadingPattern::parse(res, obj, out, state); + pattern = GfxShadingPattern::parse(res, obj, out, state, patternRefNum); } return pattern; } @@ -3382,7 +3385,7 @@ GfxPattern *GfxPattern::parse(GfxResources *res, Object *obj, OutputDev *out, Gf // GfxTilingPattern //------------------------------------------------------------------------ -GfxTilingPattern *GfxTilingPattern::parse(Object *patObj) { +GfxTilingPattern *GfxTilingPattern::parse(Object *patObj, int patternRefNum) { Dict *dict; int paintTypeA, tilingTypeA; double bboxA[4], matrixA[6]; @@ -3455,14 +3458,14 @@ GfxTilingPattern *GfxTilingPattern::parse(Object *patObj) { } return new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA, - &resDictA, matrixA, patObj); + &resDictA, matrixA, patObj, patternRefNum); } GfxTilingPattern::GfxTilingPattern(int paintTypeA, int tilingTypeA, double *bboxA, double xStepA, double yStepA, Object *resDictA, double *matrixA, - Object *contentStreamA): - GfxPattern(1) + Object *contentStreamA, int patternRefNumA) : + GfxPattern(1, patternRefNumA) { int i; @@ -3485,14 +3488,14 @@ GfxTilingPattern::~GfxTilingPattern() { GfxPattern *GfxTilingPattern::copy() { return new GfxTilingPattern(paintType, tilingType, bbox, xStep, yStep, - &resDict, matrix, &contentStream); + &resDict, matrix, &contentStream, getPatternRefNum()); } //------------------------------------------------------------------------ // GfxShadingPattern //------------------------------------------------------------------------ -GfxShadingPattern *GfxShadingPattern::parse(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state) { +GfxShadingPattern *GfxShadingPattern::parse(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state, int patternRefNum) { Dict *dict; GfxShading *shadingA; double matrixA[6]; @@ -3523,11 +3526,11 @@ GfxShadingPattern *GfxShadingPattern::parse(GfxResources *res, Object *patObj, O } } - return new GfxShadingPattern(shadingA, matrixA); + return new GfxShadingPattern(shadingA, matrixA, patternRefNum); } -GfxShadingPattern::GfxShadingPattern(GfxShading *shadingA, double *matrixA): - GfxPattern(2) +GfxShadingPattern::GfxShadingPattern(GfxShading *shadingA, double *matrixA, int patternRefNumA): + GfxPattern(2, patternRefNumA) { int i; @@ -3542,7 +3545,7 @@ GfxShadingPattern::~GfxShadingPattern() { } GfxPattern *GfxShadingPattern::copy() { - return new GfxShadingPattern(shading->copy(), matrix); + return new GfxShadingPattern(shading->copy(), matrix, getPatternRefNum()); } //------------------------------------------------------------------------ diff --git a/source/libs/poppler/poppler-src/poppler/GfxState.h b/source/libs/poppler/poppler-src/poppler/GfxState.h index 7bcedf2a8..57f372527 100644 --- a/source/libs/poppler/poppler-src/poppler/GfxState.h +++ b/source/libs/poppler/poppler-src/poppler/GfxState.h @@ -17,7 +17,7 @@ // 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, 2016 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2009-2011, 2013, 2016, 2017 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, 2016 Thomas Freitag <Thomas.Freitag@alfa.de> @@ -762,18 +762,21 @@ private: class GfxPattern { public: - GfxPattern(int typeA); + GfxPattern(int typeA, int patternRefNumA); virtual ~GfxPattern(); - static GfxPattern *parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state); + static GfxPattern *parse(GfxResources *res, Object *obj, OutputDev *out, GfxState *state, int patternRefNum); virtual GfxPattern *copy() = 0; int getType() { return type; } + int getPatternRefNum() const { return patternRefNum; } + private: int type; + int patternRefNum; }; //------------------------------------------------------------------------ @@ -783,7 +786,7 @@ private: class GfxTilingPattern: public GfxPattern { public: - static GfxTilingPattern *parse(Object *patObj); + static GfxTilingPattern *parse(Object *patObj, int patternRefNum); ~GfxTilingPattern(); GfxPattern *copy() override; @@ -803,7 +806,7 @@ private: GfxTilingPattern(int paintTypeA, int tilingTypeA, double *bboxA, double xStepA, double yStepA, Object *resDictA, double *matrixA, - Object *contentStreamA); + Object *contentStreamA, int patternRefNumA); int paintType; int tilingType; @@ -821,7 +824,7 @@ private: class GfxShadingPattern: public GfxPattern { public: - static GfxShadingPattern *parse(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state); + static GfxShadingPattern *parse(GfxResources *res, Object *patObj, OutputDev *out, GfxState *state, int patternRefNum); ~GfxShadingPattern(); GfxPattern *copy() override; @@ -831,7 +834,7 @@ public: private: - GfxShadingPattern(GfxShading *shadingA, double *matrixA); + GfxShadingPattern(GfxShading *shadingA, double *matrixA, int patternRefNumA); GfxShading *shading; double matrix[6]; diff --git a/source/libs/poppler/poppler-src/poppler/GlobalParams.cc b/source/libs/poppler/poppler-src/poppler/GlobalParams.cc index 10830944b..93c42d2a7 100644 --- a/source/libs/poppler/poppler-src/poppler/GlobalParams.cc +++ b/source/libs/poppler/poppler-src/poppler/GlobalParams.cc @@ -15,7 +15,7 @@ // // 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, 2007-2010, 2012, 2015, 2017 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> @@ -127,24 +127,6 @@ extern XpdfPluginVecTable xpdfPluginVecTable; 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 */ @@ -587,17 +569,11 @@ GlobalParams::GlobalParams(const char *customPopplerDataDir) 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; @@ -796,18 +772,10 @@ GlobalParams::~GlobalParams() { 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; @@ -1105,14 +1073,7 @@ static FcPattern *buildFcPattern(GfxFont *font, GooString *base14Name) #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; + GooString *path; setupBaseFonts(NULL); lockGlobalParams; @@ -1121,26 +1082,6 @@ GooString *GlobalParams::findFontFile(GooString *fontName) { 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; } @@ -1425,18 +1366,6 @@ GooString *GlobalParams::findSystemFontFile(GfxFont *font, } #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; @@ -1473,67 +1402,6 @@ PSLevel GlobalParams::getPSLevel() { 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; @@ -1791,15 +1659,6 @@ void GlobalParams::addFontFile(GooString *fontName, GooString *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; diff --git a/source/libs/poppler/poppler-src/poppler/GlobalParams.h b/source/libs/poppler/poppler-src/poppler/GlobalParams.h index 1a65085f8..16dc7a4a0 100644 --- a/source/libs/poppler/poppler-src/poppler/GlobalParams.h +++ b/source/libs/poppler/poppler-src/poppler/GlobalParams.h @@ -81,22 +81,6 @@ enum SysFontType { //------------------------------------------------------------------------ -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, @@ -156,15 +140,10 @@ public: 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(); @@ -198,7 +177,6 @@ public: //----- 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); @@ -270,24 +248,11 @@ private: #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 @@ -310,7 +275,6 @@ private: 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; diff --git a/source/libs/poppler/poppler-src/poppler/GlobalParamsWin.cc b/source/libs/poppler/poppler-src/poppler/GlobalParamsWin.cc index 1dc3d4ab5..eba72fa00 100644 --- a/source/libs/poppler/poppler-src/poppler/GlobalParamsWin.cc +++ b/source/libs/poppler/poppler-src/poppler/GlobalParamsWin.cc @@ -78,7 +78,7 @@ description for all fonts available in Windows. That's how MuPDF works. #define DEFAULT_CID_FONT_AK1_MSWIN "Batang" /* Adobe-Korea1 */ #define DEFAULT_CID_FONT_MSWIN "ArialUnicode" /* Unknown */ -static struct { +static const struct { const char *name; const char *t1FileName; const char *ttFileName; diff --git a/source/libs/poppler/poppler-src/poppler/JBIG2Stream.cc b/source/libs/poppler/poppler-src/poppler/JBIG2Stream.cc index 50c6eee6f..bda7f42eb 100644 --- a/source/libs/poppler/poppler-src/poppler/JBIG2Stream.cc +++ b/source/libs/poppler/poppler-src/poppler/JBIG2Stream.cc @@ -2964,8 +2964,8 @@ JBIG2Bitmap *JBIG2Stream::readGenericBitmap(GBool mmr, int w, int h, 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; + delete bitmap; + return NULL; } // 0 <= codingLine[0] < codingLine[1] < ... < codingLine[n] = w // ---> max codingLine size = w + 1 diff --git a/source/libs/poppler/poppler-src/poppler/Makefile.am b/source/libs/poppler/poppler-src/poppler/Makefile.am deleted file mode 100644 index 8cf7af850..000000000 --- a/source/libs/poppler/poppler-src/poppler/Makefile.am +++ /dev/null @@ -1,348 +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_NSS - -nss_sources = \ - SignatureHandler.cc - -nss_libs = \ - $(NSS3_LIBS) - -nss_includes = \ - $(NSS3_CFLAGS) - -nss_headers = \ - SignatureHandler.h - -endif - - -if BUILD_ZLIB - -zlib_sources = \ - FlateEncoder.h \ - FlateEncoder.cc - -zlib_libs = \ - $(ZLIB_LIBS) - -endif - -if BUILD_ZLIB_UNCOMPRESS - -zlib_uncompress_sources = \ - FlateStream.h \ - FlateStream.cc - -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) \ - $(nss_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 \ - SignatureInfo.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) \ - $(zlib_uncompress_sources) \ - $(nss_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 \ - SignatureInfo.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) \ - $(nss_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) \ - $(nss_libs) \ - $(libjpeg2000_libs) \ - $(FREETYPE_LIBS) \ - $(FONTCONFIG_LIBS) \ - $(PTHREAD_LIBS) \ - $(win32_libs) - -libpoppler_la_LDFLAGS = \ - -version-info 70: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/source/libs/poppler/poppler-src/poppler/Object.cc b/source/libs/poppler/poppler-src/poppler/Object.cc index 4fce012dc..d3adc4473 100644 --- a/source/libs/poppler/poppler-src/poppler/Object.cc +++ b/source/libs/poppler/poppler-src/poppler/Object.cc @@ -160,11 +160,11 @@ void Object::free() { type = objNone; } -const char *Object::getTypeName() { +const char *Object::getTypeName() const { return objTypeNames[type]; } -void Object::print(FILE *f) { +void Object::print(FILE *f) const { Object obj; int i; diff --git a/source/libs/poppler/poppler-src/poppler/Object.h b/source/libs/poppler/poppler-src/poppler/Object.h index 331854781..50b2c1611 100644 --- a/source/libs/poppler/poppler-src/poppler/Object.h +++ b/source/libs/poppler/poppler-src/poppler/Object.h @@ -184,100 +184,100 @@ public: Object fetch(XRef *xref, int recursion = 0) const; // Type checking. - ObjType getType() { CHECK_NOT_DEAD; return type; } - GBool isBool() { CHECK_NOT_DEAD; return type == objBool; } - GBool isInt() { CHECK_NOT_DEAD; return type == objInt; } - GBool isReal() { CHECK_NOT_DEAD; return type == objReal; } - GBool isNum() { CHECK_NOT_DEAD; return type == objInt || type == objReal || type == objInt64; } - GBool isString() { CHECK_NOT_DEAD; return type == objString; } - GBool isName() { CHECK_NOT_DEAD; return type == objName; } - GBool isNull() { CHECK_NOT_DEAD; return type == objNull; } - GBool isArray() { CHECK_NOT_DEAD; return type == objArray; } - GBool isDict() { CHECK_NOT_DEAD; return type == objDict; } - GBool isStream() { CHECK_NOT_DEAD; return type == objStream; } - GBool isRef() { CHECK_NOT_DEAD; return type == objRef; } - GBool isCmd() { CHECK_NOT_DEAD; return type == objCmd; } - GBool isError() { CHECK_NOT_DEAD; return type == objError; } - GBool isEOF() { CHECK_NOT_DEAD; return type == objEOF; } - GBool isNone() { CHECK_NOT_DEAD; return type == objNone; } - GBool isInt64() { CHECK_NOT_DEAD; return type == objInt64; } - GBool isIntOrInt64() { CHECK_NOT_DEAD; return type == objInt || type == objInt64; } + ObjType getType() const { CHECK_NOT_DEAD; return type; } + GBool isBool() const { CHECK_NOT_DEAD; return type == objBool; } + GBool isInt() const { CHECK_NOT_DEAD; return type == objInt; } + GBool isReal() const { CHECK_NOT_DEAD; return type == objReal; } + GBool isNum() const { CHECK_NOT_DEAD; return type == objInt || type == objReal || type == objInt64; } + GBool isString() const { CHECK_NOT_DEAD; return type == objString; } + GBool isName() const { CHECK_NOT_DEAD; return type == objName; } + GBool isNull() const { CHECK_NOT_DEAD; return type == objNull; } + GBool isArray() const { CHECK_NOT_DEAD; return type == objArray; } + GBool isDict() const { CHECK_NOT_DEAD; return type == objDict; } + GBool isStream() const { CHECK_NOT_DEAD; return type == objStream; } + GBool isRef() const { CHECK_NOT_DEAD; return type == objRef; } + GBool isCmd() const { CHECK_NOT_DEAD; return type == objCmd; } + GBool isError() const { CHECK_NOT_DEAD; return type == objError; } + GBool isEOF() const { CHECK_NOT_DEAD; return type == objEOF; } + GBool isNone() const { CHECK_NOT_DEAD; return type == objNone; } + GBool isInt64() const { CHECK_NOT_DEAD; return type == objInt64; } + GBool isIntOrInt64() const { CHECK_NOT_DEAD; return type == objInt || type == objInt64; } // Special type checking. - GBool isName(const char *nameA) + GBool isName(const char *nameA) const { return type == objName && !strcmp(cString, nameA); } - GBool isDict(const char *dictType); - GBool isStream(const char *dictType); - GBool isCmd(const char *cmdA) + GBool isDict(const char *dictType) const; + GBool isStream(const char *dictType) const; + GBool isCmd(const char *cmdA) const { return type == objCmd && !strcmp(cString, 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; } + GBool getBool() const { OBJECT_TYPE_CHECK(objBool); return booln; } + int getInt() const { OBJECT_TYPE_CHECK(objInt); return intg; } + double getReal() const { 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); + double getNum() const { OBJECT_3TYPES_CHECK(objInt, objInt64, objReal); return type == objInt ? (double)intg : type == objInt64 ? (double)int64g : real; } - double getNum(bool *ok) { + double getNum(bool *ok) const { if (unlikely(type != objInt && type != objInt64 && type != objReal)) { *ok = false; return 0.; } return type == objInt ? (double)intg : type == objInt64 ? (double)int64g : real; } - GooString *getString() { OBJECT_TYPE_CHECK(objString); return string; } + GooString *getString() const { 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 cString; } - 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 cString; } - long long getInt64() { OBJECT_TYPE_CHECK(objInt64); return int64g; } - long long getIntOrInt64() { OBJECT_2TYPES_CHECK(objInt, objInt64); + char *getName() const { OBJECT_TYPE_CHECK(objName); return cString; } + Array *getArray() const { OBJECT_TYPE_CHECK(objArray); return array; } + Dict *getDict() const { OBJECT_TYPE_CHECK(objDict); return dict; } + Stream *getStream() const { OBJECT_TYPE_CHECK(objStream); return stream; } + Ref getRef() const { OBJECT_TYPE_CHECK(objRef); return ref; } + int getRefNum() const { OBJECT_TYPE_CHECK(objRef); return ref.num; } + int getRefGen() const { OBJECT_TYPE_CHECK(objRef); return ref.gen; } + char *getCmd() const { OBJECT_TYPE_CHECK(objCmd); return cString; } + long long getInt64() const { OBJECT_TYPE_CHECK(objInt64); return int64g; } + long long getIntOrInt64() const { OBJECT_2TYPES_CHECK(objInt, objInt64); return type == objInt ? intg : int64g; } // Array accessors. - int arrayGetLength(); + int arrayGetLength() const; void arrayAdd(Object &&elem); void arrayRemove(int i); - Object arrayGet(int i, int recursion); - Object arrayGetNF(int i); + Object arrayGet(int i, int recursion) const; + Object arrayGetNF(int i) const; // Dict accessors. - int dictGetLength(); + int dictGetLength() const; void dictAdd(char *key, Object &&val); void dictSet(const char *key, Object &&val); void dictRemove(const char *key); - GBool dictIs(const char *dictType); - Object dictLookup(const char *key, int recursion = 0); - Object dictLookupNF(const char *key); - char *dictGetKey(int i); - Object dictGetVal(int i); - Object dictGetValNF(int i); + GBool dictIs(const char *dictType) const; + Object dictLookup(const char *key, int recursion = 0) const; + Object dictLookupNF(const char *key) const; + char *dictGetKey(int i) const; + Object dictGetVal(int i) const; + Object dictGetValNF(int i) const; // Stream accessors. - GBool streamIs(const char *dictType); + GBool streamIs(const char *dictType) const; void streamReset(); void streamClose(); - int streamGetChar(); - int streamGetChars(int nChars, Guchar *buffer); - int streamLookChar(); - char *streamGetLine(char *buf, int size); - Goffset streamGetPos(); + int streamGetChar() const; + int streamGetChars(int nChars, Guchar *buffer) const; + int streamLookChar() const; + char *streamGetLine(char *buf, int size) const; + Goffset streamGetPos() const; void streamSetPos(Goffset pos, int dir = 0); - Dict *streamGetDict(); + Dict *streamGetDict() const; // Output. - const char *getTypeName(); - void print(FILE *f = stdout); + const char *getTypeName() const; + void print(FILE *f = stdout) const; // Memory testing. static void memCheck(FILE *f); @@ -319,7 +319,7 @@ private: #include "Array.h" -inline int Object::arrayGetLength() +inline int Object::arrayGetLength() const { OBJECT_TYPE_CHECK(objArray); return array->getLength(); } inline void Object::arrayAdd(Object &&elem) @@ -328,10 +328,10 @@ inline void Object::arrayAdd(Object &&elem) inline void Object::arrayRemove(int i) { OBJECT_TYPE_CHECK(objArray); array->remove(i); } -inline Object Object::arrayGet(int i, int recursion = 0) +inline Object Object::arrayGet(int i, int recursion = 0) const { OBJECT_TYPE_CHECK(objArray); return array->get(i, recursion); } -inline Object Object::arrayGetNF(int i) +inline Object Object::arrayGetNF(int i) const { OBJECT_TYPE_CHECK(objArray); return array->getNF(i); } //------------------------------------------------------------------------ @@ -340,7 +340,7 @@ inline Object Object::arrayGetNF(int i) #include "Dict.h" -inline int Object::dictGetLength() +inline int Object::dictGetLength() const { OBJECT_TYPE_CHECK(objDict); return dict->getLength(); } inline void Object::dictAdd(char *key, Object &&val) @@ -352,25 +352,25 @@ inline void Object::dictSet(const char *key, Object &&val) inline void Object::dictRemove(const char *key) { OBJECT_TYPE_CHECK(objDict); dict->remove(key); } -inline GBool Object::dictIs(const char *dictType) +inline GBool Object::dictIs(const char *dictType) const { OBJECT_TYPE_CHECK(objDict); return dict->is(dictType); } -inline GBool Object::isDict(const char *dictType) +inline GBool Object::isDict(const char *dictType) const { return type == objDict && dictIs(dictType); } -inline Object Object::dictLookup(const char *key, int recursion) +inline Object Object::dictLookup(const char *key, int recursion) const { OBJECT_TYPE_CHECK(objDict); return dict->lookup(key, recursion); } -inline Object Object::dictLookupNF(const char *key) +inline Object Object::dictLookupNF(const char *key) const { OBJECT_TYPE_CHECK(objDict); return dict->lookupNF(key); } -inline char *Object::dictGetKey(int i) +inline char *Object::dictGetKey(int i) const { OBJECT_TYPE_CHECK(objDict); return dict->getKey(i); } -inline Object Object::dictGetVal(int i) +inline Object Object::dictGetVal(int i) const { OBJECT_TYPE_CHECK(objDict); return dict->getVal(i); } -inline Object Object::dictGetValNF(int i) +inline Object Object::dictGetValNF(int i) const { OBJECT_TYPE_CHECK(objDict); return dict->getValNF(i); } //------------------------------------------------------------------------ @@ -379,10 +379,10 @@ inline Object Object::dictGetValNF(int i) #include "Stream.h" -inline GBool Object::streamIs(const char *dictType) +inline GBool Object::streamIs(const char *dictType) const { OBJECT_TYPE_CHECK(objStream); return stream->getDict()->is(dictType); } -inline GBool Object::isStream(const char *dictType) +inline GBool Object::isStream(const char *dictType) const { return type == objStream && streamIs(dictType); } inline void Object::streamReset() @@ -391,25 +391,25 @@ inline void Object::streamReset() inline void Object::streamClose() { OBJECT_TYPE_CHECK(objStream); stream->close(); } -inline int Object::streamGetChar() +inline int Object::streamGetChar() const { OBJECT_TYPE_CHECK(objStream); return stream->getChar(); } -inline int Object::streamGetChars(int nChars, Guchar *buffer) +inline int Object::streamGetChars(int nChars, Guchar *buffer) const { OBJECT_TYPE_CHECK(objStream); return stream->doGetChars(nChars, buffer); } -inline int Object::streamLookChar() +inline int Object::streamLookChar() const { OBJECT_TYPE_CHECK(objStream); return stream->lookChar(); } -inline char *Object::streamGetLine(char *buf, int size) +inline char *Object::streamGetLine(char *buf, int size) const { OBJECT_TYPE_CHECK(objStream); return stream->getLine(buf, size); } -inline Goffset Object::streamGetPos() +inline Goffset Object::streamGetPos() const { 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() +inline Dict *Object::streamGetDict() const { OBJECT_TYPE_CHECK(objStream); return stream->getDict(); } #endif diff --git a/source/libs/poppler/poppler-src/poppler/PSOutputDev.cc b/source/libs/poppler/poppler-src/poppler/PSOutputDev.cc index b2d6d3a94..5e4226f42 100644 --- a/source/libs/poppler/poppler-src/poppler/PSOutputDev.cc +++ b/source/libs/poppler/poppler-src/poppler/PSOutputDev.cc @@ -23,7 +23,7 @@ // 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-2016 William Bader <williambader@hotmail.com> +// Copyright (C) 2009, 2011, 2012, 2014-2017 William Bader <williambader@hotmail.com> // Copyright (C) 2009 Kovid Goyal <kovid@kovidgoyal.net> // Copyright (C) 2009-2011, 2013-2015 Adrian Johnson <ajohnson@redneon.com> // Copyright (C) 2012, 2014 Fabio D'Urso <fabiodurso@hotmail.it> @@ -1311,7 +1311,6 @@ void PSOutputDev::postInit() Catalog *catalog; PDFRectangle *box; PSOutPaperSize *size; - GooList *names; int w, h, i; if (postInitDone || !ok) { @@ -1405,11 +1404,6 @@ void PSOutputDev::postInit() 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)); @@ -2544,6 +2538,14 @@ void PSOutputDev::setupExternalTrueTypeFont(GfxFont *font, GooString *fileName, writePS("%%EndResource\n"); } +void PSOutputDev::updateFontMaxValidGlyph(GfxFont *font, int maxValidGlyph) { + if (maxValidGlyph >= 0 && font->getName()) { + if (maxValidGlyph > fontMaxValidGlyph->lookupInt(font->getName())) { + fontMaxValidGlyph->replace(font->getName()->copy(), maxValidGlyph); + } + } +} + void PSOutputDev::setupExternalCIDTrueTypeFont(GfxFont *font, GooString *fileName, GooString *psName, @@ -2594,9 +2596,7 @@ void PSOutputDev::setupExternalCIDTrueTypeFont(GfxFont *font, needVerticalMetrics, &maxValidGlyph, outputFunc, outputStream); - if (maxValidGlyph >= 0 && font->getName()) { - fontMaxValidGlyph->replace(font->getName()->copy(), maxValidGlyph); - } + updateFontMaxValidGlyph(font, maxValidGlyph); } gfree(codeToGID); } else { @@ -2696,9 +2696,7 @@ void PSOutputDev::setupEmbeddedCIDTrueTypeFont(GfxFont *font, Ref *id, needVerticalMetrics, &maxValidGlyph, outputFunc, outputStream); - if (maxValidGlyph > 0 && font->getName()) { - fontMaxValidGlyph->replace(font->getName()->copy(), maxValidGlyph); - } + updateFontMaxValidGlyph(font, maxValidGlyph); } delete ffTT; } diff --git a/source/libs/poppler/poppler-src/poppler/PSOutputDev.h b/source/libs/poppler/poppler-src/poppler/PSOutputDev.h index 833f686ea..8dd1c9504 100644 --- a/source/libs/poppler/poppler-src/poppler/PSOutputDev.h +++ b/source/libs/poppler/poppler-src/poppler/PSOutputDev.h @@ -20,7 +20,7 @@ // 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-2016 William Bader <williambader@hotmail.com> +// Copyright (C) 2009, 2011, 2015-2017 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> @@ -355,6 +355,7 @@ private: void setupFonts(Dict *resDict); void setupFont(GfxFont *font, Dict *parentResDict); void setupEmbeddedType1Font(Ref *id, GooString *psName); + void updateFontMaxValidGlyph(GfxFont *font, int maxValidGlyph); void setupExternalType1Font(GooString *fileName, GooString *psName); void setupEmbeddedType1CFont(GfxFont *font, Ref *id, GooString *psName); void setupEmbeddedOpenTypeT1CFont(GfxFont *font, Ref *id, GooString *psName); diff --git a/source/libs/poppler/poppler-src/poppler/SplashOutputDev.cc b/source/libs/poppler/poppler-src/poppler/SplashOutputDev.cc index 60edb8ac8..dc5b68714 100644 --- a/source/libs/poppler/poppler-src/poppler/SplashOutputDev.cc +++ b/source/libs/poppler/poppler-src/poppler/SplashOutputDev.cc @@ -128,6 +128,7 @@ static inline void convertGfxColor(SplashColorPtr dest, break; case splashModeXBGR8: color[3] = 255; + // fallthrough case splashModeBGR8: case splashModeRGB8: colorSpace->getRGB(src, &rgb); @@ -175,6 +176,7 @@ static inline void convertGfxShortColor(SplashColorPtr dest, break; case splashModeXBGR8: dest[3] = 255; + // fallthrough case splashModeBGR8: case splashModeRGB8: { @@ -1016,6 +1018,7 @@ static void splashOutBlendHue(SplashColorPtr src, SplashColorPtr dest, break; case splashModeXBGR8: src[3] = 255; + // fallthrough case splashModeRGB8: case splashModeBGR8: setSat(src[0], src[1], src[2], getSat(dest[0], dest[1], dest[2]), @@ -1066,6 +1069,7 @@ static void splashOutBlendSaturation(SplashColorPtr src, SplashColorPtr dest, break; case splashModeXBGR8: src[3] = 255; + // fallthrough case splashModeRGB8: case splashModeBGR8: setSat(dest[0], dest[1], dest[2], getSat(src[0], src[1], src[2]), @@ -1113,6 +1117,7 @@ static void splashOutBlendColor(SplashColorPtr src, SplashColorPtr dest, break; case splashModeXBGR8: src[3] = 255; + // fallthrough case splashModeRGB8: case splashModeBGR8: setLum(src[0], src[1], src[2], getLum(dest[0], dest[1], dest[2]), @@ -1157,6 +1162,7 @@ static void splashOutBlendLuminosity(SplashColorPtr src, SplashColorPtr dest, break; case splashModeXBGR8: src[3] = 255; + // fallthrough case splashModeRGB8: case splashModeBGR8: setLum(dest[0], dest[1], dest[2], getLum(src[0], src[1], src[2]), @@ -1570,6 +1576,7 @@ void SplashOutputDev::startPage(int pageNum, GfxState *state, XRef *xrefA) { break; case splashModeXBGR8: color[3] = 255; + // fallthrough case splashModeRGB8: case splashModeBGR8: color[0] = color[1] = color[2] = 0; @@ -2716,7 +2723,11 @@ void SplashOutputDev::endType3Char(GfxState *state) { } void SplashOutputDev::type3D0(GfxState *state, double wx, double wy) { - t3GlyphStack->haveDx = gTrue; + if (likely(t3GlyphStack != nullptr)) { + t3GlyphStack->haveDx = gTrue; + } else { + error(errSyntaxWarning, -1, "t3GlyphStack was null in SplashOutputDev::type3D0"); + } } void SplashOutputDev::type3D1(GfxState *state, double wx, double wy, @@ -4424,6 +4435,7 @@ void SplashOutputDev::setSoftMask(GfxState *state, double *bbox, break; case splashModeXBGR8: color[3] = 255; + // fallthrough case splashModeRGB8: case splashModeBGR8: transpGroupStack->blendingColorSpace->getRGB(backdropColor, &rgb); diff --git a/source/libs/poppler/poppler-src/poppler/Stream.cc b/source/libs/poppler/poppler-src/poppler/Stream.cc index f4eda85b3..0ad602c79 100644 --- a/source/libs/poppler/poppler-src/poppler/Stream.cc +++ b/source/libs/poppler/poppler-src/poppler/Stream.cc @@ -454,11 +454,10 @@ ImageStream::ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA) { } else { imgLineSize = nVals; } - if (width > INT_MAX / nComps) { - // force a call to gmallocn(-1,...), which will throw an exception + if (nComps <= 0 || width > INT_MAX / nComps) { imgLineSize = -1; } - imgLine = (Guchar *)gmallocn(imgLineSize, sizeof(Guchar)); + imgLine = (Guchar *)gmallocn_checkoverflow(imgLineSize, sizeof(Guchar)); } imgIdx = nVals; } diff --git a/source/libs/poppler/poppler-src/poppler/Stream.h b/source/libs/poppler/poppler-src/poppler/Stream.h index 4f83275d3..c2c48111c 100644 --- a/source/libs/poppler/poppler-src/poppler/Stream.h +++ b/source/libs/poppler/poppler-src/poppler/Stream.h @@ -284,7 +284,7 @@ public: void put (char c) override; - void printf (const char *format, ...) override; + void printf (const char *format, ...) override GCC_PRINTF_FORMAT(2,3); private: FILE *f; Goffset start; diff --git a/source/libs/poppler/poppler-src/poppler/StructElement.cc b/source/libs/poppler/poppler-src/poppler/StructElement.cc index 0fbd336a6..629254743 100644 --- a/source/libs/poppler/poppler-src/poppler/StructElement.cc +++ b/source/libs/poppler/poppler-src/poppler/StructElement.cc @@ -226,13 +226,13 @@ static GBool isTextString(Object *value) 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); +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 @@ -248,6 +248,8 @@ struct AttributeMapEntry { }; struct AttributeDefaults { + AttributeDefaults() {}; // needed to support old clang + Object Inline = Object(objName, "Inline"); Object LrTb = Object(objName, "LrTb"); Object Normal = Object(objName, "Normal"); diff --git a/source/libs/poppler/poppler-src/poppler/TextOutputDev.cc b/source/libs/poppler/poppler-src/poppler/TextOutputDev.cc index a89ba23cd..d30874cf3 100644 --- a/source/libs/poppler/poppler-src/poppler/TextOutputDev.cc +++ b/source/libs/poppler/poppler-src/poppler/TextOutputDev.cc @@ -565,7 +565,7 @@ static struct CombiningTable combiningTable[] = { }; // returning combining versions of characters -Unicode getCombiningChar(Unicode u) { +static Unicode getCombiningChar(Unicode u) { int len = sizeof(combiningTable) / sizeof(combiningTable[0]); for (int i = 0; i < len; ++i) { if (u == combiningTable[i].base) diff --git a/source/libs/poppler/poppler-src/poppler/UnicodeMap.cc b/source/libs/poppler/poppler-src/poppler/UnicodeMap.cc index 131966677..15d9a81e6 100644 --- a/source/libs/poppler/poppler-src/poppler/UnicodeMap.cc +++ b/source/libs/poppler/poppler-src/poppler/UnicodeMap.cc @@ -14,6 +14,7 @@ // under GPL version 2 or later // // Copyright (C) 2010 Jakub Wilk <jwilk@jwilk.net> +// Copyright (C) 2017 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 @@ -55,7 +56,7 @@ UnicodeMap *UnicodeMap::parse(GooString *encodingNameA) { UnicodeMapExt *eMap; int size, eMapsSize; char buf[256]; - int line, nBytes, i, x; + int line, nBytes, i; char *tok1, *tok2, *tok3; char *tokptr; @@ -102,6 +103,7 @@ UnicodeMap *UnicodeMap::parse(GooString *encodingNameA) { eMap = &map->eMaps[map->eMapsLen]; sscanf(tok1, "%x", &eMap->u); for (i = 0; i < nBytes; ++i) { + unsigned int x; sscanf(tok3 + i*2, "%2x", &x); eMap->code[i] = (char)x; } diff --git a/source/libs/poppler/poppler-src/poppler/XRef.cc b/source/libs/poppler/poppler-src/poppler/XRef.cc index eca2dc708..f3b88ec0e 100644 --- a/source/libs/poppler/poppler-src/poppler/XRef.cc +++ b/source/libs/poppler/poppler-src/poppler/XRef.cc @@ -1526,6 +1526,9 @@ GBool XRef::parseEntry(Goffset offset, XRefEntry *entry) { GBool r; + if (unlikely(entry == nullptr)) + return gFalse; + Parser parser(NULL, new Lexer(NULL, str->makeSubStream(offset, gFalse, 20, Object(objNull))), gTrue); diff --git a/source/libs/poppler/poppler-src/poppler/poppler-config.h.in b/source/libs/poppler/poppler-src/poppler/poppler-config.h.in index 0d0aa9e52..142f6df87 100644 --- a/source/libs/poppler/poppler-src/poppler/poppler-config.h.in +++ b/source/libs/poppler/poppler-src/poppler/poppler-config.h.in @@ -34,7 +34,7 @@ /* Defines the poppler version. */ #ifndef POPPLER_VERSION -#undef POPPLER_VERSION +#define POPPLER_VERSION "${POPPLER_VERSION}" #endif /* Enable multithreading support. */ @@ -82,9 +82,9 @@ #undef ENABLE_LIBPNG #endif -/* Use zlib instead of builtin zlib decoder for uncompressing flate streams. */ -#ifndef ENABLE_ZLIB_UNCOMPRESS -#undef ENABLE_ZLIB_UNCOMPRESS +/* 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'. diff --git a/source/libs/poppler/poppler-src/splash/Makefile.am b/source/libs/poppler/poppler-src/splash/Makefile.am deleted file mode 100644 index 5c265d636..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/Splash.cc b/source/libs/poppler/poppler-src/splash/Splash.cc deleted file mode 100644 index 46b8ce292..000000000 --- a/source/libs/poppler/poppler-src/splash/Splash.cc +++ /dev/null @@ -1,6477 +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-2016 Albert Astals Cid <aacid@kde.org> -// Copyright (C) 2005 Marco Pesenti Gritti <mpg@redhat.com> -// Copyright (C) 2010-2016 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; - 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 = (state->multiplyPatternAlpha) ? alpha * state->patternStrokeAlpha : alpha; -} - -void Splash::setFillAlpha(SplashCoord alpha) { - state->fillAlpha = (state->multiplyPatternAlpha) ? alpha * state->patternFillAlpha : alpha; -} - -void Splash::setPatternAlpha(SplashCoord strokeAlpha, SplashCoord fillAlpha) { - state->patternStrokeAlpha = strokeAlpha; - state->patternFillAlpha = fillAlpha; - state->multiplyPatternAlpha = gTrue; -} - -void Splash::clearPatternAlpha() { - state->patternStrokeAlpha = 1; - state->patternFillAlpha = 1; - state->multiplyPatternAlpha = gFalse; -} - -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; - if (likely(bitmapOff >= 0)) { - 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 { - if (!bDirectBlit) { - delete blitTarget; - } - 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, hasangle; - 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); - hasangle = crossprod != 0 || dx * dxNext < 0 || dy * dyNext < 0; - 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 (hasangle && 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 if (hasangle) { - 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/source/libs/poppler/poppler-src/splash/Splash.h b/source/libs/poppler/poppler-src/splash/Splash.h deleted file mode 100644 index 3ca15c38b..000000000 --- a/source/libs/poppler/poppler-src/splash/Splash.h +++ /dev/null @@ -1,431 +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 setPatternAlpha(SplashCoord strokeAlpha, SplashCoord fillAlpha); - void clearPatternAlpha(); - 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/source/libs/poppler/poppler-src/splash/SplashBitmap.cc b/source/libs/poppler/poppler-src/splash/SplashBitmap.cc deleted file mode 100644 index 060a858ee..000000000 --- a/source/libs/poppler/poppler-src/splash/SplashBitmap.cc +++ /dev/null @@ -1,853 +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, 2017 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> -// Copyright (C) 2016 Kenji Uno <ku@digitaldolphins.jp> -// -// To see a description of the changes please see the Changelog file that -// came with your tarball or type make ChangeLog if you are building from git -// -//======================================================================== - -#include <config.h> - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include <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, WriteImgParams* params) { - FILE *f; - SplashError e; - - if (!(f = fopen(fileName, "wb"))) { - return splashErrOpenFile; - } - - e = writeImgFile(format, f, hDPI, vDPI, params); - - fclose(f); - return e; -} - -void SplashBitmap::setJpegParams(ImgWriter *writer, WriteImgParams* params) -{ -#ifdef ENABLE_LIBJPEG - if (params) { - static_cast<JpegWriter*>(writer)->setProgressive(params->jpegProgressive); - if (params->jpegQuality >= 0) - static_cast<JpegWriter*>(writer)->setQuality(params->jpegQuality); - } -#endif -} - -SplashError SplashBitmap::writeImgFile(SplashImageFileFormat format, FILE *f, int hDPI, int vDPI, WriteImgParams* params) { - ImgWriter *writer; - SplashError e; - - SplashColorMode imageWriterFormat = splashModeRGB8; - - 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); - setJpegParams(writer, params); - break; - #endif - case splashFormatJpeg: - writer = new JpegWriter(); - setJpegParams(writer, params); - break; - #endif - - #ifdef ENABLE_LIBTIFF - case splashFormatTiff: - switch (mode) { - case splashModeMono1: - writer = new TiffWriter(TiffWriter::MONOCHROME); - imageWriterFormat = splashModeMono1; - break; - case splashModeMono8: - writer = new TiffWriter(TiffWriter::GRAY); - imageWriterFormat = splashModeMono8; - 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 && params) { - ((TiffWriter *)writer)->setCompressionString(params->tiffCompression.getCString()); - } - 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, imageWriterFormat); - 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, SplashColorMode imageWriterFormat) { - 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: - { - if (imageWriterFormat == splashModeMono8) { - 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 if (imageWriterFormat == splashModeRGB8) { - 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; - } - else { - // only splashModeMono8 or splashModeRGB8 - return splashErrGeneric; - } - } - break; - - case splashModeMono1: - { - if (imageWriterFormat == splashModeMono1) { - 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 if (imageWriterFormat == splashModeRGB8) { - 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; - } - else { - // only splashModeMono1 or splashModeRGB8 - return splashErrGeneric; - } - } - break; - - default: - // can't happen - break; - } - - if (!writer->close()) { - return splashErrGeneric; - } - - return splashOk; -} diff --git a/source/libs/poppler/poppler-src/splash/SplashBitmap.h b/source/libs/poppler/poppler-src/splash/SplashBitmap.h deleted file mode 100644 index deb65c120..000000000 --- a/source/libs/poppler/poppler-src/splash/SplashBitmap.h +++ /dev/null @@ -1,126 +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, 2017 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> -// Copyright (C) 2016 Kenji Uno <ku@digitaldolphins.jp> -// -// To see a description of the changes please see the Changelog file that -// came with your tarball or type make ChangeLog if you are building from git -// -//======================================================================== - -#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); - - struct WriteImgParams - { - int jpegQuality = -1; - GBool jpegProgressive = gFalse; - GooString tiffCompression; - }; - - SplashError writeImgFile(SplashImageFileFormat format, char *fileName, int hDPI, int vDPI, WriteImgParams* params = nullptr); - SplashError writeImgFile(SplashImageFileFormat format, FILE *f, int hDPI, int vDPI, WriteImgParams* params = nullptr); - SplashError writeImgFile(ImgWriter *writer, FILE *f, int hDPI, int vDPI, SplashColorMode imageWriterFormat); - - 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; - - void setJpegParams(ImgWriter *writer, WriteImgParams* params); -}; - -#endif diff --git a/source/libs/poppler/poppler-src/splash/SplashClip.cc b/source/libs/poppler/poppler-src/splash/SplashClip.cc deleted file mode 100644 index 85c6b1147..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashClip.h b/source/libs/poppler/poppler-src/splash/SplashClip.h deleted file mode 100644 index 5c0fdba99..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashErrorCodes.h b/source/libs/poppler/poppler-src/splash/SplashErrorCodes.h deleted file mode 100644 index d1f81f85d..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFTFont.cc b/source/libs/poppler/poppler-src/splash/SplashFTFont.cc deleted file mode 100644 index b785826d6..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFTFont.h b/source/libs/poppler/poppler-src/splash/SplashFTFont.h deleted file mode 100644 index 7d5c1e32b..000000000 --- a/source/libs/poppler/poppler-src/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. - GBool getGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) override; - - // Rasterize a glyph. The <xFrac> and <yFrac> values are the same - // as described for getGlyph. - GBool makeGlyph(int c, int xFrac, int yFrac, - SplashGlyphBitmap *bitmap, int x0, int y0, SplashClip *clip, SplashClipResult *clipRes) override; - - // Return the path for a glyph. - SplashPath *getGlyphPath(int c) override; - - // Return the advance of a glyph. (in 0..1 range) - double getGlyphAdvance(int c) override; - -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/source/libs/poppler/poppler-src/splash/SplashFTFontEngine.cc b/source/libs/poppler/poppler-src/splash/SplashFTFontEngine.cc deleted file mode 100644 index 9fef8f007..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFTFontEngine.h b/source/libs/poppler/poppler-src/splash/SplashFTFontEngine.h deleted file mode 100644 index 11bbea74a..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFTFontFile.cc b/source/libs/poppler/poppler-src/splash/SplashFTFontFile.cc deleted file mode 100644 index f0dcf5038..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFTFontFile.h b/source/libs/poppler/poppler-src/splash/SplashFTFontFile.h deleted file mode 100644 index 7a7bb218e..000000000 --- a/source/libs/poppler/poppler-src/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); - - ~SplashFTFontFile(); - - // Create a new SplashFTFont, i.e., a scaled instance of this font - // file. - SplashFont *makeFont(SplashCoord *mat, - SplashCoord *textMat) override; - -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/source/libs/poppler/poppler-src/splash/SplashFont.cc b/source/libs/poppler/poppler-src/splash/SplashFont.cc deleted file mode 100644 index 3d6d6b234..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFont.h b/source/libs/poppler/poppler-src/splash/SplashFont.h deleted file mode 100644 index 78b00d2dc..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFontEngine.cc b/source/libs/poppler/poppler-src/splash/SplashFontEngine.cc deleted file mode 100644 index 73ef8de08..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFontEngine.h b/source/libs/poppler/poppler-src/splash/SplashFontEngine.h deleted file mode 100644 index 6502ea5a7..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFontFile.cc b/source/libs/poppler/poppler-src/splash/SplashFontFile.cc deleted file mode 100644 index 68e8608b6..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFontFile.h b/source/libs/poppler/poppler-src/splash/SplashFontFile.h deleted file mode 100644 index ec87504b9..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFontFileID.cc b/source/libs/poppler/poppler-src/splash/SplashFontFileID.cc deleted file mode 100644 index a66dabf61..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashFontFileID.h b/source/libs/poppler/poppler-src/splash/SplashFontFileID.h deleted file mode 100644 index cfd89ebb5..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashGlyphBitmap.h b/source/libs/poppler/poppler-src/splash/SplashGlyphBitmap.h deleted file mode 100644 index c062c106e..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashMath.h b/source/libs/poppler/poppler-src/splash/SplashMath.h deleted file mode 100644 index ca73c2bd1..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashPath.cc b/source/libs/poppler/poppler-src/splash/SplashPath.cc deleted file mode 100644 index bc4ccd524..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashPath.h b/source/libs/poppler/poppler-src/splash/SplashPath.h deleted file mode 100644 index 81273c613..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashPattern.cc b/source/libs/poppler/poppler-src/splash/SplashPattern.cc deleted file mode 100644 index 28ca49958..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashPattern.h b/source/libs/poppler/poppler-src/splash/SplashPattern.h deleted file mode 100644 index 1e2881c81..000000000 --- a/source/libs/poppler/poppler-src/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); - - SplashPattern *copy() override { return new SplashSolidColor(color); } - - ~SplashSolidColor(); - - GBool getColor(int x, int y, SplashColorPtr c) override; - - GBool testPosition(int x, int y) override { return gFalse; } - - GBool isStatic() override { return gTrue; } - - GBool isCMYK() override { 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/source/libs/poppler/poppler-src/splash/SplashScreen.cc b/source/libs/poppler/poppler-src/splash/SplashScreen.cc deleted file mode 100644 index 28b1e7997..000000000 --- a/source/libs/poppler/poppler-src/splash/SplashScreen.cc +++ /dev/null @@ -1,390 +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, 2016 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 "goo/GooLikely.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)); - if (likely(mat != NULL)) { - memcpy(mat, screen->mat, size * size * sizeof(Guchar)); - } - minVal = screen->minVal; - maxVal = screen->maxVal; -} - -SplashScreen::~SplashScreen() { - gfree(mat); -} diff --git a/source/libs/poppler/poppler-src/splash/SplashScreen.h b/source/libs/poppler/poppler-src/splash/SplashScreen.h deleted file mode 100644 index a7fc45591..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashState.cc b/source/libs/poppler/poppler-src/splash/SplashState.cc deleted file mode 100644 index f0c98c5ef..000000000 --- a/source/libs/poppler/poppler-src/splash/SplashState.cc +++ /dev/null @@ -1,272 +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, 2015 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; - multiplyPatternAlpha = gFalse; - patternStrokeAlpha = 1; - patternFillAlpha = 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; - multiplyPatternAlpha = gFalse; - patternStrokeAlpha = 1; - patternFillAlpha = 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; - multiplyPatternAlpha = state->multiplyPatternAlpha; - patternStrokeAlpha = state->patternStrokeAlpha; - patternFillAlpha = state->patternFillAlpha; - 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/source/libs/poppler/poppler-src/splash/SplashState.h b/source/libs/poppler/poppler-src/splash/SplashState.h deleted file mode 100644 index fea760350..000000000 --- a/source/libs/poppler/poppler-src/splash/SplashState.h +++ /dev/null @@ -1,142 +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, 2015 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; - GBool multiplyPatternAlpha; - SplashCoord patternStrokeAlpha; - SplashCoord patternFillAlpha; - 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/source/libs/poppler/poppler-src/splash/SplashT1Font.cc b/source/libs/poppler/poppler-src/splash/SplashT1Font.cc deleted file mode 100644 index 0fdfaaf51..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashT1Font.h b/source/libs/poppler/poppler-src/splash/SplashT1Font.h deleted file mode 100644 index 1dbe66cd7..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashT1FontEngine.cc b/source/libs/poppler/poppler-src/splash/SplashT1FontEngine.cc deleted file mode 100644 index fb4b38dae..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashT1FontEngine.h b/source/libs/poppler/poppler-src/splash/SplashT1FontEngine.h deleted file mode 100644 index 268a01479..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashT1FontFile.cc b/source/libs/poppler/poppler-src/splash/SplashT1FontFile.cc deleted file mode 100644 index 1832a916d..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashT1FontFile.h b/source/libs/poppler/poppler-src/splash/SplashT1FontFile.h deleted file mode 100644 index c094b6d8b..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashXPath.cc b/source/libs/poppler/poppler-src/splash/SplashXPath.cc deleted file mode 100644 index 27106ee3d..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashXPath.h b/source/libs/poppler/poppler-src/splash/SplashXPath.h deleted file mode 100644 index 1c7040daa..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashXPathScanner.cc b/source/libs/poppler/poppler-src/splash/SplashXPathScanner.cc deleted file mode 100644 index ac47881cb..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/poppler-src/splash/SplashXPathScanner.h b/source/libs/poppler/poppler-src/splash/SplashXPathScanner.h deleted file mode 100644 index cc295cb68..000000000 --- a/source/libs/poppler/poppler-src/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/source/libs/poppler/version.ac b/source/libs/poppler/version.ac index 678ff6080..6f38baf5d 100644 --- a/source/libs/poppler/version.ac +++ b/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.59.0]) +m4_define([poppler_version], [0.60.0]) diff --git a/source/texk/web2c/luatexdir/font/writefont.w b/source/texk/web2c/luatexdir/font/writefont.w index 1cbe42cdb..2ba81d617 100644 --- a/source/texk/web2c/luatexdir/font/writefont.w +++ b/source/texk/web2c/luatexdir/font/writefont.w @@ -578,7 +578,7 @@ static void write_fontdescriptor(PDF pdf, fd_entry * fd) assert(0); } } - if ((! pdf->omit_cidset) && (cidset != 0)) { + if ((! pdf->omit_cidset) && (pdf->major_version == 1) && (cidset != 0) ) { pdf_dict_add_ref(pdf, "CIDSet", cidset); } /* diff --git a/source/texk/web2c/luatexdir/font/writetype2.w b/source/texk/web2c/luatexdir/font/writetype2.w index dc1821c5e..81aefb1fb 100644 --- a/source/texk/web2c/luatexdir/font/writetype2.w +++ b/source/texk/web2c/luatexdir/font/writetype2.w @@ -387,24 +387,26 @@ boolean make_tt_subset(PDF pdf, fd_entry * fd, unsigned char *buff, int buflen) /* CIDSet: a table of bits indexed by cid, bytes with high order bit first, each (set) bit is a (present) CID. */ if (is_subsetted(fd->fm)) { - cidset = pdf_create_obj(pdf, obj_type_others, 0); - if (cidset != 0) { - size_t l = (last_cid / 8) + 1; - char *stream = xmalloc(l); - memset(stream, 0, l); - for (cid = 1; cid <= (long) last_cid; cid++) { - if (used_chars[cid]) { - stream[(cid / 8)] |= (1 << (7 - (cid % 8))); + if ((! pdf->omit_cidset) && (pdf->major_version == 1)) { + cidset = pdf_create_obj(pdf, obj_type_others, 0); + if (cidset != 0) { + size_t l = (last_cid / 8) + 1; + char *stream = xmalloc(l); + memset(stream, 0, l); + for (cid = 1; cid <= (long) last_cid; cid++) { + if (used_chars[cid]) { + stream[(cid / 8)] |= (1 << (7 - (cid % 8))); + } } + pdf_begin_obj(pdf, cidset, OBJSTM_NEVER); + pdf_begin_dict(pdf); + pdf_dict_add_streaminfo(pdf); + pdf_end_dict(pdf); + pdf_begin_stream(pdf); + pdf_out_block(pdf, stream, l); + pdf_end_stream(pdf); + pdf_end_obj(pdf); } - pdf_begin_obj(pdf, cidset, OBJSTM_NEVER); - pdf_begin_dict(pdf); - pdf_dict_add_streaminfo(pdf); - pdf_end_dict(pdf); - pdf_begin_stream(pdf); - pdf_out_block(pdf, stream, l); - pdf_end_stream(pdf); - pdf_end_obj(pdf); } } diff --git a/source/texk/web2c/luatexdir/image/image.h b/source/texk/web2c/luatexdir/image/image.h index 2ff07d448..7c79723f1 100644 --- a/source/texk/web2c/luatexdir/image/image.h +++ b/source/texk/web2c/luatexdir/image/image.h @@ -126,6 +126,7 @@ typedef struct { int luaref ; boolean keepopen; int errorlevel; + int pdfmajorversion; int pdfminorversion; union { pdf_stream_struct *pdfstream; @@ -171,6 +172,7 @@ typedef struct { # define img_luaref(N) ((N)->luaref) # define img_keepopen(N) ((N)->keepopen) # define img_errorlevel(N) ((N)->errorlevel) +# define img_pdfmajorversion(N) ((N)->pdfmajorversion) # define img_pdfminorversion(N) ((N)->pdfminorversion) # define img_pdfstream_ptr(N) ((N)->img_struct.pdfstream) diff --git a/source/texk/web2c/luatexdir/image/pdftoepdf.w b/source/texk/web2c/luatexdir/image/pdftoepdf.w index c60cd7d77..09dcd2515 100644 --- a/source/texk/web2c/luatexdir/image/pdftoepdf.w +++ b/source/texk/web2c/luatexdir/image/pdftoepdf.w @@ -27,7 +27,7 @@ /* This file is mostly C and not very much C++; it's just used to interface the functions of poppler, which happens to be written in C++. - Patches for the new poppler 0.59 from + Patches for the new poppler 0.59 from https://www.mail-archive.com/arch-commits@archlinux.org/msg357548.html with some modifications to comply the poppler API. @@ -597,7 +597,7 @@ void read_pdf_info(image_dict * idict) pdf_doc = refPdfDocument(img_filepath(idict), FE_FAIL); else if (img_type(idict) == IMG_TYPE_PDFMEMSTREAM) { pdf_doc = findPdfDocument(img_filepath(idict)) ; - if (pdf_doc == NULL ) + if (pdf_doc == NULL ) normal_error("pdf inclusion", "memstream not initialized"); if (pdf_doc->doc == NULL) normal_error("pdf inclusion", "memstream document is empty"); @@ -614,12 +614,12 @@ void read_pdf_info(image_dict * idict) */ pdf_major_version_found = doc->getPDFMajorVersion(); pdf_minor_version_found = doc->getPDFMinorVersion(); - if ((pdf_major_version_found > 1) || (pdf_minor_version_found > img_pdfminorversion(idict))) { - const char *msg = "PDF inclusion: found PDF version '%d.%d', but at most version '1.%d' allowed"; + if ((100 * pdf_major_version_found + pdf_major_version_found) > (100 * img_pdfmajorversion(idict) + img_pdfminorversion(idict))) { + const char *msg = "PDF inclusion: found PDF version '%d.%d', but at most version '%d.%d' allowed"; if (img_errorlevel(idict) > 0) { - formatted_error("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfminorversion(idict)); + formatted_error("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfmajorversion(idict), img_pdfminorversion(idict)); } else { - formatted_warning("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfminorversion(idict)); + formatted_warning("pdf inclusion",msg, pdf_major_version_found, pdf_minor_version_found, img_pdfmajorversion(idict), img_pdfminorversion(idict)); } } img_totalpages(idict) = catalog->getNumPages(); diff --git a/source/texk/web2c/luatexdir/image/writeimg.w b/source/texk/web2c/luatexdir/image/writeimg.w index 0944509c0..95e1ec304 100644 --- a/source/texk/web2c/luatexdir/image/writeimg.w +++ b/source/texk/web2c/luatexdir/image/writeimg.w @@ -100,7 +100,7 @@ that a type has been found. #define HEADER_PNG "\x89PNG\r\n\x1A\n" #define HEADER_JBIG2 "\x97\x4A\x42\x32\x0D\x0A\x1A\x0A" #define HEADER_JP2 "\x6A\x50\x20\x20" -#define HEADER_PDF "%PDF-1." +#define HEADER_PDF "%PDF-" #define MAX_HEADER (sizeof(HEADER_PNG)-1) #define HEADER_PDF_MEMSTREAM "data:application/pdf," /* see epdf.h */ #define LEN_PDF_MEMSTREAM 21 /* see epdf.h */ @@ -217,7 +217,8 @@ image_dict *new_image_dict(void) img_index(p) = -1; /* -1 = unused, used count from 0 */ img_luaref(p) = 0; img_errorlevel(p) = pdf_inclusion_errorlevel; - fix_pdf_minorversion(static_pdf); + fix_pdf_version(static_pdf); + img_pdfmajorversion(p) = pdf_major_version; img_pdfminorversion(p) = pdf_minor_version; return p; } diff --git a/source/texk/web2c/luatexdir/image/writejbig2.w b/source/texk/web2c/luatexdir/image/writejbig2.w index d1ed0a408..a58313ce8 100644 --- a/source/texk/web2c/luatexdir/image/writejbig2.w +++ b/source/texk/web2c/luatexdir/image/writejbig2.w @@ -762,7 +762,7 @@ static void wr_jbig2(PDF pdf, image_dict * idict, FILEINFO * fip, @ @c boolean supported_jbig2(image_dict * idict) { - if (img_pdfminorversion(idict) < 4) { + if (img_pdfmajorversion(idict) < 2 && img_pdfminorversion(idict) < 4) { normal_error("readjbig2","you need to generate at least PDF 1.4"); return false; } else { diff --git a/source/texk/web2c/luatexdir/image/writejpg.w b/source/texk/web2c/luatexdir/image/writejpg.w index 7d463b773..54ed47f0f 100644 --- a/source/texk/web2c/luatexdir/image/writejpg.w +++ b/source/texk/web2c/luatexdir/image/writejpg.w @@ -132,9 +132,9 @@ static unsigned int read_exif_bytes(unsigned char **p, int n, int b) XResolution, YResolution and ResolutionUnit (tag 282, 283 and 296) as well as PixelPerUnitX, PixelPerUnitY and PixelUnit (tag 0x5111, 0x5112 and 0x5110). Tags 282, 293 and 296 have the priority, -with ResolutionUnit set to inch by default, then +with ResolutionUnit set to inch by default, then tag 0x5110, 0x5111 and 0x5112, where the only valid value for PixelUnit is 0.0254, -and finally the given value xx and yy, +and finally the given value xx and yy, choosen if the Exif x and y resolution are not strictly positive. @@ -256,7 +256,7 @@ static void read_APP1_Exif (FILE *fp, unsigned short length, int *xx, int *yy, i res_unit_ms = 0.0254; /* Unit is meter */ break; default: - res_unit_ms = 0; + res_unit_ms = 0; } case 0x5111: /* PixelPerUnitX */ found_x_ms = true ; @@ -269,13 +269,13 @@ static void read_APP1_Exif (FILE *fp, unsigned short length, int *xx, int *yy, i } - } + } if (found_x && found_y && res_unit>0) { - found_res = true; + found_res = true; tempx = (int)(xres * res_unit+0.5); tempy = (int)(yres * res_unit+0.5); } else if (found_x_ms && found_y_ms && res_unit_ms==0.0254) { - found_res = true; + found_res = true; tempx = (int)(xres_ms * res_unit_ms+0.5); tempy = (int)(yres_ms * res_unit_ms+0.5); } @@ -394,7 +394,7 @@ void read_jpg_info(image_dict * idict) formatted_error("readjpg","unsupported compression SOF_%d", i - M_SOF0); break; case M_SOF2: - if (img_pdfminorversion(idict) <= 2) { + if (img_pdfmajorversion(idict) < 2 && img_pdfminorversion(idict) <= 2) { normal_error("readjpg","progressive DCT with PDF-1.2 is not permitted"); } case M_SOF0: diff --git a/source/texk/web2c/luatexdir/lua/lpdflib.c b/source/texk/web2c/luatexdir/lua/lpdflib.c index f20604ead..88f9eac7c 100644 --- a/source/texk/web2c/luatexdir/lua/lpdflib.c +++ b/source/texk/web2c/luatexdir/lua/lpdflib.c @@ -949,6 +949,25 @@ static int getpdfcreationdate(lua_State * L) return 1 ; } +static int getpdfmajorversion(lua_State * L) +{ + /* lua_pushinteger(L,static_pdf->major_version); */ + lua_pushinteger(L,pdf_major_version); + return 1 ; +} + +static int setpdfmajorversion(lua_State * L) +{ + if (lua_type(L, 1) == LUA_TNUMBER) { + int c = (int) lua_tointeger(L, 1); + if ((c >= 1) && (c <= 2)) { + static_pdf->major_version = c; + set_pdf_major_version(c); + } + } + return 0 ; +} + static int getpdfminorversion(lua_State * L) { /* lua_pushinteger(L,static_pdf->minor_version); */ @@ -1199,6 +1218,8 @@ static const struct luaL_Reg pdflib[] = { { "xformname", getpdfxformname }, { "getversion", getpdfversion }, { "getcreationdate", getpdfcreationdate }, + { "getmajorversion", getpdfmajorversion }, + { "setmajorversion", setpdfmajorversion }, { "getminorversion", getpdfminorversion }, { "setminorversion", setpdfminorversion }, { "newcolorstack", newpdfcolorstack }, diff --git a/source/texk/web2c/luatexdir/lua/ltexlib.c b/source/texk/web2c/luatexdir/lua/ltexlib.c index f975dc90a..641bc578f 100644 --- a/source/texk/web2c/luatexdir/lua/ltexlib.c +++ b/source/texk/web2c/luatexdir/lua/ltexlib.c @@ -789,7 +789,7 @@ static int get_item_index(lua_State * L, int i, int base) static int gettex(lua_State * L); -#define get_item_index_plus(L, where, base, what, value, is_assign, get_register, glue) { \ +#define get_item_index_plus(L, where, base, what, value, is_assign, get_register, texget) { \ size_t len; \ const char *str; \ int key, cs; \ @@ -804,7 +804,7 @@ static int gettex(lua_State * L); if (key >= 0 && key <= 65535) { \ value = get_register(key); \ } else if (is_assign(eq_type(cs))) { \ - gettex(L); /* lazy */ \ + texget = gettex(L); /* lazy */ \ } else { \ luaL_error(L, "incorrect %s name", what); \ } \ @@ -849,7 +849,11 @@ static int setdimen(lua_State * L) static int getdimen(lua_State * L) { int value = 0; - get_item_index_plus(L, lua_gettop(L), scaled_base, "dimen", value, is_dim_assign, get_tex_dimen_register, false); + int texget = 0; + get_item_index_plus(L, lua_gettop(L), scaled_base, "dimen", value, is_dim_assign, get_tex_dimen_register, texget); + if (texget > 0) { + return texget; + } lua_pushinteger(L, value); return 1; } @@ -877,7 +881,11 @@ static int setskip(lua_State * L) static int getskip(lua_State * L) { int value = 0; - get_item_index_plus(L, lua_gettop(L), skip_base, "skip", value, is_glue_assign, get_tex_skip_register, true); + int texget = 0; + get_item_index_plus(L, lua_gettop(L), skip_base, "skip", value, is_glue_assign, get_tex_skip_register, texget); + if (texget > 0) { + return texget; + } if (value == null) { lua_nodelib_push_fast(L, copy_node(zero_glue)); } else { @@ -910,22 +918,47 @@ static int setglue(lua_State * L) static int getglue(lua_State * L) { int value = 0; + int texget = 0; int top = lua_gettop(L); - get_item_index_plus(L, top, skip_base, "skip", value, is_glue_assign, get_tex_skip_register, true); - if (value == null) { - lua_pushinteger(L,0); - lua_pushinteger(L,0); - lua_pushinteger(L,0); - lua_pushinteger(L,0); - lua_pushinteger(L,0); + int dim = -1; + if (top > 1 && lua_type(L,top) == LUA_TBOOLEAN) { + dim = lua_toboolean(L,top); + top = top - 1; } else { - lua_pushinteger(L,width(value)); - lua_pushinteger(L,stretch(value)); - lua_pushinteger(L,shrink(value)); - lua_pushinteger(L,stretch_order(value)); - lua_pushinteger(L,shrink_order(value)); + lua_pushboolean(L,1); + dim = 1 ; + /* no top adaption. somewhat messy, but the gettex fallback checks itself */ + } + /* checks itself for the boolean */ + get_item_index_plus(L, top, skip_base, "glue", value, is_glue_assign, get_tex_skip_register, texget); + if (texget > 0) { + return texget; + } + if (dim == 0) { + /* false */ + if (value == null) { + lua_pushinteger(L,0); + } else { + lua_pushinteger(L,width(value)); + } + return 1; + } else { + /* true and nil */ + if (value == null) { + lua_pushinteger(L,0); + lua_pushinteger(L,0); + lua_pushinteger(L,0); + lua_pushinteger(L,0); + lua_pushinteger(L,0); + } else { + lua_pushinteger(L,width(value)); + lua_pushinteger(L,stretch(value)); + lua_pushinteger(L,shrink(value)); + lua_pushinteger(L,stretch_order(value)); + lua_pushinteger(L,shrink_order(value)); + } + return 5; } - return 5; } static int ismuskip(lua_State * L) @@ -947,7 +980,11 @@ static int setmuskip(lua_State * L) static int getmuskip(lua_State * L) { int value = 0; - get_item_index_plus(L, lua_gettop(L), mu_skip_base, "muskip", value, is_mu_glue_assign, get_tex_mu_skip_register, true); + int texget = 0; + get_item_index_plus(L, lua_gettop(L), mu_skip_base, "muskip", value, is_mu_glue_assign, get_tex_mu_skip_register, texget); + if (texget > 0) { + return texget; + } lua_nodelib_push_fast(L, copy_node(value)); return 1; } @@ -976,16 +1013,45 @@ static int setmuglue(lua_State * L) static int getmuglue(lua_State * L) { int value = 0; - get_item_index_plus(L, lua_gettop(L), mu_skip_base, "muskip", value, is_mu_glue_assign, get_tex_mu_skip_register, true); - if (value == null) { - lua_pushnil(L); - return 1; + int texget = 0; + int top = lua_gettop(L); + int dim = -1; + if (top > 1 && lua_type(L,top) == LUA_TBOOLEAN) { + dim = lua_toboolean(L,top); + top = top - 1; } else { - lua_pushinteger(L,width(value)); - lua_pushinteger(L,stretch(value)); - lua_pushinteger(L,shrink(value)); - lua_pushinteger(L,stretch_order(value)); - lua_pushinteger(L,shrink_order(value)); + lua_pushboolean(L,1); + dim = 1 ; + /* no top adaption. somewhat messy, but the gettex fallback checks itself */ + } + /* checks itself for the boolean */ + get_item_index_plus(L, top, mu_skip_base, "muskip", value, is_mu_glue_assign, get_tex_mu_skip_register, texget); + if (texget > 0) { + return texget; + } + if (dim == 0) { + /* false */ + if (value == null) { + lua_pushinteger(L,0); + } else { + lua_pushinteger(L,width(value)); + } + return 1; + } else { + /* true and nil */ + if (value == null) { + lua_pushinteger(L,0); + lua_pushinteger(L,0); + lua_pushinteger(L,0); + lua_pushinteger(L,0); + lua_pushinteger(L,0); + } else { + lua_pushinteger(L,width(value)); + lua_pushinteger(L,stretch(value)); + lua_pushinteger(L,shrink(value)); + lua_pushinteger(L,stretch_order(value)); + lua_pushinteger(L,shrink_order(value)); + } return 5; } } @@ -1015,7 +1081,11 @@ static int setcount(lua_State * L) static int getcount(lua_State * L) { int value = 0; - get_item_index_plus(L, lua_gettop(L), count_base, "count", value, is_int_assign, get_tex_count_register, false); + int texget = 0; + get_item_index_plus(L, lua_gettop(L), count_base, "count", value, is_int_assign, get_tex_count_register, texget); + if (texget > 0) { + return texget; + } lua_pushinteger(L, value); return 1; } @@ -1047,7 +1117,11 @@ static int setattribute(lua_State * L) static int getattribute(lua_State * L) { int value = 0; - get_item_index_plus(L, lua_gettop(L), attribute_base, "attribute", value, is_attr_assign, get_tex_attribute_register, false); + int texget = 0; + get_item_index_plus(L, lua_gettop(L), attribute_base, "attribute", value, is_attr_assign, get_tex_attribute_register, texget); + if (texget > 0) { + return texget; + } lua_pushinteger(L, value); return 1; } @@ -3041,6 +3115,7 @@ static int tex_save_box_resource(lua_State * L) int attributes = null; int resources = null; int type = 0; + int margin = pdf_xform_margin; boolean immediate = false; /* box attributes resources */ halfword boxnumber = lua_tointeger(L,1); @@ -3058,6 +3133,9 @@ static int tex_save_box_resource(lua_State * L) if (lua_type(L,5) == LUA_TNUMBER) { type = lua_tointeger(L, 5); } + if (lua_type(L,6) == LUA_TNUMBER) { + margin = lua_tointeger(L, 6); + } /* more or less same as scanner variant */ boxdata = box(boxnumber); if (boxdata == null) @@ -3074,6 +3152,7 @@ static int tex_save_box_resource(lua_State * L) set_obj_xform_height(static_pdf, index, height(boxdata)); set_obj_xform_depth(static_pdf, index, depth(boxdata)); set_obj_xform_type(static_pdf, index, type); + set_obj_xform_margin(static_pdf, index, margin); box(boxnumber) = null; last_saved_box_index = index; lua_pushinteger(L, index); @@ -3138,14 +3217,16 @@ static int tex_get_box_resource_dimensions(lua_State * L) lua_pushnil(L); lua_pushnil(L); lua_pushnil(L); + lua_pushnil(L); } else { index = lua_tointeger(L,1); check_obj_type(static_pdf, obj_type_xform, index); lua_pushinteger(L, (int) obj_xform_width(static_pdf, index)); lua_pushinteger(L, (int) obj_xform_height(static_pdf, index)); lua_pushinteger(L, (int) obj_xform_depth(static_pdf, index)); + lua_pushinteger(L, (int) obj_xform_margin(static_pdf, index)); } - return 3; + return 4; } static int tex_build_page(lua_State * L) diff --git a/source/texk/web2c/luatexdir/luapeg/lpeg.h b/source/texk/web2c/luatexdir/luapeg/lpeg.h index 280e3eaeb..9bc79ff74 100644 --- a/source/texk/web2c/luatexdir/luapeg/lpeg.h +++ b/source/texk/web2c/luatexdir/luapeg/lpeg.h @@ -13,7 +13,7 @@ #if !defined(lptypes_h) #define lptypes_h - +#define LPEG_DEBUG #if !defined(LPEG_DEBUG) #define NDEBUG #endif diff --git a/source/texk/web2c/luatexdir/luatex.c b/source/texk/web2c/luatexdir/luatex.c index 801906e8e..1d817b76d 100644 --- a/source/texk/web2c/luatexdir/luatex.c +++ b/source/texk/web2c/luatexdir/luatex.c @@ -33,8 +33,8 @@ */ int luatex_version = 106; -int luatex_revision = '1'; -const char *luatex_version_string = "1.06.1"; +int luatex_revision = '2'; +const char *luatex_version_string = "1.06.2"; const char *engine_name = my_name; #include <kpathsea/c-ctype.h> diff --git a/source/texk/web2c/luatexdir/luatex_svnversion.h b/source/texk/web2c/luatexdir/luatex_svnversion.h index 6ab2f3166..b4b5b28ca 100644 --- a/source/texk/web2c/luatexdir/luatex_svnversion.h +++ b/source/texk/web2c/luatexdir/luatex_svnversion.h @@ -1 +1 @@ -#define luatex_svn_revision 6409 +#define luatex_svn_revision 6420 diff --git a/source/texk/web2c/luatexdir/pdf/pdfgen.h b/source/texk/web2c/luatexdir/pdf/pdfgen.h index f2086663c..01b0e74cd 100644 --- a/source/texk/web2c/luatexdir/pdf/pdfgen.h +++ b/source/texk/web2c/luatexdir/pdf/pdfgen.h @@ -81,7 +81,7 @@ extern int ten_pow[10]; extern void pdf_flush(PDF); extern void pdf_room(PDF, int); -extern void fix_pdf_minorversion(PDF); +extern void fix_pdf_version(PDF); /* output a byte to PDF buffer without checking of overflow */ diff --git a/source/texk/web2c/luatexdir/pdf/pdfgen.w b/source/texk/web2c/luatexdir/pdf/pdfgen.w index 0137755a5..26b7112ed 100644 --- a/source/texk/web2c/luatexdir/pdf/pdfgen.w +++ b/source/texk/web2c/luatexdir/pdf/pdfgen.w @@ -190,6 +190,7 @@ PDF init_pdf_struct(PDF pdf) memset(pdf->obj_tab, 0, sizeof(obj_entry)); pdf->minor_version = -1; + pdf->major_version = -1; pdf->decimal_digits = 4; pdf->gamma = 65536; pdf->image_gamma = 65536; @@ -262,35 +263,43 @@ void fix_o_mode(void) } } -@ This ensures that |pdfminorversion| is set only before any bytes have been -written to the generated \.{PDF} file. Here also all variables for \.{PDF} output -are initialized, the \.{PDF} file is opened by |ensure_pdf_open|, and the \.{PDF} -header is written. +@ This ensures that |pdfmajorversion| and |pdfminorversion| are set only before any +bytes have been written to the generated \.{PDF} file. Here also all variables for +\.{PDF} output are initialized, the \.{PDF} file is opened by |ensure_pdf_open|, and +the \.{PDF} header is written. @c -void fix_pdf_minorversion(PDF pdf) -{ - if (pdf->minor_version < 0) { /* unset */ +void fix_pdf_version(PDF pdf) +{ + if (pdf->major_version < 0) { /* unset */ + if (pdf_major_version == 0) { + normal_warning("pdf backend","unset major version, using 1 instead"); + pdf->major_version = 1; + } else if ((pdf_major_version < 0) || (pdf_major_version > 2)) { + formatted_warning("pdf backend","illegal major version %d, using 1 instead",pdf_major_version); + pdf->major_version = 1; + } else { + pdf->major_version = pdf_major_version; + } + } else if (pdf->major_version != pdf_major_version) { + normal_warning("pdf backend", "the major version cannot be changed after data is written to the PDF file"); + } + if (pdf->minor_version < 0) { /* unset */ if ((pdf_minor_version < 0) || (pdf_minor_version > 9)) { - const char *hlp[] = { "The pdfminorversion must be between 0 and 9.", "I changed this to 4.", NULL }; - char msg[256]; - (void) snprintf(msg, 255, "LuaTeX error (illegal pdfminorversion %d)", (int) pdf_minor_version); - tex_error(msg, hlp); + formatted_warning("pdf backend","illegal minor version %d, using 4 instead",pdf_minor_version); pdf->minor_version = 4; } else { pdf->minor_version = pdf_minor_version; } - } else { - /* Check that variables for \.{PDF} output are unchanged */ - if (pdf->minor_version != pdf_minor_version) - normal_error("pdf backend", "minorversion cannot be changed after data is written to the PDF file"); + } else if (pdf->minor_version != pdf_minor_version) { + normal_warning("pdf backend", "minorversion cannot be changed after data is written to the PDF file"); } } static void fix_pdf_draftmode(PDF pdf) { if (pdf->draftmode != draft_mode_par) - normal_error("pdf backend", "draftmode cannot be changed after data is written to the PDF file"); + normal_warning("pdf backend", "draftmode cannot be changed after data is written to the PDF file"); if (pdf->draftmode != 0) { pdf->compress_level = 0; /* re-fix it, might have been changed inbetween */ pdf->objcompresslevel = 0; @@ -1027,11 +1036,11 @@ static void ensure_output_file_open(PDF pdf, const char *ext) static void ensure_pdf_header_written(PDF pdf) { /* Initialize variables for \.{PDF} output */ - fix_pdf_minorversion(pdf); + fix_pdf_version(pdf); init_pdf_outputparameters(pdf); fix_pdf_draftmode(pdf); /* Write \.{PDF} header */ - pdf_printf(pdf, "%%PDF-1.%d\n", pdf->minor_version); + pdf_printf(pdf, "%%PDF-%d.%d\n", pdf->major_version, pdf->minor_version); /* The next blob will be removed 1.0. */ pdf_out(pdf, '%'); pdf_out(pdf, 'P' + 128); @@ -1732,6 +1741,7 @@ void pdf_begin_page(PDF pdf) pdf_dict_add_int(pdf, "FormType", 1); } xform_attributes = pdf_xform_attr; /* lookup once */ + form_margin = obj_xform_margin(pdf, pdf_cur_form); /* now stored in object */ if (xform_attributes != null) pdf_print_toks(pdf, xform_attributes); if (obj_xform_attr(pdf, pdf_cur_form) != null) { @@ -2062,19 +2072,21 @@ void pdf_end_page(PDF pdf) pdf_end_dict(pdf); } /* Generate ProcSet */ - pdf_add_name(pdf, "ProcSet"); - pdf_begin_array(pdf); - if ((procset & PROCSET_PDF) != 0) - pdf_add_name(pdf, "PDF"); - if ((procset & PROCSET_TEXT) != 0) - pdf_add_name(pdf, "Text"); - if ((procset & PROCSET_IMAGE_B) != 0) - pdf_add_name(pdf, "ImageB"); - if ((procset & PROCSET_IMAGE_C) != 0) - pdf_add_name(pdf, "ImageC"); - if ((procset & PROCSET_IMAGE_I) != 0) - pdf_add_name(pdf, "ImageI"); - pdf_end_array(pdf); + if (pdf->major_version == 1) { + pdf_add_name(pdf, "ProcSet"); + pdf_begin_array(pdf); + if ((procset & PROCSET_PDF) != 0) + pdf_add_name(pdf, "PDF"); + if ((procset & PROCSET_TEXT) != 0) + pdf_add_name(pdf, "Text"); + if ((procset & PROCSET_IMAGE_B) != 0) + pdf_add_name(pdf, "ImageB"); + if ((procset & PROCSET_IMAGE_C) != 0) + pdf_add_name(pdf, "ImageC"); + if ((procset & PROCSET_IMAGE_I) != 0) + pdf_add_name(pdf, "ImageI"); + pdf_end_array(pdf); + } pdf_end_dict(pdf); pdf_end_obj(pdf); } diff --git a/source/texk/web2c/luatexdir/pdf/pdftables.h b/source/texk/web2c/luatexdir/pdf/pdftables.h index 9a14d65da..cfaab5df0 100644 --- a/source/texk/web2c/luatexdir/pdf/pdftables.h +++ b/source/texk/web2c/luatexdir/pdf/pdftables.h @@ -123,6 +123,7 @@ typedef enum { c_pdf_image_resolution, c_pdf_pk_resolution, c_pdf_unique_resname, + c_pdf_major_version, c_pdf_minor_version, c_pdf_pagebox, c_pdf_inclusion_errorlevel, @@ -170,6 +171,7 @@ extern int pdf_retval; # define pdf_image_resolution get_tex_extension_count_register(c_pdf_image_resolution) # define pdf_pk_resolution get_tex_extension_count_register(c_pdf_pk_resolution) # define pdf_unique_resname get_tex_extension_count_register(c_pdf_unique_resname) +# define pdf_major_version get_tex_extension_count_register(c_pdf_major_version) # define pdf_minor_version get_tex_extension_count_register(c_pdf_minor_version) # define pdf_pagebox get_tex_extension_count_register(c_pdf_pagebox) # define pdf_inclusion_errorlevel get_tex_extension_count_register(c_pdf_inclusion_errorlevel) @@ -200,6 +202,7 @@ extern int pdf_retval; # define pdf_pk_mode get_tex_extension_toks_register(t_pdf_pk_mode) # define pdf_trailer_id get_tex_extension_toks_register(t_pdf_trailer_id) +# define set_pdf_major_version(i) set_tex_extension_count_register(c_pdf_major_version,i) # define set_pdf_minor_version(i) set_tex_extension_count_register(c_pdf_minor_version,i) # define set_pdf_compress_level(i) set_tex_extension_count_register(c_pdf_compress_level,i) # define set_pdf_obj_compress_level(i) set_tex_extension_count_register(c_pdf_obj_compress_level,i) diff --git a/source/texk/web2c/luatexdir/pdf/pdftypes.h b/source/texk/web2c/luatexdir/pdf/pdftypes.h index 34153600d..c5f0393cc 100644 --- a/source/texk/web2c/luatexdir/pdf/pdftypes.h +++ b/source/texk/web2c/luatexdir/pdf/pdftypes.h @@ -293,6 +293,7 @@ typedef struct pdf_output_file_ { int gen_tounicode; int omit_cidset; int inclusion_copy_font; + int major_version; /* fixed major part of the PDF version */ int minor_version; /* fixed minor part of the PDF version */ int compress_level; /* level for zlib object stream compression */ int objcompresslevel; /* fixed level for activating PDF object streams */ diff --git a/source/texk/web2c/luatexdir/pdf/pdfxform.h b/source/texk/web2c/luatexdir/pdf/pdfxform.h index 64525d837..2d6441ff4 100644 --- a/source/texk/web2c/luatexdir/pdf/pdfxform.h +++ b/source/texk/web2c/luatexdir/pdf/pdfxform.h @@ -22,7 +22,7 @@ #ifndef PDFXFORM_H # define PDFXFORM_H -# define pdfmem_xform_size 9 /* size of memory in |pdf->mem| which |obj_data_ptr| holds */ +# define pdfmem_xform_size 10 /* size of memory in |pdf->mem| which |obj_data_ptr| holds */ # define obj_xform_width(pdf,A) pdf->mem[obj_data_ptr(pdf,A) + 0] # define obj_xform_height(pdf,A) pdf->mem[obj_data_ptr(pdf,A) + 1] @@ -33,6 +33,7 @@ # define obj_xform_attr_str(pdf,A) pdf->mem[obj_data_ptr(pdf,A) + 6] # define obj_xform_resources_str(pdf,A) pdf->mem[obj_data_ptr(pdf,A) + 7] # define obj_xform_type(pdf,A) pdf->mem[obj_data_ptr(pdf,A) + 8] +# define obj_xform_margin(pdf,A) pdf->mem[obj_data_ptr(pdf,A) + 9] # define set_pdf_xform_objnum(A,B) pdf_xform_objnum(A)=B # define set_obj_xform_width(pdf,A,B) obj_xform_width(pdf,A)=B @@ -44,6 +45,7 @@ # define set_obj_xform_attr_str(pdf,A,B) obj_xform_attr_str(pdf,A)=B # define set_obj_xform_resources_str(pdf,A,B) obj_xform_resources_str(pdf,A)=B # define set_obj_xform_type(pdf,A,B) obj_xform_type(pdf,A)=B +# define set_obj_xform_margin(pdf,A,B) obj_xform_margin(pdf,A)=B extern int pdf_cur_form; /* the form being output */ diff --git a/source/texk/web2c/luatexdir/pdf/pdfxform.w b/source/texk/web2c/luatexdir/pdf/pdfxform.w index 4c83b0249..731dc2290 100644 --- a/source/texk/web2c/luatexdir/pdf/pdfxform.w +++ b/source/texk/web2c/luatexdir/pdf/pdfxform.w @@ -89,6 +89,12 @@ void scan_pdfxform(PDF pdf) } else { set_obj_xform_resources(pdf, k, null); } + if (scan_keyword("margin")) { + scan_int(); + set_obj_xform_margin(pdf, k, cur_val); + } else { + set_obj_xform_margin(pdf, k, pdf_xform_margin); + } set_obj_xform_resources_str(pdf, k, null); scan_int(); p = box(cur_val); diff --git a/source/texk/web2c/luatexdir/tex/dumpdata.w b/source/texk/web2c/luatexdir/tex/dumpdata.w index 6973fbf0e..8683318bd 100644 --- a/source/texk/web2c/luatexdir/tex/dumpdata.w +++ b/source/texk/web2c/luatexdir/tex/dumpdata.w @@ -23,7 +23,7 @@ /* we start with 907: the sum of the values of the bytes of "don knuth" */ -#define FORMAT_ID (907+34) +#define FORMAT_ID (907+35) #if ((FORMAT_ID>=0) && (FORMAT_ID<=256)) #error Wrong value for FORMAT_ID. #endif diff --git a/source/texk/web2c/luatexdir/tex/linebreak.w b/source/texk/web2c/luatexdir/tex/linebreak.w index 665366660..345a1a424 100644 --- a/source/texk/web2c/luatexdir/tex/linebreak.w +++ b/source/texk/web2c/luatexdir/tex/linebreak.w @@ -755,6 +755,14 @@ Replacement texts and discretionary texts are supposed to contain only character nodes, kern nodes, and box or rule nodes. @c +#define bad_node_in_disc_error(p) { \ + if (type(p) == whatsit_node) { \ + formatted_error("linebreak","invalid node with type %s and subtype %i found in discretionary",node_data[type(p)].name,subtype(p)); \ + } else { \ + formatted_error("linebreak","invalid node with type %s found in discretionary",node_data[type(p)].name); \ + } \ +} + static void add_to_widths(halfword s, int line_break_dir, int adjust_spacing, scaled * widths) { while (s != null) { @@ -783,7 +791,8 @@ static void add_to_widths(halfword s, int line_break_dir, int adjust_spacing, sc case disc_node: /* TH temp */ break; default: - confusion("invalid node found in discretionary"); /* todo: report type */ + bad_node_in_disc_error(s); + break; } } s = vlink(s); @@ -825,7 +834,7 @@ static void sub_from_widths(halfword s, int line_break_dir, int adjust_spacing, case disc_node: /* TH temp */ break; default: - confusion("invalid node found in discretionary"); /* todo: report type */ + bad_node_in_disc_error(s); break; } } diff --git a/source/texk/web2c/luatexdir/tex/maincontrol.w b/source/texk/web2c/luatexdir/tex/maincontrol.w index 8c712289f..30de71ad7 100644 --- a/source/texk/web2c/luatexdir/tex/maincontrol.w +++ b/source/texk/web2c/luatexdir/tex/maincontrol.w @@ -3660,7 +3660,9 @@ void initialize(void) set_eq_level(end_write, level_one); set_eq_type(end_write, outer_call_cmd); set_equiv(end_write, null); - + /* bah */ + set_pdf_major_version(1); + set_pdf_minor_version(0); } synctexoffset = int_base + synctex_code; diff --git a/source/texk/web2c/luatexdir/tex/texnodes.w b/source/texk/web2c/luatexdir/tex/texnodes.w index 75a8c7656..59c0627c5 100644 --- a/source/texk/web2c/luatexdir/tex/texnodes.w +++ b/source/texk/web2c/luatexdir/tex/texnodes.w @@ -656,11 +656,14 @@ static int test_count = 1; #define check_action_ref(a) { dorangetest(p,a,var_mem_max); } #define check_attribute_ref(a) { dorangetest(p,a,var_mem_max); } -#define check_token_ref(a) { \ + +/* hm, we can just pass p then */ + +#define check_token_ref(p) { \ if (type(p) == whatsit_node) { \ - formatted_error("nodes","fuzzy token cleanup in whatsit node with id %i and subtype %i",type(p),subtype(p)); \ + formatted_error("nodes","fuzzy token cleanup in whatsit node with type %s and subtype %i",node_data[type(p)].name,subtype(p)); \ } else { \ - formatted_error("nodes","fuzzy token cleanup in node with id %i",type(p)); \ + formatted_error("nodes","fuzzy token cleanup in node with type %s",node_data[type(p)].name); \ } \ } @@ -1631,7 +1634,7 @@ static void check_node_wrapup_core(halfword p) switch (subtype(p)) { /* frontend code */ case special_node: - check_token_ref(write_tokens(p)); + check_token_ref(p); break; case user_defined_node: switch (user_node_type(p)) { @@ -1639,7 +1642,7 @@ static void check_node_wrapup_core(halfword p) check_attribute_ref(user_node_value(p)); break; case 't': - check_token_ref(user_node_value(p)); + check_token_ref(p); break; case 'n': dorangetest(p, user_node_value(p), var_mem_max); @@ -1669,39 +1672,39 @@ void check_node_wrapup_pdf(halfword p) switch (subtype(p)) { case pdf_literal_node: if (pdf_literal_type(p) == normal) - check_token_ref(pdf_literal_data(p)); + check_token_ref(p); break; case pdf_colorstack_node: if (pdf_colorstack_cmd(p) <= colorstack_data) - check_token_ref(pdf_colorstack_data(p)); + check_token_ref(p); break; case pdf_setmatrix_node: - check_token_ref(pdf_setmatrix_data(p)); + check_token_ref(p); break; case late_lua_node: if (late_lua_name(p) > 0) - check_token_ref(late_lua_name(p)); + check_token_ref(p); if (late_lua_type(p) == normal) - check_token_ref(late_lua_data(p)); + check_token_ref(p); break; case pdf_annot_node: - check_token_ref(pdf_annot_data(p)); + check_token_ref(p); break; case pdf_start_link_node: if (pdf_link_attr(p) != null) - check_token_ref(pdf_link_attr(p)); + check_token_ref(p); check_action_ref(pdf_link_action(p)); break; case pdf_dest_node: if (pdf_dest_named_id(p) > 0) - check_token_ref(pdf_dest_id(p)); + check_token_ref(p); break; case pdf_thread_node: case pdf_start_thread_node: if (pdf_thread_named_id(p) > 0) - check_token_ref(pdf_thread_id(p)); + check_token_ref(p); if (pdf_thread_attr(p) != null) - check_token_ref(pdf_thread_attr(p)); + check_token_ref(p); break; case pdf_save_node: case pdf_restore_node: diff --git a/source/texk/web2c/luatexdir/tex/textoken.w b/source/texk/web2c/luatexdir/tex/textoken.w index b11169a89..bf14a9614 100644 --- a/source/texk/web2c/luatexdir/tex/textoken.w +++ b/source/texk/web2c/luatexdir/tex/textoken.w @@ -2311,6 +2311,7 @@ static int do_variable_pdf(halfword c) else if (scan_keyword("imageresolution")) { do_variable_backend_int(c_pdf_image_resolution); } else if (scan_keyword("pkresolution")) { do_variable_backend_int(c_pdf_pk_resolution); } else if (scan_keyword("uniqueresname")) { do_variable_backend_int(c_pdf_unique_resname); } + else if (scan_keyword("majorversion")) { do_variable_backend_int(c_pdf_major_version); } else if (scan_keyword("minorversion")) { do_variable_backend_int(c_pdf_minor_version); } else if (scan_keyword("pagebox")) { do_variable_backend_int(c_pdf_pagebox); } else if (scan_keyword("inclusionerrorlevel")) { do_variable_backend_int(c_pdf_inclusion_errorlevel); } -- GitLab