rfreeimage 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (860) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +1 -0
  4. data/Rakefile +34 -0
  5. data/ext/rfreeimage/extconf.rb +35 -0
  6. data/ext/rfreeimage/rfi_main.c +389 -0
  7. data/lib/rfreeimage/image.rb +26 -0
  8. data/lib/rfreeimage/version.rb +3 -0
  9. data/lib/rfreeimage.rb +3 -0
  10. data/rfreeimage.gemspec +32 -0
  11. data/vendor/FreeImage/Makefile +34 -0
  12. data/vendor/FreeImage/Makefile.cygwin +74 -0
  13. data/vendor/FreeImage/Makefile.fip +84 -0
  14. data/vendor/FreeImage/Makefile.gnu +83 -0
  15. data/vendor/FreeImage/Makefile.iphone +96 -0
  16. data/vendor/FreeImage/Makefile.mingw +136 -0
  17. data/vendor/FreeImage/Makefile.osx +115 -0
  18. data/vendor/FreeImage/Makefile.solaris +66 -0
  19. data/vendor/FreeImage/Makefile.srcs +6 -0
  20. data/vendor/FreeImage/README.iphone +19 -0
  21. data/vendor/FreeImage/README.linux +50 -0
  22. data/vendor/FreeImage/README.minGW +236 -0
  23. data/vendor/FreeImage/README.osx +44 -0
  24. data/vendor/FreeImage/README.solaris +67 -0
  25. data/vendor/FreeImage/Source/CacheFile.h +92 -0
  26. data/vendor/FreeImage/Source/DeprecationManager/Deprecated.cpp +36 -0
  27. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.cpp +103 -0
  28. data/vendor/FreeImage/Source/DeprecationManager/DeprecationMgr.h +83 -0
  29. data/vendor/FreeImage/Source/FreeImage/BitmapAccess.cpp +1573 -0
  30. data/vendor/FreeImage/Source/FreeImage/CacheFile.cpp +271 -0
  31. data/vendor/FreeImage/Source/FreeImage/ColorLookup.cpp +785 -0
  32. data/vendor/FreeImage/Source/FreeImage/Conversion.cpp +551 -0
  33. data/vendor/FreeImage/Source/FreeImage/Conversion16_555.cpp +209 -0
  34. data/vendor/FreeImage/Source/FreeImage/Conversion16_565.cpp +204 -0
  35. data/vendor/FreeImage/Source/FreeImage/Conversion24.cpp +252 -0
  36. data/vendor/FreeImage/Source/FreeImage/Conversion32.cpp +345 -0
  37. data/vendor/FreeImage/Source/FreeImage/Conversion4.cpp +246 -0
  38. data/vendor/FreeImage/Source/FreeImage/Conversion8.cpp +305 -0
  39. data/vendor/FreeImage/Source/FreeImage/ConversionFloat.cpp +194 -0
  40. data/vendor/FreeImage/Source/FreeImage/ConversionRGB16.cpp +144 -0
  41. data/vendor/FreeImage/Source/FreeImage/ConversionRGBA16.cpp +147 -0
  42. data/vendor/FreeImage/Source/FreeImage/ConversionRGBAF.cpp +250 -0
  43. data/vendor/FreeImage/Source/FreeImage/ConversionRGBF.cpp +243 -0
  44. data/vendor/FreeImage/Source/FreeImage/ConversionType.cpp +699 -0
  45. data/vendor/FreeImage/Source/FreeImage/ConversionUINT16.cpp +134 -0
  46. data/vendor/FreeImage/Source/FreeImage/FreeImage.cpp +226 -0
  47. data/vendor/FreeImage/Source/FreeImage/FreeImageC.c +22 -0
  48. data/vendor/FreeImage/Source/FreeImage/FreeImageIO.cpp +175 -0
  49. data/vendor/FreeImage/Source/FreeImage/GetType.cpp +92 -0
  50. data/vendor/FreeImage/Source/FreeImage/Halftoning.cpp +474 -0
  51. data/vendor/FreeImage/Source/FreeImage/J2KHelper.cpp +591 -0
  52. data/vendor/FreeImage/Source/FreeImage/J2KHelper.h +36 -0
  53. data/vendor/FreeImage/Source/FreeImage/LFPQuantizer.cpp +208 -0
  54. data/vendor/FreeImage/Source/FreeImage/MNGHelper.cpp +1320 -0
  55. data/vendor/FreeImage/Source/FreeImage/MemoryIO.cpp +237 -0
  56. data/vendor/FreeImage/Source/FreeImage/MultiPage.cpp +974 -0
  57. data/vendor/FreeImage/Source/FreeImage/NNQuantizer.cpp +507 -0
  58. data/vendor/FreeImage/Source/FreeImage/PSDParser.cpp +1057 -0
  59. data/vendor/FreeImage/Source/FreeImage/PSDParser.h +271 -0
  60. data/vendor/FreeImage/Source/FreeImage/PixelAccess.cpp +197 -0
  61. data/vendor/FreeImage/Source/FreeImage/Plugin.cpp +822 -0
  62. data/vendor/FreeImage/Source/FreeImage/PluginBMP.cpp +1494 -0
  63. data/vendor/FreeImage/Source/FreeImage/PluginCUT.cpp +240 -0
  64. data/vendor/FreeImage/Source/FreeImage/PluginDDS.cpp +655 -0
  65. data/vendor/FreeImage/Source/FreeImage/PluginEXR.cpp +773 -0
  66. data/vendor/FreeImage/Source/FreeImage/PluginG3.cpp +433 -0
  67. data/vendor/FreeImage/Source/FreeImage/PluginGIF.cpp +1407 -0
  68. data/vendor/FreeImage/Source/FreeImage/PluginHDR.cpp +722 -0
  69. data/vendor/FreeImage/Source/FreeImage/PluginICO.cpp +824 -0
  70. data/vendor/FreeImage/Source/FreeImage/PluginIFF.cpp +459 -0
  71. data/vendor/FreeImage/Source/FreeImage/PluginJ2K.cpp +328 -0
  72. data/vendor/FreeImage/Source/FreeImage/PluginJNG.cpp +162 -0
  73. data/vendor/FreeImage/Source/FreeImage/PluginJP2.cpp +328 -0
  74. data/vendor/FreeImage/Source/FreeImage/PluginJPEG.cpp +1706 -0
  75. data/vendor/FreeImage/Source/FreeImage/PluginJXR.cpp +1475 -0
  76. data/vendor/FreeImage/Source/FreeImage/PluginKOALA.cpp +243 -0
  77. data/vendor/FreeImage/Source/FreeImage/PluginMNG.cpp +153 -0
  78. data/vendor/FreeImage/Source/FreeImage/PluginPCD.cpp +251 -0
  79. data/vendor/FreeImage/Source/FreeImage/PluginPCX.cpp +659 -0
  80. data/vendor/FreeImage/Source/FreeImage/PluginPFM.cpp +409 -0
  81. data/vendor/FreeImage/Source/FreeImage/PluginPICT.cpp +1343 -0
  82. data/vendor/FreeImage/Source/FreeImage/PluginPNG.cpp +1115 -0
  83. data/vendor/FreeImage/Source/FreeImage/PluginPNM.cpp +838 -0
  84. data/vendor/FreeImage/Source/FreeImage/PluginPSD.cpp +131 -0
  85. data/vendor/FreeImage/Source/FreeImage/PluginRAS.cpp +512 -0
  86. data/vendor/FreeImage/Source/FreeImage/PluginRAW.cpp +793 -0
  87. data/vendor/FreeImage/Source/FreeImage/PluginSGI.cpp +425 -0
  88. data/vendor/FreeImage/Source/FreeImage/PluginTARGA.cpp +1591 -0
  89. data/vendor/FreeImage/Source/FreeImage/PluginTIFF.cpp +2631 -0
  90. data/vendor/FreeImage/Source/FreeImage/PluginWBMP.cpp +372 -0
  91. data/vendor/FreeImage/Source/FreeImage/PluginWebP.cpp +698 -0
  92. data/vendor/FreeImage/Source/FreeImage/PluginXBM.cpp +399 -0
  93. data/vendor/FreeImage/Source/FreeImage/PluginXPM.cpp +487 -0
  94. data/vendor/FreeImage/Source/FreeImage/TIFFLogLuv.cpp +65 -0
  95. data/vendor/FreeImage/Source/FreeImage/ToneMapping.cpp +75 -0
  96. data/vendor/FreeImage/Source/FreeImage/WuQuantizer.cpp +559 -0
  97. data/vendor/FreeImage/Source/FreeImage/ZLibInterface.cpp +223 -0
  98. data/vendor/FreeImage/Source/FreeImage/tmoColorConvert.cpp +479 -0
  99. data/vendor/FreeImage/Source/FreeImage/tmoDrago03.cpp +295 -0
  100. data/vendor/FreeImage/Source/FreeImage/tmoFattal02.cpp +689 -0
  101. data/vendor/FreeImage/Source/FreeImage/tmoReinhard05.cpp +260 -0
  102. data/vendor/FreeImage/Source/FreeImage.h +1153 -0
  103. data/vendor/FreeImage/Source/FreeImageIO.h +63 -0
  104. data/vendor/FreeImage/Source/FreeImageToolkit/BSplineRotate.cpp +730 -0
  105. data/vendor/FreeImage/Source/FreeImageToolkit/Background.cpp +895 -0
  106. data/vendor/FreeImage/Source/FreeImageToolkit/Channels.cpp +488 -0
  107. data/vendor/FreeImage/Source/FreeImageToolkit/ClassicRotate.cpp +917 -0
  108. data/vendor/FreeImage/Source/FreeImageToolkit/Colors.cpp +967 -0
  109. data/vendor/FreeImage/Source/FreeImageToolkit/CopyPaste.cpp +861 -0
  110. data/vendor/FreeImage/Source/FreeImageToolkit/Display.cpp +230 -0
  111. data/vendor/FreeImage/Source/FreeImageToolkit/Filters.h +287 -0
  112. data/vendor/FreeImage/Source/FreeImageToolkit/Flip.cpp +166 -0
  113. data/vendor/FreeImage/Source/FreeImageToolkit/JPEGTransform.cpp +623 -0
  114. data/vendor/FreeImage/Source/FreeImageToolkit/MultigridPoissonSolver.cpp +505 -0
  115. data/vendor/FreeImage/Source/FreeImageToolkit/Rescale.cpp +192 -0
  116. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.cpp +2116 -0
  117. data/vendor/FreeImage/Source/FreeImageToolkit/Resize.h +196 -0
  118. data/vendor/FreeImage/Source/LibJPEG/ansi2knr.c +739 -0
  119. data/vendor/FreeImage/Source/LibJPEG/cderror.h +134 -0
  120. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.c +181 -0
  121. data/vendor/FreeImage/Source/LibJPEG/cdjpeg.h +187 -0
  122. data/vendor/FreeImage/Source/LibJPEG/cjpeg.c +664 -0
  123. data/vendor/FreeImage/Source/LibJPEG/ckconfig.c +402 -0
  124. data/vendor/FreeImage/Source/LibJPEG/djpeg.c +617 -0
  125. data/vendor/FreeImage/Source/LibJPEG/example.c +433 -0
  126. data/vendor/FreeImage/Source/LibJPEG/jaricom.c +153 -0
  127. data/vendor/FreeImage/Source/LibJPEG/jcapimin.c +288 -0
  128. data/vendor/FreeImage/Source/LibJPEG/jcapistd.c +162 -0
  129. data/vendor/FreeImage/Source/LibJPEG/jcarith.c +944 -0
  130. data/vendor/FreeImage/Source/LibJPEG/jccoefct.c +454 -0
  131. data/vendor/FreeImage/Source/LibJPEG/jccolor.c +604 -0
  132. data/vendor/FreeImage/Source/LibJPEG/jcdctmgr.c +477 -0
  133. data/vendor/FreeImage/Source/LibJPEG/jchuff.c +1573 -0
  134. data/vendor/FreeImage/Source/LibJPEG/jcinit.c +84 -0
  135. data/vendor/FreeImage/Source/LibJPEG/jcmainct.c +297 -0
  136. data/vendor/FreeImage/Source/LibJPEG/jcmarker.c +719 -0
  137. data/vendor/FreeImage/Source/LibJPEG/jcmaster.c +856 -0
  138. data/vendor/FreeImage/Source/LibJPEG/jcomapi.c +106 -0
  139. data/vendor/FreeImage/Source/LibJPEG/jconfig.h +161 -0
  140. data/vendor/FreeImage/Source/LibJPEG/jcparam.c +675 -0
  141. data/vendor/FreeImage/Source/LibJPEG/jcprepct.c +358 -0
  142. data/vendor/FreeImage/Source/LibJPEG/jcsample.c +545 -0
  143. data/vendor/FreeImage/Source/LibJPEG/jctrans.c +385 -0
  144. data/vendor/FreeImage/Source/LibJPEG/jdapimin.c +399 -0
  145. data/vendor/FreeImage/Source/LibJPEG/jdapistd.c +276 -0
  146. data/vendor/FreeImage/Source/LibJPEG/jdarith.c +796 -0
  147. data/vendor/FreeImage/Source/LibJPEG/jdatadst.c +270 -0
  148. data/vendor/FreeImage/Source/LibJPEG/jdatasrc.c +275 -0
  149. data/vendor/FreeImage/Source/LibJPEG/jdcoefct.c +741 -0
  150. data/vendor/FreeImage/Source/LibJPEG/jdcolor.c +748 -0
  151. data/vendor/FreeImage/Source/LibJPEG/jdct.h +393 -0
  152. data/vendor/FreeImage/Source/LibJPEG/jddctmgr.c +384 -0
  153. data/vendor/FreeImage/Source/LibJPEG/jdhuff.c +1554 -0
  154. data/vendor/FreeImage/Source/LibJPEG/jdinput.c +662 -0
  155. data/vendor/FreeImage/Source/LibJPEG/jdmainct.c +513 -0
  156. data/vendor/FreeImage/Source/LibJPEG/jdmarker.c +1511 -0
  157. data/vendor/FreeImage/Source/LibJPEG/jdmaster.c +543 -0
  158. data/vendor/FreeImage/Source/LibJPEG/jdmerge.c +401 -0
  159. data/vendor/FreeImage/Source/LibJPEG/jdpostct.c +290 -0
  160. data/vendor/FreeImage/Source/LibJPEG/jdsample.c +361 -0
  161. data/vendor/FreeImage/Source/LibJPEG/jdtrans.c +140 -0
  162. data/vendor/FreeImage/Source/LibJPEG/jerror.c +253 -0
  163. data/vendor/FreeImage/Source/LibJPEG/jerror.h +304 -0
  164. data/vendor/FreeImage/Source/LibJPEG/jfdctflt.c +174 -0
  165. data/vendor/FreeImage/Source/LibJPEG/jfdctfst.c +230 -0
  166. data/vendor/FreeImage/Source/LibJPEG/jfdctint.c +4406 -0
  167. data/vendor/FreeImage/Source/LibJPEG/jidctflt.c +235 -0
  168. data/vendor/FreeImage/Source/LibJPEG/jidctfst.c +368 -0
  169. data/vendor/FreeImage/Source/LibJPEG/jidctint.c +5179 -0
  170. data/vendor/FreeImage/Source/LibJPEG/jinclude.h +91 -0
  171. data/vendor/FreeImage/Source/LibJPEG/jmemansi.c +167 -0
  172. data/vendor/FreeImage/Source/LibJPEG/jmemdos.c +638 -0
  173. data/vendor/FreeImage/Source/LibJPEG/jmemmac.c +289 -0
  174. data/vendor/FreeImage/Source/LibJPEG/jmemmgr.c +1119 -0
  175. data/vendor/FreeImage/Source/LibJPEG/jmemname.c +276 -0
  176. data/vendor/FreeImage/Source/LibJPEG/jmemnobs.c +109 -0
  177. data/vendor/FreeImage/Source/LibJPEG/jmemsys.h +198 -0
  178. data/vendor/FreeImage/Source/LibJPEG/jmorecfg.h +442 -0
  179. data/vendor/FreeImage/Source/LibJPEG/jpegint.h +426 -0
  180. data/vendor/FreeImage/Source/LibJPEG/jpeglib.h +1180 -0
  181. data/vendor/FreeImage/Source/LibJPEG/jpegtran.c +577 -0
  182. data/vendor/FreeImage/Source/LibJPEG/jquant1.c +857 -0
  183. data/vendor/FreeImage/Source/LibJPEG/jquant2.c +1311 -0
  184. data/vendor/FreeImage/Source/LibJPEG/jutils.c +227 -0
  185. data/vendor/FreeImage/Source/LibJPEG/jversion.h +14 -0
  186. data/vendor/FreeImage/Source/LibJPEG/rdbmp.c +480 -0
  187. data/vendor/FreeImage/Source/LibJPEG/rdcolmap.c +253 -0
  188. data/vendor/FreeImage/Source/LibJPEG/rdgif.c +38 -0
  189. data/vendor/FreeImage/Source/LibJPEG/rdjpgcom.c +515 -0
  190. data/vendor/FreeImage/Source/LibJPEG/rdppm.c +459 -0
  191. data/vendor/FreeImage/Source/LibJPEG/rdrle.c +387 -0
  192. data/vendor/FreeImage/Source/LibJPEG/rdswitch.c +365 -0
  193. data/vendor/FreeImage/Source/LibJPEG/rdtarga.c +500 -0
  194. data/vendor/FreeImage/Source/LibJPEG/transupp.c +1763 -0
  195. data/vendor/FreeImage/Source/LibJPEG/transupp.h +219 -0
  196. data/vendor/FreeImage/Source/LibJPEG/wrbmp.c +442 -0
  197. data/vendor/FreeImage/Source/LibJPEG/wrgif.c +399 -0
  198. data/vendor/FreeImage/Source/LibJPEG/wrjpgcom.c +583 -0
  199. data/vendor/FreeImage/Source/LibJPEG/wrppm.c +269 -0
  200. data/vendor/FreeImage/Source/LibJPEG/wrrle.c +305 -0
  201. data/vendor/FreeImage/Source/LibJPEG/wrtarga.c +253 -0
  202. data/vendor/FreeImage/Source/LibJXR/common/include/guiddef.h +230 -0
  203. data/vendor/FreeImage/Source/LibJXR/common/include/wmsal.h +757 -0
  204. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstring.h +342 -0
  205. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_adt.h +71 -0
  206. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_strict.h +1096 -0
  207. data/vendor/FreeImage/Source/LibJXR/common/include/wmspecstrings_undef.h +406 -0
  208. data/vendor/FreeImage/Source/LibJXR/image/decode/JXRTranscode.c +987 -0
  209. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.c +200 -0
  210. data/vendor/FreeImage/Source/LibJXR/image/decode/decode.h +143 -0
  211. data/vendor/FreeImage/Source/LibJXR/image/decode/postprocess.c +288 -0
  212. data/vendor/FreeImage/Source/LibJXR/image/decode/segdec.c +1205 -0
  213. data/vendor/FreeImage/Source/LibJXR/image/decode/strInvTransform.c +1888 -0
  214. data/vendor/FreeImage/Source/LibJXR/image/decode/strPredQuantDec.c +539 -0
  215. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec.c +3628 -0
  216. data/vendor/FreeImage/Source/LibJXR/image/decode/strdec_x86.c +1640 -0
  217. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.c +144 -0
  218. data/vendor/FreeImage/Source/LibJXR/image/encode/encode.h +113 -0
  219. data/vendor/FreeImage/Source/LibJXR/image/encode/segenc.c +1186 -0
  220. data/vendor/FreeImage/Source/LibJXR/image/encode/strFwdTransform.c +1111 -0
  221. data/vendor/FreeImage/Source/LibJXR/image/encode/strPredQuantEnc.c +511 -0
  222. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc.c +2370 -0
  223. data/vendor/FreeImage/Source/LibJXR/image/encode/strenc_x86.c +409 -0
  224. data/vendor/FreeImage/Source/LibJXR/image/sys/adapthuff.c +511 -0
  225. data/vendor/FreeImage/Source/LibJXR/image/sys/ansi.h +61 -0
  226. data/vendor/FreeImage/Source/LibJXR/image/sys/common.h +131 -0
  227. data/vendor/FreeImage/Source/LibJXR/image/sys/image.c +183 -0
  228. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimer.h +115 -0
  229. data/vendor/FreeImage/Source/LibJXR/image/sys/perfTimerANSI.c +274 -0
  230. data/vendor/FreeImage/Source/LibJXR/image/sys/strPredQuant.c +306 -0
  231. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.c +85 -0
  232. data/vendor/FreeImage/Source/LibJXR/image/sys/strTransform.h +50 -0
  233. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.c +1251 -0
  234. data/vendor/FreeImage/Source/LibJXR/image/sys/strcodec.h +681 -0
  235. data/vendor/FreeImage/Source/LibJXR/image/sys/windowsmediaphoto.h +515 -0
  236. data/vendor/FreeImage/Source/LibJXR/image/sys/xplatform_image.h +84 -0
  237. data/vendor/FreeImage/Source/LibJXR/image/x86/x86.h +58 -0
  238. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.c +930 -0
  239. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlue.h +636 -0
  240. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGlueJxr.c +2246 -0
  241. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRGluePFC.c +2338 -0
  242. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.c +905 -0
  243. data/vendor/FreeImage/Source/LibJXR/jxrgluelib/JXRMeta.h +258 -0
  244. data/vendor/FreeImage/Source/LibOpenJPEG/bio.c +188 -0
  245. data/vendor/FreeImage/Source/LibOpenJPEG/bio.h +128 -0
  246. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.c +239 -0
  247. data/vendor/FreeImage/Source/LibOpenJPEG/cidx_manager.h +68 -0
  248. data/vendor/FreeImage/Source/LibOpenJPEG/cio.c +644 -0
  249. data/vendor/FreeImage/Source/LibOpenJPEG/cio.h +393 -0
  250. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.c +919 -0
  251. data/vendor/FreeImage/Source/LibOpenJPEG/dwt.h +116 -0
  252. data/vendor/FreeImage/Source/LibOpenJPEG/event.c +141 -0
  253. data/vendor/FreeImage/Source/LibOpenJPEG/event.h +97 -0
  254. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.c +114 -0
  255. data/vendor/FreeImage/Source/LibOpenJPEG/function_list.h +126 -0
  256. data/vendor/FreeImage/Source/LibOpenJPEG/image.c +235 -0
  257. data/vendor/FreeImage/Source/LibOpenJPEG/image.h +63 -0
  258. data/vendor/FreeImage/Source/LibOpenJPEG/indexbox_manager.h +148 -0
  259. data/vendor/FreeImage/Source/LibOpenJPEG/invert.c +289 -0
  260. data/vendor/FreeImage/Source/LibOpenJPEG/invert.h +59 -0
  261. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.c +10238 -0
  262. data/vendor/FreeImage/Source/LibOpenJPEG/j2k.h +838 -0
  263. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.c +2776 -0
  264. data/vendor/FreeImage/Source/LibOpenJPEG/jp2.h +490 -0
  265. data/vendor/FreeImage/Source/LibOpenJPEG/mct.c +319 -0
  266. data/vendor/FreeImage/Source/LibOpenJPEG/mct.h +149 -0
  267. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.c +604 -0
  268. data/vendor/FreeImage/Source/LibOpenJPEG/mqc.h +201 -0
  269. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.c +955 -0
  270. data/vendor/FreeImage/Source/LibOpenJPEG/openjpeg.h +1475 -0
  271. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.c +59 -0
  272. data/vendor/FreeImage/Source/LibOpenJPEG/opj_clock.h +54 -0
  273. data/vendor/FreeImage/Source/LibOpenJPEG/opj_codec.h +160 -0
  274. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config.h +9 -0
  275. data/vendor/FreeImage/Source/LibOpenJPEG/opj_config_private.h +16 -0
  276. data/vendor/FreeImage/Source/LibOpenJPEG/opj_includes.h +175 -0
  277. data/vendor/FreeImage/Source/LibOpenJPEG/opj_intmath.h +172 -0
  278. data/vendor/FreeImage/Source/LibOpenJPEG/opj_inttypes.h +43 -0
  279. data/vendor/FreeImage/Source/LibOpenJPEG/opj_malloc.h +180 -0
  280. data/vendor/FreeImage/Source/LibOpenJPEG/opj_stdint.h +47 -0
  281. data/vendor/FreeImage/Source/LibOpenJPEG/phix_manager.c +191 -0
  282. data/vendor/FreeImage/Source/LibOpenJPEG/pi.c +1870 -0
  283. data/vendor/FreeImage/Source/LibOpenJPEG/pi.h +182 -0
  284. data/vendor/FreeImage/Source/LibOpenJPEG/ppix_manager.c +194 -0
  285. data/vendor/FreeImage/Source/LibOpenJPEG/raw.c +89 -0
  286. data/vendor/FreeImage/Source/LibOpenJPEG/raw.h +100 -0
  287. data/vendor/FreeImage/Source/LibOpenJPEG/t1.c +1751 -0
  288. data/vendor/FreeImage/Source/LibOpenJPEG/t1.h +157 -0
  289. data/vendor/FreeImage/Source/LibOpenJPEG/t1_generate_luts.c +276 -0
  290. data/vendor/FreeImage/Source/LibOpenJPEG/t1_luts.h +143 -0
  291. data/vendor/FreeImage/Source/LibOpenJPEG/t2.c +1334 -0
  292. data/vendor/FreeImage/Source/LibOpenJPEG/t2.h +127 -0
  293. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.c +2123 -0
  294. data/vendor/FreeImage/Source/LibOpenJPEG/tcd.h +348 -0
  295. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.c +331 -0
  296. data/vendor/FreeImage/Source/LibOpenJPEG/tgt.h +140 -0
  297. data/vendor/FreeImage/Source/LibOpenJPEG/thix_manager.c +134 -0
  298. data/vendor/FreeImage/Source/LibOpenJPEG/tpix_manager.c +185 -0
  299. data/vendor/FreeImage/Source/LibPNG/example.c +1061 -0
  300. data/vendor/FreeImage/Source/LibPNG/png.c +4493 -0
  301. data/vendor/FreeImage/Source/LibPNG/png.h +3282 -0
  302. data/vendor/FreeImage/Source/LibPNG/pngconf.h +644 -0
  303. data/vendor/FreeImage/Source/LibPNG/pngdebug.h +154 -0
  304. data/vendor/FreeImage/Source/LibPNG/pngerror.c +963 -0
  305. data/vendor/FreeImage/Source/LibPNG/pngget.c +1213 -0
  306. data/vendor/FreeImage/Source/LibPNG/pnginfo.h +260 -0
  307. data/vendor/FreeImage/Source/LibPNG/pnglibconf.h +218 -0
  308. data/vendor/FreeImage/Source/LibPNG/pngmem.c +281 -0
  309. data/vendor/FreeImage/Source/LibPNG/pngpread.c +1168 -0
  310. data/vendor/FreeImage/Source/LibPNG/pngpriv.h +1944 -0
  311. data/vendor/FreeImage/Source/LibPNG/pngread.c +4121 -0
  312. data/vendor/FreeImage/Source/LibPNG/pngrio.c +120 -0
  313. data/vendor/FreeImage/Source/LibPNG/pngrtran.c +4994 -0
  314. data/vendor/FreeImage/Source/LibPNG/pngrutil.c +4474 -0
  315. data/vendor/FreeImage/Source/LibPNG/pngset.c +1611 -0
  316. data/vendor/FreeImage/Source/LibPNG/pngstruct.h +489 -0
  317. data/vendor/FreeImage/Source/LibPNG/pngtest.c +2011 -0
  318. data/vendor/FreeImage/Source/LibPNG/pngtrans.c +849 -0
  319. data/vendor/FreeImage/Source/LibPNG/pngwio.c +168 -0
  320. data/vendor/FreeImage/Source/LibPNG/pngwrite.c +2455 -0
  321. data/vendor/FreeImage/Source/LibPNG/pngwtran.c +574 -0
  322. data/vendor/FreeImage/Source/LibPNG/pngwutil.c +3029 -0
  323. data/vendor/FreeImage/Source/LibRawLite/dcraw/dcraw.c +15462 -0
  324. data/vendor/FreeImage/Source/LibRawLite/internal/aahd_demosaic.cpp +706 -0
  325. data/vendor/FreeImage/Source/LibRawLite/internal/dcb_demosaicing.c +710 -0
  326. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_common.cpp +13593 -0
  327. data/vendor/FreeImage/Source/LibRawLite/internal/dcraw_fileio.cpp +240 -0
  328. data/vendor/FreeImage/Source/LibRawLite/internal/defines.h +167 -0
  329. data/vendor/FreeImage/Source/LibRawLite/internal/demosaic_packs.cpp +99 -0
  330. data/vendor/FreeImage/Source/LibRawLite/internal/dht_demosaic.cpp +873 -0
  331. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_internal_funcs.h +282 -0
  332. data/vendor/FreeImage/Source/LibRawLite/internal/libraw_x3f.cpp +1919 -0
  333. data/vendor/FreeImage/Source/LibRawLite/internal/var_defines.h +216 -0
  334. data/vendor/FreeImage/Source/LibRawLite/internal/wf_filtering.cpp +1950 -0
  335. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw.h +338 -0
  336. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_alloc.h +99 -0
  337. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_const.h +233 -0
  338. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_datastream.h +238 -0
  339. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_internal.h +225 -0
  340. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_types.h +442 -0
  341. data/vendor/FreeImage/Source/LibRawLite/libraw/libraw_version.h +62 -0
  342. data/vendor/FreeImage/Source/LibRawLite/src/libraw_c_api.cpp +230 -0
  343. data/vendor/FreeImage/Source/LibRawLite/src/libraw_cxx.cpp +4533 -0
  344. data/vendor/FreeImage/Source/LibRawLite/src/libraw_datastream.cpp +703 -0
  345. data/vendor/FreeImage/Source/LibTIFF4/mkg3states.c +451 -0
  346. data/vendor/FreeImage/Source/LibTIFF4/mkspans.c +82 -0
  347. data/vendor/FreeImage/Source/LibTIFF4/t4.h +292 -0
  348. data/vendor/FreeImage/Source/LibTIFF4/tif_aux.c +358 -0
  349. data/vendor/FreeImage/Source/LibTIFF4/tif_close.c +140 -0
  350. data/vendor/FreeImage/Source/LibTIFF4/tif_codec.c +166 -0
  351. data/vendor/FreeImage/Source/LibTIFF4/tif_color.c +287 -0
  352. data/vendor/FreeImage/Source/LibTIFF4/tif_compress.c +304 -0
  353. data/vendor/FreeImage/Source/LibTIFF4/tif_config.h +97 -0
  354. data/vendor/FreeImage/Source/LibTIFF4/tif_config.vc.h +74 -0
  355. data/vendor/FreeImage/Source/LibTIFF4/tif_config.wince.h +71 -0
  356. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.c +1700 -0
  357. data/vendor/FreeImage/Source/LibTIFF4/tif_dir.h +308 -0
  358. data/vendor/FreeImage/Source/LibTIFF4/tif_dirinfo.c +959 -0
  359. data/vendor/FreeImage/Source/LibTIFF4/tif_dirread.c +5640 -0
  360. data/vendor/FreeImage/Source/LibTIFF4/tif_dirwrite.c +2910 -0
  361. data/vendor/FreeImage/Source/LibTIFF4/tif_dumpmode.c +143 -0
  362. data/vendor/FreeImage/Source/LibTIFF4/tif_error.c +80 -0
  363. data/vendor/FreeImage/Source/LibTIFF4/tif_extension.c +118 -0
  364. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.c +1595 -0
  365. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3.h +538 -0
  366. data/vendor/FreeImage/Source/LibTIFF4/tif_fax3sm.c +1260 -0
  367. data/vendor/FreeImage/Source/LibTIFF4/tif_flush.c +118 -0
  368. data/vendor/FreeImage/Source/LibTIFF4/tif_getimage.c +2890 -0
  369. data/vendor/FreeImage/Source/LibTIFF4/tif_jbig.c +213 -0
  370. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg.c +2354 -0
  371. data/vendor/FreeImage/Source/LibTIFF4/tif_jpeg_12.c +65 -0
  372. data/vendor/FreeImage/Source/LibTIFF4/tif_luv.c +1683 -0
  373. data/vendor/FreeImage/Source/LibTIFF4/tif_lzma.c +495 -0
  374. data/vendor/FreeImage/Source/LibTIFF4/tif_lzw.c +1169 -0
  375. data/vendor/FreeImage/Source/LibTIFF4/tif_next.c +181 -0
  376. data/vendor/FreeImage/Source/LibTIFF4/tif_ojpeg.c +2501 -0
  377. data/vendor/FreeImage/Source/LibTIFF4/tif_open.c +725 -0
  378. data/vendor/FreeImage/Source/LibTIFF4/tif_packbits.c +300 -0
  379. data/vendor/FreeImage/Source/LibTIFF4/tif_pixarlog.c +1442 -0
  380. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.c +764 -0
  381. data/vendor/FreeImage/Source/LibTIFF4/tif_predict.h +77 -0
  382. data/vendor/FreeImage/Source/LibTIFF4/tif_print.c +716 -0
  383. data/vendor/FreeImage/Source/LibTIFF4/tif_read.c +1086 -0
  384. data/vendor/FreeImage/Source/LibTIFF4/tif_strip.c +383 -0
  385. data/vendor/FreeImage/Source/LibTIFF4/tif_swab.c +310 -0
  386. data/vendor/FreeImage/Source/LibTIFF4/tif_thunder.c +207 -0
  387. data/vendor/FreeImage/Source/LibTIFF4/tif_tile.c +299 -0
  388. data/vendor/FreeImage/Source/LibTIFF4/tif_unix.c +325 -0
  389. data/vendor/FreeImage/Source/LibTIFF4/tif_version.c +40 -0
  390. data/vendor/FreeImage/Source/LibTIFF4/tif_vms.c +603 -0
  391. data/vendor/FreeImage/Source/LibTIFF4/tif_warning.c +81 -0
  392. data/vendor/FreeImage/Source/LibTIFF4/tif_win32.c +443 -0
  393. data/vendor/FreeImage/Source/LibTIFF4/tif_wince.c +293 -0
  394. data/vendor/FreeImage/Source/LibTIFF4/tif_write.c +771 -0
  395. data/vendor/FreeImage/Source/LibTIFF4/tif_zip.c +472 -0
  396. data/vendor/FreeImage/Source/LibTIFF4/tiff.h +681 -0
  397. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.h +170 -0
  398. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.vc.h +160 -0
  399. data/vendor/FreeImage/Source/LibTIFF4/tiffconf.wince.h +121 -0
  400. data/vendor/FreeImage/Source/LibTIFF4/tiffio.h +557 -0
  401. data/vendor/FreeImage/Source/LibTIFF4/tiffiop.h +367 -0
  402. data/vendor/FreeImage/Source/LibTIFF4/tiffvers.h +9 -0
  403. data/vendor/FreeImage/Source/LibTIFF4/uvcode.h +180 -0
  404. data/vendor/FreeImage/Source/LibWebP/src/dec/alphai.h +55 -0
  405. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.alpha.c +167 -0
  406. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.buffer.c +249 -0
  407. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.frame.c +827 -0
  408. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.idec.c +857 -0
  409. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.io.c +640 -0
  410. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.quant.c +110 -0
  411. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.tree.c +525 -0
  412. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8.c +663 -0
  413. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.vp8l.c +1584 -0
  414. data/vendor/FreeImage/Source/LibWebP/src/dec/dec.webp.c +834 -0
  415. data/vendor/FreeImage/Source/LibWebP/src/dec/decode_vp8.h +185 -0
  416. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8i.h +353 -0
  417. data/vendor/FreeImage/Source/LibWebP/src/dec/vp8li.h +136 -0
  418. data/vendor/FreeImage/Source/LibWebP/src/dec/webpi.h +120 -0
  419. data/vendor/FreeImage/Source/LibWebP/src/demux/demux.demux.c +957 -0
  420. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing.c +377 -0
  421. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_mips_dsp_r2.c +139 -0
  422. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.alpha_processing_sse2.c +296 -0
  423. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb.c +68 -0
  424. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_mips_dsp_r2.c +108 -0
  425. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.argb_sse2.c +62 -0
  426. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost.c +412 -0
  427. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips32.c +154 -0
  428. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_mips_dsp_r2.c +107 -0
  429. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cost_sse2.c +121 -0
  430. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.cpu.c +138 -0
  431. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec.c +760 -0
  432. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_clip_tables.c +366 -0
  433. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips32.c +585 -0
  434. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_mips_dsp_r2.c +992 -0
  435. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_neon.c +1489 -0
  436. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.dec_sse2.c +1284 -0
  437. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc.c +788 -0
  438. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_avx2.c +24 -0
  439. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips32.c +670 -0
  440. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_mips_dsp_r2.c +1510 -0
  441. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_neon.c +932 -0
  442. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.enc_sse2.c +940 -0
  443. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters.c +240 -0
  444. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_mips_dsp_r2.c +404 -0
  445. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.filters_sse2.c +349 -0
  446. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.h +434 -0
  447. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless.c +1838 -0
  448. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips32.c +416 -0
  449. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_mips_dsp_r2.c +921 -0
  450. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_neon.c +357 -0
  451. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.lossless_sse2.c +535 -0
  452. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler.c +115 -0
  453. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips32.c +192 -0
  454. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.rescaler_mips_dsp_r2.c +210 -0
  455. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling.c +252 -0
  456. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_mips_dsp_r2.c +280 -0
  457. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_neon.c +267 -0
  458. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.upsampling_sse2.c +214 -0
  459. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv.c +166 -0
  460. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips32.c +100 -0
  461. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_mips_dsp_r2.c +131 -0
  462. data/vendor/FreeImage/Source/LibWebP/src/dsp/dsp.yuv_sse2.c +322 -0
  463. data/vendor/FreeImage/Source/LibWebP/src/dsp/lossless.h +313 -0
  464. data/vendor/FreeImage/Source/LibWebP/src/dsp/mips_macro.h +200 -0
  465. data/vendor/FreeImage/Source/LibWebP/src/dsp/neon.h +82 -0
  466. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv.h +321 -0
  467. data/vendor/FreeImage/Source/LibWebP/src/dsp/yuv_tables_sse2.h +536 -0
  468. data/vendor/FreeImage/Source/LibWebP/src/enc/backward_references.h +202 -0
  469. data/vendor/FreeImage/Source/LibWebP/src/enc/cost.h +69 -0
  470. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.alpha.c +440 -0
  471. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.analysis.c +501 -0
  472. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.backward_references.c +1076 -0
  473. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.config.c +163 -0
  474. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.cost.c +355 -0
  475. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.filter.c +296 -0
  476. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.frame.c +850 -0
  477. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.histogram.c +897 -0
  478. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.iterator.c +456 -0
  479. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.near_lossless.c +160 -0
  480. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture.c +290 -0
  481. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_csp.c +1100 -0
  482. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_psnr.c +150 -0
  483. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_rescale.c +285 -0
  484. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.picture_tools.c +206 -0
  485. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.quant.c +1191 -0
  486. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.syntax.c +383 -0
  487. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.token.c +285 -0
  488. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.tree.c +504 -0
  489. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.vp8l.c +1437 -0
  490. data/vendor/FreeImage/Source/LibWebP/src/enc/enc.webpenc.c +379 -0
  491. data/vendor/FreeImage/Source/LibWebP/src/enc/histogram.h +114 -0
  492. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8enci.h +551 -0
  493. data/vendor/FreeImage/Source/LibWebP/src/enc/vp8li.h +78 -0
  494. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.anim_encode.c +1241 -0
  495. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxedit.c +696 -0
  496. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxinternal.c +551 -0
  497. data/vendor/FreeImage/Source/LibWebP/src/mux/mux.muxread.c +544 -0
  498. data/vendor/FreeImage/Source/LibWebP/src/mux/muxi.h +232 -0
  499. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader.h +168 -0
  500. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_reader_inl.h +172 -0
  501. data/vendor/FreeImage/Source/LibWebP/src/utils/bit_writer.h +120 -0
  502. data/vendor/FreeImage/Source/LibWebP/src/utils/color_cache.h +74 -0
  503. data/vendor/FreeImage/Source/LibWebP/src/utils/endian_inl.h +100 -0
  504. data/vendor/FreeImage/Source/LibWebP/src/utils/filters.h +32 -0
  505. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman.h +67 -0
  506. data/vendor/FreeImage/Source/LibWebP/src/utils/huffman_encode.h +60 -0
  507. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels.h +36 -0
  508. data/vendor/FreeImage/Source/LibWebP/src/utils/quant_levels_dec.h +35 -0
  509. data/vendor/FreeImage/Source/LibWebP/src/utils/random.h +63 -0
  510. data/vendor/FreeImage/Source/LibWebP/src/utils/rescaler.h +78 -0
  511. data/vendor/FreeImage/Source/LibWebP/src/utils/thread.h +93 -0
  512. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_reader.c +208 -0
  513. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.bit_writer.c +308 -0
  514. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.color_cache.c +49 -0
  515. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.filters.c +76 -0
  516. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.h +121 -0
  517. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman.c +205 -0
  518. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.huffman_encode.c +417 -0
  519. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels.c +140 -0
  520. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.quant_levels_dec.c +279 -0
  521. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.random.c +43 -0
  522. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.rescaler.c +82 -0
  523. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.thread.c +309 -0
  524. data/vendor/FreeImage/Source/LibWebP/src/utils/utils.utils.c +211 -0
  525. data/vendor/FreeImage/Source/LibWebP/src/webp/decode.h +493 -0
  526. data/vendor/FreeImage/Source/LibWebP/src/webp/demux.h +224 -0
  527. data/vendor/FreeImage/Source/LibWebP/src/webp/encode.h +515 -0
  528. data/vendor/FreeImage/Source/LibWebP/src/webp/format_constants.h +88 -0
  529. data/vendor/FreeImage/Source/LibWebP/src/webp/mux.h +507 -0
  530. data/vendor/FreeImage/Source/LibWebP/src/webp/mux_types.h +97 -0
  531. data/vendor/FreeImage/Source/LibWebP/src/webp/types.h +52 -0
  532. data/vendor/FreeImage/Source/MapIntrospector.h +212 -0
  533. data/vendor/FreeImage/Source/Metadata/Exif.cpp +1253 -0
  534. data/vendor/FreeImage/Source/Metadata/FIRational.cpp +176 -0
  535. data/vendor/FreeImage/Source/Metadata/FIRational.h +108 -0
  536. data/vendor/FreeImage/Source/Metadata/FreeImageTag.cpp +353 -0
  537. data/vendor/FreeImage/Source/Metadata/FreeImageTag.h +500 -0
  538. data/vendor/FreeImage/Source/Metadata/IPTC.cpp +342 -0
  539. data/vendor/FreeImage/Source/Metadata/TagConversion.cpp +1094 -0
  540. data/vendor/FreeImage/Source/Metadata/TagLib.cpp +1618 -0
  541. data/vendor/FreeImage/Source/Metadata/XTIFF.cpp +766 -0
  542. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.cpp +114 -0
  543. data/vendor/FreeImage/Source/OpenEXR/Half/eLut.h +71 -0
  544. data/vendor/FreeImage/Source/OpenEXR/Half/half.cpp +310 -0
  545. data/vendor/FreeImage/Source/OpenEXR/Half/half.h +757 -0
  546. data/vendor/FreeImage/Source/OpenEXR/Half/halfExport.h +27 -0
  547. data/vendor/FreeImage/Source/OpenEXR/Half/halfFunction.h +179 -0
  548. data/vendor/FreeImage/Source/OpenEXR/Half/halfLimits.h +102 -0
  549. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.cpp +164 -0
  550. data/vendor/FreeImage/Source/OpenEXR/Half/toFloat.h +16391 -0
  551. data/vendor/FreeImage/Source/OpenEXR/Iex/Iex.h +60 -0
  552. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.cpp +156 -0
  553. data/vendor/FreeImage/Source/OpenEXR/Iex/IexBaseExc.h +264 -0
  554. data/vendor/FreeImage/Source/OpenEXR/Iex/IexErrnoExc.h +208 -0
  555. data/vendor/FreeImage/Source/OpenEXR/Iex/IexExport.h +51 -0
  556. data/vendor/FreeImage/Source/OpenEXR/Iex/IexForward.h +229 -0
  557. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMacros.h +170 -0
  558. data/vendor/FreeImage/Source/OpenEXR/Iex/IexMathExc.h +57 -0
  559. data/vendor/FreeImage/Source/OpenEXR/Iex/IexNamespace.h +112 -0
  560. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.cpp +873 -0
  561. data/vendor/FreeImage/Source/OpenEXR/Iex/IexThrowErrnoExc.h +97 -0
  562. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.cpp +113 -0
  563. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFloatExc.h +146 -0
  564. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.cpp +530 -0
  565. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathFpu.h +91 -0
  566. data/vendor/FreeImage/Source/OpenEXR/IexMath/IexMathIeeeExc.h +62 -0
  567. data/vendor/FreeImage/Source/OpenEXR/IlmBaseConfig.h +61 -0
  568. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.cpp +633 -0
  569. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAcesFile.h +324 -0
  570. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfArray.h +285 -0
  571. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.cpp +158 -0
  572. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAttribute.h +407 -0
  573. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfAutoArray.h +95 -0
  574. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.cpp +1072 -0
  575. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfB44Compressor.h +118 -0
  576. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.cpp +111 -0
  577. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfBoxAttribute.h +87 -0
  578. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.cpp +1438 -0
  579. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCRgbaFile.h +555 -0
  580. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.cpp +322 -0
  581. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelList.h +436 -0
  582. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.cpp +150 -0
  583. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChannelListAttribute.h +74 -0
  584. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCheckedArithmetic.h +163 -0
  585. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.cpp +151 -0
  586. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticities.h +131 -0
  587. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.cpp +87 -0
  588. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfChromaticitiesAttribute.h +73 -0
  589. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.cpp +591 -0
  590. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompositeDeepScanLine.h +142 -0
  591. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompression.h +84 -0
  592. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.cpp +78 -0
  593. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressionAttribute.h +64 -0
  594. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.cpp +226 -0
  595. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfCompressor.h +265 -0
  596. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.cpp +143 -0
  597. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfConvert.h +107 -0
  598. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.cpp +110 -0
  599. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepCompositing.h +132 -0
  600. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.cpp +230 -0
  601. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepFrameBuffer.h +339 -0
  602. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageState.h +96 -0
  603. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.cpp +78 -0
  604. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepImageStateAttribute.h +68 -0
  605. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.cpp +2025 -0
  606. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputFile.h +276 -0
  607. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.cpp +149 -0
  608. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineInputPart.h +181 -0
  609. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.cpp +1552 -0
  610. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputFile.h +244 -0
  611. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.cpp +107 -0
  612. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepScanLineOutputPart.h +168 -0
  613. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.cpp +1979 -0
  614. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputFile.h +437 -0
  615. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.cpp +273 -0
  616. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledInputPart.h +362 -0
  617. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.cpp +2055 -0
  618. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputFile.h +475 -0
  619. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.cpp +250 -0
  620. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDeepTiledOutputPart.h +394 -0
  621. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.cpp +57 -0
  622. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDoubleAttribute.h +59 -0
  623. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.cpp +3424 -0
  624. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressor.h +210 -0
  625. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfDwaCompressorSimd.h +2145 -0
  626. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.cpp +335 -0
  627. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmap.h +336 -0
  628. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.cpp +76 -0
  629. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfEnvmapAttribute.h +68 -0
  630. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfExport.h +46 -0
  631. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.cpp +768 -0
  632. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFastHuf.h +148 -0
  633. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.cpp +57 -0
  634. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatAttribute.h +58 -0
  635. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.cpp +84 -0
  636. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFloatVectorAttribute.h +76 -0
  637. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfForward.h +127 -0
  638. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.cpp +228 -0
  639. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFrameBuffer.h +386 -0
  640. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.cpp +76 -0
  641. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfFramesPerSecond.h +94 -0
  642. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.cpp +76 -0
  643. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericInputFile.h +58 -0
  644. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.cpp +112 -0
  645. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfGenericOutputFile.h +62 -0
  646. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.cpp +1283 -0
  647. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHeader.h +699 -0
  648. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.cpp +1114 -0
  649. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfHuf.h +82 -0
  650. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.cpp +110 -0
  651. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIO.h +255 -0
  652. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.cpp +895 -0
  653. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputFile.h +240 -0
  654. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.cpp +114 -0
  655. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPart.h +84 -0
  656. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.cpp +51 -0
  657. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputPartData.h +69 -0
  658. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInputStreamMutex.h +68 -0
  659. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfInt64.h +56 -0
  660. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.cpp +57 -0
  661. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfIntAttribute.h +58 -0
  662. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.cpp +217 -0
  663. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCode.h +167 -0
  664. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.cpp +99 -0
  665. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfKeyCodeAttribute.h +73 -0
  666. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrder.h +69 -0
  667. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.cpp +78 -0
  668. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLineOrderAttribute.h +72 -0
  669. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.cpp +178 -0
  670. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfLut.h +188 -0
  671. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.cpp +263 -0
  672. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMatrixAttribute.h +83 -0
  673. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.cpp +1872 -0
  674. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMisc.h +466 -0
  675. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.cpp +783 -0
  676. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartInputFile.h +128 -0
  677. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.cpp +519 -0
  678. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiPartOutputFile.h +118 -0
  679. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.cpp +435 -0
  680. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfMultiView.h +187 -0
  681. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfName.h +150 -0
  682. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfNamespace.h +115 -0
  683. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.cpp +126 -0
  684. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOpaqueAttribute.h +110 -0
  685. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOptimizedPixelReading.h +646 -0
  686. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.cpp +1378 -0
  687. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputFile.h +263 -0
  688. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.cpp +105 -0
  689. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPart.h +77 -0
  690. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.cpp +52 -0
  691. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputPartData.h +62 -0
  692. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfOutputStreamMutex.h +70 -0
  693. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartHelper.h +262 -0
  694. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.cpp +63 -0
  695. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPartType.h +62 -0
  696. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPixelType.h +67 -0
  697. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.cpp +667 -0
  698. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPizCompressor.h +117 -0
  699. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.cpp +104 -0
  700. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImage.h +135 -0
  701. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.cpp +103 -0
  702. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPreviewImageAttribute.h +70 -0
  703. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.cpp +553 -0
  704. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfPxr24Compressor.h +109 -0
  705. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.cpp +127 -0
  706. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRational.h +98 -0
  707. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.cpp +74 -0
  708. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRationalAttribute.h +69 -0
  709. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgba.h +109 -0
  710. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.cpp +1405 -0
  711. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaFile.h +346 -0
  712. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.cpp +497 -0
  713. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRgbaYca.h +259 -0
  714. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.cpp +157 -0
  715. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRle.h +63 -0
  716. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.cpp +220 -0
  717. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfRleCompressor.h +80 -0
  718. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.cpp +1702 -0
  719. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfScanLineInputFile.h +210 -0
  720. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSimd.h +59 -0
  721. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.cpp +125 -0
  722. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStandardAttributes.h +382 -0
  723. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.cpp +242 -0
  724. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStdIO.h +160 -0
  725. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.cpp +80 -0
  726. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringAttribute.h +71 -0
  727. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.cpp +100 -0
  728. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfStringVectorAttribute.h +74 -0
  729. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.cpp +129 -0
  730. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfSystemSpecific.h +172 -0
  731. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.cpp +216 -0
  732. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTestFile.h +97 -0
  733. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.cpp +62 -0
  734. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfThreading.h +95 -0
  735. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescription.h +107 -0
  736. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.cpp +86 -0
  737. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileDescriptionAttribute.h +72 -0
  738. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.cpp +552 -0
  739. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTileOffsets.h +125 -0
  740. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.cpp +1533 -0
  741. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputFile.h +401 -0
  742. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.cpp +208 -0
  743. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledInputPart.h +100 -0
  744. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.cpp +389 -0
  745. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledMisc.h +106 -0
  746. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.cpp +1841 -0
  747. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputFile.h +495 -0
  748. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.cpp +228 -0
  749. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledOutputPart.h +105 -0
  750. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.cpp +1163 -0
  751. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTiledRgbaFile.h +482 -0
  752. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.cpp +431 -0
  753. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCode.h +242 -0
  754. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.cpp +79 -0
  755. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfTimeCodeAttribute.h +74 -0
  756. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.cpp +217 -0
  757. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVecAttribute.h +100 -0
  758. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.cpp +60 -0
  759. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfVersion.h +136 -0
  760. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.cpp +391 -0
  761. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfWav.h +78 -0
  762. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfXdr.h +927 -0
  763. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.cpp +196 -0
  764. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZip.h +78 -0
  765. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.cpp +127 -0
  766. data/vendor/FreeImage/Source/OpenEXR/IlmImf/ImfZipCompressor.h +89 -0
  767. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.cpp +136 -0
  768. data/vendor/FreeImage/Source/OpenEXR/IlmImf/b44ExpLogTable.h +16396 -0
  769. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.cpp +573 -0
  770. data/vendor/FreeImage/Source/OpenEXR/IlmImf/dwaLookups.h +98334 -0
  771. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.cpp +80 -0
  772. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThread.h +143 -0
  773. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadExport.h +46 -0
  774. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadForward.h +52 -0
  775. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.cpp +59 -0
  776. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutex.h +160 -0
  777. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexPosix.cpp +85 -0
  778. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadMutexWin32.cpp +79 -0
  779. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadNamespace.h +114 -0
  780. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.cpp +483 -0
  781. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPool.h +160 -0
  782. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadPosix.cpp +98 -0
  783. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.cpp +60 -0
  784. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphore.h +112 -0
  785. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosix.cpp +106 -0
  786. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphorePosixCompat.cpp +155 -0
  787. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadSemaphoreWin32.cpp +153 -0
  788. data/vendor/FreeImage/Source/OpenEXR/IlmThread/IlmThreadWin32.cpp +100 -0
  789. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.cpp +37 -0
  790. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBox.h +849 -0
  791. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathBoxAlgo.h +1016 -0
  792. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColor.h +736 -0
  793. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.cpp +178 -0
  794. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathColorAlgo.h +257 -0
  795. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathEuler.h +926 -0
  796. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExc.h +73 -0
  797. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathExport.h +46 -0
  798. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathForward.h +72 -0
  799. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrame.h +192 -0
  800. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustum.h +741 -0
  801. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFrustumTest.h +417 -0
  802. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.cpp +181 -0
  803. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathFun.h +269 -0
  804. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGL.h +166 -0
  805. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathGLU.h +54 -0
  806. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathHalfLimits.h +68 -0
  807. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInt64.h +62 -0
  808. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathInterval.h +226 -0
  809. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLimits.h +268 -0
  810. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLine.h +185 -0
  811. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathLineAlgo.h +288 -0
  812. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMath.h +208 -0
  813. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrix.h +3441 -0
  814. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.cpp +1252 -0
  815. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathMatrixAlgo.h +1425 -0
  816. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathNamespace.h +115 -0
  817. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlane.h +257 -0
  818. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathPlatform.h +112 -0
  819. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathQuat.h +964 -0
  820. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.cpp +194 -0
  821. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRandom.h +401 -0
  822. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathRoots.h +219 -0
  823. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.cpp +54 -0
  824. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathShear.h +656 -0
  825. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathSphere.h +177 -0
  826. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.cpp +583 -0
  827. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVec.h +2227 -0
  828. data/vendor/FreeImage/Source/OpenEXR/Imath/ImathVecAlgo.h +147 -0
  829. data/vendor/FreeImage/Source/OpenEXR/OpenEXRConfig.h +72 -0
  830. data/vendor/FreeImage/Source/Plugin.h +144 -0
  831. data/vendor/FreeImage/Source/Quantizers.h +354 -0
  832. data/vendor/FreeImage/Source/ToneMapping.h +44 -0
  833. data/vendor/FreeImage/Source/Utilities.h +516 -0
  834. data/vendor/FreeImage/Source/ZLib/adler32.c +179 -0
  835. data/vendor/FreeImage/Source/ZLib/compress.c +80 -0
  836. data/vendor/FreeImage/Source/ZLib/crc32.c +425 -0
  837. data/vendor/FreeImage/Source/ZLib/crc32.h +441 -0
  838. data/vendor/FreeImage/Source/ZLib/deflate.c +1967 -0
  839. data/vendor/FreeImage/Source/ZLib/deflate.h +346 -0
  840. data/vendor/FreeImage/Source/ZLib/gzclose.c +25 -0
  841. data/vendor/FreeImage/Source/ZLib/gzguts.h +209 -0
  842. data/vendor/FreeImage/Source/ZLib/gzlib.c +634 -0
  843. data/vendor/FreeImage/Source/ZLib/gzread.c +594 -0
  844. data/vendor/FreeImage/Source/ZLib/gzwrite.c +577 -0
  845. data/vendor/FreeImage/Source/ZLib/infback.c +640 -0
  846. data/vendor/FreeImage/Source/ZLib/inffast.c +340 -0
  847. data/vendor/FreeImage/Source/ZLib/inffast.h +11 -0
  848. data/vendor/FreeImage/Source/ZLib/inffixed.h +94 -0
  849. data/vendor/FreeImage/Source/ZLib/inflate.c +1512 -0
  850. data/vendor/FreeImage/Source/ZLib/inflate.h +122 -0
  851. data/vendor/FreeImage/Source/ZLib/inftrees.c +306 -0
  852. data/vendor/FreeImage/Source/ZLib/inftrees.h +62 -0
  853. data/vendor/FreeImage/Source/ZLib/trees.c +1226 -0
  854. data/vendor/FreeImage/Source/ZLib/trees.h +128 -0
  855. data/vendor/FreeImage/Source/ZLib/uncompr.c +59 -0
  856. data/vendor/FreeImage/Source/ZLib/zconf.h +511 -0
  857. data/vendor/FreeImage/Source/ZLib/zlib.h +1768 -0
  858. data/vendor/FreeImage/Source/ZLib/zutil.c +324 -0
  859. data/vendor/FreeImage/Source/ZLib/zutil.h +253 -0
  860. metadata +931 -0
