pdf2json 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (473) hide show
  1. data/README.markdown +9 -0
  2. data/bin/.gitkeep +0 -0
  3. data/ext/extconf.rb +30 -0
  4. data/lib/pdf2json.rb +8 -0
  5. data/pdf2json-0.52-source/AUTHORS +24 -0
  6. data/pdf2json-0.52-source/CHANGES +11 -0
  7. data/pdf2json-0.52-source/Makefile +84 -0
  8. data/pdf2json-0.52-source/Makefile.in +84 -0
  9. data/pdf2json-0.52-source/aclocal.m4 +274 -0
  10. data/pdf2json-0.52-source/aconf-win32.h +86 -0
  11. data/pdf2json-0.52-source/aconf.h +42 -0
  12. data/pdf2json-0.52-source/aconf.h.in +41 -0
  13. data/pdf2json-0.52-source/autom4te.cache/output.0 +6908 -0
  14. data/pdf2json-0.52-source/autom4te.cache/requests +76 -0
  15. data/pdf2json-0.52-source/autom4te.cache/traces.0 +466 -0
  16. data/pdf2json-0.52-source/config.log +1259 -0
  17. data/pdf2json-0.52-source/config.status +1050 -0
  18. data/pdf2json-0.52-source/configure +6908 -0
  19. data/pdf2json-0.52-source/configure.ac +93 -0
  20. data/pdf2json-0.52-source/doc/pdffonts.1 +130 -0
  21. data/pdf2json-0.52-source/doc/pdffonts.cat +107 -0
  22. data/pdf2json-0.52-source/doc/pdffonts.hlp +117 -0
  23. data/pdf2json-0.52-source/doc/pdfimages.1 +102 -0
  24. data/pdf2json-0.52-source/doc/pdfimages.cat +92 -0
  25. data/pdf2json-0.52-source/doc/pdfimages.hlp +101 -0
  26. data/pdf2json-0.52-source/doc/pdfinfo.1 +158 -0
  27. data/pdf2json-0.52-source/doc/pdfinfo.cat +119 -0
  28. data/pdf2json-0.52-source/doc/pdfinfo.hlp +129 -0
  29. data/pdf2json-0.52-source/doc/pdftoppm.1 +115 -0
  30. data/pdf2json-0.52-source/doc/pdftoppm.cat +105 -0
  31. data/pdf2json-0.52-source/doc/pdftoppm.hlp +114 -0
  32. data/pdf2json-0.52-source/doc/pdftops.1 +229 -0
  33. data/pdf2json-0.52-source/doc/pdftops.cat +221 -0
  34. data/pdf2json-0.52-source/doc/pdftops.hlp +231 -0
  35. data/pdf2json-0.52-source/doc/pdftotext.1 +137 -0
  36. data/pdf2json-0.52-source/doc/pdftotext.cat +120 -0
  37. data/pdf2json-0.52-source/doc/pdftotext.hlp +133 -0
  38. data/pdf2json-0.52-source/doc/sample-xpdfrc +91 -0
  39. data/pdf2json-0.52-source/doc/xpdf.1 +513 -0
  40. data/pdf2json-0.52-source/doc/xpdf.cat +476 -0
  41. data/pdf2json-0.52-source/doc/xpdf.hlp +489 -0
  42. data/pdf2json-0.52-source/doc/xpdfrc.5 +480 -0
  43. data/pdf2json-0.52-source/doc/xpdfrc.cat +474 -0
  44. data/pdf2json-0.52-source/doc/xpdfrc.hlp +479 -0
  45. data/pdf2json-0.52-source/fofi/.DS_Store +0 -0
  46. data/pdf2json-0.52-source/fofi/FoFiBase.cc +156 -0
  47. data/pdf2json-0.52-source/fofi/FoFiBase.h +57 -0
  48. data/pdf2json-0.52-source/fofi/FoFiBase.o +0 -0
  49. data/pdf2json-0.52-source/fofi/FoFiEncodings.cc +994 -0
  50. data/pdf2json-0.52-source/fofi/FoFiEncodings.h +36 -0
  51. data/pdf2json-0.52-source/fofi/FoFiEncodings.o +0 -0
  52. data/pdf2json-0.52-source/fofi/FoFiTrueType.cc +2027 -0
  53. data/pdf2json-0.52-source/fofi/FoFiTrueType.h +174 -0
  54. data/pdf2json-0.52-source/fofi/FoFiTrueType.o +0 -0
  55. data/pdf2json-0.52-source/fofi/FoFiType1.cc +252 -0
  56. data/pdf2json-0.52-source/fofi/FoFiType1.h +59 -0
  57. data/pdf2json-0.52-source/fofi/FoFiType1.o +0 -0
  58. data/pdf2json-0.52-source/fofi/FoFiType1C.cc +2603 -0
  59. data/pdf2json-0.52-source/fofi/FoFiType1C.h +233 -0
  60. data/pdf2json-0.52-source/fofi/FoFiType1C.o +0 -0
  61. data/pdf2json-0.52-source/fofi/Makefile +70 -0
  62. data/pdf2json-0.52-source/fofi/Makefile.dep +0 -0
  63. data/pdf2json-0.52-source/fofi/Makefile.in +70 -0
  64. data/pdf2json-0.52-source/fofi/libfofi.a +0 -0
  65. data/pdf2json-0.52-source/fofi/vms_make.com +0 -0
  66. data/pdf2json-0.52-source/freetype.win32/.DS_Store +0 -0
  67. data/pdf2json-0.52-source/freetype.win32/include/.DS_Store +0 -0
  68. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftconfig.h +528 -0
  69. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftheader.h +780 -0
  70. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftmodule.h +32 -0
  71. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftoption.h +733 -0
  72. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftstdlib.h +173 -0
  73. data/pdf2json-0.52-source/freetype.win32/include/freetype/freetype.h +3919 -0
  74. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftadvanc.h +179 -0
  75. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftbbox.h +94 -0
  76. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftbdf.h +209 -0
  77. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftbitmap.h +227 -0
  78. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftcache.h +1128 -0
  79. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftchapters.h +103 -0
  80. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftcid.h +166 -0
  81. data/pdf2json-0.52-source/freetype.win32/include/freetype/fterrdef.h +244 -0
  82. data/pdf2json-0.52-source/freetype.win32/include/freetype/fterrors.h +206 -0
  83. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftgasp.h +120 -0
  84. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftglyph.h +613 -0
  85. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftgxval.h +358 -0
  86. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftgzip.h +102 -0
  87. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftimage.h +1313 -0
  88. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftincrem.h +353 -0
  89. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftlcdfil.h +213 -0
  90. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftlist.h +277 -0
  91. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftlzw.h +99 -0
  92. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftmac.h +274 -0
  93. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftmm.h +378 -0
  94. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftmodapi.h +483 -0
  95. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftmoderr.h +155 -0
  96. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftotval.h +203 -0
  97. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftoutln.h +537 -0
  98. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftpfr.h +172 -0
  99. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftrender.h +230 -0
  100. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftsizes.h +159 -0
  101. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftsnames.h +200 -0
  102. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftstroke.h +716 -0
  103. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftsynth.h +80 -0
  104. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftsystem.h +347 -0
  105. data/pdf2json-0.52-source/freetype.win32/include/freetype/fttrigon.h +350 -0
  106. data/pdf2json-0.52-source/freetype.win32/include/freetype/fttypes.h +588 -0
  107. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftwinfnt.h +274 -0
  108. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftxf86.h +83 -0
  109. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/autohint.h +231 -0
  110. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftcalc.h +179 -0
  111. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftdebug.h +250 -0
  112. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftdriver.h +422 -0
  113. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftgloadr.h +168 -0
  114. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftmemory.h +380 -0
  115. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftobjs.h +1428 -0
  116. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftpic.h +67 -0
  117. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftrfork.h +196 -0
  118. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftserv.h +620 -0
  119. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftstream.h +539 -0
  120. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/fttrace.h +139 -0
  121. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftvalid.h +150 -0
  122. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/internal.h +51 -0
  123. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/pcftypes.h +56 -0
  124. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/psaux.h +873 -0
  125. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/pshints.h +712 -0
  126. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svbdf.h +77 -0
  127. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svcid.h +83 -0
  128. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svgldict.h +82 -0
  129. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svgxval.h +72 -0
  130. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svkern.h +51 -0
  131. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svmm.h +104 -0
  132. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svotval.h +55 -0
  133. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svpfr.h +66 -0
  134. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svpostnm.h +79 -0
  135. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svpscmap.h +164 -0
  136. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svpsinfo.h +92 -0
  137. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svsfnt.h +102 -0
  138. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svttcmap.h +106 -0
  139. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svtteng.h +53 -0
  140. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svttglyf.h +67 -0
  141. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svwinfnt.h +50 -0
  142. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svxf86nm.h +55 -0
  143. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/sfnt.h +897 -0
  144. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/t1types.h +270 -0
  145. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/tttypes.h +1543 -0
  146. data/pdf2json-0.52-source/freetype.win32/include/freetype/t1tables.h +504 -0
  147. data/pdf2json-0.52-source/freetype.win32/include/freetype/ttnameid.h +1247 -0
  148. data/pdf2json-0.52-source/freetype.win32/include/freetype/tttables.h +759 -0
  149. data/pdf2json-0.52-source/freetype.win32/include/freetype/tttags.h +107 -0
  150. data/pdf2json-0.52-source/freetype.win32/include/freetype/ttunpat.h +59 -0
  151. data/pdf2json-0.52-source/freetype.win32/include/ft2build.h +39 -0
  152. data/pdf2json-0.52-source/freetype.win32/lib/freetype_a.lib +0 -0
  153. data/pdf2json-0.52-source/goo/.DS_Store +0 -0
  154. data/pdf2json-0.52-source/goo/FixedPoint.cc +118 -0
  155. data/pdf2json-0.52-source/goo/FixedPoint.h +155 -0
  156. data/pdf2json-0.52-source/goo/FixedPoint.o +0 -0
  157. data/pdf2json-0.52-source/goo/GHash.cc +380 -0
  158. data/pdf2json-0.52-source/goo/GHash.h +78 -0
  159. data/pdf2json-0.52-source/goo/GHash.o +0 -0
  160. data/pdf2json-0.52-source/goo/GList.cc +97 -0
  161. data/pdf2json-0.52-source/goo/GList.h +96 -0
  162. data/pdf2json-0.52-source/goo/GList.o +0 -0
  163. data/pdf2json-0.52-source/goo/GMutex.h +49 -0
  164. data/pdf2json-0.52-source/goo/GString.cc +724 -0
  165. data/pdf2json-0.52-source/goo/GString.cc.fixed +718 -0
  166. data/pdf2json-0.52-source/goo/GString.h +136 -0
  167. data/pdf2json-0.52-source/goo/GString.o +0 -0
  168. data/pdf2json-0.52-source/goo/ImgWriter.o +0 -0
  169. data/pdf2json-0.52-source/goo/JpegWriter.o +0 -0
  170. data/pdf2json-0.52-source/goo/Makefile +72 -0
  171. data/pdf2json-0.52-source/goo/Makefile.dep +0 -0
  172. data/pdf2json-0.52-source/goo/Makefile.in +72 -0
  173. data/pdf2json-0.52-source/goo/PNGWriter.o +0 -0
  174. data/pdf2json-0.52-source/goo/gfile.cc +731 -0
  175. data/pdf2json-0.52-source/goo/gfile.h +138 -0
  176. data/pdf2json-0.52-source/goo/gfile.o +0 -0
  177. data/pdf2json-0.52-source/goo/gmem.cc +264 -0
  178. data/pdf2json-0.52-source/goo/gmem.h +79 -0
  179. data/pdf2json-0.52-source/goo/gmem.o +0 -0
  180. data/pdf2json-0.52-source/goo/gmempp.cc +32 -0
  181. data/pdf2json-0.52-source/goo/gmempp.o +0 -0
  182. data/pdf2json-0.52-source/goo/gtypes.h +29 -0
  183. data/pdf2json-0.52-source/goo/libGoo.a +0 -0
  184. data/pdf2json-0.52-source/goo/parseargs.c +190 -0
  185. data/pdf2json-0.52-source/goo/parseargs.h +71 -0
  186. data/pdf2json-0.52-source/goo/parseargs.o +0 -0
  187. data/pdf2json-0.52-source/goo/vms_directory.c +214 -0
  188. data/pdf2json-0.52-source/goo/vms_dirent.h +67 -0
  189. data/pdf2json-0.52-source/goo/vms_make.com +82 -0
  190. data/pdf2json-0.52-source/goo/vms_sys_dirent.h +54 -0
  191. data/pdf2json-0.52-source/goo/vms_unix_time.h +102 -0
  192. data/pdf2json-0.52-source/goo/vms_unix_times.c +42 -0
  193. data/pdf2json-0.52-source/goo/vms_unlink.c +22 -0
  194. data/pdf2json-0.52-source/ms_make.bat +199 -0
  195. data/pdf2json-0.52-source/splash/.DS_Store +0 -0
  196. data/pdf2json-0.52-source/splash/Makefile +103 -0
  197. data/pdf2json-0.52-source/splash/Makefile.dep +0 -0
  198. data/pdf2json-0.52-source/splash/Makefile.in +103 -0
  199. data/pdf2json-0.52-source/splash/Splash.cc +3310 -0
  200. data/pdf2json-0.52-source/splash/Splash.h +293 -0
  201. data/pdf2json-0.52-source/splash/Splash.o +0 -0
  202. data/pdf2json-0.52-source/splash/SplashBitmap.cc +188 -0
  203. data/pdf2json-0.52-source/splash/SplashBitmap.h +64 -0
  204. data/pdf2json-0.52-source/splash/SplashBitmap.o +0 -0
  205. data/pdf2json-0.52-source/splash/SplashClip.cc +382 -0
  206. data/pdf2json-0.52-source/splash/SplashClip.h +107 -0
  207. data/pdf2json-0.52-source/splash/SplashClip.o +0 -0
  208. data/pdf2json-0.52-source/splash/SplashErrorCodes.h +32 -0
  209. data/pdf2json-0.52-source/splash/SplashFTFont.cc +357 -0
  210. data/pdf2json-0.52-source/splash/SplashFTFont.h +58 -0
  211. data/pdf2json-0.52-source/splash/SplashFTFont.o +0 -0
  212. data/pdf2json-0.52-source/splash/SplashFTFontEngine.cc +179 -0
  213. data/pdf2json-0.52-source/splash/SplashFTFontEngine.h +65 -0
  214. data/pdf2json-0.52-source/splash/SplashFTFontEngine.o +0 -0
  215. data/pdf2json-0.52-source/splash/SplashFTFontFile.cc +114 -0
  216. data/pdf2json-0.52-source/splash/SplashFTFontFile.h +73 -0
  217. data/pdf2json-0.52-source/splash/SplashFTFontFile.o +0 -0
  218. data/pdf2json-0.52-source/splash/SplashFont.cc +176 -0
  219. data/pdf2json-0.52-source/splash/SplashFont.h +104 -0
  220. data/pdf2json-0.52-source/splash/SplashFont.o +0 -0
  221. data/pdf2json-0.52-source/splash/SplashFontEngine.cc +317 -0
  222. data/pdf2json-0.52-source/splash/SplashFontEngine.h +91 -0
  223. data/pdf2json-0.52-source/splash/SplashFontEngine.o +0 -0
  224. data/pdf2json-0.52-source/splash/SplashFontFile.cc +55 -0
  225. data/pdf2json-0.52-source/splash/SplashFontFile.h +60 -0
  226. data/pdf2json-0.52-source/splash/SplashFontFile.o +0 -0
  227. data/pdf2json-0.52-source/splash/SplashFontFileID.cc +23 -0
  228. data/pdf2json-0.52-source/splash/SplashFontFileID.h +30 -0
  229. data/pdf2json-0.52-source/splash/SplashFontFileID.o +0 -0
  230. data/pdf2json-0.52-source/splash/SplashGlyphBitmap.h +26 -0
  231. data/pdf2json-0.52-source/splash/SplashMath.h +89 -0
  232. data/pdf2json-0.52-source/splash/SplashPath.cc +184 -0
  233. data/pdf2json-0.52-source/splash/SplashPath.h +121 -0
  234. data/pdf2json-0.52-source/splash/SplashPath.o +0 -0
  235. data/pdf2json-0.52-source/splash/SplashPattern.cc +40 -0
  236. data/pdf2json-0.52-source/splash/SplashPattern.h +65 -0
  237. data/pdf2json-0.52-source/splash/SplashPattern.o +0 -0
  238. data/pdf2json-0.52-source/splash/SplashScreen.cc +383 -0
  239. data/pdf2json-0.52-source/splash/SplashScreen.h +56 -0
  240. data/pdf2json-0.52-source/splash/SplashScreen.o +0 -0
  241. data/pdf2json-0.52-source/splash/SplashState.cc +165 -0
  242. data/pdf2json-0.52-source/splash/SplashState.h +103 -0
  243. data/pdf2json-0.52-source/splash/SplashState.o +0 -0
  244. data/pdf2json-0.52-source/splash/SplashT1Font.cc +287 -0
  245. data/pdf2json-0.52-source/splash/SplashT1Font.h +57 -0
  246. data/pdf2json-0.52-source/splash/SplashT1Font.o +0 -0
  247. data/pdf2json-0.52-source/splash/SplashT1FontEngine.cc +124 -0
  248. data/pdf2json-0.52-source/splash/SplashT1FontEngine.h +53 -0
  249. data/pdf2json-0.52-source/splash/SplashT1FontEngine.o +0 -0
  250. data/pdf2json-0.52-source/splash/SplashT1FontFile.cc +97 -0
  251. data/pdf2json-0.52-source/splash/SplashT1FontFile.h +58 -0
  252. data/pdf2json-0.52-source/splash/SplashT1FontFile.o +0 -0
  253. data/pdf2json-0.52-source/splash/SplashTypes.h +132 -0
  254. data/pdf2json-0.52-source/splash/SplashXPath.cc +438 -0
  255. data/pdf2json-0.52-source/splash/SplashXPath.h +100 -0
  256. data/pdf2json-0.52-source/splash/SplashXPath.o +0 -0
  257. data/pdf2json-0.52-source/splash/SplashXPathScanner.cc +428 -0
  258. data/pdf2json-0.52-source/splash/SplashXPathScanner.h +87 -0
  259. data/pdf2json-0.52-source/splash/SplashXPathScanner.o +0 -0
  260. data/pdf2json-0.52-source/splash/libsplash.a +0 -0
  261. data/pdf2json-0.52-source/splash/vms_make.com +0 -0
  262. data/pdf2json-0.52-source/src/.DS_Store +0 -0
  263. data/pdf2json-0.52-source/src/GVector.h +101 -0
  264. data/pdf2json-0.52-source/src/ImgOutputDev.cc +1243 -0
  265. data/pdf2json-0.52-source/src/ImgOutputDev.h +307 -0
  266. data/pdf2json-0.52-source/src/ImgOutputDev.o +0 -0
  267. data/pdf2json-0.52-source/src/Makefile +68 -0
  268. data/pdf2json-0.52-source/src/Makefile.in +68 -0
  269. data/pdf2json-0.52-source/src/XmlFonts.cc +367 -0
  270. data/pdf2json-0.52-source/src/XmlFonts.h +91 -0
  271. data/pdf2json-0.52-source/src/XmlFonts.o +0 -0
  272. data/pdf2json-0.52-source/src/XmlLinks.cc +101 -0
  273. data/pdf2json-0.52-source/src/XmlLinks.h +54 -0
  274. data/pdf2json-0.52-source/src/XmlLinks.o +0 -0
  275. data/pdf2json-0.52-source/src/pdf2json +0 -0
  276. data/pdf2json-0.52-source/src/pdf2json.cc +343 -0
  277. data/pdf2json-0.52-source/src/pdf2json.o +0 -0
  278. data/pdf2json-0.52-source/src/pdf2xml.dtd +22 -0
  279. data/pdf2json-0.52-source/src/pdf2xmljson.dtd +9 -0
  280. data/pdf2json-0.52-source/xpdf/.DS_Store +0 -0
  281. data/pdf2json-0.52-source/xpdf/Annot.cc +1556 -0
  282. data/pdf2json-0.52-source/xpdf/Annot.h +142 -0
  283. data/pdf2json-0.52-source/xpdf/Annot.o +0 -0
  284. data/pdf2json-0.52-source/xpdf/Array.cc +73 -0
  285. data/pdf2json-0.52-source/xpdf/Array.h +58 -0
  286. data/pdf2json-0.52-source/xpdf/Array.o +0 -0
  287. data/pdf2json-0.52-source/xpdf/BuiltinFont.cc +65 -0
  288. data/pdf2json-0.52-source/xpdf/BuiltinFont.h +57 -0
  289. data/pdf2json-0.52-source/xpdf/BuiltinFont.o +0 -0
  290. data/pdf2json-0.52-source/xpdf/BuiltinFontTables.cc +4284 -0
  291. data/pdf2json-0.52-source/xpdf/BuiltinFontTables.h +23 -0
  292. data/pdf2json-0.52-source/xpdf/BuiltinFontTables.o +0 -0
  293. data/pdf2json-0.52-source/xpdf/CMap.cc +408 -0
  294. data/pdf2json-0.52-source/xpdf/CMap.h +102 -0
  295. data/pdf2json-0.52-source/xpdf/CMap.o +0 -0
  296. data/pdf2json-0.52-source/xpdf/Catalog.cc +374 -0
  297. data/pdf2json-0.52-source/xpdf/Catalog.h +97 -0
  298. data/pdf2json-0.52-source/xpdf/Catalog.o +0 -0
  299. data/pdf2json-0.52-source/xpdf/CharCodeToUnicode.cc +540 -0
  300. data/pdf2json-0.52-source/xpdf/CharCodeToUnicode.h +117 -0
  301. data/pdf2json-0.52-source/xpdf/CharCodeToUnicode.o +0 -0
  302. data/pdf2json-0.52-source/xpdf/CharTypes.h +24 -0
  303. data/pdf2json-0.52-source/xpdf/CompactFontTables.h +464 -0
  304. data/pdf2json-0.52-source/xpdf/CoreOutputDev.cc +61 -0
  305. data/pdf2json-0.52-source/xpdf/CoreOutputDev.h +61 -0
  306. data/pdf2json-0.52-source/xpdf/Decrypt.cc +776 -0
  307. data/pdf2json-0.52-source/xpdf/Decrypt.h +95 -0
  308. data/pdf2json-0.52-source/xpdf/Decrypt.o +0 -0
  309. data/pdf2json-0.52-source/xpdf/Dict.cc +95 -0
  310. data/pdf2json-0.52-source/xpdf/Dict.h +77 -0
  311. data/pdf2json-0.52-source/xpdf/Dict.o +0 -0
  312. data/pdf2json-0.52-source/xpdf/Error.cc +38 -0
  313. data/pdf2json-0.52-source/xpdf/Error.h +23 -0
  314. data/pdf2json-0.52-source/xpdf/Error.o +0 -0
  315. data/pdf2json-0.52-source/xpdf/ErrorCodes.h +36 -0
  316. data/pdf2json-0.52-source/xpdf/FontEncodingTables.cc +1824 -0
  317. data/pdf2json-0.52-source/xpdf/FontEncodingTables.h +20 -0
  318. data/pdf2json-0.52-source/xpdf/FontEncodingTables.o +0 -0
  319. data/pdf2json-0.52-source/xpdf/Function.cc +1573 -0
  320. data/pdf2json-0.52-source/xpdf/Function.h +229 -0
  321. data/pdf2json-0.52-source/xpdf/Function.o +0 -0
  322. data/pdf2json-0.52-source/xpdf/Gfx.cc +4187 -0
  323. data/pdf2json-0.52-source/xpdf/Gfx.h +312 -0
  324. data/pdf2json-0.52-source/xpdf/Gfx.o +0 -0
  325. data/pdf2json-0.52-source/xpdf/GfxFont.cc +1568 -0
  326. data/pdf2json-0.52-source/xpdf/GfxFont.h +320 -0
  327. data/pdf2json-0.52-source/xpdf/GfxFont.o +0 -0
  328. data/pdf2json-0.52-source/xpdf/GfxState.cc +4137 -0
  329. data/pdf2json-0.52-source/xpdf/GfxState.h +1244 -0
  330. data/pdf2json-0.52-source/xpdf/GfxState.o +0 -0
  331. data/pdf2json-0.52-source/xpdf/GlobalParams.cc +2924 -0
  332. data/pdf2json-0.52-source/xpdf/GlobalParams.cc.old +2908 -0
  333. data/pdf2json-0.52-source/xpdf/GlobalParams.h +466 -0
  334. data/pdf2json-0.52-source/xpdf/GlobalParams.h.old +463 -0
  335. data/pdf2json-0.52-source/xpdf/GlobalParams.o +0 -0
  336. data/pdf2json-0.52-source/xpdf/ImageOutputDev.cc +195 -0
  337. data/pdf2json-0.52-source/xpdf/ImageOutputDev.h +76 -0
  338. data/pdf2json-0.52-source/xpdf/ImageOutputDev.o +0 -0
  339. data/pdf2json-0.52-source/xpdf/JArithmeticDecoder.cc +322 -0
  340. data/pdf2json-0.52-source/xpdf/JArithmeticDecoder.h +109 -0
  341. data/pdf2json-0.52-source/xpdf/JArithmeticDecoder.o +0 -0
  342. data/pdf2json-0.52-source/xpdf/JBIG2Stream.cc +3413 -0
  343. data/pdf2json-0.52-source/xpdf/JBIG2Stream.h +145 -0
  344. data/pdf2json-0.52-source/xpdf/JBIG2Stream.o +0 -0
  345. data/pdf2json-0.52-source/xpdf/JPXStream.cc +3144 -0
  346. data/pdf2json-0.52-source/xpdf/JPXStream.h +351 -0
  347. data/pdf2json-0.52-source/xpdf/JPXStream.o +0 -0
  348. data/pdf2json-0.52-source/xpdf/Lexer.cc +485 -0
  349. data/pdf2json-0.52-source/xpdf/Lexer.h +80 -0
  350. data/pdf2json-0.52-source/xpdf/Lexer.o +0 -0
  351. data/pdf2json-0.52-source/xpdf/Link.cc +806 -0
  352. data/pdf2json-0.52-source/xpdf/Link.cc.old +784 -0
  353. data/pdf2json-0.52-source/xpdf/Link.h +415 -0
  354. data/pdf2json-0.52-source/xpdf/Link.h.old +369 -0
  355. data/pdf2json-0.52-source/xpdf/Link.o +0 -0
  356. data/pdf2json-0.52-source/xpdf/Makefile +232 -0
  357. data/pdf2json-0.52-source/xpdf/Makefile.dep +0 -0
  358. data/pdf2json-0.52-source/xpdf/Makefile.in +232 -0
  359. data/pdf2json-0.52-source/xpdf/NameToCharCode.cc +116 -0
  360. data/pdf2json-0.52-source/xpdf/NameToCharCode.h +42 -0
  361. data/pdf2json-0.52-source/xpdf/NameToCharCode.o +0 -0
  362. data/pdf2json-0.52-source/xpdf/NameToUnicodeTable.h +1097 -0
  363. data/pdf2json-0.52-source/xpdf/Object.cc +231 -0
  364. data/pdf2json-0.52-source/xpdf/Object.h +303 -0
  365. data/pdf2json-0.52-source/xpdf/Object.o +0 -0
  366. data/pdf2json-0.52-source/xpdf/Outline.cc +151 -0
  367. data/pdf2json-0.52-source/xpdf/Outline.h +76 -0
  368. data/pdf2json-0.52-source/xpdf/Outline.o +0 -0
  369. data/pdf2json-0.52-source/xpdf/OutputDev.cc +131 -0
  370. data/pdf2json-0.52-source/xpdf/OutputDev.h +253 -0
  371. data/pdf2json-0.52-source/xpdf/OutputDev.o +0 -0
  372. data/pdf2json-0.52-source/xpdf/PDFCore.cc +2044 -0
  373. data/pdf2json-0.52-source/xpdf/PDFCore.h +321 -0
  374. data/pdf2json-0.52-source/xpdf/PDFDoc.cc +404 -0
  375. data/pdf2json-0.52-source/xpdf/PDFDoc.h +183 -0
  376. data/pdf2json-0.52-source/xpdf/PDFDoc.o +0 -0
  377. data/pdf2json-0.52-source/xpdf/PDFDocEncoding.cc +44 -0
  378. data/pdf2json-0.52-source/xpdf/PDFDocEncoding.h +16 -0
  379. data/pdf2json-0.52-source/xpdf/PDFDocEncoding.o +0 -0
  380. data/pdf2json-0.52-source/xpdf/PSOutputDev.cc +6224 -0
  381. data/pdf2json-0.52-source/xpdf/PSOutputDev.h +395 -0
  382. data/pdf2json-0.52-source/xpdf/PSOutputDev.o +0 -0
  383. data/pdf2json-0.52-source/xpdf/PSTokenizer.cc +135 -0
  384. data/pdf2json-0.52-source/xpdf/PSTokenizer.h +41 -0
  385. data/pdf2json-0.52-source/xpdf/PSTokenizer.o +0 -0
  386. data/pdf2json-0.52-source/xpdf/Page.cc +454 -0
  387. data/pdf2json-0.52-source/xpdf/Page.h +187 -0
  388. data/pdf2json-0.52-source/xpdf/Page.o +0 -0
  389. data/pdf2json-0.52-source/xpdf/Parser.cc +227 -0
  390. data/pdf2json-0.52-source/xpdf/Parser.h +59 -0
  391. data/pdf2json-0.52-source/xpdf/Parser.o +0 -0
  392. data/pdf2json-0.52-source/xpdf/PreScanOutputDev.cc +257 -0
  393. data/pdf2json-0.52-source/xpdf/PreScanOutputDev.h +130 -0
  394. data/pdf2json-0.52-source/xpdf/PreScanOutputDev.o +0 -0
  395. data/pdf2json-0.52-source/xpdf/SecurityHandler.cc +390 -0
  396. data/pdf2json-0.52-source/xpdf/SecurityHandler.h +160 -0
  397. data/pdf2json-0.52-source/xpdf/SecurityHandler.o +0 -0
  398. data/pdf2json-0.52-source/xpdf/SplashOutputDev.cc +2845 -0
  399. data/pdf2json-0.52-source/xpdf/SplashOutputDev.h +247 -0
  400. data/pdf2json-0.52-source/xpdf/SplashOutputDev.o +0 -0
  401. data/pdf2json-0.52-source/xpdf/Stream-CCITT.h +459 -0
  402. data/pdf2json-0.52-source/xpdf/Stream.cc +4627 -0
  403. data/pdf2json-0.52-source/xpdf/Stream.h +858 -0
  404. data/pdf2json-0.52-source/xpdf/Stream.o +0 -0
  405. data/pdf2json-0.52-source/xpdf/TextOutputDev.cc +4090 -0
  406. data/pdf2json-0.52-source/xpdf/TextOutputDev.h +661 -0
  407. data/pdf2json-0.52-source/xpdf/TextOutputDev.o +0 -0
  408. data/pdf2json-0.52-source/xpdf/UTF8.h +56 -0
  409. data/pdf2json-0.52-source/xpdf/UnicodeMap.cc +302 -0
  410. data/pdf2json-0.52-source/xpdf/UnicodeMap.cc.old +293 -0
  411. data/pdf2json-0.52-source/xpdf/UnicodeMap.h +135 -0
  412. data/pdf2json-0.52-source/xpdf/UnicodeMap.h.old +123 -0
  413. data/pdf2json-0.52-source/xpdf/UnicodeMap.o +0 -0
  414. data/pdf2json-0.52-source/xpdf/UnicodeMapTables.h +361 -0
  415. data/pdf2json-0.52-source/xpdf/UnicodeTypeTable.cc +949 -0
  416. data/pdf2json-0.52-source/xpdf/UnicodeTypeTable.h +20 -0
  417. data/pdf2json-0.52-source/xpdf/UnicodeTypeTable.o +0 -0
  418. data/pdf2json-0.52-source/xpdf/XPDFApp.cc +447 -0
  419. data/pdf2json-0.52-source/xpdf/XPDFApp.h +114 -0
  420. data/pdf2json-0.52-source/xpdf/XPDFCore.cc +1655 -0
  421. data/pdf2json-0.52-source/xpdf/XPDFCore.h +251 -0
  422. data/pdf2json-0.52-source/xpdf/XPDFTree.cc +931 -0
  423. data/pdf2json-0.52-source/xpdf/XPDFTree.h +45 -0
  424. data/pdf2json-0.52-source/xpdf/XPDFTreeP.h +87 -0
  425. data/pdf2json-0.52-source/xpdf/XPDFViewer.cc +3488 -0
  426. data/pdf2json-0.52-source/xpdf/XPDFViewer.h +352 -0
  427. data/pdf2json-0.52-source/xpdf/XRef.cc +896 -0
  428. data/pdf2json-0.52-source/xpdf/XRef.h +133 -0
  429. data/pdf2json-0.52-source/xpdf/XRef.o +0 -0
  430. data/pdf2json-0.52-source/xpdf/XpdfPluginAPI.cc +262 -0
  431. data/pdf2json-0.52-source/xpdf/XpdfPluginAPI.h +341 -0
  432. data/pdf2json-0.52-source/xpdf/XpdfPluginAPI.o +0 -0
  433. data/pdf2json-0.52-source/xpdf/about-text.h +48 -0
  434. data/pdf2json-0.52-source/xpdf/about.xbm +6 -0
  435. data/pdf2json-0.52-source/xpdf/backArrow.xbm +6 -0
  436. data/pdf2json-0.52-source/xpdf/backArrowDis.xbm +6 -0
  437. data/pdf2json-0.52-source/xpdf/config.h +112 -0
  438. data/pdf2json-0.52-source/xpdf/dblLeftArrow.xbm +6 -0
  439. data/pdf2json-0.52-source/xpdf/dblLeftArrowDis.xbm +6 -0
  440. data/pdf2json-0.52-source/xpdf/dblRightArrow.xbm +6 -0
  441. data/pdf2json-0.52-source/xpdf/dblRightArrowDis.xbm +6 -0
  442. data/pdf2json-0.52-source/xpdf/find.xbm +6 -0
  443. data/pdf2json-0.52-source/xpdf/findDis.xbm +6 -0
  444. data/pdf2json-0.52-source/xpdf/forwardArrow.xbm +6 -0
  445. data/pdf2json-0.52-source/xpdf/forwardArrowDis.xbm +6 -0
  446. data/pdf2json-0.52-source/xpdf/leftArrow.xbm +5 -0
  447. data/pdf2json-0.52-source/xpdf/leftArrowDis.xbm +5 -0
  448. data/pdf2json-0.52-source/xpdf/libXpdf.a +0 -0
  449. data/pdf2json-0.52-source/xpdf/pdffonts +0 -0
  450. data/pdf2json-0.52-source/xpdf/pdffonts.cc +298 -0
  451. data/pdf2json-0.52-source/xpdf/pdffonts.o +0 -0
  452. data/pdf2json-0.52-source/xpdf/pdfimages +0 -0
  453. data/pdf2json-0.52-source/xpdf/pdfimages.cc +155 -0
  454. data/pdf2json-0.52-source/xpdf/pdfimages.o +0 -0
  455. data/pdf2json-0.52-source/xpdf/pdfinfo +0 -0
  456. data/pdf2json-0.52-source/xpdf/pdfinfo.cc +387 -0
  457. data/pdf2json-0.52-source/xpdf/pdfinfo.o +0 -0
  458. data/pdf2json-0.52-source/xpdf/pdftoppm.cc +203 -0
  459. data/pdf2json-0.52-source/xpdf/pdftops +0 -0
  460. data/pdf2json-0.52-source/xpdf/pdftops.cc +344 -0
  461. data/pdf2json-0.52-source/xpdf/pdftops.o +0 -0
  462. data/pdf2json-0.52-source/xpdf/pdftotext +0 -0
  463. data/pdf2json-0.52-source/xpdf/pdftotext.cc +333 -0
  464. data/pdf2json-0.52-source/xpdf/pdftotext.o +0 -0
  465. data/pdf2json-0.52-source/xpdf/print.xbm +6 -0
  466. data/pdf2json-0.52-source/xpdf/printDis.xbm +6 -0
  467. data/pdf2json-0.52-source/xpdf/rightArrow.xbm +5 -0
  468. data/pdf2json-0.52-source/xpdf/rightArrowDis.xbm +5 -0
  469. data/pdf2json-0.52-source/xpdf/vms_make.com +129 -0
  470. data/pdf2json-0.52-source/xpdf/xpdf.cc +344 -0
  471. data/pdf2json-0.52-source/xpdf/xpdfIcon.xpm +62 -0
  472. data/pdf2json.gemspec +29 -0
  473. metadata +518 -0
@@ -0,0 +1,103 @@
1
+ #========================================================================
2
+ #
3
+ # Splash library Makefile
4
+ #
5
+ # Copyright 2003 Glyph & Cog, LLC
6
+ #
7
+ #========================================================================
8
+
9
+ SHELL = /bin/sh
10
+
11
+ srcdir = .
12
+
13
+
14
+ GOOSRCDIR = $(srcdir)/../goo
15
+ GOOLIBDIR = ../goo
16
+ FOFISRCDIR = $(srcdir)/../fofi
17
+ FOFILIBDIR = ../fofi
18
+
19
+ CXXFLAGS = -I/usr/local/include -g -O2 -DHAVE_CONFIG_H -I.. -I$(GOOSRCDIR) -I$(FOFISRCDIR) -I$(srcdir)
20
+
21
+ CXX = g++
22
+ AR = ar rc
23
+ RANLIB = ranlib
24
+
25
+ LIBPREFIX = lib
26
+
27
+ #------------------------------------------------------------------------
28
+
29
+ .SUFFIXES: .cc
30
+
31
+ .cc.o:
32
+ $(CXX) $(CXXFLAGS) -c $<
33
+
34
+ #------------------------------------------------------------------------
35
+
36
+ CXX_SRC = \
37
+ $(srcdir)/Splash.cc \
38
+ $(srcdir)/SplashBitmap.cc \
39
+ $(srcdir)/SplashClip.cc \
40
+ $(srcdir)/SplashFTFont.cc \
41
+ $(srcdir)/SplashFTFontEngine.cc \
42
+ $(srcdir)/SplashFTFontFile.cc \
43
+ $(srcdir)/SplashFont.cc \
44
+ $(srcdir)/SplashFontEngine.cc \
45
+ $(srcdir)/SplashFontFile.cc \
46
+ $(srcdir)/SplashFontFileID.cc \
47
+ $(srcdir)/SplashPath.cc \
48
+ $(srcdir)/SplashPattern.cc \
49
+ $(srcdir)/SplashScreen.cc \
50
+ $(srcdir)/SplashState.cc \
51
+ $(srcdir)/SplashT1Font.cc \
52
+ $(srcdir)/SplashT1FontEngine.cc \
53
+ $(srcdir)/SplashT1FontFile.cc \
54
+ $(srcdir)/SplashXPath.cc \
55
+ $(srcdir)/SplashXPathScanner.cc
56
+
57
+ #------------------------------------------------------------------------
58
+
59
+ all: $(LIBPREFIX)splash.a
60
+
61
+ #------------------------------------------------------------------------
62
+
63
+ SPLASH_OBJS = \
64
+ Splash.o \
65
+ SplashBitmap.o \
66
+ SplashClip.o \
67
+ SplashFTFont.o \
68
+ SplashFTFontEngine.o \
69
+ SplashFTFontFile.o \
70
+ SplashFont.o \
71
+ SplashFontEngine.o \
72
+ SplashFontFile.o \
73
+ SplashFontFileID.o \
74
+ SplashPath.o \
75
+ SplashPattern.o \
76
+ SplashScreen.o \
77
+ SplashState.o \
78
+ SplashT1Font.o \
79
+ SplashT1FontEngine.o \
80
+ SplashT1FontFile.o \
81
+ SplashXPath.o \
82
+ SplashXPathScanner.o
83
+
84
+ $(LIBPREFIX)splash.a: $(SPLASH_OBJS)
85
+ rm -f $(LIBPREFIX)splash.a
86
+ $(AR) $(LIBPREFIX)splash.a $(SPLASH_OBJS)
87
+ $(RANLIB) $(LIBPREFIX)splash.a
88
+
89
+ #------------------------------------------------------------------------
90
+ SPLASH_WINOBJS = libsplash.lib SplashBitmap.obj SplashFontFile.obj SplashFTFont.obj SplashScreen.obj SplashT1Font.obj \
91
+ SplashClip.obj SplashFont.obj Splash.obj SplashState.obj SplashXPath.obj \
92
+ SplashFontEngine.obj SplashFTFontEngine.obj SplashPath.obj SplashT1FontEngine.obj SplashXPathScanner.obj \
93
+ SplashFontFileID.obj SplashFTFontFile.obj SplashPattern.obj SplashT1FontFile.obj
94
+
95
+ clean:
96
+ rm -f $(SPLASH_OBJS) $(LIBPREFIX)splash.a $(SPLASH_WINOBJS)
97
+
98
+ #------------------------------------------------------------------------
99
+
100
+ depend:
101
+ $(CXX) $(CXXFLAGS) -MM $(CXX_SRC) >Makefile.dep
102
+
103
+ include Makefile.dep
File without changes
@@ -0,0 +1,103 @@
1
+ #========================================================================
2
+ #
3
+ # Splash library Makefile
4
+ #
5
+ # Copyright 2003 Glyph & Cog, LLC
6
+ #
7
+ #========================================================================
8
+
9
+ SHELL = /bin/sh
10
+
11
+ srcdir = @srcdir@
12
+ VPATH = @srcdir@
13
+
14
+ GOOSRCDIR = $(srcdir)/../goo
15
+ GOOLIBDIR = ../goo
16
+ FOFISRCDIR = $(srcdir)/../fofi
17
+ FOFILIBDIR = ../fofi
18
+
19
+ CXXFLAGS = -I/usr/local/include @CXXFLAGS@ @DEFS@ -I.. -I$(GOOSRCDIR) -I$(FOFISRCDIR) -I$(srcdir)
20
+
21
+ CXX = g++
22
+ AR = ar rc
23
+ RANLIB = ranlib
24
+
25
+ LIBPREFIX = lib
26
+
27
+ #------------------------------------------------------------------------
28
+
29
+ .SUFFIXES: .cc
30
+
31
+ .cc.o:
32
+ $(CXX) $(CXXFLAGS) -c $<
33
+
34
+ #------------------------------------------------------------------------
35
+
36
+ CXX_SRC = \
37
+ $(srcdir)/Splash.cc \
38
+ $(srcdir)/SplashBitmap.cc \
39
+ $(srcdir)/SplashClip.cc \
40
+ $(srcdir)/SplashFTFont.cc \
41
+ $(srcdir)/SplashFTFontEngine.cc \
42
+ $(srcdir)/SplashFTFontFile.cc \
43
+ $(srcdir)/SplashFont.cc \
44
+ $(srcdir)/SplashFontEngine.cc \
45
+ $(srcdir)/SplashFontFile.cc \
46
+ $(srcdir)/SplashFontFileID.cc \
47
+ $(srcdir)/SplashPath.cc \
48
+ $(srcdir)/SplashPattern.cc \
49
+ $(srcdir)/SplashScreen.cc \
50
+ $(srcdir)/SplashState.cc \
51
+ $(srcdir)/SplashT1Font.cc \
52
+ $(srcdir)/SplashT1FontEngine.cc \
53
+ $(srcdir)/SplashT1FontFile.cc \
54
+ $(srcdir)/SplashXPath.cc \
55
+ $(srcdir)/SplashXPathScanner.cc
56
+
57
+ #------------------------------------------------------------------------
58
+
59
+ all: $(LIBPREFIX)splash.a
60
+
61
+ #------------------------------------------------------------------------
62
+
63
+ SPLASH_OBJS = \
64
+ Splash.o \
65
+ SplashBitmap.o \
66
+ SplashClip.o \
67
+ SplashFTFont.o \
68
+ SplashFTFontEngine.o \
69
+ SplashFTFontFile.o \
70
+ SplashFont.o \
71
+ SplashFontEngine.o \
72
+ SplashFontFile.o \
73
+ SplashFontFileID.o \
74
+ SplashPath.o \
75
+ SplashPattern.o \
76
+ SplashScreen.o \
77
+ SplashState.o \
78
+ SplashT1Font.o \
79
+ SplashT1FontEngine.o \
80
+ SplashT1FontFile.o \
81
+ SplashXPath.o \
82
+ SplashXPathScanner.o
83
+
84
+ $(LIBPREFIX)splash.a: $(SPLASH_OBJS)
85
+ rm -f $(LIBPREFIX)splash.a
86
+ $(AR) $(LIBPREFIX)splash.a $(SPLASH_OBJS)
87
+ $(RANLIB) $(LIBPREFIX)splash.a
88
+
89
+ #------------------------------------------------------------------------
90
+ SPLASH_WINOBJS = libsplash.lib SplashBitmap.obj SplashFontFile.obj SplashFTFont.obj SplashScreen.obj SplashT1Font.obj \
91
+ SplashClip.obj SplashFont.obj Splash.obj SplashState.obj SplashXPath.obj \
92
+ SplashFontEngine.obj SplashFTFontEngine.obj SplashPath.obj SplashT1FontEngine.obj SplashXPathScanner.obj \
93
+ SplashFontFileID.obj SplashFTFontFile.obj SplashPattern.obj SplashT1FontFile.obj
94
+
95
+ clean:
96
+ rm -f $(SPLASH_OBJS) $(LIBPREFIX)splash.a $(SPLASH_WINOBJS)
97
+
98
+ #------------------------------------------------------------------------
99
+
100
+ depend:
101
+ $(CXX) $(CXXFLAGS) -MM $(CXX_SRC) >Makefile.dep
102
+
103
+ include Makefile.dep
@@ -0,0 +1,3310 @@
1
+ //========================================================================
2
+ //
3
+ // Splash.cc
4
+ //
5
+ //========================================================================
6
+
7
+ #include <aconf.h>
8
+
9
+ #ifdef USE_GCC_PRAGMAS
10
+ #pragma implementation
11
+ #endif
12
+
13
+ #include <stdlib.h>
14
+ #include <string.h>
15
+ #include "gmem.h"
16
+ #include "SplashErrorCodes.h"
17
+ #include "SplashMath.h"
18
+ #include "SplashBitmap.h"
19
+ #include "SplashState.h"
20
+ #include "SplashPath.h"
21
+ #include "SplashXPath.h"
22
+ #include "SplashXPathScanner.h"
23
+ #include "SplashPattern.h"
24
+ #include "SplashScreen.h"
25
+ #include "SplashFont.h"
26
+ #include "SplashGlyphBitmap.h"
27
+ #include "Splash.h"
28
+
29
+ //------------------------------------------------------------------------
30
+
31
+ // distance of Bezier control point from center for circle approximation
32
+ // = (4 * (sqrt(2) - 1) / 3) * r
33
+ #define bezierCircle ((SplashCoord)0.55228475)
34
+ #define bezierCircle2 ((SplashCoord)(0.5 * 0.55228475))
35
+
36
+ // Divide a 16-bit value (in [0, 255*255]) by 255, returning an 8-bit result.
37
+ static inline Guchar div255(int x) {
38
+ return (Guchar)((x + (x >> 8) + 0x80) >> 8);
39
+ }
40
+
41
+ //------------------------------------------------------------------------
42
+ // SplashPipe
43
+ //------------------------------------------------------------------------
44
+
45
+ #define splashPipeMaxStages 9
46
+
47
+ struct SplashPipe {
48
+ // pixel coordinates
49
+ int x, y;
50
+
51
+ // source pattern
52
+ SplashPattern *pattern;
53
+
54
+ // source alpha and color
55
+ SplashCoord aInput;
56
+ GBool usesShape;
57
+ Guchar aSrc;
58
+ SplashColorPtr cSrc;
59
+ SplashColor cSrcVal;
60
+
61
+ // non-isolated group alpha0
62
+ Guchar *alpha0Ptr;
63
+
64
+ // soft mask
65
+ SplashColorPtr softMaskPtr;
66
+
67
+ // destination alpha and color
68
+ SplashColorPtr destColorPtr;
69
+ int destColorMask;
70
+ Guchar *destAlphaPtr;
71
+
72
+ // shape
73
+ SplashCoord shape;
74
+
75
+ // result alpha and color
76
+ GBool noTransparency;
77
+ SplashPipeResultColorCtrl resultColorCtrl;
78
+
79
+ // non-isolated group correction
80
+ int nonIsolatedGroup;
81
+ };
82
+
83
+ SplashPipeResultColorCtrl Splash::pipeResultColorNoAlphaBlend[] = {
84
+ splashPipeResultColorNoAlphaBlendMono,
85
+ splashPipeResultColorNoAlphaBlendMono,
86
+ splashPipeResultColorNoAlphaBlendRGB,
87
+ splashPipeResultColorNoAlphaBlendRGB
88
+ #if SPLASH_CMYK
89
+ ,
90
+ splashPipeResultColorNoAlphaBlendCMYK
91
+ #endif
92
+ };
93
+
94
+ SplashPipeResultColorCtrl Splash::pipeResultColorAlphaNoBlend[] = {
95
+ splashPipeResultColorAlphaNoBlendMono,
96
+ splashPipeResultColorAlphaNoBlendMono,
97
+ splashPipeResultColorAlphaNoBlendRGB,
98
+ splashPipeResultColorAlphaNoBlendRGB
99
+ #if SPLASH_CMYK
100
+ ,
101
+ splashPipeResultColorAlphaNoBlendCMYK
102
+ #endif
103
+ };
104
+
105
+ SplashPipeResultColorCtrl Splash::pipeResultColorAlphaBlend[] = {
106
+ splashPipeResultColorAlphaBlendMono,
107
+ splashPipeResultColorAlphaBlendMono,
108
+ splashPipeResultColorAlphaBlendRGB,
109
+ splashPipeResultColorAlphaBlendRGB
110
+ #if SPLASH_CMYK
111
+ ,
112
+ splashPipeResultColorAlphaBlendCMYK
113
+ #endif
114
+ };
115
+
116
+ //------------------------------------------------------------------------
117
+
118
+ static void blendXor(SplashColorPtr src, SplashColorPtr dest,
119
+ SplashColorPtr blend, SplashColorMode cm) {
120
+ int i;
121
+
122
+ for (i = 0; i < splashColorModeNComps[cm]; ++i) {
123
+ blend[i] = src[i] ^ dest[i];
124
+ }
125
+ }
126
+
127
+ //------------------------------------------------------------------------
128
+ // modified region
129
+ //------------------------------------------------------------------------
130
+
131
+ void Splash::clearModRegion() {
132
+ modXMin = bitmap->getWidth();
133
+ modYMin = bitmap->getHeight();
134
+ modXMax = -1;
135
+ modYMax = -1;
136
+ }
137
+
138
+ inline void Splash::updateModX(int x) {
139
+ if (x < modXMin) {
140
+ modXMin = x;
141
+ }
142
+ if (x > modXMax) {
143
+ modXMax = x;
144
+ }
145
+ }
146
+
147
+ inline void Splash::updateModY(int y) {
148
+ if (y < modYMin) {
149
+ modYMin = y;
150
+ }
151
+ if (y > modYMax) {
152
+ modYMax = y;
153
+ }
154
+ }
155
+
156
+ //------------------------------------------------------------------------
157
+ // pipeline
158
+ //------------------------------------------------------------------------
159
+
160
+ inline void Splash::pipeInit(SplashPipe *pipe, int x, int y,
161
+ SplashPattern *pattern, SplashColorPtr cSrc,
162
+ SplashCoord aInput, GBool usesShape,
163
+ GBool nonIsolatedGroup) {
164
+ pipeSetXY(pipe, x, y);
165
+ pipe->pattern = NULL;
166
+
167
+ // source color
168
+ if (pattern) {
169
+ if (pattern->isStatic()) {
170
+ pattern->getColor(x, y, pipe->cSrcVal);
171
+ } else {
172
+ pipe->pattern = pattern;
173
+ }
174
+ pipe->cSrc = pipe->cSrcVal;
175
+ } else {
176
+ pipe->cSrc = cSrc;
177
+ }
178
+
179
+ // source alpha
180
+ pipe->aInput = aInput;
181
+ if (!state->softMask) {
182
+ if (usesShape) {
183
+ pipe->aInput *= 255;
184
+ } else {
185
+ pipe->aSrc = (Guchar)splashRound(pipe->aInput * 255);
186
+ }
187
+ }
188
+ pipe->usesShape = usesShape;
189
+
190
+ // result alpha
191
+ if (aInput == 1 && !state->softMask && !usesShape &&
192
+ !state->inNonIsolatedGroup) {
193
+ pipe->noTransparency = gTrue;
194
+ } else {
195
+ pipe->noTransparency = gFalse;
196
+ }
197
+
198
+ // result color
199
+ if (pipe->noTransparency) {
200
+ // the !state->blendFunc case is handled separately in pipeRun
201
+ pipe->resultColorCtrl = pipeResultColorNoAlphaBlend[bitmap->mode];
202
+ } else if (!state->blendFunc) {
203
+ pipe->resultColorCtrl = pipeResultColorAlphaNoBlend[bitmap->mode];
204
+ } else {
205
+ pipe->resultColorCtrl = pipeResultColorAlphaBlend[bitmap->mode];
206
+ }
207
+
208
+ // non-isolated group correction
209
+ if (nonIsolatedGroup) {
210
+ pipe->nonIsolatedGroup = splashColorModeNComps[bitmap->mode];
211
+ } else {
212
+ pipe->nonIsolatedGroup = 0;
213
+ }
214
+ }
215
+
216
+ inline void Splash::pipeRun(SplashPipe *pipe) {
217
+ Guchar aSrc, aDest, alpha2, alpha0, aResult;
218
+ SplashColor cDest, cBlend;
219
+ Guchar cResult0, cResult1, cResult2, cResult3;
220
+
221
+ //----- source color
222
+
223
+ // static pattern: handled in pipeInit
224
+ // fixed color: handled in pipeInit
225
+
226
+ // dynamic pattern
227
+ if (pipe->pattern) {
228
+ pipe->pattern->getColor(pipe->x, pipe->y, pipe->cSrcVal);
229
+ }
230
+
231
+ if (pipe->noTransparency && !state->blendFunc) {
232
+
233
+ //----- write destination pixel
234
+
235
+ switch (bitmap->mode) {
236
+ case splashModeMono1:
237
+ cResult0 = pipe->cSrc[0];
238
+ if (state->screen->test(pipe->x, pipe->y, cResult0)) {
239
+ *pipe->destColorPtr |= pipe->destColorMask;
240
+ } else {
241
+ *pipe->destColorPtr &= ~pipe->destColorMask;
242
+ }
243
+ if (!(pipe->destColorMask >>= 1)) {
244
+ pipe->destColorMask = 0x80;
245
+ ++pipe->destColorPtr;
246
+ }
247
+ break;
248
+ case splashModeMono8:
249
+ *pipe->destColorPtr++ = pipe->cSrc[0];
250
+ break;
251
+ case splashModeRGB8:
252
+ *pipe->destColorPtr++ = pipe->cSrc[0];
253
+ *pipe->destColorPtr++ = pipe->cSrc[1];
254
+ *pipe->destColorPtr++ = pipe->cSrc[2];
255
+ break;
256
+ case splashModeBGR8:
257
+ *pipe->destColorPtr++ = pipe->cSrc[2];
258
+ *pipe->destColorPtr++ = pipe->cSrc[1];
259
+ *pipe->destColorPtr++ = pipe->cSrc[0];
260
+ break;
261
+ #if SPLASH_CMYK
262
+ case splashModeCMYK8:
263
+ *pipe->destColorPtr++ = pipe->cSrc[0];
264
+ *pipe->destColorPtr++ = pipe->cSrc[1];
265
+ *pipe->destColorPtr++ = pipe->cSrc[2];
266
+ *pipe->destColorPtr++ = pipe->cSrc[3];
267
+ break;
268
+ #endif
269
+ }
270
+ if (pipe->destAlphaPtr) {
271
+ *pipe->destAlphaPtr++ = 255;
272
+ }
273
+
274
+ } else {
275
+
276
+ //----- read destination pixel
277
+
278
+ switch (bitmap->mode) {
279
+ case splashModeMono1:
280
+ cDest[0] = (*pipe->destColorPtr & pipe->destColorMask) ? 0xff : 0x00;
281
+ break;
282
+ case splashModeMono8:
283
+ cDest[0] = *pipe->destColorPtr;
284
+ break;
285
+ case splashModeRGB8:
286
+ cDest[0] = pipe->destColorPtr[0];
287
+ cDest[1] = pipe->destColorPtr[1];
288
+ cDest[2] = pipe->destColorPtr[2];
289
+ break;
290
+ case splashModeBGR8:
291
+ cDest[0] = pipe->destColorPtr[2];
292
+ cDest[1] = pipe->destColorPtr[1];
293
+ cDest[2] = pipe->destColorPtr[0];
294
+ break;
295
+ #if SPLASH_CMYK
296
+ case splashModeCMYK8:
297
+ cDest[0] = pipe->destColorPtr[0];
298
+ cDest[1] = pipe->destColorPtr[1];
299
+ cDest[2] = pipe->destColorPtr[2];
300
+ cDest[3] = pipe->destColorPtr[3];
301
+ break;
302
+ #endif
303
+ }
304
+ if (pipe->destAlphaPtr) {
305
+ aDest = *pipe->destAlphaPtr;
306
+ } else {
307
+ aDest = 0xff;
308
+ }
309
+
310
+ //----- blend function
311
+
312
+ if (state->blendFunc) {
313
+ (*state->blendFunc)(pipe->cSrc, cDest, cBlend, bitmap->mode);
314
+ }
315
+
316
+ //----- source alpha
317
+
318
+ if (state->softMask) {
319
+ if (pipe->usesShape) {
320
+ aSrc = (Guchar)splashRound(pipe->aInput * *pipe->softMaskPtr++
321
+ * pipe->shape);
322
+ } else {
323
+ aSrc = (Guchar)splashRound(pipe->aInput * *pipe->softMaskPtr++);
324
+ }
325
+ } else if (pipe->usesShape) {
326
+ // pipe->aInput is premultiplied by 255 in pipeInit
327
+ aSrc = (Guchar)splashRound(pipe->aInput * pipe->shape);
328
+ } else {
329
+ // precomputed in pipeInit
330
+ aSrc = pipe->aSrc;
331
+ }
332
+
333
+ //----- result alpha and non-isolated group element correction
334
+
335
+ if (pipe->noTransparency) {
336
+ alpha2 = aResult = 255;
337
+ } else {
338
+ aResult = aSrc + aDest - div255(aSrc * aDest);
339
+
340
+ if (pipe->alpha0Ptr) {
341
+ alpha0 = *pipe->alpha0Ptr++;
342
+ alpha2 = aResult + alpha0 - div255(aResult * alpha0);
343
+ } else {
344
+ alpha2 = aResult;
345
+ }
346
+ }
347
+
348
+ //----- result color
349
+
350
+ cResult0 = cResult1 = cResult2 = cResult3 = 0; // make gcc happy
351
+
352
+ switch (pipe->resultColorCtrl) {
353
+
354
+ #if SPLASH_CMYK
355
+ case splashPipeResultColorNoAlphaBlendCMYK:
356
+ cResult3 = div255((255 - aDest) * pipe->cSrc[3] + aDest * cBlend[3]);
357
+ #endif
358
+ case splashPipeResultColorNoAlphaBlendRGB:
359
+ cResult2 = div255((255 - aDest) * pipe->cSrc[2] + aDest * cBlend[2]);
360
+ cResult1 = div255((255 - aDest) * pipe->cSrc[1] + aDest * cBlend[1]);
361
+ case splashPipeResultColorNoAlphaBlendMono:
362
+ cResult0 = div255((255 - aDest) * pipe->cSrc[0] + aDest * cBlend[0]);
363
+ break;
364
+
365
+ case splashPipeResultColorAlphaNoBlendMono:
366
+ if (alpha2 == 0) {
367
+ cResult0 = 0;
368
+ } else {
369
+ cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] +
370
+ aSrc * pipe->cSrc[0]) / alpha2);
371
+ }
372
+ break;
373
+ case splashPipeResultColorAlphaNoBlendRGB:
374
+ if (alpha2 == 0) {
375
+ cResult0 = 0;
376
+ cResult1 = 0;
377
+ cResult2 = 0;
378
+ } else {
379
+ cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] +
380
+ aSrc * pipe->cSrc[0]) / alpha2);
381
+ cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] +
382
+ aSrc * pipe->cSrc[1]) / alpha2);
383
+ cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] +
384
+ aSrc * pipe->cSrc[2]) / alpha2);
385
+ }
386
+ break;
387
+ #if SPLASH_CMYK
388
+ case splashPipeResultColorAlphaNoBlendCMYK:
389
+ if (alpha2 == 0) {
390
+ cResult0 = 0;
391
+ cResult1 = 0;
392
+ cResult2 = 0;
393
+ cResult3 = 0;
394
+ } else {
395
+ cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] +
396
+ aSrc * pipe->cSrc[0]) / alpha2);
397
+ cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] +
398
+ aSrc * pipe->cSrc[1]) / alpha2);
399
+ cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] +
400
+ aSrc * pipe->cSrc[2]) / alpha2);
401
+ cResult3 = (Guchar)(((alpha2 - aSrc) * cDest[3] +
402
+ aSrc * pipe->cSrc[3]) / alpha2);
403
+ }
404
+ break;
405
+ #endif
406
+
407
+ case splashPipeResultColorAlphaBlendMono:
408
+ if (alpha2 == 0) {
409
+ cResult0 = 0;
410
+ } else {
411
+ cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] +
412
+ aSrc * ((255 - aDest) * pipe->cSrc[0] +
413
+ aDest * cBlend[0]) / 255) /
414
+ alpha2);
415
+ }
416
+ break;
417
+ case splashPipeResultColorAlphaBlendRGB:
418
+ if (alpha2 == 0) {
419
+ cResult0 = 0;
420
+ cResult1 = 0;
421
+ cResult2 = 0;
422
+ } else {
423
+ cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] +
424
+ aSrc * ((255 - aDest) * pipe->cSrc[0] +
425
+ aDest * cBlend[0]) / 255) /
426
+ alpha2);
427
+ cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] +
428
+ aSrc * ((255 - aDest) * pipe->cSrc[1] +
429
+ aDest * cBlend[1]) / 255) /
430
+ alpha2);
431
+ cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] +
432
+ aSrc * ((255 - aDest) * pipe->cSrc[2] +
433
+ aDest * cBlend[2]) / 255) /
434
+ alpha2);
435
+ }
436
+ break;
437
+ #if SPLASH_CMYK
438
+ case splashPipeResultColorAlphaBlendCMYK:
439
+ if (alpha2 == 0) {
440
+ cResult0 = 0;
441
+ cResult1 = 0;
442
+ cResult2 = 0;
443
+ cResult3 = 0;
444
+ } else {
445
+ cResult0 = (Guchar)(((alpha2 - aSrc) * cDest[0] +
446
+ aSrc * ((255 - aDest) * pipe->cSrc[0] +
447
+ aDest * cBlend[0]) / 255) /
448
+ alpha2);
449
+ cResult1 = (Guchar)(((alpha2 - aSrc) * cDest[1] +
450
+ aSrc * ((255 - aDest) * pipe->cSrc[1] +
451
+ aDest * cBlend[1]) / 255) /
452
+ alpha2);
453
+ cResult2 = (Guchar)(((alpha2 - aSrc) * cDest[2] +
454
+ aSrc * ((255 - aDest) * pipe->cSrc[2] +
455
+ aDest * cBlend[2]) / 255) /
456
+ alpha2);
457
+ cResult3 = (Guchar)(((alpha2 - aSrc) * cDest[3] +
458
+ aSrc * ((255 - aDest) * pipe->cSrc[3] +
459
+ aDest * cBlend[3]) / 255) /
460
+ alpha2);
461
+ }
462
+ break;
463
+ #endif
464
+ }
465
+
466
+ //----- non-isolated group correction
467
+
468
+ if (aResult != 0) {
469
+ switch (pipe->nonIsolatedGroup) {
470
+ #if SPLASH_CMYK
471
+ case 4:
472
+ cResult3 += (cResult3 - cDest[3]) * aDest *
473
+ (255 - aResult) / (255 * aResult);
474
+ #endif
475
+ case 3:
476
+ cResult2 += (cResult2 - cDest[2]) * aDest *
477
+ (255 - aResult) / (255 * aResult);
478
+ cResult1 += (cResult1 - cDest[1]) * aDest *
479
+ (255 - aResult) / (255 * aResult);
480
+ case 1:
481
+ cResult0 += (cResult0 - cDest[0]) * aDest *
482
+ (255 - aResult) / (255 * aResult);
483
+ case 0:
484
+ break;
485
+ }
486
+ }
487
+
488
+ //----- write destination pixel
489
+
490
+ switch (bitmap->mode) {
491
+ case splashModeMono1:
492
+ if (state->screen->test(pipe->x, pipe->y, cResult0)) {
493
+ *pipe->destColorPtr |= pipe->destColorMask;
494
+ } else {
495
+ *pipe->destColorPtr &= ~pipe->destColorMask;
496
+ }
497
+ if (!(pipe->destColorMask >>= 1)) {
498
+ pipe->destColorMask = 0x80;
499
+ ++pipe->destColorPtr;
500
+ }
501
+ break;
502
+ case splashModeMono8:
503
+ *pipe->destColorPtr++ = cResult0;
504
+ break;
505
+ case splashModeRGB8:
506
+ *pipe->destColorPtr++ = cResult0;
507
+ *pipe->destColorPtr++ = cResult1;
508
+ *pipe->destColorPtr++ = cResult2;
509
+ break;
510
+ case splashModeBGR8:
511
+ *pipe->destColorPtr++ = cResult2;
512
+ *pipe->destColorPtr++ = cResult1;
513
+ *pipe->destColorPtr++ = cResult0;
514
+ break;
515
+ #if SPLASH_CMYK
516
+ case splashModeCMYK8:
517
+ *pipe->destColorPtr++ = cResult0;
518
+ *pipe->destColorPtr++ = cResult1;
519
+ *pipe->destColorPtr++ = cResult2;
520
+ *pipe->destColorPtr++ = cResult3;
521
+ break;
522
+ #endif
523
+ }
524
+ if (pipe->destAlphaPtr) {
525
+ *pipe->destAlphaPtr++ = aResult;
526
+ }
527
+
528
+ }
529
+
530
+ ++pipe->x;
531
+ }
532
+
533
+ inline void Splash::pipeSetXY(SplashPipe *pipe, int x, int y) {
534
+ pipe->x = x;
535
+ pipe->y = y;
536
+ if (state->softMask) {
537
+ pipe->softMaskPtr =
538
+ &state->softMask->data[y * state->softMask->rowSize + x];
539
+ }
540
+ switch (bitmap->mode) {
541
+ case splashModeMono1:
542
+ pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + (x >> 3)];
543
+ pipe->destColorMask = 0x80 >> (x & 7);
544
+ break;
545
+ case splashModeMono8:
546
+ pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + x];
547
+ break;
548
+ case splashModeRGB8:
549
+ case splashModeBGR8:
550
+ pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 3 * x];
551
+ break;
552
+ #if SPLASH_CMYK
553
+ case splashModeCMYK8:
554
+ pipe->destColorPtr = &bitmap->data[y * bitmap->rowSize + 4 * x];
555
+ break;
556
+ #endif
557
+ }
558
+ if (bitmap->alpha) {
559
+ pipe->destAlphaPtr = &bitmap->alpha[y * bitmap->width + x];
560
+ } else {
561
+ pipe->destAlphaPtr = NULL;
562
+ }
563
+ if (state->inNonIsolatedGroup && alpha0Bitmap->alpha) {
564
+ pipe->alpha0Ptr =
565
+ &alpha0Bitmap->alpha[(alpha0Y + y) * alpha0Bitmap->width +
566
+ (alpha0X + x)];
567
+ } else {
568
+ pipe->alpha0Ptr = NULL;
569
+ }
570
+ }
571
+
572
+ inline void Splash::pipeIncX(SplashPipe *pipe) {
573
+ ++pipe->x;
574
+ if (state->softMask) {
575
+ ++pipe->softMaskPtr;
576
+ }
577
+ switch (bitmap->mode) {
578
+ case splashModeMono1:
579
+ if (!(pipe->destColorMask >>= 1)) {
580
+ pipe->destColorMask = 0x80;
581
+ ++pipe->destColorPtr;
582
+ }
583
+ break;
584
+ case splashModeMono8:
585
+ ++pipe->destColorPtr;
586
+ break;
587
+ case splashModeRGB8:
588
+ case splashModeBGR8:
589
+ pipe->destColorPtr += 3;
590
+ break;
591
+ #if SPLASH_CMYK
592
+ case splashModeCMYK8:
593
+ pipe->destColorPtr += 4;
594
+ break;
595
+ #endif
596
+ }
597
+ if (pipe->destAlphaPtr) {
598
+ ++pipe->destAlphaPtr;
599
+ }
600
+ if (pipe->alpha0Ptr) {
601
+ ++pipe->alpha0Ptr;
602
+ }
603
+ }
604
+
605
+ inline void Splash::drawPixel(SplashPipe *pipe, int x, int y, GBool noClip) {
606
+ if (noClip || state->clip->test(x, y)) {
607
+ pipeSetXY(pipe, x, y);
608
+ pipeRun(pipe);
609
+ updateModX(x);
610
+ updateModY(y);
611
+ }
612
+ }
613
+
614
+ inline void Splash::drawAAPixelInit() {
615
+ aaBufY = -1;
616
+ }
617
+
618
+ inline void Splash::drawAAPixel(SplashPipe *pipe, int x, int y) {
619
+ #if splashAASize == 4
620
+ static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3,
621
+ 1, 2, 2, 3, 2, 3, 3, 4 };
622
+ int w;
623
+ #else
624
+ int xx, yy;
625
+ #endif
626
+ SplashColorPtr p;
627
+ int x0, x1, t;
628
+
629
+ if (x < 0 || x >= bitmap->width ||
630
+ y < state->clip->getYMinI() || y > state->clip->getYMaxI()) {
631
+ return;
632
+ }
633
+
634
+ // update aaBuf
635
+ if (y != aaBufY) {
636
+ memset(aaBuf->getDataPtr(), 0xff,
637
+ aaBuf->getRowSize() * aaBuf->getHeight());
638
+ x0 = 0;
639
+ x1 = bitmap->width - 1;
640
+ state->clip->clipAALine(aaBuf, &x0, &x1, y);
641
+ aaBufY = y;
642
+ }
643
+
644
+ // compute the shape value
645
+ #if splashAASize == 4
646
+ p = aaBuf->getDataPtr() + (x >> 1);
647
+ w = aaBuf->getRowSize();
648
+ if (x & 1) {
649
+ t = bitCount4[*p & 0x0f] + bitCount4[p[w] & 0x0f] +
650
+ bitCount4[p[2*w] & 0x0f] + bitCount4[p[3*w] & 0x0f];
651
+ } else {
652
+ t = bitCount4[*p >> 4] + bitCount4[p[w] >> 4] +
653
+ bitCount4[p[2*w] >> 4] + bitCount4[p[3*w] >> 4];
654
+ }
655
+ #else
656
+ t = 0;
657
+ for (yy = 0; yy < splashAASize; ++yy) {
658
+ for (xx = 0; xx < splashAASize; ++xx) {
659
+ p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() +
660
+ ((x * splashAASize + xx) >> 3);
661
+ t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1;
662
+ }
663
+ }
664
+ #endif
665
+
666
+ // draw the pixel
667
+ if (t != 0) {
668
+ pipeSetXY(pipe, x, y);
669
+ pipe->shape *= aaGamma[t];
670
+ pipeRun(pipe);
671
+ updateModX(x);
672
+ updateModY(y);
673
+ }
674
+ }
675
+
676
+ inline void Splash::drawSpan(SplashPipe *pipe, int x0, int x1, int y,
677
+ GBool noClip) {
678
+ int x;
679
+
680
+ pipeSetXY(pipe, x0, y);
681
+ if (noClip) {
682
+ for (x = x0; x <= x1; ++x) {
683
+ pipeRun(pipe);
684
+ }
685
+ updateModX(x0);
686
+ updateModX(x1);
687
+ updateModY(y);
688
+ } else {
689
+ for (x = x0; x <= x1; ++x) {
690
+ if (state->clip->test(x, y)) {
691
+ pipeRun(pipe);
692
+ updateModX(x);
693
+ updateModY(y);
694
+ } else {
695
+ pipeIncX(pipe);
696
+ }
697
+ }
698
+ }
699
+ }
700
+
701
+ inline void Splash::drawAALine(SplashPipe *pipe, int x0, int x1, int y) {
702
+ #if splashAASize == 4
703
+ static int bitCount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3,
704
+ 1, 2, 2, 3, 2, 3, 3, 4 };
705
+ SplashColorPtr p0, p1, p2, p3;
706
+ int t;
707
+ #else
708
+ SplashColorPtr p;
709
+ int xx, yy, t;
710
+ #endif
711
+ int x;
712
+
713
+ #if splashAASize == 4
714
+ p0 = aaBuf->getDataPtr() + (x0 >> 1);
715
+ p1 = p0 + aaBuf->getRowSize();
716
+ p2 = p1 + aaBuf->getRowSize();
717
+ p3 = p2 + aaBuf->getRowSize();
718
+ #endif
719
+ pipeSetXY(pipe, x0, y);
720
+ for (x = x0; x <= x1; ++x) {
721
+
722
+ // compute the shape value
723
+ #if splashAASize == 4
724
+ if (x & 1) {
725
+ t = bitCount4[*p0 & 0x0f] + bitCount4[*p1 & 0x0f] +
726
+ bitCount4[*p2 & 0x0f] + bitCount4[*p3 & 0x0f];
727
+ ++p0; ++p1; ++p2; ++p3;
728
+ } else {
729
+ t = bitCount4[*p0 >> 4] + bitCount4[*p1 >> 4] +
730
+ bitCount4[*p2 >> 4] + bitCount4[*p3 >> 4];
731
+ }
732
+ #else
733
+ t = 0;
734
+ for (yy = 0; yy < splashAASize; ++yy) {
735
+ for (xx = 0; xx < splashAASize; ++xx) {
736
+ p = aaBuf->getDataPtr() + yy * aaBuf->getRowSize() +
737
+ ((x * splashAASize + xx) >> 3);
738
+ t += (*p >> (7 - ((x * splashAASize + xx) & 7))) & 1;
739
+ }
740
+ }
741
+ #endif
742
+
743
+ if (t != 0) {
744
+ pipe->shape = aaGamma[t];
745
+ pipeRun(pipe);
746
+ updateModX(x);
747
+ updateModY(y);
748
+ } else {
749
+ pipeIncX(pipe);
750
+ }
751
+ }
752
+ }
753
+
754
+ //------------------------------------------------------------------------
755
+
756
+ // Transform a point from user space to device space.
757
+ inline void Splash::transform(SplashCoord *matrix,
758
+ SplashCoord xi, SplashCoord yi,
759
+ SplashCoord *xo, SplashCoord *yo) {
760
+ // [ m[0] m[1] 0 ]
761
+ // [xo yo 1] = [xi yi 1] * [ m[2] m[3] 0 ]
762
+ // [ m[4] m[5] 1 ]
763
+ *xo = xi * matrix[0] + yi * matrix[2] + matrix[4];
764
+ *yo = xi * matrix[1] + yi * matrix[3] + matrix[5];
765
+ }
766
+
767
+ //------------------------------------------------------------------------
768
+ // Splash
769
+ //------------------------------------------------------------------------
770
+
771
+ Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA,
772
+ SplashScreenParams *screenParams) {
773
+ int i;
774
+
775
+ bitmap = bitmapA;
776
+ vectorAntialias = vectorAntialiasA;
777
+ state = new SplashState(bitmap->width, bitmap->height, vectorAntialias,
778
+ screenParams);
779
+ if (vectorAntialias) {
780
+ aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize,
781
+ 1, splashModeMono1, gFalse);
782
+ for (i = 0; i <= splashAASize * splashAASize; ++i) {
783
+ aaGamma[i] = splashPow((SplashCoord)i /
784
+ (SplashCoord)(splashAASize * splashAASize),
785
+ 1.5);
786
+ }
787
+ } else {
788
+ aaBuf = NULL;
789
+ }
790
+ clearModRegion();
791
+ debugMode = gFalse;
792
+ }
793
+
794
+ Splash::Splash(SplashBitmap *bitmapA, GBool vectorAntialiasA,
795
+ SplashScreen *screenA) {
796
+ int i;
797
+
798
+ bitmap = bitmapA;
799
+ vectorAntialias = vectorAntialiasA;
800
+ state = new SplashState(bitmap->width, bitmap->height, vectorAntialias,
801
+ screenA);
802
+ if (vectorAntialias) {
803
+ aaBuf = new SplashBitmap(splashAASize * bitmap->width, splashAASize,
804
+ 1, splashModeMono1, gFalse);
805
+ for (i = 0; i <= splashAASize * splashAASize; ++i) {
806
+ aaGamma[i] = splashPow((SplashCoord)i /
807
+ (SplashCoord)(splashAASize * splashAASize),
808
+ 1.5);
809
+ }
810
+ } else {
811
+ aaBuf = NULL;
812
+ }
813
+ clearModRegion();
814
+ debugMode = gFalse;
815
+ }
816
+
817
+ Splash::~Splash() {
818
+ while (state->next) {
819
+ restoreState();
820
+ }
821
+ delete state;
822
+ if (vectorAntialias) {
823
+ delete aaBuf;
824
+ }
825
+ }
826
+
827
+ //------------------------------------------------------------------------
828
+ // state read
829
+ //------------------------------------------------------------------------
830
+
831
+ SplashCoord *Splash::getMatrix() {
832
+ return state->matrix;
833
+ }
834
+
835
+ SplashPattern *Splash::getStrokePattern() {
836
+ return state->strokePattern;
837
+ }
838
+
839
+ SplashPattern *Splash::getFillPattern() {
840
+ return state->fillPattern;
841
+ }
842
+
843
+ SplashScreen *Splash::getScreen() {
844
+ return state->screen;
845
+ }
846
+
847
+ SplashBlendFunc Splash::getBlendFunc() {
848
+ return state->blendFunc;
849
+ }
850
+
851
+ SplashCoord Splash::getStrokeAlpha() {
852
+ return state->strokeAlpha;
853
+ }
854
+
855
+ SplashCoord Splash::getFillAlpha() {
856
+ return state->fillAlpha;
857
+ }
858
+
859
+ SplashCoord Splash::getLineWidth() {
860
+ return state->lineWidth;
861
+ }
862
+
863
+ int Splash::getLineCap() {
864
+ return state->lineCap;
865
+ }
866
+
867
+ int Splash::getLineJoin() {
868
+ return state->lineJoin;
869
+ }
870
+
871
+ SplashCoord Splash::getMiterLimit() {
872
+ return state->miterLimit;
873
+ }
874
+
875
+ SplashCoord Splash::getFlatness() {
876
+ return state->flatness;
877
+ }
878
+
879
+ SplashCoord *Splash::getLineDash() {
880
+ return state->lineDash;
881
+ }
882
+
883
+ int Splash::getLineDashLength() {
884
+ return state->lineDashLength;
885
+ }
886
+
887
+ SplashCoord Splash::getLineDashPhase() {
888
+ return state->lineDashPhase;
889
+ }
890
+
891
+ SplashClip *Splash::getClip() {
892
+ return state->clip;
893
+ }
894
+
895
+ SplashBitmap *Splash::getSoftMask() {
896
+ return state->softMask;
897
+ }
898
+
899
+ GBool Splash::getInNonIsolatedGroup() {
900
+ return state->inNonIsolatedGroup;
901
+ }
902
+
903
+ //------------------------------------------------------------------------
904
+ // state write
905
+ //------------------------------------------------------------------------
906
+
907
+ void Splash::setMatrix(SplashCoord *matrix) {
908
+ memcpy(state->matrix, matrix, 6 * sizeof(SplashCoord));
909
+ }
910
+
911
+ void Splash::setStrokePattern(SplashPattern *strokePattern) {
912
+ state->setStrokePattern(strokePattern);
913
+ }
914
+
915
+ void Splash::setFillPattern(SplashPattern *fillPattern) {
916
+ state->setFillPattern(fillPattern);
917
+ }
918
+
919
+ void Splash::setScreen(SplashScreen *screen) {
920
+ state->setScreen(screen);
921
+ }
922
+
923
+ void Splash::setBlendFunc(SplashBlendFunc func) {
924
+ state->blendFunc = func;
925
+ }
926
+
927
+ void Splash::setStrokeAlpha(SplashCoord alpha) {
928
+ state->strokeAlpha = alpha;
929
+ }
930
+
931
+ void Splash::setFillAlpha(SplashCoord alpha) {
932
+ state->fillAlpha = alpha;
933
+ }
934
+
935
+ void Splash::setLineWidth(SplashCoord lineWidth) {
936
+ state->lineWidth = lineWidth;
937
+ }
938
+
939
+ void Splash::setLineCap(int lineCap) {
940
+ state->lineCap = lineCap;
941
+ }
942
+
943
+ void Splash::setLineJoin(int lineJoin) {
944
+ state->lineJoin = lineJoin;
945
+ }
946
+
947
+ void Splash::setMiterLimit(SplashCoord miterLimit) {
948
+ state->miterLimit = miterLimit;
949
+ }
950
+
951
+ void Splash::setFlatness(SplashCoord flatness) {
952
+ if (flatness < 1) {
953
+ state->flatness = 1;
954
+ } else {
955
+ state->flatness = flatness;
956
+ }
957
+ }
958
+
959
+ void Splash::setLineDash(SplashCoord *lineDash, int lineDashLength,
960
+ SplashCoord lineDashPhase) {
961
+ state->setLineDash(lineDash, lineDashLength, lineDashPhase);
962
+ }
963
+
964
+ void Splash::setStrokeAdjust(GBool strokeAdjust) {
965
+ state->strokeAdjust = strokeAdjust;
966
+ }
967
+
968
+ void Splash::clipResetToRect(SplashCoord x0, SplashCoord y0,
969
+ SplashCoord x1, SplashCoord y1) {
970
+ state->clip->resetToRect(x0, y0, x1, y1);
971
+ }
972
+
973
+ SplashError Splash::clipToRect(SplashCoord x0, SplashCoord y0,
974
+ SplashCoord x1, SplashCoord y1) {
975
+ return state->clip->clipToRect(x0, y0, x1, y1);
976
+ }
977
+
978
+ SplashError Splash::clipToPath(SplashPath *path, GBool eo) {
979
+ return state->clip->clipToPath(path, state->matrix, state->flatness, eo);
980
+ }
981
+
982
+ void Splash::setSoftMask(SplashBitmap *softMask) {
983
+ state->setSoftMask(softMask);
984
+ }
985
+
986
+ void Splash::setInNonIsolatedGroup(SplashBitmap *alpha0BitmapA,
987
+ int alpha0XA, int alpha0YA) {
988
+ alpha0Bitmap = alpha0BitmapA;
989
+ alpha0X = alpha0XA;
990
+ alpha0Y = alpha0YA;
991
+ state->inNonIsolatedGroup = gTrue;
992
+ }
993
+
994
+ //------------------------------------------------------------------------
995
+ // state save/restore
996
+ //------------------------------------------------------------------------
997
+
998
+ void Splash::saveState() {
999
+ SplashState *newState;
1000
+
1001
+ newState = state->copy();
1002
+ newState->next = state;
1003
+ state = newState;
1004
+ }
1005
+
1006
+ SplashError Splash::restoreState() {
1007
+ SplashState *oldState;
1008
+
1009
+ if (!state->next) {
1010
+ return splashErrNoSave;
1011
+ }
1012
+ oldState = state;
1013
+ state = state->next;
1014
+ delete oldState;
1015
+ return splashOk;
1016
+ }
1017
+
1018
+ //------------------------------------------------------------------------
1019
+ // drawing operations
1020
+ //------------------------------------------------------------------------
1021
+
1022
+ void Splash::clear(SplashColorPtr color, Guchar alpha) {
1023
+ SplashColorPtr row, p;
1024
+ Guchar mono;
1025
+ int x, y;
1026
+
1027
+ switch (bitmap->mode) {
1028
+ case splashModeMono1:
1029
+ mono = (color[0] & 0x80) ? 0xff : 0x00;
1030
+ if (bitmap->rowSize < 0) {
1031
+ memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
1032
+ mono, -bitmap->rowSize * bitmap->height);
1033
+ } else {
1034
+ memset(bitmap->data, mono, bitmap->rowSize * bitmap->height);
1035
+ }
1036
+ break;
1037
+ case splashModeMono8:
1038
+ if (bitmap->rowSize < 0) {
1039
+ memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
1040
+ color[0], -bitmap->rowSize * bitmap->height);
1041
+ } else {
1042
+ memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height);
1043
+ }
1044
+ break;
1045
+ case splashModeRGB8:
1046
+ if (color[0] == color[1] && color[1] == color[2]) {
1047
+ if (bitmap->rowSize < 0) {
1048
+ memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
1049
+ color[0], -bitmap->rowSize * bitmap->height);
1050
+ } else {
1051
+ memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height);
1052
+ }
1053
+ } else {
1054
+ row = bitmap->data;
1055
+ for (y = 0; y < bitmap->height; ++y) {
1056
+ p = row;
1057
+ for (x = 0; x < bitmap->width; ++x) {
1058
+ *p++ = color[2];
1059
+ *p++ = color[1];
1060
+ *p++ = color[0];
1061
+ }
1062
+ row += bitmap->rowSize;
1063
+ }
1064
+ }
1065
+ break;
1066
+ case splashModeBGR8:
1067
+ if (color[0] == color[1] && color[1] == color[2]) {
1068
+ if (bitmap->rowSize < 0) {
1069
+ memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
1070
+ color[0], -bitmap->rowSize * bitmap->height);
1071
+ } else {
1072
+ memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height);
1073
+ }
1074
+ } else {
1075
+ row = bitmap->data;
1076
+ for (y = 0; y < bitmap->height; ++y) {
1077
+ p = row;
1078
+ for (x = 0; x < bitmap->width; ++x) {
1079
+ *p++ = color[0];
1080
+ *p++ = color[1];
1081
+ *p++ = color[2];
1082
+ }
1083
+ row += bitmap->rowSize;
1084
+ }
1085
+ }
1086
+ break;
1087
+ #if SPLASH_CMYK
1088
+ case splashModeCMYK8:
1089
+ if (color[0] == color[1] && color[1] == color[2] && color[2] == color[3]) {
1090
+ if (bitmap->rowSize < 0) {
1091
+ memset(bitmap->data + bitmap->rowSize * (bitmap->height - 1),
1092
+ color[0], -bitmap->rowSize * bitmap->height);
1093
+ } else {
1094
+ memset(bitmap->data, color[0], bitmap->rowSize * bitmap->height);
1095
+ }
1096
+ } else {
1097
+ row = bitmap->data;
1098
+ for (y = 0; y < bitmap->height; ++y) {
1099
+ p = row;
1100
+ for (x = 0; x < bitmap->width; ++x) {
1101
+ *p++ = color[0];
1102
+ *p++ = color[1];
1103
+ *p++ = color[2];
1104
+ *p++ = color[3];
1105
+ }
1106
+ row += bitmap->rowSize;
1107
+ }
1108
+ }
1109
+ break;
1110
+ #endif
1111
+ }
1112
+
1113
+ if (bitmap->alpha) {
1114
+ memset(bitmap->alpha, alpha, bitmap->width * bitmap->height);
1115
+ }
1116
+
1117
+ updateModX(0);
1118
+ updateModY(0);
1119
+ updateModX(bitmap->width - 1);
1120
+ updateModY(bitmap->height - 1);
1121
+ }
1122
+
1123
+ SplashError Splash::stroke(SplashPath *path) {
1124
+ SplashPath *path2, *dPath;
1125
+
1126
+ if (debugMode) {
1127
+ printf("stroke [dash:%d] [width:%.2f]:\n",
1128
+ state->lineDashLength, (double)state->lineWidth);
1129
+ dumpPath(path);
1130
+ }
1131
+ opClipRes = splashClipAllOutside;
1132
+ if (path->length == 0) {
1133
+ return splashErrEmptyPath;
1134
+ }
1135
+ path2 = flattenPath(path, state->matrix, state->flatness);
1136
+ if (state->lineDashLength > 0) {
1137
+ dPath = makeDashedPath(path2);
1138
+ delete path2;
1139
+ path2 = dPath;
1140
+ }
1141
+ if (state->lineWidth == 0) {
1142
+ strokeNarrow(path2);
1143
+ } else {
1144
+ strokeWide(path2);
1145
+ }
1146
+ delete path2;
1147
+ return splashOk;
1148
+ }
1149
+
1150
+ void Splash::strokeNarrow(SplashPath *path) {
1151
+ SplashPipe pipe;
1152
+ SplashXPath *xPath;
1153
+ SplashXPathSeg *seg;
1154
+ int x0, x1, x2, x3, y0, y1, x, y, t;
1155
+ SplashCoord dx, dy, dxdy;
1156
+ SplashClipResult clipRes;
1157
+ int nClipRes[3];
1158
+ int i;
1159
+
1160
+ nClipRes[0] = nClipRes[1] = nClipRes[2] = 0;
1161
+
1162
+ xPath = new SplashXPath(path, state->matrix, state->flatness, gFalse);
1163
+
1164
+ pipeInit(&pipe, 0, 0, state->strokePattern, NULL, state->strokeAlpha,
1165
+ gFalse, gFalse);
1166
+
1167
+ for (i = 0, seg = xPath->segs; i < xPath->length; ++i, ++seg) {
1168
+
1169
+ x0 = splashFloor(seg->x0);
1170
+ x1 = splashFloor(seg->x1);
1171
+ y0 = splashFloor(seg->y0);
1172
+ y1 = splashFloor(seg->y1);
1173
+
1174
+ // horizontal segment
1175
+ if (y0 == y1) {
1176
+ if (x0 > x1) {
1177
+ t = x0; x0 = x1; x1 = t;
1178
+ }
1179
+ if ((clipRes = state->clip->testSpan(x0, x1, y0))
1180
+ != splashClipAllOutside) {
1181
+ drawSpan(&pipe, x0, x1, y0, clipRes == splashClipAllInside);
1182
+ }
1183
+
1184
+ // segment with |dx| > |dy|
1185
+ } else if (splashAbs(seg->dxdy) > 1) {
1186
+ dx = seg->x1 - seg->x0;
1187
+ dy = seg->y1 - seg->y0;
1188
+ dxdy = seg->dxdy;
1189
+ if (y0 > y1) {
1190
+ t = y0; y0 = y1; y1 = t;
1191
+ t = x0; x0 = x1; x1 = t;
1192
+ dx = -dx;
1193
+ dy = -dy;
1194
+ }
1195
+ if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0,
1196
+ x0 <= x1 ? x1 : x0, y1))
1197
+ != splashClipAllOutside) {
1198
+ if (dx > 0) {
1199
+ x2 = x0;
1200
+ x3 = splashFloor(seg->x0 + ((SplashCoord)y0 + 1 - seg->y0) * dxdy);
1201
+ drawSpan(&pipe, x2, (x2 <= x3 - 1) ? x3 - 1 : x2, y0,
1202
+ clipRes == splashClipAllInside);
1203
+ x2 = x3;
1204
+ for (y = y0 + 1; y <= y1 - 1; ++y) {
1205
+ x3 = splashFloor(seg->x0 + ((SplashCoord)y + 1 - seg->y0) * dxdy);
1206
+ drawSpan(&pipe, x2, x3 - 1, y, clipRes == splashClipAllInside);
1207
+ x2 = x3;
1208
+ }
1209
+ drawSpan(&pipe, x2, x2 <= x1 ? x1 : x2, y1,
1210
+ clipRes == splashClipAllInside);
1211
+ } else {
1212
+ x2 = x0;
1213
+ x3 = splashFloor(seg->x0 + ((SplashCoord)y0 + 1 - seg->y0) * dxdy);
1214
+ drawSpan(&pipe, (x3 + 1 <= x2) ? x3 + 1 : x2, x2, y0,
1215
+ clipRes == splashClipAllInside);
1216
+ x2 = x3;
1217
+ for (y = y0 + 1; y <= y1 - 1; ++y) {
1218
+ x3 = splashFloor(seg->x0 + ((SplashCoord)y + 1 - seg->y0) * dxdy);
1219
+ drawSpan(&pipe, x3 + 1, x2, y, clipRes == splashClipAllInside);
1220
+ x2 = x3;
1221
+ }
1222
+ drawSpan(&pipe, x1, (x1 <= x2) ? x2 : x1, y1,
1223
+ clipRes == splashClipAllInside);
1224
+ }
1225
+ }
1226
+
1227
+ // segment with |dy| > |dx|
1228
+ } else {
1229
+ dxdy = seg->dxdy;
1230
+ if (y0 > y1) {
1231
+ t = x0; x0 = x1; x1 = t;
1232
+ t = y0; y0 = y1; y1 = t;
1233
+ }
1234
+ if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0,
1235
+ x0 <= x1 ? x1 : x0, y1))
1236
+ != splashClipAllOutside) {
1237
+ drawPixel(&pipe, x0, y0, clipRes == splashClipAllInside);
1238
+ for (y = y0 + 1; y <= y1 - 1; ++y) {
1239
+ x = splashFloor(seg->x0 + ((SplashCoord)y - seg->y0) * dxdy);
1240
+ drawPixel(&pipe, x, y, clipRes == splashClipAllInside);
1241
+ }
1242
+ drawPixel(&pipe, x1, y1, clipRes == splashClipAllInside);
1243
+ }
1244
+ }
1245
+ ++nClipRes[clipRes];
1246
+ }
1247
+ if (nClipRes[splashClipPartial] ||
1248
+ (nClipRes[splashClipAllInside] && nClipRes[splashClipAllOutside])) {
1249
+ opClipRes = splashClipPartial;
1250
+ } else if (nClipRes[splashClipAllInside]) {
1251
+ opClipRes = splashClipAllInside;
1252
+ } else {
1253
+ opClipRes = splashClipAllOutside;
1254
+ }
1255
+
1256
+ delete xPath;
1257
+ }
1258
+
1259
+ void Splash::strokeWide(SplashPath *path) {
1260
+ SplashPath *path2;
1261
+
1262
+ path2 = makeStrokePath(path, gFalse);
1263
+ fillWithPattern(path2, gFalse, state->strokePattern, state->strokeAlpha);
1264
+ delete path2;
1265
+ }
1266
+
1267
+ SplashPath *Splash::flattenPath(SplashPath *path, SplashCoord *matrix,
1268
+ SplashCoord flatness) {
1269
+ SplashPath *fPath;
1270
+ SplashCoord flatness2;
1271
+ Guchar flag;
1272
+ int i;
1273
+
1274
+ fPath = new SplashPath();
1275
+ flatness2 = flatness * flatness;
1276
+ i = 0;
1277
+ while (i < path->length) {
1278
+ flag = path->flags[i];
1279
+ if (flag & splashPathFirst) {
1280
+ fPath->moveTo(path->pts[i].x, path->pts[i].y);
1281
+ ++i;
1282
+ } else {
1283
+ if (flag & splashPathCurve) {
1284
+ flattenCurve(path->pts[i-1].x, path->pts[i-1].y,
1285
+ path->pts[i ].x, path->pts[i ].y,
1286
+ path->pts[i+1].x, path->pts[i+1].y,
1287
+ path->pts[i+2].x, path->pts[i+2].y,
1288
+ matrix, flatness2, fPath);
1289
+ i += 3;
1290
+ } else {
1291
+ fPath->lineTo(path->pts[i].x, path->pts[i].y);
1292
+ ++i;
1293
+ }
1294
+ if (path->flags[i-1] & splashPathClosed) {
1295
+ fPath->close();
1296
+ }
1297
+ }
1298
+ }
1299
+ return fPath;
1300
+ }
1301
+
1302
+ void Splash::flattenCurve(SplashCoord x0, SplashCoord y0,
1303
+ SplashCoord x1, SplashCoord y1,
1304
+ SplashCoord x2, SplashCoord y2,
1305
+ SplashCoord x3, SplashCoord y3,
1306
+ SplashCoord *matrix, SplashCoord flatness2,
1307
+ SplashPath *fPath) {
1308
+ SplashCoord cx[splashMaxCurveSplits + 1][3];
1309
+ SplashCoord cy[splashMaxCurveSplits + 1][3];
1310
+ int cNext[splashMaxCurveSplits + 1];
1311
+ SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh;
1312
+ SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh;
1313
+ SplashCoord dx, dy, mx, my, tx, ty, d1, d2;
1314
+ int p1, p2, p3;
1315
+
1316
+ // initial segment
1317
+ p1 = 0;
1318
+ p2 = splashMaxCurveSplits;
1319
+ cx[p1][0] = x0; cy[p1][0] = y0;
1320
+ cx[p1][1] = x1; cy[p1][1] = y1;
1321
+ cx[p1][2] = x2; cy[p1][2] = y2;
1322
+ cx[p2][0] = x3; cy[p2][0] = y3;
1323
+ cNext[p1] = p2;
1324
+
1325
+ while (p1 < splashMaxCurveSplits) {
1326
+
1327
+ // get the next segment
1328
+ xl0 = cx[p1][0]; yl0 = cy[p1][0];
1329
+ xx1 = cx[p1][1]; yy1 = cy[p1][1];
1330
+ xx2 = cx[p1][2]; yy2 = cy[p1][2];
1331
+ p2 = cNext[p1];
1332
+ xr3 = cx[p2][0]; yr3 = cy[p2][0];
1333
+
1334
+ // compute the distances (in device space) from the control points
1335
+ // to the midpoint of the straight line (this is a bit of a hack,
1336
+ // but it's much faster than computing the actual distances to the
1337
+ // line)
1338
+ transform(matrix, (xl0 + xr3) * 0.5, (yl0 + yr3) * 0.5, &mx, &my);
1339
+ transform(matrix, xx1, yy1, &tx, &ty);
1340
+ dx = tx - mx;
1341
+ dy = ty - my;
1342
+ d1 = dx*dx + dy*dy;
1343
+ transform(matrix, xx2, yy2, &tx, &ty);
1344
+ dx = tx - mx;
1345
+ dy = ty - my;
1346
+ d2 = dx*dx + dy*dy;
1347
+
1348
+ // if the curve is flat enough, or no more subdivisions are
1349
+ // allowed, add the straight line segment
1350
+ if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) {
1351
+ fPath->lineTo(xr3, yr3);
1352
+ p1 = p2;
1353
+
1354
+ // otherwise, subdivide the curve
1355
+ } else {
1356
+ xl1 = (xl0 + xx1) * 0.5;
1357
+ yl1 = (yl0 + yy1) * 0.5;
1358
+ xh = (xx1 + xx2) * 0.5;
1359
+ yh = (yy1 + yy2) * 0.5;
1360
+ xl2 = (xl1 + xh) * 0.5;
1361
+ yl2 = (yl1 + yh) * 0.5;
1362
+ xr2 = (xx2 + xr3) * 0.5;
1363
+ yr2 = (yy2 + yr3) * 0.5;
1364
+ xr1 = (xh + xr2) * 0.5;
1365
+ yr1 = (yh + yr2) * 0.5;
1366
+ xr0 = (xl2 + xr1) * 0.5;
1367
+ yr0 = (yl2 + yr1) * 0.5;
1368
+ // add the new subdivision points
1369
+ p3 = (p1 + p2) / 2;
1370
+ cx[p1][1] = xl1; cy[p1][1] = yl1;
1371
+ cx[p1][2] = xl2; cy[p1][2] = yl2;
1372
+ cNext[p1] = p3;
1373
+ cx[p3][0] = xr0; cy[p3][0] = yr0;
1374
+ cx[p3][1] = xr1; cy[p3][1] = yr1;
1375
+ cx[p3][2] = xr2; cy[p3][2] = yr2;
1376
+ cNext[p3] = p2;
1377
+ }
1378
+ }
1379
+ }
1380
+
1381
+ SplashPath *Splash::makeDashedPath(SplashPath *path) {
1382
+ SplashPath *dPath;
1383
+ SplashCoord lineDashTotal;
1384
+ SplashCoord lineDashStartPhase, lineDashDist, segLen;
1385
+ SplashCoord x0, y0, x1, y1, xa, ya;
1386
+ GBool lineDashStartOn, lineDashOn, newPath;
1387
+ int lineDashStartIdx, lineDashIdx;
1388
+ int i, j, k;
1389
+
1390
+ lineDashTotal = 0;
1391
+ for (i = 0; i < state->lineDashLength; ++i) {
1392
+ lineDashTotal += state->lineDash[i];
1393
+ }
1394
+ lineDashStartPhase = state->lineDashPhase;
1395
+ i = splashFloor(lineDashStartPhase / lineDashTotal);
1396
+ lineDashStartPhase -= (SplashCoord)i * lineDashTotal;
1397
+ lineDashStartOn = gTrue;
1398
+ lineDashStartIdx = 0;
1399
+ while (lineDashStartPhase >= state->lineDash[lineDashStartIdx]) {
1400
+ lineDashStartOn = !lineDashStartOn;
1401
+ lineDashStartPhase -= state->lineDash[lineDashStartIdx];
1402
+ ++lineDashStartIdx;
1403
+ }
1404
+
1405
+ dPath = new SplashPath();
1406
+
1407
+ // process each subpath
1408
+ i = 0;
1409
+ while (i < path->length) {
1410
+
1411
+ // find the end of the subpath
1412
+ for (j = i;
1413
+ j < path->length - 1 && !(path->flags[j] & splashPathLast);
1414
+ ++j) ;
1415
+
1416
+ // initialize the dash parameters
1417
+ lineDashOn = lineDashStartOn;
1418
+ lineDashIdx = lineDashStartIdx;
1419
+ lineDashDist = state->lineDash[lineDashIdx] - lineDashStartPhase;
1420
+
1421
+ // process each segment of the subpath
1422
+ newPath = gTrue;
1423
+ for (k = i; k < j; ++k) {
1424
+
1425
+ // grab the segment
1426
+ x0 = path->pts[k].x;
1427
+ y0 = path->pts[k].y;
1428
+ x1 = path->pts[k+1].x;
1429
+ y1 = path->pts[k+1].y;
1430
+ segLen = splashDist(x0, y0, x1, y1);
1431
+
1432
+ // process the segment
1433
+ while (segLen > 0) {
1434
+
1435
+ if (lineDashDist >= segLen) {
1436
+ if (lineDashOn) {
1437
+ if (newPath) {
1438
+ dPath->moveTo(x0, y0);
1439
+ newPath = gFalse;
1440
+ }
1441
+ dPath->lineTo(x1, y1);
1442
+ }
1443
+ lineDashDist -= segLen;
1444
+ segLen = 0;
1445
+
1446
+ } else {
1447
+ xa = x0 + (lineDashDist / segLen) * (x1 - x0);
1448
+ ya = y0 + (lineDashDist / segLen) * (y1 - y0);
1449
+ if (lineDashOn) {
1450
+ if (newPath) {
1451
+ dPath->moveTo(x0, y0);
1452
+ newPath = gFalse;
1453
+ }
1454
+ dPath->lineTo(xa, ya);
1455
+ }
1456
+ x0 = xa;
1457
+ y0 = ya;
1458
+ segLen -= lineDashDist;
1459
+ lineDashDist = 0;
1460
+ }
1461
+
1462
+ // get the next entry in the dash array
1463
+ if (lineDashDist <= 0) {
1464
+ lineDashOn = !lineDashOn;
1465
+ if (++lineDashIdx == state->lineDashLength) {
1466
+ lineDashIdx = 0;
1467
+ }
1468
+ lineDashDist = state->lineDash[lineDashIdx];
1469
+ newPath = gTrue;
1470
+ }
1471
+ }
1472
+ }
1473
+ i = j + 1;
1474
+ }
1475
+
1476
+ return dPath;
1477
+ }
1478
+
1479
+ SplashError Splash::fill(SplashPath *path, GBool eo) {
1480
+ if (debugMode) {
1481
+ printf("fill [eo:%d]:\n", eo);
1482
+ dumpPath(path);
1483
+ }
1484
+ return fillWithPattern(path, eo, state->fillPattern, state->fillAlpha);
1485
+ }
1486
+
1487
+ SplashError Splash::fillWithPattern(SplashPath *path, GBool eo,
1488
+ SplashPattern *pattern,
1489
+ SplashCoord alpha) {
1490
+ SplashPipe pipe;
1491
+ SplashXPath *xPath;
1492
+ SplashXPathScanner *scanner;
1493
+ int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
1494
+ SplashClipResult clipRes, clipRes2;
1495
+
1496
+ if (path->length == 0) {
1497
+ return splashErrEmptyPath;
1498
+ }
1499
+ xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue);
1500
+ if (vectorAntialias) {
1501
+ xPath->aaScale();
1502
+ }
1503
+ xPath->sort();
1504
+ scanner = new SplashXPathScanner(xPath, eo);
1505
+
1506
+ // get the min and max x and y values
1507
+ if (vectorAntialias) {
1508
+ scanner->getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI);
1509
+ } else {
1510
+ scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
1511
+ }
1512
+
1513
+ // check clipping
1514
+ if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI))
1515
+ != splashClipAllOutside) {
1516
+
1517
+ // limit the y range
1518
+ if (yMinI < state->clip->getYMinI()) {
1519
+ yMinI = state->clip->getYMinI();
1520
+ }
1521
+ if (yMaxI > state->clip->getYMaxI()) {
1522
+ yMaxI = state->clip->getYMaxI();
1523
+ }
1524
+
1525
+ pipeInit(&pipe, 0, yMinI, pattern, NULL, alpha, vectorAntialias, gFalse);
1526
+
1527
+ // draw the spans
1528
+ if (vectorAntialias) {
1529
+ for (y = yMinI; y <= yMaxI; ++y) {
1530
+ scanner->renderAALine(aaBuf, &x0, &x1, y);
1531
+ if (clipRes != splashClipAllInside) {
1532
+ state->clip->clipAALine(aaBuf, &x0, &x1, y);
1533
+ }
1534
+ drawAALine(&pipe, x0, x1, y);
1535
+ }
1536
+ } else {
1537
+ for (y = yMinI; y <= yMaxI; ++y) {
1538
+ while (scanner->getNextSpan(y, &x0, &x1)) {
1539
+ if (clipRes == splashClipAllInside) {
1540
+ drawSpan(&pipe, x0, x1, y, gTrue);
1541
+ } else {
1542
+ // limit the x range
1543
+ if (x0 < state->clip->getXMinI()) {
1544
+ x0 = state->clip->getXMinI();
1545
+ }
1546
+ if (x1 > state->clip->getXMaxI()) {
1547
+ x1 = state->clip->getXMaxI();
1548
+ }
1549
+ clipRes2 = state->clip->testSpan(x0, x1, y);
1550
+ drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside);
1551
+ }
1552
+ }
1553
+ }
1554
+ }
1555
+ }
1556
+ opClipRes = clipRes;
1557
+
1558
+ delete scanner;
1559
+ delete xPath;
1560
+ return splashOk;
1561
+ }
1562
+
1563
+ SplashError Splash::xorFill(SplashPath *path, GBool eo) {
1564
+ SplashPipe pipe;
1565
+ SplashXPath *xPath;
1566
+ SplashXPathScanner *scanner;
1567
+ int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
1568
+ SplashClipResult clipRes, clipRes2;
1569
+ SplashBlendFunc origBlendFunc;
1570
+
1571
+ if (path->length == 0) {
1572
+ return splashErrEmptyPath;
1573
+ }
1574
+ xPath = new SplashXPath(path, state->matrix, state->flatness, gTrue);
1575
+ xPath->sort();
1576
+ scanner = new SplashXPathScanner(xPath, eo);
1577
+
1578
+ // get the min and max x and y values
1579
+ scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
1580
+
1581
+ // check clipping
1582
+ if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI))
1583
+ != splashClipAllOutside) {
1584
+
1585
+ // limit the y range
1586
+ if (yMinI < state->clip->getYMinI()) {
1587
+ yMinI = state->clip->getYMinI();
1588
+ }
1589
+ if (yMaxI > state->clip->getYMaxI()) {
1590
+ yMaxI = state->clip->getYMaxI();
1591
+ }
1592
+
1593
+ origBlendFunc = state->blendFunc;
1594
+ state->blendFunc = &blendXor;
1595
+ pipeInit(&pipe, 0, yMinI, state->fillPattern, NULL, 1, gFalse, gFalse);
1596
+
1597
+ // draw the spans
1598
+ for (y = yMinI; y <= yMaxI; ++y) {
1599
+ while (scanner->getNextSpan(y, &x0, &x1)) {
1600
+ if (clipRes == splashClipAllInside) {
1601
+ drawSpan(&pipe, x0, x1, y, gTrue);
1602
+ } else {
1603
+ // limit the x range
1604
+ if (x0 < state->clip->getXMinI()) {
1605
+ x0 = state->clip->getXMinI();
1606
+ }
1607
+ if (x1 > state->clip->getXMaxI()) {
1608
+ x1 = state->clip->getXMaxI();
1609
+ }
1610
+ clipRes2 = state->clip->testSpan(x0, x1, y);
1611
+ drawSpan(&pipe, x0, x1, y, clipRes2 == splashClipAllInside);
1612
+ }
1613
+ }
1614
+ }
1615
+ state->blendFunc = origBlendFunc;
1616
+ }
1617
+ opClipRes = clipRes;
1618
+
1619
+ delete scanner;
1620
+ delete xPath;
1621
+ return splashOk;
1622
+ }
1623
+
1624
+ SplashError Splash::fillChar(SplashCoord x, SplashCoord y,
1625
+ int c, SplashFont *font) {
1626
+ SplashGlyphBitmap glyph;
1627
+ SplashCoord xt, yt;
1628
+ int x0, y0, xFrac, yFrac;
1629
+ SplashError err;
1630
+
1631
+ if (debugMode) {
1632
+ printf("fillChar: x=%.2f y=%.2f c=%3d=0x%02x='%c'\n",
1633
+ (double)x, (double)y, c, c, c);
1634
+ }
1635
+ transform(state->matrix, x, y, &xt, &yt);
1636
+ x0 = splashFloor(xt);
1637
+ xFrac = splashFloor((xt - x0) * splashFontFraction);
1638
+ y0 = splashFloor(yt);
1639
+ yFrac = splashFloor((yt - y0) * splashFontFraction);
1640
+ if (!font->getGlyph(c, xFrac, yFrac, &glyph)) {
1641
+ return splashErrNoGlyph;
1642
+ }
1643
+ err = fillGlyph2(x0, y0, &glyph);
1644
+ if (glyph.freeData) {
1645
+ gfree(glyph.data);
1646
+ }
1647
+ return err;
1648
+ }
1649
+
1650
+ SplashError Splash::fillGlyph(SplashCoord x, SplashCoord y,
1651
+ SplashGlyphBitmap *glyph) {
1652
+ SplashCoord xt, yt;
1653
+ int x0, y0;
1654
+
1655
+ transform(state->matrix, x, y, &xt, &yt);
1656
+ x0 = splashFloor(xt);
1657
+ y0 = splashFloor(yt);
1658
+ return fillGlyph2(x0, y0, glyph);
1659
+ }
1660
+
1661
+ SplashError Splash::fillGlyph2(int x0, int y0, SplashGlyphBitmap *glyph) {
1662
+ SplashPipe pipe;
1663
+ SplashClipResult clipRes;
1664
+ GBool noClip;
1665
+ int alpha0, alpha;
1666
+ Guchar *p;
1667
+ int x1, y1, xx, xx1, yy;
1668
+
1669
+ if ((clipRes = state->clip->testRect(x0 - glyph->x,
1670
+ y0 - glyph->y,
1671
+ x0 - glyph->x + glyph->w - 1,
1672
+ y0 - glyph->y + glyph->h - 1))
1673
+ != splashClipAllOutside) {
1674
+ noClip = clipRes == splashClipAllInside;
1675
+
1676
+ if (noClip) {
1677
+ if (glyph->aa) {
1678
+ pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y,
1679
+ state->fillPattern, NULL, state->fillAlpha, gTrue, gFalse);
1680
+ p = glyph->data;
1681
+ for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
1682
+ pipeSetXY(&pipe, x0 - glyph->x, y1);
1683
+ for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) {
1684
+ alpha = *p++;
1685
+ if (alpha != 0) {
1686
+ pipe.shape = (SplashCoord)(alpha / 255.0);
1687
+ pipeRun(&pipe);
1688
+ updateModX(x1);
1689
+ updateModY(y1);
1690
+ } else {
1691
+ pipeIncX(&pipe);
1692
+ }
1693
+ }
1694
+ }
1695
+ } else {
1696
+ pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y,
1697
+ state->fillPattern, NULL, state->fillAlpha, gFalse, gFalse);
1698
+ p = glyph->data;
1699
+ for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
1700
+ pipeSetXY(&pipe, x0 - glyph->x, y1);
1701
+ for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; xx += 8) {
1702
+ alpha0 = *p++;
1703
+ for (xx1 = 0; xx1 < 8 && xx + xx1 < glyph->w; ++xx1, ++x1) {
1704
+ if (alpha0 & 0x80) {
1705
+ pipeRun(&pipe);
1706
+ updateModX(x1);
1707
+ updateModY(y1);
1708
+ } else {
1709
+ pipeIncX(&pipe);
1710
+ }
1711
+ alpha0 <<= 1;
1712
+ }
1713
+ }
1714
+ }
1715
+ }
1716
+ } else {
1717
+ if (glyph->aa) {
1718
+ pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y,
1719
+ state->fillPattern, NULL, state->fillAlpha, gTrue, gFalse);
1720
+ p = glyph->data;
1721
+ for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
1722
+ pipeSetXY(&pipe, x0 - glyph->x, y1);
1723
+ for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) {
1724
+ if (state->clip->test(x1, y1)) {
1725
+ alpha = *p++;
1726
+ if (alpha != 0) {
1727
+ pipe.shape = (SplashCoord)(alpha / 255.0);
1728
+ pipeRun(&pipe);
1729
+ updateModX(x1);
1730
+ updateModY(y1);
1731
+ } else {
1732
+ pipeIncX(&pipe);
1733
+ }
1734
+ } else {
1735
+ pipeIncX(&pipe);
1736
+ ++p;
1737
+ }
1738
+ }
1739
+ }
1740
+ } else {
1741
+ pipeInit(&pipe, x0 - glyph->x, y0 - glyph->y,
1742
+ state->fillPattern, NULL, state->fillAlpha, gFalse, gFalse);
1743
+ p = glyph->data;
1744
+ for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
1745
+ pipeSetXY(&pipe, x0 - glyph->x, y1);
1746
+ for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; xx += 8) {
1747
+ alpha0 = *p++;
1748
+ for (xx1 = 0; xx1 < 8 && xx + xx1 < glyph->w; ++xx1, ++x1) {
1749
+ if (state->clip->test(x1, y1)) {
1750
+ if (alpha0 & 0x80) {
1751
+ pipeRun(&pipe);
1752
+ updateModX(x1);
1753
+ updateModY(y1);
1754
+ } else {
1755
+ pipeIncX(&pipe);
1756
+ }
1757
+ } else {
1758
+ pipeIncX(&pipe);
1759
+ }
1760
+ alpha0 <<= 1;
1761
+ }
1762
+ }
1763
+ }
1764
+ }
1765
+ }
1766
+ }
1767
+ opClipRes = clipRes;
1768
+
1769
+ return splashOk;
1770
+ }
1771
+
1772
+ SplashError Splash::fillImageMask(SplashImageMaskSource src, void *srcData,
1773
+ int w, int h, SplashCoord *mat,
1774
+ GBool glyphMode) {
1775
+ SplashPipe pipe;
1776
+ GBool rot;
1777
+ SplashCoord xScale, yScale, xShear, yShear, yShear1;
1778
+ int tx, tx2, ty, ty2, scaledWidth, scaledHeight, xSign, ySign;
1779
+ int ulx, uly, llx, lly, urx, ury, lrx, lry;
1780
+ int ulx1, uly1, llx1, lly1, urx1, ury1, lrx1, lry1;
1781
+ int xMin, xMax, yMin, yMax;
1782
+ SplashClipResult clipRes, clipRes2;
1783
+ int yp, yq, yt, yStep, lastYStep;
1784
+ int xp, xq, xt, xStep, xSrc;
1785
+ int k1, spanXMin, spanXMax, spanY;
1786
+ SplashColorPtr pixBuf, p;
1787
+ int pixAcc;
1788
+ int x, y, x1, x2, y2;
1789
+ SplashCoord y1;
1790
+ int n, m, i, j;
1791
+
1792
+ if (debugMode) {
1793
+ printf("fillImageMask: w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n",
1794
+ w, h, (double)mat[0], (double)mat[1], (double)mat[2],
1795
+ (double)mat[3], (double)mat[4], (double)mat[5]);
1796
+ }
1797
+
1798
+ // check for singular matrix
1799
+ if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.000001) {
1800
+ return splashErrSingularMatrix;
1801
+ }
1802
+
1803
+ // compute scale, shear, rotation, translation parameters
1804
+ rot = splashAbs(mat[1]) > splashAbs(mat[0]);
1805
+ if (rot) {
1806
+ xScale = -mat[1];
1807
+ yScale = mat[2] - (mat[0] * mat[3]) / mat[1];
1808
+ xShear = -mat[3] / yScale;
1809
+ yShear = -mat[0] / mat[1];
1810
+ } else {
1811
+ xScale = mat[0];
1812
+ yScale = mat[3] - (mat[1] * mat[2]) / mat[0];
1813
+ xShear = mat[2] / yScale;
1814
+ yShear = mat[1] / mat[0];
1815
+ }
1816
+ // Note 1: The PDF spec says that all pixels whose *centers* lie
1817
+ // within the region get painted -- but that doesn't seem to match
1818
+ // up with what Acrobat actually does: it ends up leaving gaps
1819
+ // between image stripes. So we use the same rule here as for
1820
+ // fills: any pixel that overlaps the region gets painted.
1821
+ // Note 2: The "glyphMode" flag is a kludge: it switches back to
1822
+ // "correct" behavior (matching the spec), for use in rendering Type
1823
+ // 3 fonts.
1824
+ // Note 3: The +/-0.01 in these computations is to avoid floating
1825
+ // point precision problems which can lead to gaps between image
1826
+ // stripes (it can cause image stripes to overlap, but that's a much
1827
+ // less visible problem).
1828
+ if (glyphMode) {
1829
+ if (xScale >= 0) {
1830
+ tx = splashRound(mat[4]);
1831
+ tx2 = splashRound(mat[4] + xScale) - 1;
1832
+ } else {
1833
+ tx = splashRound(mat[4]) - 1;
1834
+ tx2 = splashRound(mat[4] + xScale);
1835
+ }
1836
+ } else {
1837
+ if (xScale >= 0) {
1838
+ tx = splashFloor(mat[4] - 0.01);
1839
+ tx2 = splashFloor(mat[4] + xScale + 0.01);
1840
+ } else {
1841
+ tx = splashFloor(mat[4] + 0.01);
1842
+ tx2 = splashFloor(mat[4] + xScale - 0.01);
1843
+ }
1844
+ }
1845
+ scaledWidth = abs(tx2 - tx) + 1;
1846
+ if (glyphMode) {
1847
+ if (yScale >= 0) {
1848
+ ty = splashRound(mat[5]);
1849
+ ty2 = splashRound(mat[5] + yScale) - 1;
1850
+ } else {
1851
+ ty = splashRound(mat[5]) - 1;
1852
+ ty2 = splashRound(mat[5] + yScale);
1853
+ }
1854
+ } else {
1855
+ if (yScale >= 0) {
1856
+ ty = splashFloor(mat[5] - 0.01);
1857
+ ty2 = splashFloor(mat[5] + yScale + 0.01);
1858
+ } else {
1859
+ ty = splashFloor(mat[5] + 0.01);
1860
+ ty2 = splashFloor(mat[5] + yScale - 0.01);
1861
+ }
1862
+ }
1863
+ scaledHeight = abs(ty2 - ty) + 1;
1864
+ xSign = (xScale < 0) ? -1 : 1;
1865
+ ySign = (yScale < 0) ? -1 : 1;
1866
+ yShear1 = (SplashCoord)xSign * yShear;
1867
+
1868
+ // clipping
1869
+ ulx1 = 0;
1870
+ uly1 = 0;
1871
+ urx1 = xSign * (scaledWidth - 1);
1872
+ ury1 = (int)(yShear * urx1);
1873
+ llx1 = splashRound(xShear * ySign * (scaledHeight - 1));
1874
+ lly1 = ySign * (scaledHeight - 1) + (int)(yShear * llx1);
1875
+ lrx1 = xSign * (scaledWidth - 1) +
1876
+ splashRound(xShear * ySign * (scaledHeight - 1));
1877
+ lry1 = ySign * (scaledHeight - 1) + (int)(yShear * lrx1);
1878
+ if (rot) {
1879
+ ulx = tx + uly1; uly = ty - ulx1;
1880
+ urx = tx + ury1; ury = ty - urx1;
1881
+ llx = tx + lly1; lly = ty - llx1;
1882
+ lrx = tx + lry1; lry = ty - lrx1;
1883
+ } else {
1884
+ ulx = tx + ulx1; uly = ty + uly1;
1885
+ urx = tx + urx1; ury = ty + ury1;
1886
+ llx = tx + llx1; lly = ty + lly1;
1887
+ lrx = tx + lrx1; lry = ty + lry1;
1888
+ }
1889
+ xMin = (ulx < urx) ? (ulx < llx) ? (ulx < lrx) ? ulx : lrx
1890
+ : (llx < lrx) ? llx : lrx
1891
+ : (urx < llx) ? (urx < lrx) ? urx : lrx
1892
+ : (llx < lrx) ? llx : lrx;
1893
+ xMax = (ulx > urx) ? (ulx > llx) ? (ulx > lrx) ? ulx : lrx
1894
+ : (llx > lrx) ? llx : lrx
1895
+ : (urx > llx) ? (urx > lrx) ? urx : lrx
1896
+ : (llx > lrx) ? llx : lrx;
1897
+ yMin = (uly < ury) ? (uly < lly) ? (uly < lry) ? uly : lry
1898
+ : (lly < lry) ? lly : lry
1899
+ : (ury < lly) ? (ury < lry) ? ury : lry
1900
+ : (lly < lry) ? lly : lry;
1901
+ yMax = (uly > ury) ? (uly > lly) ? (uly > lry) ? uly : lry
1902
+ : (lly > lry) ? lly : lry
1903
+ : (ury > lly) ? (ury > lry) ? ury : lry
1904
+ : (lly > lry) ? lly : lry;
1905
+ clipRes = state->clip->testRect(xMin, yMin, xMax, yMax);
1906
+ opClipRes = clipRes;
1907
+
1908
+ // compute Bresenham parameters for x and y scaling
1909
+ yp = h / scaledHeight;
1910
+ yq = h % scaledHeight;
1911
+ xp = w / scaledWidth;
1912
+ xq = w % scaledWidth;
1913
+
1914
+ // allocate pixel buffer
1915
+ pixBuf = (SplashColorPtr)gmalloc((yp + 1) * w);
1916
+
1917
+ // initialize the pixel pipe
1918
+ pipeInit(&pipe, 0, 0, state->fillPattern, NULL, state->fillAlpha,
1919
+ gTrue, gFalse);
1920
+ if (vectorAntialias) {
1921
+ drawAAPixelInit();
1922
+ }
1923
+
1924
+ // init y scale Bresenham
1925
+ yt = 0;
1926
+ lastYStep = 1;
1927
+
1928
+ for (y = 0; y < scaledHeight; ++y) {
1929
+
1930
+ // y scale Bresenham
1931
+ yStep = yp;
1932
+ yt += yq;
1933
+ if (yt >= scaledHeight) {
1934
+ yt -= scaledHeight;
1935
+ ++yStep;
1936
+ }
1937
+
1938
+ // read row(s) from image
1939
+ n = (yp > 0) ? yStep : lastYStep;
1940
+ if (n > 0) {
1941
+ p = pixBuf;
1942
+ for (i = 0; i < n; ++i) {
1943
+ (*src)(srcData, p);
1944
+ p += w;
1945
+ }
1946
+ }
1947
+ lastYStep = yStep;
1948
+
1949
+ // loop-invariant constants
1950
+ k1 = splashRound(xShear * ySign * y);
1951
+
1952
+ // clipping test
1953
+ if (clipRes != splashClipAllInside &&
1954
+ !rot &&
1955
+ (int)(yShear * k1) ==
1956
+ (int)(yShear * (xSign * (scaledWidth - 1) + k1))) {
1957
+ if (xSign > 0) {
1958
+ spanXMin = tx + k1;
1959
+ spanXMax = spanXMin + (scaledWidth - 1);
1960
+ } else {
1961
+ spanXMax = tx + k1;
1962
+ spanXMin = spanXMax - (scaledWidth - 1);
1963
+ }
1964
+ spanY = ty + ySign * y + (int)(yShear * k1);
1965
+ clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY);
1966
+ if (clipRes2 == splashClipAllOutside) {
1967
+ continue;
1968
+ }
1969
+ } else {
1970
+ clipRes2 = clipRes;
1971
+ }
1972
+
1973
+ // init x scale Bresenham
1974
+ xt = 0;
1975
+ xSrc = 0;
1976
+
1977
+ // x shear
1978
+ x1 = k1;
1979
+
1980
+ // y shear
1981
+ y1 = (SplashCoord)ySign * y + yShear * x1;
1982
+ // this is a kludge: if yShear1 is negative, then (int)y1 would
1983
+ // change immediately after the first pixel, which is not what we
1984
+ // want
1985
+ if (yShear1 < 0) {
1986
+ y1 += 0.999;
1987
+ }
1988
+
1989
+ // loop-invariant constants
1990
+ n = yStep > 0 ? yStep : 1;
1991
+
1992
+ for (x = 0; x < scaledWidth; ++x) {
1993
+
1994
+ // x scale Bresenham
1995
+ xStep = xp;
1996
+ xt += xq;
1997
+ if (xt >= scaledWidth) {
1998
+ xt -= scaledWidth;
1999
+ ++xStep;
2000
+ }
2001
+
2002
+ // rotation
2003
+ if (rot) {
2004
+ x2 = (int)y1;
2005
+ y2 = -x1;
2006
+ } else {
2007
+ x2 = x1;
2008
+ y2 = (int)y1;
2009
+ }
2010
+
2011
+ // compute the alpha value for (x,y) after the x and y scaling
2012
+ // operations
2013
+ m = xStep > 0 ? xStep : 1;
2014
+ p = pixBuf + xSrc;
2015
+ pixAcc = 0;
2016
+ for (i = 0; i < n; ++i) {
2017
+ for (j = 0; j < m; ++j) {
2018
+ pixAcc += *p++;
2019
+ }
2020
+ p += w - m;
2021
+ }
2022
+
2023
+ // blend fill color with background
2024
+ if (pixAcc != 0) {
2025
+ pipe.shape = (pixAcc == n * m)
2026
+ ? (SplashCoord)1
2027
+ : (SplashCoord)pixAcc / (SplashCoord)(n * m);
2028
+ if (vectorAntialias && clipRes2 != splashClipAllInside) {
2029
+ drawAAPixel(&pipe, tx + x2, ty + y2);
2030
+ } else {
2031
+ drawPixel(&pipe, tx + x2, ty + y2, clipRes2 == splashClipAllInside);
2032
+ }
2033
+ }
2034
+
2035
+ // x scale Bresenham
2036
+ xSrc += xStep;
2037
+
2038
+ // x shear
2039
+ x1 += xSign;
2040
+
2041
+ // y shear
2042
+ y1 += yShear1;
2043
+ }
2044
+ }
2045
+
2046
+ // free memory
2047
+ gfree(pixBuf);
2048
+
2049
+ return splashOk;
2050
+ }
2051
+
2052
+ SplashError Splash::drawImage(SplashImageSource src, void *srcData,
2053
+ SplashColorMode srcMode, GBool srcAlpha,
2054
+ int w, int h, SplashCoord *mat) {
2055
+ SplashPipe pipe;
2056
+ GBool ok, rot;
2057
+ SplashCoord xScale, yScale, xShear, yShear, yShear1;
2058
+ int tx, tx2, ty, ty2, scaledWidth, scaledHeight, xSign, ySign;
2059
+ int ulx, uly, llx, lly, urx, ury, lrx, lry;
2060
+ int ulx1, uly1, llx1, lly1, urx1, ury1, lrx1, lry1;
2061
+ int xMin, xMax, yMin, yMax;
2062
+ SplashClipResult clipRes, clipRes2;
2063
+ int yp, yq, yt, yStep, lastYStep;
2064
+ int xp, xq, xt, xStep, xSrc;
2065
+ int k1, spanXMin, spanXMax, spanY;
2066
+ SplashColorPtr colorBuf, p;
2067
+ SplashColor pix;
2068
+ Guchar *alphaBuf, *q;
2069
+ #if SPLASH_CMYK
2070
+ int pixAcc0, pixAcc1, pixAcc2, pixAcc3;
2071
+ #else
2072
+ int pixAcc0, pixAcc1, pixAcc2;
2073
+ #endif
2074
+ int alphaAcc;
2075
+ SplashCoord pixMul, alphaMul, alpha;
2076
+ int x, y, x1, x2, y2;
2077
+ SplashCoord y1;
2078
+ int nComps, n, m, i, j;
2079
+
2080
+ if (debugMode) {
2081
+ printf("drawImage: srcMode=%d srcAlpha=%d w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n",
2082
+ srcMode, srcAlpha, w, h, (double)mat[0], (double)mat[1], (double)mat[2],
2083
+ (double)mat[3], (double)mat[4], (double)mat[5]);
2084
+ }
2085
+
2086
+ // check color modes
2087
+ ok = gFalse; // make gcc happy
2088
+ nComps = 0; // make gcc happy
2089
+ switch (bitmap->mode) {
2090
+ case splashModeMono1:
2091
+ case splashModeMono8:
2092
+ ok = srcMode == splashModeMono8;
2093
+ nComps = 1;
2094
+ break;
2095
+ case splashModeRGB8:
2096
+ ok = srcMode == splashModeRGB8;
2097
+ nComps = 3;
2098
+ break;
2099
+ case splashModeBGR8:
2100
+ ok = srcMode == splashModeBGR8;
2101
+ nComps = 3;
2102
+ break;
2103
+ #if SPLASH_CMYK
2104
+ case splashModeCMYK8:
2105
+ ok = srcMode == splashModeCMYK8;
2106
+ nComps = 4;
2107
+ break;
2108
+ #endif
2109
+ }
2110
+ if (!ok) {
2111
+ return splashErrModeMismatch;
2112
+ }
2113
+
2114
+ // check for singular matrix
2115
+ if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.000001) {
2116
+ return splashErrSingularMatrix;
2117
+ }
2118
+
2119
+ // compute scale, shear, rotation, translation parameters
2120
+ rot = splashAbs(mat[1]) > splashAbs(mat[0]);
2121
+ if (rot) {
2122
+ xScale = -mat[1];
2123
+ yScale = mat[2] - (mat[0] * mat[3]) / mat[1];
2124
+ xShear = -mat[3] / yScale;
2125
+ yShear = -mat[0] / mat[1];
2126
+ } else {
2127
+ xScale = mat[0];
2128
+ yScale = mat[3] - (mat[1] * mat[2]) / mat[0];
2129
+ xShear = mat[2] / yScale;
2130
+ yShear = mat[1] / mat[0];
2131
+ }
2132
+ // Note 1: The PDF spec says that all pixels whose *centers* lie
2133
+ // within the region get painted -- but that doesn't seem to match
2134
+ // up with what Acrobat actually does: it ends up leaving gaps
2135
+ // between image stripes. So we use the same rule here as for
2136
+ // fills: any pixel that overlaps the region gets painted.
2137
+ // Note 2: The +/-0.01 in these computations is to avoid floating
2138
+ // point precision problems which can lead to gaps between image
2139
+ // stripes (it can cause image stripes to overlap, but that's a much
2140
+ // less visible problem).
2141
+ if (xScale >= 0) {
2142
+ tx = splashFloor(mat[4] - 0.01);
2143
+ tx2 = splashFloor(mat[4] + xScale + 0.01);
2144
+ } else {
2145
+ tx = splashFloor(mat[4] + 0.01);
2146
+ tx2 = splashFloor(mat[4] + xScale - 0.01);
2147
+ }
2148
+ scaledWidth = abs(tx2 - tx) + 1;
2149
+ if (yScale >= 0) {
2150
+ ty = splashFloor(mat[5] - 0.01);
2151
+ ty2 = splashFloor(mat[5] + yScale + 0.01);
2152
+ } else {
2153
+ ty = splashFloor(mat[5] + 0.01);
2154
+ ty2 = splashFloor(mat[5] + yScale - 0.01);
2155
+ }
2156
+ scaledHeight = abs(ty2 - ty) + 1;
2157
+ xSign = (xScale < 0) ? -1 : 1;
2158
+ ySign = (yScale < 0) ? -1 : 1;
2159
+ yShear1 = (SplashCoord)xSign * yShear;
2160
+
2161
+ // clipping
2162
+ ulx1 = 0;
2163
+ uly1 = 0;
2164
+ urx1 = xSign * (scaledWidth - 1);
2165
+ ury1 = (int)(yShear * urx1);
2166
+ llx1 = splashRound(xShear * ySign * (scaledHeight - 1));
2167
+ lly1 = ySign * (scaledHeight - 1) + (int)(yShear * llx1);
2168
+ lrx1 = xSign * (scaledWidth - 1) +
2169
+ splashRound(xShear * ySign * (scaledHeight - 1));
2170
+ lry1 = ySign * (scaledHeight - 1) + (int)(yShear * lrx1);
2171
+ if (rot) {
2172
+ ulx = tx + uly1; uly = ty - ulx1;
2173
+ urx = tx + ury1; ury = ty - urx1;
2174
+ llx = tx + lly1; lly = ty - llx1;
2175
+ lrx = tx + lry1; lry = ty - lrx1;
2176
+ } else {
2177
+ ulx = tx + ulx1; uly = ty + uly1;
2178
+ urx = tx + urx1; ury = ty + ury1;
2179
+ llx = tx + llx1; lly = ty + lly1;
2180
+ lrx = tx + lrx1; lry = ty + lry1;
2181
+ }
2182
+ xMin = (ulx < urx) ? (ulx < llx) ? (ulx < lrx) ? ulx : lrx
2183
+ : (llx < lrx) ? llx : lrx
2184
+ : (urx < llx) ? (urx < lrx) ? urx : lrx
2185
+ : (llx < lrx) ? llx : lrx;
2186
+ xMax = (ulx > urx) ? (ulx > llx) ? (ulx > lrx) ? ulx : lrx
2187
+ : (llx > lrx) ? llx : lrx
2188
+ : (urx > llx) ? (urx > lrx) ? urx : lrx
2189
+ : (llx > lrx) ? llx : lrx;
2190
+ yMin = (uly < ury) ? (uly < lly) ? (uly < lry) ? uly : lry
2191
+ : (lly < lry) ? lly : lry
2192
+ : (ury < lly) ? (ury < lry) ? ury : lry
2193
+ : (lly < lry) ? lly : lry;
2194
+ yMax = (uly > ury) ? (uly > lly) ? (uly > lry) ? uly : lry
2195
+ : (lly > lry) ? lly : lry
2196
+ : (ury > lly) ? (ury > lry) ? ury : lry
2197
+ : (lly > lry) ? lly : lry;
2198
+ clipRes = state->clip->testRect(xMin, yMin, xMax, yMax);
2199
+ opClipRes = clipRes;
2200
+ if (clipRes == splashClipAllOutside) {
2201
+ return splashOk;
2202
+ }
2203
+
2204
+ // compute Bresenham parameters for x and y scaling
2205
+ yp = h / scaledHeight;
2206
+ yq = h % scaledHeight;
2207
+ xp = w / scaledWidth;
2208
+ xq = w % scaledWidth;
2209
+
2210
+ // allocate pixel buffers
2211
+ colorBuf = (SplashColorPtr)gmalloc((yp + 1) * w * nComps);
2212
+ if (srcAlpha) {
2213
+ alphaBuf = (Guchar *)gmalloc((yp + 1) * w);
2214
+ } else {
2215
+ alphaBuf = NULL;
2216
+ }
2217
+
2218
+ pixAcc0 = pixAcc1 = pixAcc2 = 0; // make gcc happy
2219
+ #if SPLASH_CMYK
2220
+ pixAcc3 = 0; // make gcc happy
2221
+ #endif
2222
+
2223
+ // initialize the pixel pipe
2224
+ pipeInit(&pipe, 0, 0, NULL, pix, state->fillAlpha,
2225
+ srcAlpha || (vectorAntialias && clipRes != splashClipAllInside),
2226
+ gFalse);
2227
+ if (vectorAntialias) {
2228
+ drawAAPixelInit();
2229
+ }
2230
+
2231
+ if (srcAlpha) {
2232
+
2233
+ // init y scale Bresenham
2234
+ yt = 0;
2235
+ lastYStep = 1;
2236
+
2237
+ for (y = 0; y < scaledHeight; ++y) {
2238
+
2239
+ // y scale Bresenham
2240
+ yStep = yp;
2241
+ yt += yq;
2242
+ if (yt >= scaledHeight) {
2243
+ yt -= scaledHeight;
2244
+ ++yStep;
2245
+ }
2246
+
2247
+ // read row(s) from image
2248
+ n = (yp > 0) ? yStep : lastYStep;
2249
+ if (n > 0) {
2250
+ p = colorBuf;
2251
+ q = alphaBuf;
2252
+ for (i = 0; i < n; ++i) {
2253
+ (*src)(srcData, p, q);
2254
+ p += w * nComps;
2255
+ q += w;
2256
+ }
2257
+ }
2258
+ lastYStep = yStep;
2259
+
2260
+ // loop-invariant constants
2261
+ k1 = splashRound(xShear * ySign * y);
2262
+
2263
+ // clipping test
2264
+ if (clipRes != splashClipAllInside &&
2265
+ !rot &&
2266
+ (int)(yShear * k1) ==
2267
+ (int)(yShear * (xSign * (scaledWidth - 1) + k1))) {
2268
+ if (xSign > 0) {
2269
+ spanXMin = tx + k1;
2270
+ spanXMax = spanXMin + (scaledWidth - 1);
2271
+ } else {
2272
+ spanXMax = tx + k1;
2273
+ spanXMin = spanXMax - (scaledWidth - 1);
2274
+ }
2275
+ spanY = ty + ySign * y + (int)(yShear * k1);
2276
+ clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY);
2277
+ if (clipRes2 == splashClipAllOutside) {
2278
+ continue;
2279
+ }
2280
+ } else {
2281
+ clipRes2 = clipRes;
2282
+ }
2283
+
2284
+ // init x scale Bresenham
2285
+ xt = 0;
2286
+ xSrc = 0;
2287
+
2288
+ // x shear
2289
+ x1 = k1;
2290
+
2291
+ // y shear
2292
+ y1 = (SplashCoord)ySign * y + yShear * x1;
2293
+ // this is a kludge: if yShear1 is negative, then (int)y1 would
2294
+ // change immediately after the first pixel, which is not what
2295
+ // we want
2296
+ if (yShear1 < 0) {
2297
+ y1 += 0.999;
2298
+ }
2299
+
2300
+ // loop-invariant constants
2301
+ n = yStep > 0 ? yStep : 1;
2302
+
2303
+ switch (srcMode) {
2304
+
2305
+ case splashModeMono1:
2306
+ case splashModeMono8:
2307
+ for (x = 0; x < scaledWidth; ++x) {
2308
+
2309
+ // x scale Bresenham
2310
+ xStep = xp;
2311
+ xt += xq;
2312
+ if (xt >= scaledWidth) {
2313
+ xt -= scaledWidth;
2314
+ ++xStep;
2315
+ }
2316
+
2317
+ // rotation
2318
+ if (rot) {
2319
+ x2 = (int)y1;
2320
+ y2 = -x1;
2321
+ } else {
2322
+ x2 = x1;
2323
+ y2 = (int)y1;
2324
+ }
2325
+
2326
+ // compute the filtered pixel at (x,y) after the x and y scaling
2327
+ // operations
2328
+ m = xStep > 0 ? xStep : 1;
2329
+ alphaAcc = 0;
2330
+ p = colorBuf + xSrc;
2331
+ q = alphaBuf + xSrc;
2332
+ pixAcc0 = 0;
2333
+ for (i = 0; i < n; ++i) {
2334
+ for (j = 0; j < m; ++j) {
2335
+ pixAcc0 += *p++;
2336
+ alphaAcc += *q++;
2337
+ }
2338
+ p += w - m;
2339
+ q += w - m;
2340
+ }
2341
+ pixMul = (SplashCoord)1 / (SplashCoord)(n * m);
2342
+ alphaMul = pixMul * (1.0 / 255.0);
2343
+ alpha = (SplashCoord)alphaAcc * alphaMul;
2344
+
2345
+ if (alpha > 0) {
2346
+ pix[0] = (int)((SplashCoord)pixAcc0 * pixMul);
2347
+
2348
+ // set pixel
2349
+ pipe.shape = alpha;
2350
+ if (vectorAntialias && clipRes != splashClipAllInside) {
2351
+ drawAAPixel(&pipe, tx + x2, ty + y2);
2352
+ } else {
2353
+ drawPixel(&pipe, tx + x2, ty + y2,
2354
+ clipRes2 == splashClipAllInside);
2355
+ }
2356
+ }
2357
+
2358
+ // x scale Bresenham
2359
+ xSrc += xStep;
2360
+
2361
+ // x shear
2362
+ x1 += xSign;
2363
+
2364
+ // y shear
2365
+ y1 += yShear1;
2366
+ }
2367
+ break;
2368
+
2369
+ case splashModeRGB8:
2370
+ case splashModeBGR8:
2371
+ for (x = 0; x < scaledWidth; ++x) {
2372
+
2373
+ // x scale Bresenham
2374
+ xStep = xp;
2375
+ xt += xq;
2376
+ if (xt >= scaledWidth) {
2377
+ xt -= scaledWidth;
2378
+ ++xStep;
2379
+ }
2380
+
2381
+ // rotation
2382
+ if (rot) {
2383
+ x2 = (int)y1;
2384
+ y2 = -x1;
2385
+ } else {
2386
+ x2 = x1;
2387
+ y2 = (int)y1;
2388
+ }
2389
+
2390
+ // compute the filtered pixel at (x,y) after the x and y scaling
2391
+ // operations
2392
+ m = xStep > 0 ? xStep : 1;
2393
+ alphaAcc = 0;
2394
+ p = colorBuf + xSrc * 3;
2395
+ q = alphaBuf + xSrc;
2396
+ pixAcc0 = pixAcc1 = pixAcc2 = 0;
2397
+ for (i = 0; i < n; ++i) {
2398
+ for (j = 0; j < m; ++j) {
2399
+ pixAcc0 += *p++;
2400
+ pixAcc1 += *p++;
2401
+ pixAcc2 += *p++;
2402
+ alphaAcc += *q++;
2403
+ }
2404
+ p += 3 * (w - m);
2405
+ q += w - m;
2406
+ }
2407
+ pixMul = (SplashCoord)1 / (SplashCoord)(n * m);
2408
+ alphaMul = pixMul * (1.0 / 255.0);
2409
+ alpha = (SplashCoord)alphaAcc * alphaMul;
2410
+
2411
+ if (alpha > 0) {
2412
+ pix[0] = (int)((SplashCoord)pixAcc0 * pixMul);
2413
+ pix[1] = (int)((SplashCoord)pixAcc1 * pixMul);
2414
+ pix[2] = (int)((SplashCoord)pixAcc2 * pixMul);
2415
+
2416
+ // set pixel
2417
+ pipe.shape = alpha;
2418
+ if (vectorAntialias && clipRes != splashClipAllInside) {
2419
+ drawAAPixel(&pipe, tx + x2, ty + y2);
2420
+ } else {
2421
+ drawPixel(&pipe, tx + x2, ty + y2,
2422
+ clipRes2 == splashClipAllInside);
2423
+ }
2424
+ }
2425
+
2426
+ // x scale Bresenham
2427
+ xSrc += xStep;
2428
+
2429
+ // x shear
2430
+ x1 += xSign;
2431
+
2432
+ // y shear
2433
+ y1 += yShear1;
2434
+ }
2435
+ break;
2436
+
2437
+ #if SPLASH_CMYK
2438
+ case splashModeCMYK8:
2439
+ for (x = 0; x < scaledWidth; ++x) {
2440
+
2441
+ // x scale Bresenham
2442
+ xStep = xp;
2443
+ xt += xq;
2444
+ if (xt >= scaledWidth) {
2445
+ xt -= scaledWidth;
2446
+ ++xStep;
2447
+ }
2448
+
2449
+ // rotation
2450
+ if (rot) {
2451
+ x2 = (int)y1;
2452
+ y2 = -x1;
2453
+ } else {
2454
+ x2 = x1;
2455
+ y2 = (int)y1;
2456
+ }
2457
+
2458
+ // compute the filtered pixel at (x,y) after the x and y scaling
2459
+ // operations
2460
+ m = xStep > 0 ? xStep : 1;
2461
+ alphaAcc = 0;
2462
+ p = colorBuf + xSrc * 4;
2463
+ q = alphaBuf + xSrc;
2464
+ pixAcc0 = pixAcc1 = pixAcc2 = pixAcc3 = 0;
2465
+ for (i = 0; i < n; ++i) {
2466
+ for (j = 0; j < m; ++j) {
2467
+ pixAcc0 += *p++;
2468
+ pixAcc1 += *p++;
2469
+ pixAcc2 += *p++;
2470
+ pixAcc3 += *p++;
2471
+ alphaAcc += *q++;
2472
+ }
2473
+ p += 4 * (w - m);
2474
+ q += w - m;
2475
+ }
2476
+ pixMul = (SplashCoord)1 / (SplashCoord)(n * m);
2477
+ alphaMul = pixMul * (1.0 / 255.0);
2478
+ alpha = (SplashCoord)alphaAcc * alphaMul;
2479
+
2480
+ if (alpha > 0) {
2481
+ pix[0] = (int)((SplashCoord)pixAcc0 * pixMul);
2482
+ pix[1] = (int)((SplashCoord)pixAcc1 * pixMul);
2483
+ pix[2] = (int)((SplashCoord)pixAcc2 * pixMul);
2484
+ pix[3] = (int)((SplashCoord)pixAcc3 * pixMul);
2485
+
2486
+ // set pixel
2487
+ pipe.shape = alpha;
2488
+ if (vectorAntialias && clipRes != splashClipAllInside) {
2489
+ drawAAPixel(&pipe, tx + x2, ty + y2);
2490
+ } else {
2491
+ drawPixel(&pipe, tx + x2, ty + y2,
2492
+ clipRes2 == splashClipAllInside);
2493
+ }
2494
+ }
2495
+
2496
+ // x scale Bresenham
2497
+ xSrc += xStep;
2498
+
2499
+ // x shear
2500
+ x1 += xSign;
2501
+
2502
+ // y shear
2503
+ y1 += yShear1;
2504
+ }
2505
+ break;
2506
+ #endif // SPLASH_CMYK
2507
+ }
2508
+ }
2509
+
2510
+ } else {
2511
+
2512
+ // init y scale Bresenham
2513
+ yt = 0;
2514
+ lastYStep = 1;
2515
+
2516
+ for (y = 0; y < scaledHeight; ++y) {
2517
+
2518
+ // y scale Bresenham
2519
+ yStep = yp;
2520
+ yt += yq;
2521
+ if (yt >= scaledHeight) {
2522
+ yt -= scaledHeight;
2523
+ ++yStep;
2524
+ }
2525
+
2526
+ // read row(s) from image
2527
+ n = (yp > 0) ? yStep : lastYStep;
2528
+ if (n > 0) {
2529
+ p = colorBuf;
2530
+ for (i = 0; i < n; ++i) {
2531
+ (*src)(srcData, p, NULL);
2532
+ p += w * nComps;
2533
+ }
2534
+ }
2535
+ lastYStep = yStep;
2536
+
2537
+ // loop-invariant constants
2538
+ k1 = splashRound(xShear * ySign * y);
2539
+
2540
+ // clipping test
2541
+ if (clipRes != splashClipAllInside &&
2542
+ !rot &&
2543
+ (int)(yShear * k1) ==
2544
+ (int)(yShear * (xSign * (scaledWidth - 1) + k1))) {
2545
+ if (xSign > 0) {
2546
+ spanXMin = tx + k1;
2547
+ spanXMax = spanXMin + (scaledWidth - 1);
2548
+ } else {
2549
+ spanXMax = tx + k1;
2550
+ spanXMin = spanXMax - (scaledWidth - 1);
2551
+ }
2552
+ spanY = ty + ySign * y + (int)(yShear * k1);
2553
+ clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY);
2554
+ if (clipRes2 == splashClipAllOutside) {
2555
+ continue;
2556
+ }
2557
+ } else {
2558
+ clipRes2 = clipRes;
2559
+ }
2560
+
2561
+ // init x scale Bresenham
2562
+ xt = 0;
2563
+ xSrc = 0;
2564
+
2565
+ // x shear
2566
+ x1 = k1;
2567
+
2568
+ // y shear
2569
+ y1 = (SplashCoord)ySign * y + yShear * x1;
2570
+ // this is a kludge: if yShear1 is negative, then (int)y1 would
2571
+ // change immediately after the first pixel, which is not what
2572
+ // we want
2573
+ if (yShear1 < 0) {
2574
+ y1 += 0.999;
2575
+ }
2576
+
2577
+ // loop-invariant constants
2578
+ n = yStep > 0 ? yStep : 1;
2579
+
2580
+ switch (srcMode) {
2581
+
2582
+ case splashModeMono1:
2583
+ case splashModeMono8:
2584
+ for (x = 0; x < scaledWidth; ++x) {
2585
+
2586
+ // x scale Bresenham
2587
+ xStep = xp;
2588
+ xt += xq;
2589
+ if (xt >= scaledWidth) {
2590
+ xt -= scaledWidth;
2591
+ ++xStep;
2592
+ }
2593
+
2594
+ // rotation
2595
+ if (rot) {
2596
+ x2 = (int)y1;
2597
+ y2 = -x1;
2598
+ } else {
2599
+ x2 = x1;
2600
+ y2 = (int)y1;
2601
+ }
2602
+
2603
+ // compute the filtered pixel at (x,y) after the x and y scaling
2604
+ // operations
2605
+ m = xStep > 0 ? xStep : 1;
2606
+ p = colorBuf + xSrc;
2607
+ pixAcc0 = 0;
2608
+ for (i = 0; i < n; ++i) {
2609
+ for (j = 0; j < m; ++j) {
2610
+ pixAcc0 += *p++;
2611
+ }
2612
+ p += w - m;
2613
+ }
2614
+ pixMul = (SplashCoord)1 / (SplashCoord)(n * m);
2615
+
2616
+ pix[0] = (int)((SplashCoord)pixAcc0 * pixMul);
2617
+
2618
+ // set pixel
2619
+ if (vectorAntialias && clipRes != splashClipAllInside) {
2620
+ pipe.shape = (SplashCoord)1;
2621
+ drawAAPixel(&pipe, tx + x2, ty + y2);
2622
+ } else {
2623
+ drawPixel(&pipe, tx + x2, ty + y2,
2624
+ clipRes2 == splashClipAllInside);
2625
+ }
2626
+
2627
+ // x scale Bresenham
2628
+ xSrc += xStep;
2629
+
2630
+ // x shear
2631
+ x1 += xSign;
2632
+
2633
+ // y shear
2634
+ y1 += yShear1;
2635
+ }
2636
+ break;
2637
+
2638
+ case splashModeRGB8:
2639
+ case splashModeBGR8:
2640
+ for (x = 0; x < scaledWidth; ++x) {
2641
+
2642
+ // x scale Bresenham
2643
+ xStep = xp;
2644
+ xt += xq;
2645
+ if (xt >= scaledWidth) {
2646
+ xt -= scaledWidth;
2647
+ ++xStep;
2648
+ }
2649
+
2650
+ // rotation
2651
+ if (rot) {
2652
+ x2 = (int)y1;
2653
+ y2 = -x1;
2654
+ } else {
2655
+ x2 = x1;
2656
+ y2 = (int)y1;
2657
+ }
2658
+
2659
+ // compute the filtered pixel at (x,y) after the x and y scaling
2660
+ // operations
2661
+ m = xStep > 0 ? xStep : 1;
2662
+ p = colorBuf + xSrc * 3;
2663
+ pixAcc0 = pixAcc1 = pixAcc2 = 0;
2664
+ for (i = 0; i < n; ++i) {
2665
+ for (j = 0; j < m; ++j) {
2666
+ pixAcc0 += *p++;
2667
+ pixAcc1 += *p++;
2668
+ pixAcc2 += *p++;
2669
+ }
2670
+ p += 3 * (w - m);
2671
+ }
2672
+ pixMul = (SplashCoord)1 / (SplashCoord)(n * m);
2673
+
2674
+ pix[0] = (int)((SplashCoord)pixAcc0 * pixMul);
2675
+ pix[1] = (int)((SplashCoord)pixAcc1 * pixMul);
2676
+ pix[2] = (int)((SplashCoord)pixAcc2 * pixMul);
2677
+
2678
+ // set pixel
2679
+ if (vectorAntialias && clipRes != splashClipAllInside) {
2680
+ pipe.shape = (SplashCoord)1;
2681
+ drawAAPixel(&pipe, tx + x2, ty + y2);
2682
+ } else {
2683
+ drawPixel(&pipe, tx + x2, ty + y2,
2684
+ clipRes2 == splashClipAllInside);
2685
+ }
2686
+
2687
+ // x scale Bresenham
2688
+ xSrc += xStep;
2689
+
2690
+ // x shear
2691
+ x1 += xSign;
2692
+
2693
+ // y shear
2694
+ y1 += yShear1;
2695
+ }
2696
+ break;
2697
+
2698
+ #if SPLASH_CMYK
2699
+ case splashModeCMYK8:
2700
+ for (x = 0; x < scaledWidth; ++x) {
2701
+
2702
+ // x scale Bresenham
2703
+ xStep = xp;
2704
+ xt += xq;
2705
+ if (xt >= scaledWidth) {
2706
+ xt -= scaledWidth;
2707
+ ++xStep;
2708
+ }
2709
+
2710
+ // rotation
2711
+ if (rot) {
2712
+ x2 = (int)y1;
2713
+ y2 = -x1;
2714
+ } else {
2715
+ x2 = x1;
2716
+ y2 = (int)y1;
2717
+ }
2718
+
2719
+ // compute the filtered pixel at (x,y) after the x and y scaling
2720
+ // operations
2721
+ m = xStep > 0 ? xStep : 1;
2722
+ p = colorBuf + xSrc * 4;
2723
+ pixAcc0 = pixAcc1 = pixAcc2 = pixAcc3 = 0;
2724
+ for (i = 0; i < n; ++i) {
2725
+ for (j = 0; j < m; ++j) {
2726
+ pixAcc0 += *p++;
2727
+ pixAcc1 += *p++;
2728
+ pixAcc2 += *p++;
2729
+ pixAcc3 += *p++;
2730
+ }
2731
+ p += 4 * (w - m);
2732
+ }
2733
+ pixMul = (SplashCoord)1 / (SplashCoord)(n * m);
2734
+
2735
+ pix[0] = (int)((SplashCoord)pixAcc0 * pixMul);
2736
+ pix[1] = (int)((SplashCoord)pixAcc1 * pixMul);
2737
+ pix[2] = (int)((SplashCoord)pixAcc2 * pixMul);
2738
+ pix[3] = (int)((SplashCoord)pixAcc3 * pixMul);
2739
+
2740
+ // set pixel
2741
+ if (vectorAntialias && clipRes != splashClipAllInside) {
2742
+ pipe.shape = (SplashCoord)1;
2743
+ drawAAPixel(&pipe, tx + x2, ty + y2);
2744
+ } else {
2745
+ drawPixel(&pipe, tx + x2, ty + y2,
2746
+ clipRes2 == splashClipAllInside);
2747
+ }
2748
+
2749
+ // x scale Bresenham
2750
+ xSrc += xStep;
2751
+
2752
+ // x shear
2753
+ x1 += xSign;
2754
+
2755
+ // y shear
2756
+ y1 += yShear1;
2757
+ }
2758
+ break;
2759
+ #endif // SPLASH_CMYK
2760
+ }
2761
+ }
2762
+
2763
+ }
2764
+
2765
+ gfree(colorBuf);
2766
+ gfree(alphaBuf);
2767
+
2768
+ return splashOk;
2769
+ }
2770
+
2771
+ SplashError Splash::composite(SplashBitmap *src, int xSrc, int ySrc,
2772
+ int xDest, int yDest, int w, int h,
2773
+ GBool noClip, GBool nonIsolated) {
2774
+ SplashPipe pipe;
2775
+ SplashColor pixel;
2776
+ Guchar alpha;
2777
+ Guchar *ap;
2778
+ int x, y;
2779
+
2780
+ if (src->mode != bitmap->mode) {
2781
+ return splashErrModeMismatch;
2782
+ }
2783
+
2784
+ if (src->alpha) {
2785
+ pipeInit(&pipe, xDest, yDest, NULL, pixel, state->fillAlpha,
2786
+ gTrue, nonIsolated);
2787
+ for (y = 0; y < h; ++y) {
2788
+ pipeSetXY(&pipe, xDest, yDest + y);
2789
+ ap = src->getAlphaPtr() + (ySrc + y) * src->getWidth() + xSrc;
2790
+ for (x = 0; x < w; ++x) {
2791
+ src->getPixel(xSrc + x, ySrc + y, pixel);
2792
+ alpha = *ap++;
2793
+ if (noClip || state->clip->test(xDest + x, yDest + y)) {
2794
+ // this uses shape instead of alpha, which isn't technically
2795
+ // correct, but works out the same
2796
+ pipe.shape = (SplashCoord)(alpha / 255.0);
2797
+ pipeRun(&pipe);
2798
+ updateModX(xDest + x);
2799
+ updateModY(yDest + y);
2800
+ } else {
2801
+ pipeIncX(&pipe);
2802
+ }
2803
+ }
2804
+ }
2805
+ } else {
2806
+ pipeInit(&pipe, xDest, yDest, NULL, pixel, state->fillAlpha,
2807
+ gFalse, nonIsolated);
2808
+ for (y = 0; y < h; ++y) {
2809
+ pipeSetXY(&pipe, xDest, yDest + y);
2810
+ for (x = 0; x < w; ++x) {
2811
+ src->getPixel(xSrc + x, ySrc + y, pixel);
2812
+ if (noClip || state->clip->test(xDest + x, yDest + y)) {
2813
+ pipeRun(&pipe);
2814
+ updateModX(xDest + x);
2815
+ updateModY(yDest + y);
2816
+ } else {
2817
+ pipeIncX(&pipe);
2818
+ }
2819
+ }
2820
+ }
2821
+ }
2822
+
2823
+ return splashOk;
2824
+ }
2825
+
2826
+ void Splash::compositeBackground(SplashColorPtr color) {
2827
+ SplashColorPtr p;
2828
+ Guchar *q;
2829
+ Guchar alpha, alpha1, c, color0, color1, color2, color3;
2830
+ int x, y, mask;
2831
+
2832
+ switch (bitmap->mode) {
2833
+ case splashModeMono1:
2834
+ color0 = color[0];
2835
+ for (y = 0; y < bitmap->height; ++y) {
2836
+ p = &bitmap->data[y * bitmap->rowSize];
2837
+ q = &bitmap->alpha[y * bitmap->width];
2838
+ mask = 0x80;
2839
+ for (x = 0; x < bitmap->width; ++x) {
2840
+ alpha = *q++;
2841
+ alpha1 = 255 - alpha;
2842
+ c = (*p & mask) ? 0xff : 0x00;
2843
+ c = div255(alpha1 * color0 + alpha * c);
2844
+ if (c & 0x80) {
2845
+ *p |= mask;
2846
+ } else {
2847
+ *p &= ~mask;
2848
+ }
2849
+ if (!(mask >>= 1)) {
2850
+ mask = 0x80;
2851
+ ++p;
2852
+ }
2853
+ }
2854
+ }
2855
+ break;
2856
+ case splashModeMono8:
2857
+ color0 = color[0];
2858
+ for (y = 0; y < bitmap->height; ++y) {
2859
+ p = &bitmap->data[y * bitmap->rowSize];
2860
+ q = &bitmap->alpha[y * bitmap->width];
2861
+ for (x = 0; x < bitmap->width; ++x) {
2862
+ alpha = *q++;
2863
+ alpha1 = 255 - alpha;
2864
+ p[0] = div255(alpha1 * color0 + alpha * p[0]);
2865
+ ++p;
2866
+ }
2867
+ }
2868
+ break;
2869
+ case splashModeRGB8:
2870
+ case splashModeBGR8:
2871
+ color0 = color[0];
2872
+ color1 = color[1];
2873
+ color2 = color[2];
2874
+ for (y = 0; y < bitmap->height; ++y) {
2875
+ p = &bitmap->data[y * bitmap->rowSize];
2876
+ q = &bitmap->alpha[y * bitmap->width];
2877
+ for (x = 0; x < bitmap->width; ++x) {
2878
+ alpha = *q++;
2879
+ alpha1 = 255 - alpha;
2880
+ p[0] = div255(alpha1 * color0 + alpha * p[0]);
2881
+ p[1] = div255(alpha1 * color1 + alpha * p[1]);
2882
+ p[2] = div255(alpha1 * color2 + alpha * p[2]);
2883
+ p += 3;
2884
+ }
2885
+ }
2886
+ break;
2887
+ #if SPLASH_CMYK
2888
+ case splashModeCMYK8:
2889
+ color0 = color[0];
2890
+ color1 = color[1];
2891
+ color2 = color[2];
2892
+ color3 = color[3];
2893
+ for (y = 0; y < bitmap->height; ++y) {
2894
+ p = &bitmap->data[y * bitmap->rowSize];
2895
+ q = &bitmap->alpha[y * bitmap->width];
2896
+ for (x = 0; x < bitmap->width; ++x) {
2897
+ alpha = *q++;
2898
+ alpha1 = 255 - alpha;
2899
+ p[0] = div255(alpha1 * color0 + alpha * p[0]);
2900
+ p[1] = div255(alpha1 * color1 + alpha * p[1]);
2901
+ p[2] = div255(alpha1 * color2 + alpha * p[2]);
2902
+ p[3] = div255(alpha1 * color3 + alpha * p[3]);
2903
+ p += 4;
2904
+ }
2905
+ }
2906
+ break;
2907
+ #endif
2908
+ }
2909
+ memset(bitmap->alpha, 255, bitmap->width * bitmap->height);
2910
+ }
2911
+
2912
+ SplashError Splash::blitTransparent(SplashBitmap *src, int xSrc, int ySrc,
2913
+ int xDest, int yDest, int w, int h) {
2914
+ SplashColor pixel;
2915
+ SplashColorPtr p;
2916
+ Guchar *q;
2917
+ int x, y, mask;
2918
+
2919
+ if (src->mode != bitmap->mode) {
2920
+ return splashErrModeMismatch;
2921
+ }
2922
+
2923
+ switch (bitmap->mode) {
2924
+ case splashModeMono1:
2925
+ for (y = 0; y < h; ++y) {
2926
+ p = &bitmap->data[(yDest + y) * bitmap->rowSize + (xDest >> 3)];
2927
+ mask = 0x80 >> (xDest & 7);
2928
+ for (x = 0; x < w; ++x) {
2929
+ src->getPixel(xSrc + x, ySrc + y, pixel);
2930
+ if (pixel[0]) {
2931
+ *p |= mask;
2932
+ } else {
2933
+ *p &= ~mask;
2934
+ }
2935
+ if (!(mask >>= 1)) {
2936
+ mask = 0x80;
2937
+ ++p;
2938
+ }
2939
+ }
2940
+ }
2941
+ break;
2942
+ case splashModeMono8:
2943
+ for (y = 0; y < h; ++y) {
2944
+ p = &bitmap->data[(yDest + y) * bitmap->rowSize + xDest];
2945
+ for (x = 0; x < w; ++x) {
2946
+ src->getPixel(xSrc + x, ySrc + y, pixel);
2947
+ *p++ = pixel[0];
2948
+ }
2949
+ }
2950
+ break;
2951
+ case splashModeRGB8:
2952
+ case splashModeBGR8:
2953
+ for (y = 0; y < h; ++y) {
2954
+ p = &bitmap->data[(yDest + y) * bitmap->rowSize + 3 * xDest];
2955
+ for (x = 0; x < w; ++x) {
2956
+ src->getPixel(xSrc + x, ySrc + y, pixel);
2957
+ *p++ = pixel[0];
2958
+ *p++ = pixel[1];
2959
+ *p++ = pixel[2];
2960
+ }
2961
+ }
2962
+ break;
2963
+ #if SPLASH_CMYK
2964
+ case splashModeCMYK8:
2965
+ for (y = 0; y < h; ++y) {
2966
+ p = &bitmap->data[(yDest + y) * bitmap->rowSize + 4 * xDest];
2967
+ for (x = 0; x < w; ++x) {
2968
+ src->getPixel(xSrc + x, ySrc + y, pixel);
2969
+ *p++ = pixel[0];
2970
+ *p++ = pixel[1];
2971
+ *p++ = pixel[2];
2972
+ *p++ = pixel[3];
2973
+ }
2974
+ }
2975
+ break;
2976
+ #endif
2977
+ }
2978
+
2979
+ if (bitmap->alpha) {
2980
+ for (y = 0; y < h; ++y) {
2981
+ q = &bitmap->alpha[(yDest + y) * bitmap->width + xDest];
2982
+ for (x = 0; x < w; ++x) {
2983
+ *q++ = 0x00;
2984
+ }
2985
+ }
2986
+ }
2987
+
2988
+ return splashOk;
2989
+ }
2990
+
2991
+ SplashPath *Splash::makeStrokePath(SplashPath *path, GBool flatten) {
2992
+ SplashPath *pathIn, *pathOut;
2993
+ SplashCoord w, d, dx, dy, wdx, wdy, dxNext, dyNext, wdxNext, wdyNext;
2994
+ SplashCoord crossprod, dotprod, miter, m;
2995
+ GBool first, last, closed;
2996
+ int subpathStart, next, i;
2997
+ int left0, left1, left2, right0, right1, right2, join0, join1, join2;
2998
+ int leftFirst, rightFirst, firstPt;
2999
+
3000
+ if (flatten) {
3001
+ pathIn = flattenPath(path, state->matrix, state->flatness);
3002
+ if (state->lineDashLength > 0) {
3003
+ pathOut = makeDashedPath(pathIn);
3004
+ delete pathIn;
3005
+ pathIn = pathOut;
3006
+ }
3007
+ } else {
3008
+ pathIn = path;
3009
+ }
3010
+
3011
+ subpathStart = 0; // make gcc happy
3012
+ closed = gFalse; // make gcc happy
3013
+ left0 = left1 = right0 = right1 = join0 = join1 = 0; // make gcc happy
3014
+ leftFirst = rightFirst = firstPt = 0; // make gcc happy
3015
+
3016
+ pathOut = new SplashPath();
3017
+ w = state->lineWidth;
3018
+
3019
+ for (i = 0; i < pathIn->length - 1; ++i) {
3020
+ if (pathIn->flags[i] & splashPathLast) {
3021
+ continue;
3022
+ }
3023
+ if ((first = pathIn->flags[i] & splashPathFirst)) {
3024
+ subpathStart = i;
3025
+ closed = pathIn->flags[i] & splashPathClosed;
3026
+ }
3027
+ last = pathIn->flags[i+1] & splashPathLast;
3028
+
3029
+ // compute the deltas for segment (i, i+1)
3030
+ d = splashDist(pathIn->pts[i].x, pathIn->pts[i].y,
3031
+ pathIn->pts[i+1].x, pathIn->pts[i+1].y);
3032
+ if (d == 0) {
3033
+ // we need to draw end caps on zero-length lines
3034
+ //~ not clear what the behavior should be for splashLineCapButt
3035
+ //~ with d==0
3036
+ dx = 0;
3037
+ dy = 1;
3038
+ } else {
3039
+ d = (SplashCoord)1 / d;
3040
+ dx = d * (pathIn->pts[i+1].x - pathIn->pts[i].x);
3041
+ dy = d * (pathIn->pts[i+1].y - pathIn->pts[i].y);
3042
+ }
3043
+ wdx = (SplashCoord)0.5 * w * dx;
3044
+ wdy = (SplashCoord)0.5 * w * dy;
3045
+
3046
+ // compute the deltas for segment (i+1, next)
3047
+ next = last ? subpathStart + 1 : i + 2;
3048
+ d = splashDist(pathIn->pts[i+1].x, pathIn->pts[i+1].y,
3049
+ pathIn->pts[next].x, pathIn->pts[next].y);
3050
+ if (d == 0) {
3051
+ // we need to draw end caps on zero-length lines
3052
+ //~ not clear what the behavior should be for splashLineCapButt
3053
+ //~ with d==0
3054
+ dxNext = 0;
3055
+ dyNext = 1;
3056
+ } else {
3057
+ d = (SplashCoord)1 / d;
3058
+ dxNext = d * (pathIn->pts[next].x - pathIn->pts[i+1].x);
3059
+ dyNext = d * (pathIn->pts[next].y - pathIn->pts[i+1].y);
3060
+ }
3061
+ wdxNext = (SplashCoord)0.5 * w * dxNext;
3062
+ wdyNext = (SplashCoord)0.5 * w * dyNext;
3063
+
3064
+ // draw the start cap
3065
+ pathOut->moveTo(pathIn->pts[i].x - wdy, pathIn->pts[i].y + wdx);
3066
+ if (i == subpathStart) {
3067
+ firstPt = pathOut->length - 1;
3068
+ }
3069
+ if (first && !closed) {
3070
+ switch (state->lineCap) {
3071
+ case splashLineCapButt:
3072
+ pathOut->lineTo(pathIn->pts[i].x + wdy, pathIn->pts[i].y - wdx);
3073
+ break;
3074
+ case splashLineCapRound:
3075
+ pathOut->curveTo(pathIn->pts[i].x - wdy - bezierCircle * wdx,
3076
+ pathIn->pts[i].y + wdx - bezierCircle * wdy,
3077
+ pathIn->pts[i].x - wdx - bezierCircle * wdy,
3078
+ pathIn->pts[i].y - wdy + bezierCircle * wdx,
3079
+ pathIn->pts[i].x - wdx,
3080
+ pathIn->pts[i].y - wdy);
3081
+ pathOut->curveTo(pathIn->pts[i].x - wdx + bezierCircle * wdy,
3082
+ pathIn->pts[i].y - wdy - bezierCircle * wdx,
3083
+ pathIn->pts[i].x + wdy - bezierCircle * wdx,
3084
+ pathIn->pts[i].y - wdx - bezierCircle * wdy,
3085
+ pathIn->pts[i].x + wdy,
3086
+ pathIn->pts[i].y - wdx);
3087
+ break;
3088
+ case splashLineCapProjecting:
3089
+ pathOut->lineTo(pathIn->pts[i].x - wdx - wdy,
3090
+ pathIn->pts[i].y + wdx - wdy);
3091
+ pathOut->lineTo(pathIn->pts[i].x - wdx + wdy,
3092
+ pathIn->pts[i].y - wdx - wdy);
3093
+ pathOut->lineTo(pathIn->pts[i].x + wdy,
3094
+ pathIn->pts[i].y - wdx);
3095
+ break;
3096
+ }
3097
+ } else {
3098
+ pathOut->lineTo(pathIn->pts[i].x + wdy, pathIn->pts[i].y - wdx);
3099
+ }
3100
+
3101
+ // draw the left side of the segment rectangle
3102
+ left2 = pathOut->length - 1;
3103
+ pathOut->lineTo(pathIn->pts[i+1].x + wdy, pathIn->pts[i+1].y - wdx);
3104
+
3105
+ // draw the end cap
3106
+ if (last && !closed) {
3107
+ switch (state->lineCap) {
3108
+ case splashLineCapButt:
3109
+ pathOut->lineTo(pathIn->pts[i+1].x - wdy, pathIn->pts[i+1].y + wdx);
3110
+ break;
3111
+ case splashLineCapRound:
3112
+ pathOut->curveTo(pathIn->pts[i+1].x + wdy + bezierCircle * wdx,
3113
+ pathIn->pts[i+1].y - wdx + bezierCircle * wdy,
3114
+ pathIn->pts[i+1].x + wdx + bezierCircle * wdy,
3115
+ pathIn->pts[i+1].y + wdy - bezierCircle * wdx,
3116
+ pathIn->pts[i+1].x + wdx,
3117
+ pathIn->pts[i+1].y + wdy);
3118
+ pathOut->curveTo(pathIn->pts[i+1].x + wdx - bezierCircle * wdy,
3119
+ pathIn->pts[i+1].y + wdy + bezierCircle * wdx,
3120
+ pathIn->pts[i+1].x - wdy + bezierCircle * wdx,
3121
+ pathIn->pts[i+1].y + wdx + bezierCircle * wdy,
3122
+ pathIn->pts[i+1].x - wdy,
3123
+ pathIn->pts[i+1].y + wdx);
3124
+ break;
3125
+ case splashLineCapProjecting:
3126
+ pathOut->lineTo(pathIn->pts[i+1].x + wdy + wdx,
3127
+ pathIn->pts[i+1].y - wdx + wdy);
3128
+ pathOut->lineTo(pathIn->pts[i+1].x - wdy + wdx,
3129
+ pathIn->pts[i+1].y + wdx + wdy);
3130
+ pathOut->lineTo(pathIn->pts[i+1].x - wdy,
3131
+ pathIn->pts[i+1].y + wdx);
3132
+ break;
3133
+ }
3134
+ } else {
3135
+ pathOut->lineTo(pathIn->pts[i+1].x - wdy, pathIn->pts[i+1].y + wdx);
3136
+ }
3137
+
3138
+ // draw the right side of the segment rectangle
3139
+ right2 = pathOut->length - 1;
3140
+ pathOut->close();
3141
+
3142
+ // draw the join
3143
+ join2 = pathOut->length;
3144
+ if (!last || closed) {
3145
+ crossprod = dx * dyNext - dy * dxNext;
3146
+ dotprod = -(dx * dxNext + dy * dyNext);
3147
+ if (dotprod > 0.99999) {
3148
+ // avoid a divide-by-zero -- set miter to something arbitrary
3149
+ // such that sqrt(miter) will exceed miterLimit (and m is never
3150
+ // used in that situation)
3151
+ miter = (state->miterLimit + 1) * (state->miterLimit + 1);
3152
+ m = 0;
3153
+ } else {
3154
+ miter = (SplashCoord)2 / ((SplashCoord)1 - dotprod);
3155
+ if (miter < 1) {
3156
+ // this can happen because of floating point inaccuracies
3157
+ miter = 1;
3158
+ }
3159
+ m = splashSqrt(miter - 1);
3160
+ }
3161
+
3162
+ // round join
3163
+ if (state->lineJoin == splashLineJoinRound) {
3164
+ pathOut->moveTo(pathIn->pts[i+1].x + (SplashCoord)0.5 * w,
3165
+ pathIn->pts[i+1].y);
3166
+ pathOut->curveTo(pathIn->pts[i+1].x + (SplashCoord)0.5 * w,
3167
+ pathIn->pts[i+1].y + bezierCircle2 * w,
3168
+ pathIn->pts[i+1].x + bezierCircle2 * w,
3169
+ pathIn->pts[i+1].y + (SplashCoord)0.5 * w,
3170
+ pathIn->pts[i+1].x,
3171
+ pathIn->pts[i+1].y + (SplashCoord)0.5 * w);
3172
+ pathOut->curveTo(pathIn->pts[i+1].x - bezierCircle2 * w,
3173
+ pathIn->pts[i+1].y + (SplashCoord)0.5 * w,
3174
+ pathIn->pts[i+1].x - (SplashCoord)0.5 * w,
3175
+ pathIn->pts[i+1].y + bezierCircle2 * w,
3176
+ pathIn->pts[i+1].x - (SplashCoord)0.5 * w,
3177
+ pathIn->pts[i+1].y);
3178
+ pathOut->curveTo(pathIn->pts[i+1].x - (SplashCoord)0.5 * w,
3179
+ pathIn->pts[i+1].y - bezierCircle2 * w,
3180
+ pathIn->pts[i+1].x - bezierCircle2 * w,
3181
+ pathIn->pts[i+1].y - (SplashCoord)0.5 * w,
3182
+ pathIn->pts[i+1].x,
3183
+ pathIn->pts[i+1].y - (SplashCoord)0.5 * w);
3184
+ pathOut->curveTo(pathIn->pts[i+1].x + bezierCircle2 * w,
3185
+ pathIn->pts[i+1].y - (SplashCoord)0.5 * w,
3186
+ pathIn->pts[i+1].x + (SplashCoord)0.5 * w,
3187
+ pathIn->pts[i+1].y - bezierCircle2 * w,
3188
+ pathIn->pts[i+1].x + (SplashCoord)0.5 * w,
3189
+ pathIn->pts[i+1].y);
3190
+
3191
+ } else {
3192
+ pathOut->moveTo(pathIn->pts[i+1].x, pathIn->pts[i+1].y);
3193
+
3194
+ // angle < 180
3195
+ if (crossprod < 0) {
3196
+ pathOut->lineTo(pathIn->pts[i+1].x - wdyNext,
3197
+ pathIn->pts[i+1].y + wdxNext);
3198
+ // miter join inside limit
3199
+ if (state->lineJoin == splashLineJoinMiter &&
3200
+ splashSqrt(miter) <= state->miterLimit) {
3201
+ pathOut->lineTo(pathIn->pts[i+1].x - wdy + wdx * m,
3202
+ pathIn->pts[i+1].y + wdx + wdy * m);
3203
+ pathOut->lineTo(pathIn->pts[i+1].x - wdy,
3204
+ pathIn->pts[i+1].y + wdx);
3205
+ // bevel join or miter join outside limit
3206
+ } else {
3207
+ pathOut->lineTo(pathIn->pts[i+1].x - wdy, pathIn->pts[i+1].y + wdx);
3208
+ }
3209
+
3210
+ // angle >= 180
3211
+ } else {
3212
+ pathOut->lineTo(pathIn->pts[i+1].x + wdy,
3213
+ pathIn->pts[i+1].y - wdx);
3214
+ // miter join inside limit
3215
+ if (state->lineJoin == splashLineJoinMiter &&
3216
+ splashSqrt(miter) <= state->miterLimit) {
3217
+ pathOut->lineTo(pathIn->pts[i+1].x + wdy + wdx * m,
3218
+ pathIn->pts[i+1].y - wdx + wdy * m);
3219
+ pathOut->lineTo(pathIn->pts[i+1].x + wdyNext,
3220
+ pathIn->pts[i+1].y - wdxNext);
3221
+ // bevel join or miter join outside limit
3222
+ } else {
3223
+ pathOut->lineTo(pathIn->pts[i+1].x + wdyNext,
3224
+ pathIn->pts[i+1].y - wdxNext);
3225
+ }
3226
+ }
3227
+ }
3228
+
3229
+ pathOut->close();
3230
+ }
3231
+
3232
+ // add stroke adjustment hints
3233
+ if (state->strokeAdjust) {
3234
+ if (i >= subpathStart + 1) {
3235
+ if (i >= subpathStart + 2) {
3236
+ pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0);
3237
+ pathOut->addStrokeAdjustHint(left1, right1, join0, left2);
3238
+ } else {
3239
+ pathOut->addStrokeAdjustHint(left1, right1, firstPt, left2);
3240
+ }
3241
+ pathOut->addStrokeAdjustHint(left1, right1, right2 + 1, right2 + 1);
3242
+ }
3243
+ left0 = left1;
3244
+ left1 = left2;
3245
+ right0 = right1;
3246
+ right1 = right2;
3247
+ join0 = join1;
3248
+ join1 = join2;
3249
+ if (i == subpathStart) {
3250
+ leftFirst = left2;
3251
+ rightFirst = right2;
3252
+ }
3253
+ if (last) {
3254
+ if (i >= subpathStart + 2) {
3255
+ pathOut->addStrokeAdjustHint(left1, right1, left0 + 1, right0);
3256
+ pathOut->addStrokeAdjustHint(left1, right1,
3257
+ join0, pathOut->length - 1);
3258
+ } else {
3259
+ pathOut->addStrokeAdjustHint(left1, right1,
3260
+ firstPt, pathOut->length - 1);
3261
+ }
3262
+ if (closed) {
3263
+ pathOut->addStrokeAdjustHint(left1, right1, firstPt, leftFirst);
3264
+ pathOut->addStrokeAdjustHint(left1, right1,
3265
+ rightFirst + 1, rightFirst + 1);
3266
+ pathOut->addStrokeAdjustHint(leftFirst, rightFirst,
3267
+ left1 + 1, right1);
3268
+ pathOut->addStrokeAdjustHint(leftFirst, rightFirst,
3269
+ join1, pathOut->length - 1);
3270
+ }
3271
+ }
3272
+ }
3273
+ }
3274
+
3275
+ if (pathIn != path) {
3276
+ delete pathIn;
3277
+ }
3278
+
3279
+ return pathOut;
3280
+ }
3281
+
3282
+ void Splash::dumpPath(SplashPath *path) {
3283
+ int i;
3284
+
3285
+ for (i = 0; i < path->length; ++i) {
3286
+ printf(" %3d: x=%8.2f y=%8.2f%s%s%s%s\n",
3287
+ i, (double)path->pts[i].x, (double)path->pts[i].y,
3288
+ (path->flags[i] & splashPathFirst) ? " first" : "",
3289
+ (path->flags[i] & splashPathLast) ? " last" : "",
3290
+ (path->flags[i] & splashPathClosed) ? " closed" : "",
3291
+ (path->flags[i] & splashPathCurve) ? " curve" : "");
3292
+ }
3293
+ }
3294
+
3295
+ void Splash::dumpXPath(SplashXPath *path) {
3296
+ int i;
3297
+
3298
+ for (i = 0; i < path->length; ++i) {
3299
+ printf(" %4d: x0=%8.2f y0=%8.2f x1=%8.2f y1=%8.2f %s%s%s%s%s%s%s\n",
3300
+ i, (double)path->segs[i].x0, (double)path->segs[i].y0,
3301
+ (double)path->segs[i].x1, (double)path->segs[i].y1,
3302
+ (path->segs[i].flags & splashXPathFirst) ? "F" : " ",
3303
+ (path->segs[i].flags & splashXPathLast) ? "L" : " ",
3304
+ (path->segs[i].flags & splashXPathEnd0) ? "0" : " ",
3305
+ (path->segs[i].flags & splashXPathEnd1) ? "1" : " ",
3306
+ (path->segs[i].flags & splashXPathHoriz) ? "H" : " ",
3307
+ (path->segs[i].flags & splashXPathVert) ? "V" : " ",
3308
+ (path->segs[i].flags & splashXPathFlip) ? "P" : " ");
3309
+ }
3310
+ }