@@ -0,0 +1,2025 @@
1
+ ///////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas
4
+ // Digital Ltd. LLC
5
+ //
6
+ // All rights reserved.
7
+ //
8
+ // Redistribution and use in source and binary forms, with or without
9
+ // modification, are permitted provided that the following conditions are
10
+ // met:
11
+ // * Redistributions of source code must retain the above copyright
12
+ // notice, this list of conditions and the following disclaimer.
13
+ // * Redistributions in binary form must reproduce the above
14
+ // copyright notice, this list of conditions and the following disclaimer
15
+ // in the documentation and/or other materials provided with the
16
+ // distribution.
17
+ // * Neither the name of Industrial Light & Magic nor the names of
18
+ // its contributors may be used to endorse or promote products derived
19
+ // from this software without specific prior written permission.
20
+ //
21
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ //
33
+ ///////////////////////////////////////////////////////////////////////////
34
+
35
+
36
+ //-----------------------------------------------------------------------------
37
+ //
38
+ // class DeepScanLineInputFile
39
+ //
40
+ //-----------------------------------------------------------------------------
41
+
42
+ #include <ImfDeepScanLineInputFile.h>
43
+ #include <ImfChannelList.h>
44
+ #include <ImfMisc.h>
45
+ #include <ImfStdIO.h>
46
+ #include <ImfCompressor.h>
47
+ #include <ImfXdr.h>
48
+ #include <ImfConvert.h>
49
+ #include <ImfThreading.h>
50
+ #include <ImfPartType.h>
51
+ #include <ImfVersion.h>
52
+ #include "ImfMultiPartInputFile.h"
53
+ #include "ImfDeepFrameBuffer.h"
54
+ #include "ImfInputStreamMutex.h"
55
+ #include "ImfInputPartData.h"
56
+
57
+
58
+ #include "ImathBox.h"
59
+ #include "ImathFun.h"
60
+
61
+
62
+ #include "IlmThreadPool.h"
63
+ #include "IlmThreadSemaphore.h"
64
+ #include "IlmThreadMutex.h"
65
+
66
+ #include "Iex.h"
67
+
68
+ #include <string>
69
+ #include <vector>
70
+ #include <assert.h>
71
+ #include <limits>
72
+ #include <algorithm>
73
+
74
+
75
+ #include "ImfNamespace.h"
76
+ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
77
+
78
+ using IMATH_NAMESPACE::Box2i;
79
+ using IMATH_NAMESPACE::divp;
80
+ using IMATH_NAMESPACE::modp;
81
+ using std::string;
82
+ using std::vector;
83
+ using std::ifstream;
84
+ using std::min;
85
+ using std::max;
86
+ using ILMTHREAD_NAMESPACE::Mutex;
87
+ using ILMTHREAD_NAMESPACE::Lock;
88
+ using ILMTHREAD_NAMESPACE::Semaphore;
89
+ using ILMTHREAD_NAMESPACE::Task;
90
+ using ILMTHREAD_NAMESPACE::TaskGroup;
91
+ using ILMTHREAD_NAMESPACE::ThreadPool;
92
+
93
+ namespace {
94
+
95
+ struct InSliceInfo
96
+ {
97
+ PixelType typeInFrameBuffer;
98
+ PixelType typeInFile;
99
+ char * base;
100
+ char* pointerArrayBase;
101
+ size_t xPointerStride;
102
+ size_t yPointerStride;
103
+ size_t sampleStride;
104
+ int xSampling;
105
+ int ySampling;
106
+ bool fill;
107
+ bool skip;
108
+ double fillValue;
109
+
110
+ InSliceInfo (PixelType typeInFrameBuffer = HALF,
111
+ char * base = NULL,
112
+ PixelType typeInFile = HALF,
113
+ size_t xPointerStride = 0,
114
+ size_t yPointerStride = 0,
115
+ size_t sampleStride = 0,
116
+ int xSampling = 1,
117
+ int ySampling = 1,
118
+ bool fill = false,
119
+ bool skip = false,
120
+ double fillValue = 0.0);
121
+ };
122
+
123
+
124
+ InSliceInfo::InSliceInfo (PixelType tifb,
125
+ char * b,
126
+ PixelType tifl,
127
+ size_t xpst,
128
+ size_t ypst,
129
+ size_t spst,
130
+ int xsm, int ysm,
131
+ bool f, bool s,
132
+ double fv)
133
+ :
134
+ typeInFrameBuffer (tifb),
135
+ typeInFile (tifl),
136
+ base(b),
137
+ xPointerStride (xpst),
138
+ yPointerStride (ypst),
139
+ sampleStride (spst),
140
+ xSampling (xsm),
141
+ ySampling (ysm),
142
+ fill (f),
143
+ skip (s),
144
+ fillValue (fv)
145
+ {
146
+ // empty
147
+ }
148
+
149
+
150
+ struct LineBuffer
151
+ {
152
+ const char * uncompressedData;
153
+ char * buffer;
154
+ Int64 packedDataSize;
155
+ Int64 unpackedDataSize;
156
+
157
+ int minY;
158
+ int maxY;
159
+ Compressor * compressor;
160
+ Compressor::Format format;
161
+ int number;
162
+ bool hasException;
163
+ string exception;
164
+
165
+ LineBuffer ();
166
+ ~LineBuffer ();
167
+
168
+ inline void wait () {_sem.wait();}
169
+ inline void post () {_sem.post();}
170
+
171
+ private:
172
+
173
+ Semaphore _sem;
174
+ };
175
+
176
+
177
+ LineBuffer::LineBuffer ():
178
+ uncompressedData (0),
179
+ buffer (0),
180
+ packedDataSize (0),
181
+ compressor (0),
182
+ format (defaultFormat(compressor)),
183
+ number (-1),
184
+ hasException (false),
185
+ exception (),
186
+ _sem (1)
187
+ {
188
+ // empty
189
+ }
190
+
191
+
192
+ LineBuffer::~LineBuffer ()
193
+ {
194
+ if (compressor != 0)
195
+ delete compressor;
196
+ }
197
+
198
+ } // namespace
199
+
200
+
201
+ struct DeepScanLineInputFile::Data: public Mutex
202
+ {
203
+ Header header; // the image header
204
+ int version; // file's version
205
+ DeepFrameBuffer frameBuffer; // framebuffer to write into
206
+ LineOrder lineOrder; // order of the scanlines in file
207
+ int minX; // data window's min x coord
208
+ int maxX; // data window's max x coord
209
+ int minY; // data window's min y coord
210
+ int maxY; // data window's max x coord
211
+ vector<Int64> lineOffsets; // stores offsets in file for
212
+ // each line
213
+ bool fileIsComplete; // True if no scanlines are missing
214
+ // in the file
215
+ int nextLineBufferMinY; // minimum y of the next linebuffer
216
+ vector<size_t> bytesPerLine; // combined size of a line over all
217
+ // channels
218
+ vector<size_t> offsetInLineBuffer; // offset for each scanline in its
219
+ // linebuffer
220
+ vector<InSliceInfo*> slices; // info about channels in file
221
+
222
+ vector<LineBuffer*> lineBuffers; // each holds one line buffer
223
+ int linesInBuffer; // number of scanlines each buffer
224
+ // holds
225
+ int partNumber; // part number
226
+ int numThreads; // number of threads
227
+
228
+ bool multiPartBackwardSupport; // if we are reading a multipart file using single file API
229
+ MultiPartInputFile* multiPartFile; // for multipart files opened as single part
230
+ bool memoryMapped; // if the stream is memory mapped
231
+
232
+ Array2D<unsigned int> sampleCount; // the number of samples
233
+ // in each pixel
234
+
235
+ Array<unsigned int> lineSampleCount; // the number of samples
236
+ // in each line
237
+
238
+ Array<bool> gotSampleCount; // for each scanline, indicating if
239
+ // we have got its sample count table
240
+
241
+ char* sampleCountSliceBase; // pointer to the start of
242
+ // the sample count array
243
+ int sampleCountXStride; // x stride of the sample count array
244
+ int sampleCountYStride; // y stride of the sample count array
245
+ bool frameBufferValid; // set by setFrameBuffer: excepts if readPixelSampleCounts if false
246
+
247
+ Array<char> sampleCountTableBuffer;
248
+ // the buffer for sample count table
249
+
250
+ Compressor* sampleCountTableComp;
251
+ // the decompressor for sample count table
252
+
253
+ int combinedSampleSize; // total size of all channels combined: used to sanity check sample table size
254
+
255
+ int maxSampleCountTableSize;
256
+ // the max size in bytes for a pixel
257
+ // sample count table
258
+ InputStreamMutex* _streamData;
259
+ bool _deleteStream;
260
+
261
+
262
+ Data (int numThreads);
263
+ ~Data ();
264
+
265
+ inline LineBuffer * getLineBuffer (int number); // hash function from line
266
+ // buffer indices into our
267
+ // vector of line buffers
268
+ };
269
+
270
+
271
+ DeepScanLineInputFile::Data::Data (int numThreads):
272
+ partNumber(-1),
273
+ numThreads(numThreads),
274
+ multiPartBackwardSupport(false),
275
+ multiPartFile(NULL),
276
+ memoryMapped(false),
277
+ frameBufferValid(false),
278
+ _streamData(NULL),
279
+ _deleteStream(false)
280
+ {
281
+ //
282
+ // We need at least one lineBuffer, but if threading is used,
283
+ // to keep n threads busy we need 2*n lineBuffers
284
+ //
285
+
286
+ lineBuffers.resize (max (1, 2 * numThreads));
287
+
288
+ for (size_t i = 0; i < lineBuffers.size(); i++)
289
+ lineBuffers[i] = 0;
290
+
291
+ sampleCountTableComp = 0;
292
+ }
293
+
294
+
295
+ DeepScanLineInputFile::Data::~Data ()
296
+ {
297
+ for (size_t i = 0; i < lineBuffers.size(); i++)
298
+ if (lineBuffers[i] != 0)
299
+ delete lineBuffers[i];
300
+
301
+ for (size_t i = 0; i < slices.size(); i++)
302
+ delete slices[i];
303
+
304
+ if (sampleCountTableComp != 0)
305
+ delete sampleCountTableComp;
306
+
307
+ if (multiPartBackwardSupport)
308
+ delete multiPartFile;
309
+ }
310
+
311
+
312
+ inline LineBuffer *
313
+ DeepScanLineInputFile::Data::getLineBuffer (int lineBufferNumber)
314
+ {
315
+ return lineBuffers[lineBufferNumber % lineBuffers.size()];
316
+ }
317
+
318
+
319
+ namespace {
320
+
321
+
322
+ void
323
+ reconstructLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,
324
+ LineOrder lineOrder,
325
+ vector<Int64> &lineOffsets)
326
+ {
327
+ Int64 position = is.tellg();
328
+
329
+ try
330
+ {
331
+ for (unsigned int i = 0; i < lineOffsets.size(); i++)
332
+ {
333
+ Int64 lineOffset = is.tellg();
334
+
335
+ int y;
336
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (is, y);
337
+
338
+ Int64 packed_offset;
339
+ Int64 packed_sample;
340
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (is, packed_offset);
341
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (is, packed_sample);
342
+ //next is unpacked sample table size - skip this too
343
+ Xdr::skip <StreamIO> (is, packed_offset+packed_sample+8);
344
+
345
+ if (lineOrder == INCREASING_Y)
346
+ lineOffsets[i] = lineOffset;
347
+ else
348
+ lineOffsets[lineOffsets.size() - i - 1] = lineOffset;
349
+ }
350
+ }
351
+ catch (...)
352
+ {
353
+ //
354
+ // Suppress all exceptions. This functions is
355
+ // called only to reconstruct the line offset
356
+ // table for incomplete files, and exceptions
357
+ // are likely.
358
+ //
359
+ }
360
+
361
+ is.clear();
362
+ is.seekg (position);
363
+ }
364
+
365
+
366
+ void
367
+ readLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,
368
+ LineOrder lineOrder,
369
+ vector<Int64> &lineOffsets,
370
+ bool &complete)
371
+ {
372
+ for (unsigned int i = 0; i < lineOffsets.size(); i++)
373
+ {
374
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (is, lineOffsets[i]);
375
+ }
376
+
377
+ complete = true;
378
+
379
+ for (unsigned int i = 0; i < lineOffsets.size(); i++)
380
+ {
381
+ if (lineOffsets[i] <= 0)
382
+ {
383
+ //
384
+ // Invalid data in the line offset table mean that
385
+ // the file is probably incomplete (the table is
386
+ // the last thing written to the file). Either
387
+ // some process is still busy writing the file,
388
+ // or writing the file was aborted.
389
+ //
390
+ // We should still be able to read the existing
391
+ // parts of the file. In order to do this, we
392
+ // have to make a sequential scan over the scan
393
+ // line data to reconstruct the line offset table.
394
+ //
395
+
396
+ complete = false;
397
+ reconstructLineOffsets (is, lineOrder, lineOffsets);
398
+ break;
399
+ }
400
+ }
401
+ }
402
+
403
+
404
+ void
405
+ readPixelData (InputStreamMutex *streamData,
406
+ DeepScanLineInputFile::Data *ifd,
407
+ int minY,
408
+ char *&buffer,
409
+ Int64 &packedDataSize,
410
+ Int64 &unpackedDataSize)
411
+ {
412
+ //
413
+ // Read a single line buffer from the input file.
414
+ //
415
+ // If the input file is not memory-mapped, we copy the pixel data into
416
+ // into the array pointed to by buffer. If the file is memory-mapped,
417
+ // then we change where buffer points to instead of writing into the
418
+ // array (hence buffer needs to be a reference to a char *).
419
+ //
420
+
421
+ int lineBufferNumber = (minY - ifd->minY) / ifd->linesInBuffer;
422
+
423
+ Int64 lineOffset = ifd->lineOffsets[lineBufferNumber];
424
+
425
+ if (lineOffset == 0)
426
+ THROW (IEX_NAMESPACE::InputExc, "Scan line " << minY << " is missing.");
427
+
428
+ //
429
+ // Seek to the start of the scan line in the file,
430
+ // if necessary.
431
+ //
432
+
433
+ if (!isMultiPart(ifd->version))
434
+ {
435
+ if (ifd->nextLineBufferMinY != minY)
436
+ streamData->is->seekg (lineOffset);
437
+ }
438
+ else
439
+ {
440
+ //
441
+ // In a multi-part file, the file pointer may have been moved by
442
+ // other parts, so we have to ask tellg() where we are.
443
+ //
444
+ if (streamData->is->tellg() != ifd->lineOffsets[lineBufferNumber])
445
+ streamData->is->seekg (lineOffset);
446
+ }
447
+
448
+ //
449
+ // Read the data block's header.
450
+ //
451
+
452
+ int yInFile;
453
+
454
+ //
455
+ // Read the part number when we are dealing with a multi-part file.
456
+ //
457
+
458
+ if (isMultiPart(ifd->version))
459
+ {
460
+ int partNumber;
461
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, partNumber);
462
+ if (partNumber != ifd->partNumber)
463
+ {
464
+ THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber
465
+ << ", should be " << ifd->partNumber << ".");
466
+ }
467
+ }
468
+
469
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, yInFile);
470
+
471
+ if (yInFile != minY)
472
+ throw IEX_NAMESPACE::InputExc ("Unexpected data block y coordinate.");
473
+
474
+ Int64 sampleCountTableSize;
475
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, sampleCountTableSize);
476
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, packedDataSize);
477
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, unpackedDataSize);
478
+
479
+
480
+ //
481
+ // We make a check on the data size requirements here.
482
+ // Whilst we wish to store 64bit sizes on disk, not all the compressors
483
+ // have been made to work with such data sizes and are still limited to
484
+ // using signed 32 bit (int) for the data size. As such, this version
485
+ // insists that we validate that the data size does not exceed the data
486
+ // type max limit.
487
+ // @TODO refactor the compressor code to ensure full 64-bit support.
488
+ //
489
+
490
+ int compressorMaxDataSize = std::numeric_limits<int>::max();
491
+ if (packedDataSize > Int64(compressorMaxDataSize) ||
492
+ unpackedDataSize > Int64(compressorMaxDataSize))
493
+ {
494
+ THROW (IEX_NAMESPACE::ArgExc, "This version of the library does not support "
495
+ << "the allocation of data with size > " << compressorMaxDataSize
496
+ << " file unpacked size :" << unpackedDataSize
497
+ << " file packed size :" << packedDataSize << ".\n");
498
+ }
499
+
500
+ //
501
+ // Skip the pixel sample count table because we have read this data.
502
+ //
503
+
504
+ Xdr::skip <StreamIO> (*streamData->is, sampleCountTableSize);
505
+
506
+ //
507
+ // Read the pixel data.
508
+ //
509
+
510
+ if (streamData->is->isMemoryMapped ())
511
+ buffer = streamData->is->readMemoryMapped (packedDataSize);
512
+ else
513
+ {
514
+ // (TODO) check if the packed data size is too big?
515
+ // (TODO) better memory management. Don't delete buffer all the time.
516
+ if (buffer != 0) delete[] buffer;
517
+ buffer = new char[packedDataSize];
518
+ streamData->is->read (buffer, packedDataSize);
519
+ }
520
+
521
+ //
522
+ // Keep track of which scan line is the next one in
523
+ // the file, so that we can avoid redundant seekg()
524
+ // operations (seekg() can be fairly expensive).
525
+ //
526
+
527
+ if (ifd->lineOrder == INCREASING_Y)
528
+ ifd->nextLineBufferMinY = minY + ifd->linesInBuffer;
529
+ else
530
+ ifd->nextLineBufferMinY = minY - ifd->linesInBuffer;
531
+ }
532
+
533
+ //
534
+ // A LineBufferTask encapsulates the task uncompressing a set of
535
+ // scanlines (line buffer) and copying them into the frame buffer.
536
+ //
537
+
538
+ class LineBufferTask : public Task
539
+ {
540
+ public:
541
+
542
+ LineBufferTask (TaskGroup *group,
543
+ DeepScanLineInputFile::Data *ifd,
544
+ LineBuffer *lineBuffer,
545
+ int scanLineMin,
546
+ int scanLineMax);
547
+
548
+ virtual ~LineBufferTask ();
549
+
550
+ virtual void execute ();
551
+
552
+ private:
553
+
554
+ DeepScanLineInputFile::Data * _ifd;
555
+ LineBuffer * _lineBuffer;
556
+ int _scanLineMin;
557
+ int _scanLineMax;
558
+ };
559
+
560
+
561
+ LineBufferTask::LineBufferTask
562
+ (TaskGroup *group,
563
+ DeepScanLineInputFile::Data *ifd,
564
+ LineBuffer *lineBuffer,
565
+ int scanLineMin,
566
+ int scanLineMax)
567
+ :
568
+ Task (group),
569
+ _ifd (ifd),
570
+ _lineBuffer (lineBuffer),
571
+ _scanLineMin (scanLineMin),
572
+ _scanLineMax (scanLineMax)
573
+ {
574
+ // empty
575
+ }
576
+
577
+
578
+ LineBufferTask::~LineBufferTask ()
579
+ {
580
+ //
581
+ // Signal that the line buffer is now free
582
+ //
583
+
584
+ _lineBuffer->post ();
585
+ }
586
+
587
+
588
+ void
589
+ LineBufferTask::execute ()
590
+ {
591
+ try
592
+ {
593
+ //
594
+ // Uncompress the data, if necessary
595
+ //
596
+
597
+ if (_lineBuffer->uncompressedData == 0)
598
+ {
599
+ Int64 uncompressedSize = 0;
600
+ int maxY = min (_lineBuffer->maxY, _ifd->maxY);
601
+
602
+ for (int i = _lineBuffer->minY - _ifd->minY;
603
+ i <= maxY - _ifd->minY;
604
+ ++i)
605
+ {
606
+ uncompressedSize += (int) _ifd->bytesPerLine[i];
607
+ }
608
+
609
+ //
610
+ // Create the compressor everytime when we want to use it,
611
+ // because we don't know maxBytesPerLine beforehand.
612
+ // (TODO) optimize this. don't do this every time.
613
+ //
614
+
615
+ if (_lineBuffer->compressor != 0)
616
+ delete _lineBuffer->compressor;
617
+ Int64 maxBytesPerLine = 0;
618
+ for (int i = _lineBuffer->minY - _ifd->minY;
619
+ i <= maxY - _ifd->minY;
620
+ ++i)
621
+ {
622
+ if (_ifd->bytesPerLine[i] > maxBytesPerLine)
623
+ maxBytesPerLine = _ifd->bytesPerLine[i];
624
+ }
625
+ _lineBuffer->compressor = newCompressor(_ifd->header.compression(),
626
+ maxBytesPerLine,
627
+ _ifd->header);
628
+
629
+ if (_lineBuffer->compressor &&
630
+ _lineBuffer->packedDataSize < uncompressedSize)
631
+ {
632
+ _lineBuffer->format = _lineBuffer->compressor->format();
633
+
634
+ _lineBuffer->packedDataSize = _lineBuffer->compressor->uncompress
635
+ (_lineBuffer->buffer, _lineBuffer->packedDataSize,
636
+ _lineBuffer->minY, _lineBuffer->uncompressedData);
637
+ }
638
+ else
639
+ {
640
+ //
641
+ // If the line is uncompressed, it's in XDR format,
642
+ // regardless of the compressor's output format.
643
+ //
644
+
645
+ _lineBuffer->format = Compressor::XDR;
646
+ _lineBuffer->uncompressedData = _lineBuffer->buffer;
647
+ }
648
+ }
649
+
650
+ int yStart, yStop, dy;
651
+
652
+ if (_ifd->lineOrder == INCREASING_Y)
653
+ {
654
+ yStart = _scanLineMin;
655
+ yStop = _scanLineMax + 1;
656
+ dy = 1;
657
+ }
658
+ else
659
+ {
660
+ yStart = _scanLineMax;
661
+ yStop = _scanLineMin - 1;
662
+ dy = -1;
663
+ }
664
+
665
+ for (int y = yStart; y != yStop; y += dy)
666
+ {
667
+ //
668
+ // Convert one scan line's worth of pixel data back
669
+ // from the machine-independent representation, and
670
+ // store the result in the frame buffer.
671
+ //
672
+
673
+ const char *readPtr = _lineBuffer->uncompressedData +
674
+ _ifd->offsetInLineBuffer[y - _ifd->minY];
675
+
676
+ //
677
+ // Iterate over all image channels.
678
+ //
679
+
680
+ for (unsigned int i = 0; i < _ifd->slices.size(); ++i)
681
+ {
682
+ //
683
+ // Test if scan line y of this channel contains any data
684
+ // (the scan line contains data only if y % ySampling == 0).
685
+ //
686
+
687
+ InSliceInfo &slice = *_ifd->slices[i];
688
+
689
+ if (modp (y, slice.ySampling) != 0)
690
+ continue;
691
+
692
+ //
693
+ // Find the x coordinates of the leftmost and rightmost
694
+ // sampled pixels (i.e. pixels within the data window
695
+ // for which x % xSampling == 0).
696
+ //
697
+
698
+ //
699
+ // Fill the frame buffer with pixel data.
700
+ //
701
+
702
+ if (slice.skip)
703
+ {
704
+ //
705
+ // The file contains data for this channel, but
706
+ // the frame buffer contains no slice for this channel.
707
+ //
708
+
709
+ skipChannel (readPtr, slice.typeInFile,
710
+ _ifd->lineSampleCount[y - _ifd->minY]);
711
+ }
712
+ else
713
+ {
714
+ //
715
+ // The frame buffer contains a slice for this channel.
716
+ //
717
+
718
+ int width = (_ifd->maxX - _ifd->minX + 1);
719
+
720
+ copyIntoDeepFrameBuffer (readPtr, slice.base,
721
+ (char*) (&_ifd->sampleCount[0][0]
722
+ - _ifd->minX
723
+ - _ifd->minY * width),
724
+ sizeof(unsigned int) * 1,
725
+ sizeof(unsigned int) * width,
726
+ y, _ifd->minX, _ifd->maxX,
727
+ 0, 0,
728
+ 0, 0,
729
+ slice.sampleStride,
730
+ slice.xPointerStride,
731
+ slice.yPointerStride,
732
+ slice.fill,
733
+ slice.fillValue, _lineBuffer->format,
734
+ slice.typeInFrameBuffer,
735
+ slice.typeInFile);
736
+ }
737
+ }
738
+ }
739
+ }
740
+ catch (std::exception &e)
741
+ {
742
+ if (!_lineBuffer->hasException)
743
+ {
744
+ _lineBuffer->exception = e.what();
745
+ _lineBuffer->hasException = true;
746
+ }
747
+ }
748
+ catch (...)
749
+ {
750
+ if (!_lineBuffer->hasException)
751
+ {
752
+ _lineBuffer->exception = "unrecognized exception";
753
+ _lineBuffer->hasException = true;
754
+ }
755
+ }
756
+ }
757
+
758
+
759
+ LineBufferTask *
760
+ newLineBufferTask
761
+ (TaskGroup *group,
762
+ DeepScanLineInputFile::Data *ifd,
763
+ int number,
764
+ int scanLineMin,
765
+ int scanLineMax)
766
+ {
767
+ //
768
+ // Wait for a line buffer to become available, fill the line
769
+ // buffer with raw data from the file if necessary, and create
770
+ // a new LineBufferTask whose execute() method will uncompress
771
+ // the contents of the buffer and copy the pixels into the
772
+ // frame buffer.
773
+ //
774
+
775
+ LineBuffer *lineBuffer = ifd->getLineBuffer (number);
776
+
777
+ try
778
+ {
779
+ lineBuffer->wait ();
780
+
781
+ if (lineBuffer->number != number)
782
+ {
783
+ lineBuffer->minY = ifd->minY + number * ifd->linesInBuffer;
784
+ lineBuffer->maxY = lineBuffer->minY + ifd->linesInBuffer - 1;
785
+
786
+ lineBuffer->number = number;
787
+ lineBuffer->uncompressedData = 0;
788
+
789
+ readPixelData (ifd->_streamData, ifd, lineBuffer->minY,
790
+ lineBuffer->buffer,
791
+ lineBuffer->packedDataSize,
792
+ lineBuffer->unpackedDataSize);
793
+ }
794
+ }
795
+ catch (std::exception &e)
796
+ {
797
+ if (!lineBuffer->hasException)
798
+ {
799
+ lineBuffer->exception = e.what();
800
+ lineBuffer->hasException = true;
801
+ }
802
+ lineBuffer->number = -1;
803
+ lineBuffer->post();
804
+ throw;
805
+ }
806
+ catch (...)
807
+ {
808
+ //
809
+ // Reading from the file caused an exception.
810
+ // Signal that the line buffer is free, and
811
+ // re-throw the exception.
812
+ //
813
+
814
+ lineBuffer->exception = "unrecognized exception";
815
+ lineBuffer->hasException = true;
816
+ lineBuffer->number = -1;
817
+ lineBuffer->post();
818
+ throw;
819
+ }
820
+
821
+ scanLineMin = max (lineBuffer->minY, scanLineMin);
822
+ scanLineMax = min (lineBuffer->maxY, scanLineMax);
823
+
824
+ return new LineBufferTask (group, ifd, lineBuffer,
825
+ scanLineMin, scanLineMax);
826
+ }
827
+
828
+ } // namespace
829
+
830
+
831
+ void DeepScanLineInputFile::initialize(const Header& header)
832
+ {
833
+ try
834
+ {
835
+ if (header.type() != DEEPSCANLINE)
836
+ throw IEX_NAMESPACE::ArgExc("Can't build a DeepScanLineInputFile from "
837
+ "a type-mismatched part.");
838
+
839
+ if(header.version()!=1)
840
+ {
841
+ THROW(IEX_NAMESPACE::ArgExc, "Version " << header.version() << " not supported for deepscanline images in this version of the library");
842
+ }
843
+
844
+ _data->header = header;
845
+
846
+ _data->lineOrder = _data->header.lineOrder();
847
+
848
+ const Box2i &dataWindow = _data->header.dataWindow();
849
+
850
+ _data->minX = dataWindow.min.x;
851
+ _data->maxX = dataWindow.max.x;
852
+ _data->minY = dataWindow.min.y;
853
+ _data->maxY = dataWindow.max.y;
854
+
855
+ _data->sampleCount.resizeErase(_data->maxY - _data->minY + 1,
856
+ _data->maxX - _data->minX + 1);
857
+ _data->lineSampleCount.resizeErase(_data->maxY - _data->minY + 1);
858
+
859
+ Compressor* compressor = newCompressor(_data->header.compression(),
860
+ 0,
861
+ _data->header);
862
+
863
+ _data->linesInBuffer = numLinesInBuffer (compressor);
864
+
865
+ delete compressor;
866
+
867
+ _data->nextLineBufferMinY = _data->minY - 1;
868
+
869
+ int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y +
870
+ _data->linesInBuffer) / _data->linesInBuffer;
871
+
872
+ _data->lineOffsets.resize (lineOffsetSize);
873
+
874
+ for (size_t i = 0; i < _data->lineBuffers.size(); i++)
875
+ _data->lineBuffers[i] = new LineBuffer ();
876
+
877
+ _data->gotSampleCount.resizeErase(_data->maxY - _data->minY + 1);
878
+ for (int i = 0; i < _data->maxY - _data->minY + 1; i++)
879
+ _data->gotSampleCount[i] = false;
880
+
881
+ _data->maxSampleCountTableSize = min(_data->linesInBuffer, _data->maxY - _data->minY + 1) *
882
+ (_data->maxX - _data->minX + 1) *
883
+ sizeof(unsigned int);
884
+
885
+ _data->sampleCountTableBuffer.resizeErase(_data->maxSampleCountTableSize);
886
+
887
+ _data->sampleCountTableComp = newCompressor(_data->header.compression(),
888
+ _data->maxSampleCountTableSize,
889
+ _data->header);
890
+
891
+ _data->bytesPerLine.resize (_data->maxY - _data->minY + 1);
892
+
893
+ const ChannelList & c=header.channels();
894
+
895
+ _data->combinedSampleSize=0;
896
+ for(ChannelList::ConstIterator i=c.begin();i!=c.end();i++)
897
+ {
898
+ switch(i.channel().type)
899
+ {
900
+ case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF :
901
+ _data->combinedSampleSize+=Xdr::size<half>();
902
+ break;
903
+ case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT :
904
+ _data->combinedSampleSize+=Xdr::size<float>();
905
+ break;
906
+ case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT :
907
+ _data->combinedSampleSize+=Xdr::size<unsigned int>();
908
+ break;
909
+ default :
910
+ THROW(IEX_NAMESPACE::ArgExc, "Bad type for channel " << i.name() << " initializing deepscanline reader");
911
+
912
+ }
913
+ }
914
+
915
+ }
916
+ catch (...)
917
+ {
918
+ delete _data;
919
+ _data=NULL;
920
+ throw;
921
+ }
922
+ }
923
+
924
+
925
+ DeepScanLineInputFile::DeepScanLineInputFile(InputPartData* part)
926
+
927
+ {
928
+
929
+ _data = new Data(part->numThreads);
930
+ _data->_deleteStream=false;
931
+ _data->_streamData = part->mutex;
932
+ _data->memoryMapped = _data->_streamData->is->isMemoryMapped();
933
+ _data->version = part->version;
934
+
935
+ initialize(part->header);
936
+
937
+ _data->lineOffsets = part->chunkOffsets;
938
+
939
+ _data->partNumber = part->partNumber;
940
+ }
941
+
942
+
943
+ DeepScanLineInputFile::DeepScanLineInputFile
944
+ (const char fileName[], int numThreads)
945
+ :
946
+ _data (new Data (numThreads))
947
+ {
948
+ _data->_streamData = new InputStreamMutex();
949
+ _data->_deleteStream = true;
950
+ OPENEXR_IMF_INTERNAL_NAMESPACE::IStream* is = 0;
951
+
952
+ try
953
+ {
954
+ is = new StdIFStream (fileName);
955
+ readMagicNumberAndVersionField(*is, _data->version);
956
+ //
957
+ // Backward compatibility to read multpart file.
958
+ //
959
+ if (isMultiPart(_data->version))
960
+ {
961
+ compatibilityInitialize(*is);
962
+ return;
963
+ }
964
+ _data->_streamData->is = is;
965
+ _data->memoryMapped = is->isMemoryMapped();
966
+ _data->header.readFrom (*_data->_streamData->is, _data->version);
967
+ _data->header.sanityCheck (isTiled (_data->version));
968
+
969
+ initialize(_data->header);
970
+
971
+ readLineOffsets (*_data->_streamData->is,
972
+ _data->lineOrder,
973
+ _data->lineOffsets,
974
+ _data->fileIsComplete);
975
+ }
976
+ catch (IEX_NAMESPACE::BaseExc &e)
977
+ {
978
+ if (is) delete is;
979
+ if (_data && _data->_streamData) delete _data->_streamData;
980
+ if (_data) delete _data;
981
+
982
+ REPLACE_EXC (e, "Cannot read image file "
983
+ "\"" << fileName << "\". " << e);
984
+ throw;
985
+ }
986
+ catch (...)
987
+ {
988
+ if (is) delete is;
989
+ if (_data && _data->_streamData) delete _data->_streamData;
990
+ if (_data) delete _data;
991
+
992
+ throw;
993
+ }
994
+ }
995
+
996
+
997
+ DeepScanLineInputFile::DeepScanLineInputFile
998
+ (const Header &header,
999
+ OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is,
1000
+ int version,
1001
+ int numThreads)
1002
+ :
1003
+ _data (new Data (numThreads))
1004
+ {
1005
+ _data->_streamData=new InputStreamMutex();
1006
+ _data->_deleteStream=false;
1007
+ _data->_streamData->is = is;
1008
+
1009
+ _data->memoryMapped = is->isMemoryMapped();
1010
+
1011
+ _data->version =version;
1012
+
1013
+ initialize (header);
1014
+
1015
+ readLineOffsets (*_data->_streamData->is,
1016
+ _data->lineOrder,
1017
+ _data->lineOffsets,
1018
+ _data->fileIsComplete);
1019
+ }
1020
+
1021
+
1022
+ DeepScanLineInputFile::~DeepScanLineInputFile ()
1023
+ {
1024
+ if (_data->_deleteStream)
1025
+ delete _data->_streamData->is;
1026
+
1027
+ if (_data)
1028
+ {
1029
+ if (!_data->memoryMapped)
1030
+ for (size_t i = 0; i < _data->lineBuffers.size(); i++)
1031
+ delete [] _data->lineBuffers[i]->buffer;
1032
+
1033
+ //
1034
+ // Unless this file was opened via the multipart API, delete the streamdata
1035
+ // object too.
1036
+ // (TODO) it should be "isMultiPart(data->version)", but when there is only
1037
+ // single part,
1038
+ // (see the above constructor) the version field is not set.
1039
+ //
1040
+ // (TODO) we should have a way to tell if the stream data is owned by this
1041
+ // file or by a parent multipart file.
1042
+ //
1043
+
1044
+ if (_data->partNumber == -1 && _data->_streamData)
1045
+ delete _data->_streamData;
1046
+
1047
+ delete _data;
1048
+ }
1049
+ }
1050
+
1051
+ void
1052
+ DeepScanLineInputFile::compatibilityInitialize(OPENEXR_IMF_INTERNAL_NAMESPACE::IStream& is)
1053
+ {
1054
+ is.seekg(0);
1055
+ //
1056
+ // Construct a MultiPartInputFile, initialize TiledInputFile
1057
+ // with the part 0 data.
1058
+ // (TODO) maybe change the third parameter of the constructor of MultiPartInputFile later.
1059
+ //
1060
+ _data->multiPartBackwardSupport = true;
1061
+ _data->multiPartFile = new MultiPartInputFile(is, _data->numThreads);
1062
+ InputPartData* part = _data->multiPartFile->getPart(0);
1063
+
1064
+ multiPartInitialize(part);
1065
+ }
1066
+
1067
+ void DeepScanLineInputFile::multiPartInitialize(InputPartData* part)
1068
+ {
1069
+
1070
+ _data->_streamData = part->mutex;
1071
+ _data->memoryMapped = _data->_streamData->is->isMemoryMapped();
1072
+ _data->version = part->version;
1073
+
1074
+ initialize(part->header);
1075
+
1076
+ _data->lineOffsets = part->chunkOffsets;
1077
+
1078
+ _data->partNumber = part->partNumber;
1079
+
1080
+ }
1081
+
1082
+
1083
+ const char *
1084
+ DeepScanLineInputFile::fileName () const
1085
+ {
1086
+ return _data->_streamData->is->fileName();
1087
+ }
1088
+
1089
+
1090
+ const Header &
1091
+ DeepScanLineInputFile::header () const
1092
+ {
1093
+ return _data->header;
1094
+ }
1095
+
1096
+
1097
+ int
1098
+ DeepScanLineInputFile::version () const
1099
+ {
1100
+ return _data->version;
1101
+ }
1102
+
1103
+
1104
+ void
1105
+ DeepScanLineInputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer)
1106
+ {
1107
+ Lock lock (*_data->_streamData);
1108
+
1109
+
1110
+ //
1111
+ // Check if the new frame buffer descriptor is
1112
+ // compatible with the image file header.
1113
+ //
1114
+
1115
+ const ChannelList &channels = _data->header.channels();
1116
+
1117
+ for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin();
1118
+ j != frameBuffer.end();
1119
+ ++j)
1120
+ {
1121
+ ChannelList::ConstIterator i = channels.find (j.name());
1122
+
1123
+ if (i == channels.end())
1124
+ continue;
1125
+
1126
+ if (i.channel().xSampling != j.slice().xSampling ||
1127
+ i.channel().ySampling != j.slice().ySampling)
1128
+ THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors "
1129
+ "of \"" << i.name() << "\" channel "
1130
+ "of input file \"" << fileName() << "\" are "
1131
+ "not compatible with the frame buffer's "
1132
+ "subsampling factors.");
1133
+ }
1134
+
1135
+ //
1136
+ // Store the pixel sample count table.
1137
+ // (TODO) Support for different sampling rates?
1138
+ //
1139
+
1140
+ const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice();
1141
+ if (sampleCountSlice.base == 0)
1142
+ {
1143
+ throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice.");
1144
+ }
1145
+ else
1146
+ {
1147
+ _data->sampleCountSliceBase = sampleCountSlice.base;
1148
+ _data->sampleCountXStride = sampleCountSlice.xStride;
1149
+ _data->sampleCountYStride = sampleCountSlice.yStride;
1150
+ }
1151
+
1152
+ //
1153
+ // Initialize the slice table for readPixels().
1154
+ //
1155
+
1156
+ vector<InSliceInfo*> slices;
1157
+ ChannelList::ConstIterator i = channels.begin();
1158
+
1159
+ for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin();
1160
+ j != frameBuffer.end();
1161
+ ++j)
1162
+ {
1163
+ while (i != channels.end() && strcmp (i.name(), j.name()) < 0)
1164
+ {
1165
+ //
1166
+ // Channel i is present in the file but not
1167
+ // in the frame buffer; data for channel i
1168
+ // will be skipped during readPixels().
1169
+ //
1170
+
1171
+ slices.push_back (new InSliceInfo (i.channel().type,
1172
+ NULL,
1173
+ i.channel().type,
1174
+ 0,
1175
+ 0,
1176
+ 0, // sampleStride
1177
+ i.channel().xSampling,
1178
+ i.channel().ySampling,
1179
+ false, // fill
1180
+ true, // skip
1181
+ 0.0)); // fillValue
1182
+ ++i;
1183
+ }
1184
+
1185
+ bool fill = false;
1186
+
1187
+ if (i == channels.end() || strcmp (i.name(), j.name()) > 0)
1188
+ {
1189
+ //
1190
+ // Channel i is present in the frame buffer, but not in the file.
1191
+ // In the frame buffer, slice j will be filled with a default value.
1192
+ //
1193
+
1194
+ fill = true;
1195
+ }
1196
+
1197
+ slices.push_back (new InSliceInfo (j.slice().type,
1198
+ j.slice().base,
1199
+ fill? j.slice().type:
1200
+ i.channel().type,
1201
+ j.slice().xStride,
1202
+ j.slice().yStride,
1203
+ j.slice().sampleStride,
1204
+ j.slice().xSampling,
1205
+ j.slice().ySampling,
1206
+ fill,
1207
+ false, // skip
1208
+ j.slice().fillValue));
1209
+
1210
+
1211
+ if (i != channels.end() && !fill)
1212
+ ++i;
1213
+ }
1214
+
1215
+ //
1216
+ // Client may want data to be filled in multiple arrays,
1217
+ // so we reset gotSampleCount and bytesPerLine.
1218
+ //
1219
+
1220
+ for (long i = 0; i < _data->gotSampleCount.size(); i++)
1221
+ _data->gotSampleCount[i] = false;
1222
+ for (size_t i = 0; i < _data->bytesPerLine.size(); i++)
1223
+ _data->bytesPerLine[i] = 0;
1224
+
1225
+ //
1226
+ // Store the new frame buffer.
1227
+ //
1228
+
1229
+ _data->frameBuffer = frameBuffer;
1230
+
1231
+ for (size_t i = 0; i < _data->slices.size(); i++)
1232
+ delete _data->slices[i];
1233
+ _data->slices = slices;
1234
+ _data->frameBufferValid = true;
1235
+ }
1236
+
1237
+
1238
+ const DeepFrameBuffer &
1239
+ DeepScanLineInputFile::frameBuffer () const
1240
+ {
1241
+ Lock lock (*_data->_streamData);
1242
+ return _data->frameBuffer;
1243
+ }
1244
+
1245
+
1246
+ bool
1247
+ DeepScanLineInputFile::isComplete () const
1248
+ {
1249
+ return _data->fileIsComplete;
1250
+ }
1251
+
1252
+
1253
+ void
1254
+ DeepScanLineInputFile::readPixels (int scanLine1, int scanLine2)
1255
+ {
1256
+ try
1257
+ {
1258
+ Lock lock (*_data->_streamData);
1259
+
1260
+ if (_data->slices.size() == 0)
1261
+ throw IEX_NAMESPACE::ArgExc ("No frame buffer specified "
1262
+ "as pixel data destination.");
1263
+
1264
+ int scanLineMin = min (scanLine1, scanLine2);
1265
+ int scanLineMax = max (scanLine1, scanLine2);
1266
+
1267
+ if (scanLineMin < _data->minY || scanLineMax > _data->maxY)
1268
+ throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside "
1269
+ "the image file's data window.");
1270
+
1271
+ for (int i = scanLineMin; i <= scanLineMax; i++)
1272
+ {
1273
+ if (_data->gotSampleCount[i - _data->minY] == false)
1274
+ throw IEX_NAMESPACE::ArgExc ("Tried to read scan line without "
1275
+ "knowing the sample counts, please"
1276
+ "read the sample counts first.");
1277
+ }
1278
+
1279
+
1280
+ //
1281
+ // We impose a numbering scheme on the lineBuffers where the first
1282
+ // scanline is contained in lineBuffer 1.
1283
+ //
1284
+ // Determine the first and last lineBuffer numbers in this scanline
1285
+ // range. We always attempt to read the scanlines in the order that
1286
+ // they are stored in the file.
1287
+ //
1288
+
1289
+ int start, stop, dl;
1290
+
1291
+ if (_data->lineOrder == INCREASING_Y)
1292
+ {
1293
+ start = (scanLineMin - _data->minY) / _data->linesInBuffer;
1294
+ stop = (scanLineMax - _data->minY) / _data->linesInBuffer + 1;
1295
+ dl = 1;
1296
+ }
1297
+ else
1298
+ {
1299
+ start = (scanLineMax - _data->minY) / _data->linesInBuffer;
1300
+ stop = (scanLineMin - _data->minY) / _data->linesInBuffer - 1;
1301
+ dl = -1;
1302
+ }
1303
+
1304
+ //
1305
+ // Create a task group for all line buffer tasks. When the
1306
+ // task group goes out of scope, the destructor waits until
1307
+ // all tasks are complete.
1308
+ //
1309
+
1310
+ {
1311
+ TaskGroup taskGroup;
1312
+
1313
+ //
1314
+ // Add the line buffer tasks.
1315
+ //
1316
+ // The tasks will execute in the order that they are created
1317
+ // because we lock the line buffers during construction and the
1318
+ // constructors are called by the main thread. Hence, in order
1319
+ // for a successive task to execute the previous task which
1320
+ // used that line buffer must have completed already.
1321
+ //
1322
+
1323
+ for (int l = start; l != stop; l += dl)
1324
+ {
1325
+ ThreadPool::addGlobalTask (newLineBufferTask (&taskGroup,
1326
+ _data, l,
1327
+ scanLineMin,
1328
+ scanLineMax));
1329
+ }
1330
+
1331
+ //
1332
+ // finish all tasks
1333
+ //
1334
+ }
1335
+
1336
+ //
1337
+ // Exeption handling:
1338
+ //
1339
+ // LineBufferTask::execute() may have encountered exceptions, but
1340
+ // those exceptions occurred in another thread, not in the thread
1341
+ // that is executing this call to ScanLineInputFile::readPixels().
1342
+ // LineBufferTask::execute() has caught all exceptions and stored
1343
+ // the exceptions' what() strings in the line buffers.
1344
+ // Now we check if any line buffer contains a stored exception; if
1345
+ // this is the case then we re-throw the exception in this thread.
1346
+ // (It is possible that multiple line buffers contain stored
1347
+ // exceptions. We re-throw the first exception we find and
1348
+ // ignore all others.)
1349
+ //
1350
+
1351
+ const string *exception = 0;
1352
+
1353
+ for (size_t i = 0; i < _data->lineBuffers.size(); ++i)
1354
+ {
1355
+ LineBuffer *lineBuffer = _data->lineBuffers[i];
1356
+
1357
+ if (lineBuffer->hasException && !exception)
1358
+ exception = &lineBuffer->exception;
1359
+
1360
+ lineBuffer->hasException = false;
1361
+ }
1362
+
1363
+ if (exception)
1364
+ throw IEX_NAMESPACE::IoExc (*exception);
1365
+ }
1366
+ catch (IEX_NAMESPACE::BaseExc &e)
1367
+ {
1368
+ REPLACE_EXC (e, "Error reading pixel data from image "
1369
+ "file \"" << fileName() << "\". " << e);
1370
+ throw;
1371
+ }
1372
+ }
1373
+
1374
+
1375
+ void
1376
+ DeepScanLineInputFile::readPixels (int scanLine)
1377
+ {
1378
+ readPixels (scanLine, scanLine);
1379
+ }
1380
+
1381
+
1382
+ void
1383
+ DeepScanLineInputFile::rawPixelData (int firstScanLine,
1384
+ char *pixelData,
1385
+ Int64 &pixelDataSize)
1386
+ {
1387
+
1388
+
1389
+ int minY = lineBufferMinY
1390
+ (firstScanLine, _data->minY, _data->linesInBuffer);
1391
+ int lineBufferNumber = (minY - _data->minY) / _data->linesInBuffer;
1392
+
1393
+ Int64 lineOffset = _data->lineOffsets[lineBufferNumber];
1394
+
1395
+ if (lineOffset == 0)
1396
+ THROW (IEX_NAMESPACE::InputExc, "Scan line " << minY << " is missing.");
1397
+
1398
+
1399
+ // enter the lock here - prevent another thread reseeking the file during read
1400
+ Lock lock (*_data->_streamData);
1401
+
1402
+ //
1403
+ // Seek to the start of the scan line in the file,
1404
+ //
1405
+
1406
+ if (_data->_streamData->is->tellg() != _data->lineOffsets[lineBufferNumber])
1407
+ _data->_streamData->is->seekg (lineOffset);
1408
+
1409
+ //
1410
+ // Read the data block's header.
1411
+ //
1412
+
1413
+ int yInFile;
1414
+
1415
+ //
1416
+ // Read the part number when we are dealing with a multi-part file.
1417
+ //
1418
+
1419
+ if (isMultiPart(_data->version))
1420
+ {
1421
+ int partNumber;
1422
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*_data->_streamData->is, partNumber);
1423
+ if (partNumber != _data->partNumber)
1424
+ {
1425
+ THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber
1426
+ << ", should be " << _data->partNumber << ".");
1427
+ }
1428
+ }
1429
+
1430
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*_data->_streamData->is, yInFile);
1431
+
1432
+ if (yInFile != minY)
1433
+ throw IEX_NAMESPACE::InputExc ("Unexpected data block y coordinate.");
1434
+
1435
+ Int64 sampleCountTableSize;
1436
+ Int64 packedDataSize;
1437
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*_data->_streamData->is, sampleCountTableSize);
1438
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*_data->_streamData->is, packedDataSize);
1439
+
1440
+ // total requirement for reading all the data
1441
+
1442
+ Int64 totalSizeRequired=28+sampleCountTableSize+packedDataSize;
1443
+
1444
+ bool big_enough = totalSizeRequired<=pixelDataSize;
1445
+
1446
+ pixelDataSize = totalSizeRequired;
1447
+
1448
+ // was the block we were given big enough?
1449
+ if(!big_enough || pixelData==NULL)
1450
+ {
1451
+ // special case: seek stream back to start if we are at the beginning (regular reading pixels assumes it doesn't need to seek
1452
+ // in single part files)
1453
+ if(!isMultiPart(_data->version))
1454
+ {
1455
+ if (_data->nextLineBufferMinY == minY)
1456
+ _data->_streamData->is->seekg (lineOffset);
1457
+ }
1458
+ // leave lock here - bail before reading more data
1459
+ return;
1460
+ }
1461
+
1462
+ // copy the values we have read into the output block
1463
+ *(int *) pixelData = yInFile;
1464
+ *(Int64 *) (pixelData+4) =sampleCountTableSize;
1465
+ *(Int64 *) (pixelData+12) = packedDataSize;
1466
+
1467
+ // didn't read the unpackedsize - do that now
1468
+ Xdr::read<StreamIO> (*_data->_streamData->is, *(Int64 *) (pixelData+20));
1469
+
1470
+ // read the actual data
1471
+ _data->_streamData->is->read(pixelData+28, sampleCountTableSize+packedDataSize);
1472
+
1473
+ // special case: seek stream back to start if we are at the beginning (regular reading pixels assumes it doesn't need to seek
1474
+ // in single part files)
1475
+ if(!isMultiPart(_data->version))
1476
+ {
1477
+ if (_data->nextLineBufferMinY == minY)
1478
+ _data->_streamData->is->seekg (lineOffset);
1479
+ }
1480
+
1481
+ // leave lock here
1482
+
1483
+ }
1484
+
1485
+ void DeepScanLineInputFile::readPixels (const char* rawPixelData,
1486
+ const DeepFrameBuffer& frameBuffer,
1487
+ int scanLine1,
1488
+ int scanLine2) const
1489
+ {
1490
+ //
1491
+ // read header from block - already converted from Xdr to native format
1492
+ //
1493
+ int data_scanline = *(int *) rawPixelData;
1494
+ Int64 sampleCountTableDataSize=*(Int64 *) (rawPixelData+4);
1495
+ Int64 packedDataSize = *(Int64 *) (rawPixelData+12);
1496
+ Int64 unpackedDataSize = *(Int64 *) (rawPixelData+20);
1497
+
1498
+
1499
+
1500
+ //
1501
+ // Uncompress the data, if necessary
1502
+ //
1503
+
1504
+
1505
+ Compressor * decomp = NULL;
1506
+ const char * uncompressed_data;
1507
+ Compressor::Format format = Compressor::XDR;
1508
+ if(packedDataSize <unpackedDataSize)
1509
+ {
1510
+ decomp = newCompressor(_data->header.compression(),
1511
+ unpackedDataSize,
1512
+ _data->header);
1513
+
1514
+ decomp->uncompress(rawPixelData+28+sampleCountTableDataSize,
1515
+ packedDataSize,
1516
+ data_scanline, uncompressed_data);
1517
+ format = decomp->format();
1518
+ }
1519
+ else
1520
+ {
1521
+ //
1522
+ // If the line is uncompressed, it's in XDR format,
1523
+ // regardless of the compressor's output format.
1524
+ //
1525
+
1526
+ format = Compressor::XDR;
1527
+ uncompressed_data = rawPixelData+28+sampleCountTableDataSize;
1528
+ }
1529
+
1530
+
1531
+ int yStart, yStop, dy;
1532
+
1533
+ if (_data->lineOrder == INCREASING_Y)
1534
+ {
1535
+ yStart = scanLine1;
1536
+ yStop = scanLine2 + 1;
1537
+ dy = 1;
1538
+ }
1539
+ else
1540
+ {
1541
+ yStart = scanLine2;
1542
+ yStop = scanLine1 - 1;
1543
+ dy = -1;
1544
+ }
1545
+
1546
+
1547
+
1548
+ const char* samplecount_base = frameBuffer.getSampleCountSlice().base;
1549
+ int samplecount_xstride = frameBuffer.getSampleCountSlice().xStride;
1550
+ int samplecount_ystride = frameBuffer.getSampleCountSlice().yStride;
1551
+
1552
+ //
1553
+ // For each line within the block, get the count of bytes.
1554
+ //
1555
+
1556
+ int minYInLineBuffer = data_scanline;
1557
+ int maxYInLineBuffer = min(minYInLineBuffer + _data->linesInBuffer - 1, _data->maxY);
1558
+
1559
+ vector<size_t> bytesPerLine(1+_data->maxY-_data->minY);
1560
+
1561
+
1562
+ bytesPerDeepLineTable (_data->header,
1563
+ minYInLineBuffer,
1564
+ maxYInLineBuffer,
1565
+ samplecount_base,
1566
+ samplecount_xstride,
1567
+ samplecount_ystride,
1568
+ bytesPerLine);
1569
+
1570
+ //
1571
+ // For each scanline within the block, get the offset.
1572
+ //
1573
+
1574
+ vector<size_t> offsetInLineBuffer;
1575
+ offsetInLineBufferTable (bytesPerLine,
1576
+ minYInLineBuffer - _data->minY,
1577
+ maxYInLineBuffer - _data->minY,
1578
+ _data->linesInBuffer,
1579
+ offsetInLineBuffer);
1580
+
1581
+
1582
+ const ChannelList & channels=header().channels();
1583
+
1584
+
1585
+ for (int y = yStart; y != yStop; y += dy)
1586
+ {
1587
+
1588
+ const char *readPtr =uncompressed_data +
1589
+ offsetInLineBuffer[y - _data->minY];
1590
+
1591
+ //
1592
+ // need to know the total number of samples on a scanline to skip channels
1593
+ // compute on demand: -1 means uncomputed
1594
+ //
1595
+ int lineSampleCount = -1;
1596
+
1597
+
1598
+ //
1599
+ // Iterate over all image channels in frame buffer
1600
+ //
1601
+
1602
+
1603
+ ChannelList::ConstIterator i = channels.begin();
1604
+
1605
+ for (DeepFrameBuffer::ConstIterator j = frameBuffer.begin();
1606
+ j != frameBuffer.end();
1607
+ ++j)
1608
+ {
1609
+ while (i != channels.end() && strcmp (i.name(), j.name()) < 0)
1610
+ {
1611
+ //
1612
+ // Channel i is present in the file but not
1613
+ // in the frame buffer; skip
1614
+
1615
+ if(lineSampleCount==-1)
1616
+ {
1617
+ lineSampleCount=0;
1618
+ const char * ptr = (samplecount_base+y*samplecount_ystride + samplecount_xstride*_data->minX);
1619
+ for(int x=_data->minX;x<=_data->maxX;x++)
1620
+ {
1621
+
1622
+ lineSampleCount+=*(const unsigned int *) ptr;
1623
+ ptr+=samplecount_xstride;
1624
+ }
1625
+ }
1626
+
1627
+ skipChannel (readPtr, i.channel().type, lineSampleCount );
1628
+
1629
+ ++i;
1630
+ }
1631
+
1632
+ bool fill = false;
1633
+
1634
+ if (i == channels.end() || strcmp (i.name(), j.name()) > 0)
1635
+ {
1636
+ //
1637
+ // Channel i is present in the frame buffer, but not in the file.
1638
+ // In the frame buffer, slice j will be filled with a default value.
1639
+ //
1640
+
1641
+ fill = true;
1642
+ }
1643
+ if (modp (y, i.channel().ySampling) == 0)
1644
+ {
1645
+
1646
+ copyIntoDeepFrameBuffer (readPtr, j.slice().base,
1647
+ samplecount_base,
1648
+ samplecount_xstride,
1649
+ samplecount_ystride,
1650
+ y, _data->minX, _data->maxX,
1651
+ 0, 0,
1652
+ 0, 0,
1653
+ j.slice().sampleStride,
1654
+ j.slice().xStride,
1655
+ j.slice().yStride,
1656
+ fill,
1657
+ j.slice().fillValue,
1658
+ format,
1659
+ j.slice().type,
1660
+ i.channel().type);
1661
+
1662
+ ++i;
1663
+
1664
+ }
1665
+ }//next slice in framebuffer
1666
+ }//next row in image
1667
+
1668
+ //
1669
+ // clean up
1670
+ //
1671
+
1672
+ delete decomp;
1673
+ }
1674
+
1675
+
1676
+
1677
+ void DeepScanLineInputFile::readPixelSampleCounts (const char* rawPixelData,
1678
+ const DeepFrameBuffer& frameBuffer,
1679
+ int scanLine1,
1680
+ int scanLine2) const
1681
+ {
1682
+ //
1683
+ // read header from block - already converted from Xdr to native format
1684
+ //
1685
+ int data_scanline = *(int *) rawPixelData;
1686
+ Int64 sampleCountTableDataSize=*(Int64 *) (rawPixelData+4);
1687
+
1688
+
1689
+ int maxY;
1690
+ maxY = min(data_scanline + _data->linesInBuffer - 1, _data->maxY);
1691
+
1692
+ if(scanLine1 != data_scanline)
1693
+ {
1694
+ THROW(IEX_NAMESPACE::ArgExc,"readPixelSampleCounts(rawPixelData,frameBuffer,"<< scanLine1 << ',' << scanLine2 << ") called with incorrect start scanline - should be " << data_scanline );
1695
+ }
1696
+
1697
+ if(scanLine2 != maxY)
1698
+ {
1699
+ THROW(IEX_NAMESPACE::ArgExc,"readPixelSampleCounts(rawPixelData,frameBuffer,"<< scanLine1 << ',' << scanLine2 << ") called with incorrect end scanline - should be " << maxY );
1700
+ }
1701
+
1702
+
1703
+ //
1704
+ // If the sample count table is compressed, we'll uncompress it.
1705
+ //
1706
+
1707
+ Int64 rawSampleCountTableSize = (maxY - data_scanline + 1) * (_data->maxX - _data->minX + 1) *
1708
+ Xdr::size <unsigned int> ();
1709
+
1710
+
1711
+ Compressor * decomp=NULL;
1712
+ const char* readPtr;
1713
+ if (sampleCountTableDataSize < rawSampleCountTableSize)
1714
+ {
1715
+ decomp = newCompressor(_data->header.compression(),
1716
+ rawSampleCountTableSize,
1717
+ _data->header);
1718
+
1719
+ decomp->uncompress(rawPixelData+28,
1720
+ sampleCountTableDataSize,
1721
+ data_scanline,
1722
+ readPtr);
1723
+ }
1724
+ else readPtr = rawPixelData+28;
1725
+
1726
+ char* base = frameBuffer.getSampleCountSlice().base;
1727
+ int xStride = frameBuffer.getSampleCountSlice().xStride;
1728
+ int yStride = frameBuffer.getSampleCountSlice().yStride;
1729
+
1730
+
1731
+
1732
+ for (int y = scanLine1; y <= scanLine2; y++)
1733
+ {
1734
+ int lastAccumulatedCount = 0;
1735
+ for (int x = _data->minX; x <= _data->maxX; x++)
1736
+ {
1737
+ int accumulatedCount, count;
1738
+
1739
+ //
1740
+ // Read the sample count for pixel (x, y).
1741
+ //
1742
+
1743
+ Xdr::read <CharPtrIO> (readPtr, accumulatedCount);
1744
+ if (x == _data->minX)
1745
+ count = accumulatedCount;
1746
+ else
1747
+ count = accumulatedCount - lastAccumulatedCount;
1748
+ lastAccumulatedCount = accumulatedCount;
1749
+
1750
+ //
1751
+ // Store the data in both internal and external data structure.
1752
+ //
1753
+
1754
+ sampleCount(base, xStride, yStride, x, y) = count;
1755
+ }
1756
+ }
1757
+
1758
+ if(decomp)
1759
+ {
1760
+ delete decomp;
1761
+ }
1762
+ }
1763
+
1764
+
1765
+
1766
+ namespace
1767
+ {
1768
+
1769
+ void
1770
+ readSampleCountForLineBlock(InputStreamMutex* streamData,
1771
+ DeepScanLineInputFile::Data* data,
1772
+ int lineBlockId)
1773
+ {
1774
+ streamData->is->seekg(data->lineOffsets[lineBlockId]);
1775
+
1776
+ if (isMultiPart(data->version))
1777
+ {
1778
+ int partNumber;
1779
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, partNumber);
1780
+
1781
+ if (partNumber != data->partNumber)
1782
+ throw IEX_NAMESPACE::ArgExc("Unexpected part number.");
1783
+ }
1784
+
1785
+ int minY;
1786
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, minY);
1787
+
1788
+ //
1789
+ // Check the correctness of minY.
1790
+ //
1791
+
1792
+ if (minY != data->minY + lineBlockId * data->linesInBuffer)
1793
+ throw IEX_NAMESPACE::ArgExc("Unexpected data block y coordinate.");
1794
+
1795
+ int maxY;
1796
+ maxY = min(minY + data->linesInBuffer - 1, data->maxY);
1797
+
1798
+ Int64 sampleCountTableDataSize;
1799
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, sampleCountTableDataSize);
1800
+
1801
+
1802
+
1803
+ if(sampleCountTableDataSize>data->maxSampleCountTableSize)
1804
+ {
1805
+ THROW (IEX_NAMESPACE::ArgExc, "Bad sampleCountTableDataSize read from chunk "<< lineBlockId << ": expected " << data->maxSampleCountTableSize << " or less, got "<< sampleCountTableDataSize);
1806
+ }
1807
+
1808
+ Int64 packedDataSize;
1809
+ Int64 unpackedDataSize;
1810
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, packedDataSize);
1811
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, unpackedDataSize);
1812
+
1813
+
1814
+
1815
+ //
1816
+ // We make a check on the data size requirements here.
1817
+ // Whilst we wish to store 64bit sizes on disk, not all the compressors
1818
+ // have been made to work with such data sizes and are still limited to
1819
+ // using signed 32 bit (int) for the data size. As such, this version
1820
+ // insists that we validate that the data size does not exceed the data
1821
+ // type max limit.
1822
+ // @TODO refactor the compressor code to ensure full 64-bit support.
1823
+ //
1824
+
1825
+ int compressorMaxDataSize = std::numeric_limits<int>::max();
1826
+ if (sampleCountTableDataSize > Int64(compressorMaxDataSize))
1827
+ {
1828
+ THROW (IEX_NAMESPACE::ArgExc, "This version of the library does not "
1829
+ << "support the allocation of data with size > "
1830
+ << compressorMaxDataSize
1831
+ << " file table size :" << sampleCountTableDataSize << ".\n");
1832
+ }
1833
+ streamData->is->read(data->sampleCountTableBuffer, sampleCountTableDataSize);
1834
+
1835
+ const char* readPtr;
1836
+
1837
+ //
1838
+ // If the sample count table is compressed, we'll uncompress it.
1839
+ //
1840
+
1841
+
1842
+ if (sampleCountTableDataSize < data->maxSampleCountTableSize)
1843
+ {
1844
+ if(!data->sampleCountTableComp)
1845
+ {
1846
+ THROW(IEX_NAMESPACE::ArgExc,"Deep scanline data corrupt at chunk " << lineBlockId << " (sampleCountTableDataSize error)");
1847
+ }
1848
+ data->sampleCountTableComp->uncompress(data->sampleCountTableBuffer,
1849
+ sampleCountTableDataSize,
1850
+ minY,
1851
+ readPtr);
1852
+ }
1853
+ else readPtr = data->sampleCountTableBuffer;
1854
+
1855
+ char* base = data->sampleCountSliceBase;
1856
+ int xStride = data->sampleCountXStride;
1857
+ int yStride = data->sampleCountYStride;
1858
+
1859
+ // total number of samples in block: used to check samplecount table doesn't
1860
+ // reference more data than exists
1861
+
1862
+ size_t cumulative_total_samples=0;
1863
+
1864
+ for (int y = minY; y <= maxY; y++)
1865
+ {
1866
+ int yInDataWindow = y - data->minY;
1867
+ data->lineSampleCount[yInDataWindow] = 0;
1868
+
1869
+ int lastAccumulatedCount = 0;
1870
+ for (int x = data->minX; x <= data->maxX; x++)
1871
+ {
1872
+ int accumulatedCount, count;
1873
+
1874
+ //
1875
+ // Read the sample count for pixel (x, y).
1876
+ //
1877
+
1878
+ Xdr::read <CharPtrIO> (readPtr, accumulatedCount);
1879
+
1880
+ // sample count table should always contain monotonically
1881
+ // increasing values.
1882
+ if (accumulatedCount < lastAccumulatedCount)
1883
+ {
1884
+ THROW(IEX_NAMESPACE::ArgExc,"Deep scanline sampleCount data corrupt at chunk " << lineBlockId << " (negative sample count detected)");
1885
+ }
1886
+
1887
+ count = accumulatedCount - lastAccumulatedCount;
1888
+ lastAccumulatedCount = accumulatedCount;
1889
+
1890
+ //
1891
+ // Store the data in both internal and external data structure.
1892
+ //
1893
+
1894
+ data->sampleCount[yInDataWindow][x - data->minX] = count;
1895
+ data->lineSampleCount[yInDataWindow] += count;
1896
+ sampleCount(base, xStride, yStride, x, y) = count;
1897
+ }
1898
+ cumulative_total_samples+=data->lineSampleCount[yInDataWindow];
1899
+ if(cumulative_total_samples*data->combinedSampleSize > unpackedDataSize)
1900
+ {
1901
+ THROW(IEX_NAMESPACE::ArgExc,"Deep scanline sampleCount data corrupt at chunk " << lineBlockId << ": pixel data only contains " << unpackedDataSize
1902
+ << " bytes of data but table references at least " << cumulative_total_samples*data->combinedSampleSize << " bytes of sample data" );
1903
+ }
1904
+ data->gotSampleCount[y - data->minY] = true;
1905
+ }
1906
+ }
1907
+
1908
+
1909
+ void
1910
+ fillSampleCountFromCache(int y, DeepScanLineInputFile::Data* data)
1911
+ {
1912
+ int yInDataWindow = y - data->minY;
1913
+ char* base = data->sampleCountSliceBase;
1914
+ int xStride = data->sampleCountXStride;
1915
+ int yStride = data->sampleCountYStride;
1916
+
1917
+ for (int x = data->minX; x <= data->maxX; x++)
1918
+ {
1919
+ unsigned int count = data->sampleCount[yInDataWindow][x - data->minX];
1920
+ sampleCount(base, xStride, yStride, x, y) = count;
1921
+ }
1922
+ }
1923
+
1924
+ } // namespace
1925
+
1926
+ void
1927
+ DeepScanLineInputFile::readPixelSampleCounts (int scanline1, int scanline2)
1928
+ {
1929
+ Int64 savedFilePos = 0;
1930
+
1931
+ if(!_data->frameBufferValid)
1932
+ {
1933
+ throw IEX_NAMESPACE::ArgExc("readPixelSampleCounts called with no valid frame buffer");
1934
+ }
1935
+
1936
+ try
1937
+ {
1938
+ Lock lock (*_data->_streamData);
1939
+
1940
+ savedFilePos = _data->_streamData->is->tellg();
1941
+
1942
+ int scanLineMin = min (scanline1, scanline2);
1943
+ int scanLineMax = max (scanline1, scanline2);
1944
+
1945
+ if (scanLineMin < _data->minY || scanLineMax > _data->maxY)
1946
+ throw IEX_NAMESPACE::ArgExc ("Tried to read scan line sample counts outside "
1947
+ "the image file's data window.");
1948
+
1949
+ for (int i = scanLineMin; i <= scanLineMax; i++)
1950
+ {
1951
+ //
1952
+ // if scanline is already read, it'll be in the cache
1953
+ // otherwise, read from file, store in cache and in caller's framebuffer
1954
+ //
1955
+ if (_data->gotSampleCount[i - _data->minY])
1956
+ {
1957
+ fillSampleCountFromCache(i,_data);
1958
+
1959
+ }else{
1960
+
1961
+ int lineBlockId = ( i - _data->minY ) / _data->linesInBuffer;
1962
+
1963
+ readSampleCountForLineBlock ( _data->_streamData, _data, lineBlockId );
1964
+
1965
+ int minYInLineBuffer = lineBlockId * _data->linesInBuffer + _data->minY;
1966
+ int maxYInLineBuffer = min ( minYInLineBuffer + _data->linesInBuffer - 1, _data->maxY );
1967
+
1968
+ //
1969
+ // For each line within the block, get the count of bytes.
1970
+ //
1971
+
1972
+ bytesPerDeepLineTable ( _data->header,
1973
+ minYInLineBuffer,
1974
+ maxYInLineBuffer,
1975
+ _data->sampleCountSliceBase,
1976
+ _data->sampleCountXStride,
1977
+ _data->sampleCountYStride,
1978
+ _data->bytesPerLine );
1979
+
1980
+ //
1981
+ // For each scanline within the block, get the offset.
1982
+ //
1983
+
1984
+ offsetInLineBufferTable ( _data->bytesPerLine,
1985
+ minYInLineBuffer - _data->minY,
1986
+ maxYInLineBuffer - _data->minY,
1987
+ _data->linesInBuffer,
1988
+ _data->offsetInLineBuffer );
1989
+ }
1990
+ }
1991
+
1992
+ _data->_streamData->is->seekg(savedFilePos);
1993
+ }
1994
+ catch (IEX_NAMESPACE::BaseExc &e)
1995
+ {
1996
+ REPLACE_EXC (e, "Error reading sample count data from image "
1997
+ "file \"" << fileName() << "\". " << e);
1998
+
1999
+ _data->_streamData->is->seekg(savedFilePos);
2000
+
2001
+ throw;
2002
+ }
2003
+ }
2004
+
2005
+ void
2006
+ DeepScanLineInputFile::readPixelSampleCounts(int scanline)
2007
+ {
2008
+ readPixelSampleCounts(scanline, scanline);
2009
+ }
2010
+
2011
+ int
2012
+ DeepScanLineInputFile::firstScanLineInChunk(int y) const
2013
+ {
2014
+ return int((y-_data->minY)/_data->linesInBuffer)*_data->linesInBuffer + _data->minY;
2015
+ }
2016
+
2017
+ int
2018
+ DeepScanLineInputFile::lastScanLineInChunk(int y) const
2019
+ {
2020
+ int minY = firstScanLineInChunk(y);
2021
+ return min(minY+_data->linesInBuffer-1,_data->maxY);
2022
+ }
2023
+
2024
+
2025
+ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT