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,1702 @@
1
+ ///////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // Copyright (c) 2004, 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 ScanLineInputFile
39
+ //
40
+ //-----------------------------------------------------------------------------
41
+
42
+ #include "ImfScanLineInputFile.h"
43
+ #include "ImfChannelList.h"
44
+ #include "ImfMisc.h"
45
+ #include "ImfStdIO.h"
46
+ #include "ImfCompressor.h"
47
+ #include "ImathBox.h"
48
+ #include "ImathFun.h"
49
+ #include <ImfXdr.h>
50
+ #include <ImfConvert.h>
51
+ #include <ImfThreading.h>
52
+ #include <ImfPartType.h>
53
+ #include "IlmThreadPool.h"
54
+ #include "IlmThreadSemaphore.h"
55
+ #include "IlmThreadMutex.h"
56
+ #include "Iex.h"
57
+ #include "ImfVersion.h"
58
+ #include "ImfOptimizedPixelReading.h"
59
+ #include "ImfNamespace.h"
60
+ #include "ImfStandardAttributes.h"
61
+
62
+ #include <algorithm>
63
+ #include <string>
64
+ #include <vector>
65
+ #include <assert.h>
66
+ #include <cstring>
67
+
68
+ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
69
+
70
+
71
+ using IMATH_NAMESPACE::Box2i;
72
+ using IMATH_NAMESPACE::divp;
73
+ using IMATH_NAMESPACE::modp;
74
+ using std::string;
75
+ using std::vector;
76
+ using std::ifstream;
77
+ using std::min;
78
+ using std::max;
79
+ using std::sort;
80
+ using ILMTHREAD_NAMESPACE::Mutex;
81
+ using ILMTHREAD_NAMESPACE::Lock;
82
+ using ILMTHREAD_NAMESPACE::Semaphore;
83
+ using ILMTHREAD_NAMESPACE::Task;
84
+ using ILMTHREAD_NAMESPACE::TaskGroup;
85
+ using ILMTHREAD_NAMESPACE::ThreadPool;
86
+
87
+ namespace {
88
+
89
+ struct InSliceInfo
90
+ {
91
+ PixelType typeInFrameBuffer;
92
+ PixelType typeInFile;
93
+ char * base;
94
+ size_t xStride;
95
+ size_t yStride;
96
+ int xSampling;
97
+ int ySampling;
98
+ bool fill;
99
+ bool skip;
100
+ double fillValue;
101
+
102
+ InSliceInfo (PixelType typeInFrameBuffer = HALF,
103
+ PixelType typeInFile = HALF,
104
+ char *base = 0,
105
+ size_t xStride = 0,
106
+ size_t yStride = 0,
107
+ int xSampling = 1,
108
+ int ySampling = 1,
109
+ bool fill = false,
110
+ bool skip = false,
111
+ double fillValue = 0.0);
112
+ };
113
+
114
+
115
+ InSliceInfo::InSliceInfo (PixelType tifb,
116
+ PixelType tifl,
117
+ char *b,
118
+ size_t xs, size_t ys,
119
+ int xsm, int ysm,
120
+ bool f, bool s,
121
+ double fv)
122
+ :
123
+ typeInFrameBuffer (tifb),
124
+ typeInFile (tifl),
125
+ base (b),
126
+ xStride (xs),
127
+ yStride (ys),
128
+ xSampling (xsm),
129
+ ySampling (ysm),
130
+ fill (f),
131
+ skip (s),
132
+ fillValue (fv)
133
+ {
134
+ // empty
135
+ }
136
+
137
+
138
+ struct LineBuffer
139
+ {
140
+ const char * uncompressedData;
141
+ char * buffer;
142
+ int dataSize;
143
+ int minY;
144
+ int maxY;
145
+ Compressor * compressor;
146
+ Compressor::Format format;
147
+ int number;
148
+ bool hasException;
149
+ string exception;
150
+
151
+ LineBuffer (Compressor * const comp);
152
+ ~LineBuffer ();
153
+
154
+ inline void wait () {_sem.wait();}
155
+ inline void post () {_sem.post();}
156
+
157
+ private:
158
+
159
+ Semaphore _sem;
160
+ };
161
+
162
+
163
+ LineBuffer::LineBuffer (Compressor *comp):
164
+ uncompressedData (0),
165
+ buffer (0),
166
+ dataSize (0),
167
+ compressor (comp),
168
+ format (defaultFormat(compressor)),
169
+ number (-1),
170
+ hasException (false),
171
+ exception (),
172
+ _sem (1)
173
+ {
174
+ // empty
175
+ }
176
+
177
+
178
+ LineBuffer::~LineBuffer ()
179
+ {
180
+ delete compressor;
181
+ }
182
+
183
+ /// helper struct used to detect the order that the channels are stored
184
+
185
+ struct sliceOptimizationData
186
+ {
187
+ const char * base; ///< pointer to pixel data
188
+ bool fill; ///< is this channel being filled with constant, instead of read?
189
+ half fillValue; ///< if filling, the value to use
190
+ size_t offset; ///< position this channel will be in the read buffer, accounting for previous channels, as well as their type
191
+ PixelType type; ///< type of channel
192
+ size_t xStride; ///< x-stride of channel in buffer (must be set to cause channels to interleave)
193
+ size_t yStride; ///< y-stride of channel in buffer (must be same in all channels, else order will change, which is bad)
194
+ int xSampling; ///< channel x sampling
195
+ int ySampling; ///< channel y sampling
196
+
197
+
198
+ /// we need to keep the list sorted in the order they'll be written to memory
199
+ bool operator<(const sliceOptimizationData& other ) const
200
+ {
201
+ return base < other.base;
202
+ }
203
+ };
204
+
205
+
206
+ } // namespace
207
+
208
+
209
+ struct ScanLineInputFile::Data: public Mutex
210
+ {
211
+ Header header; // the image header
212
+ int version; // file's version
213
+ FrameBuffer frameBuffer; // framebuffer to write into
214
+ LineOrder lineOrder; // order of the scanlines in file
215
+ int minX; // data window's min x coord
216
+ int maxX; // data window's max x coord
217
+ int minY; // data window's min y coord
218
+ int maxY; // data window's max x coord
219
+ vector<Int64> lineOffsets; // stores offsets in file for
220
+ // each line
221
+ bool fileIsComplete; // True if no scanlines are missing
222
+ // in the file
223
+ int nextLineBufferMinY; // minimum y of the next linebuffer
224
+ vector<size_t> bytesPerLine; // combined size of a line over all
225
+ // channels
226
+ vector<size_t> offsetInLineBuffer; // offset for each scanline in its
227
+ // linebuffer
228
+ vector<InSliceInfo> slices; // info about channels in file
229
+
230
+ vector<LineBuffer*> lineBuffers; // each holds one line buffer
231
+ int linesInBuffer; // number of scanlines each buffer
232
+ // holds
233
+ size_t lineBufferSize; // size of the line buffer
234
+ int partNumber; // part number
235
+
236
+ bool memoryMapped; // if the stream is memory mapped
237
+ OptimizationMode optimizationMode; // optimizibility of the input file
238
+ vector<sliceOptimizationData> optimizationData; ///< channel ordering for optimized reading
239
+
240
+ Data (int numThreads);
241
+ ~Data ();
242
+
243
+ inline LineBuffer * getLineBuffer (int number); // hash function from line
244
+ // buffer indices into our
245
+ // vector of line buffers
246
+
247
+
248
+ };
249
+
250
+
251
+ ScanLineInputFile::Data::Data (int numThreads):
252
+ partNumber(-1),
253
+ memoryMapped(false)
254
+ {
255
+ //
256
+ // We need at least one lineBuffer, but if threading is used,
257
+ // to keep n threads busy we need 2*n lineBuffers
258
+ //
259
+
260
+ lineBuffers.resize (max (1, 2 * numThreads));
261
+ }
262
+
263
+
264
+ ScanLineInputFile::Data::~Data ()
265
+ {
266
+ for (size_t i = 0; i < lineBuffers.size(); i++)
267
+ delete lineBuffers[i];
268
+ }
269
+
270
+
271
+ inline LineBuffer *
272
+ ScanLineInputFile::Data::getLineBuffer (int lineBufferNumber)
273
+ {
274
+ return lineBuffers[lineBufferNumber % lineBuffers.size()];
275
+ }
276
+
277
+
278
+ namespace {
279
+
280
+
281
+ void
282
+ reconstructLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,
283
+ LineOrder lineOrder,
284
+ vector<Int64> &lineOffsets)
285
+ {
286
+ Int64 position = is.tellg();
287
+
288
+ try
289
+ {
290
+ for (unsigned int i = 0; i < lineOffsets.size(); i++)
291
+ {
292
+ Int64 lineOffset = is.tellg();
293
+
294
+ int y;
295
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (is, y);
296
+
297
+ int dataSize;
298
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (is, dataSize);
299
+
300
+ Xdr::skip <StreamIO> (is, dataSize);
301
+
302
+ if (lineOrder == INCREASING_Y)
303
+ lineOffsets[i] = lineOffset;
304
+ else
305
+ lineOffsets[lineOffsets.size() - i - 1] = lineOffset;
306
+ }
307
+ }
308
+ catch (...)
309
+ {
310
+ //
311
+ // Suppress all exceptions. This functions is
312
+ // called only to reconstruct the line offset
313
+ // table for incomplete files, and exceptions
314
+ // are likely.
315
+ //
316
+ }
317
+
318
+ is.clear();
319
+ is.seekg (position);
320
+ }
321
+
322
+
323
+ void
324
+ readLineOffsets (OPENEXR_IMF_INTERNAL_NAMESPACE::IStream &is,
325
+ LineOrder lineOrder,
326
+ vector<Int64> &lineOffsets,
327
+ bool &complete)
328
+ {
329
+ for (unsigned int i = 0; i < lineOffsets.size(); i++)
330
+ {
331
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (is, lineOffsets[i]);
332
+ }
333
+
334
+ complete = true;
335
+
336
+ for (unsigned int i = 0; i < lineOffsets.size(); i++)
337
+ {
338
+ if (lineOffsets[i] <= 0)
339
+ {
340
+ //
341
+ // Invalid data in the line offset table mean that
342
+ // the file is probably incomplete (the table is
343
+ // the last thing written to the file). Either
344
+ // some process is still busy writing the file,
345
+ // or writing the file was aborted.
346
+ //
347
+ // We should still be able to read the existing
348
+ // parts of the file. In order to do this, we
349
+ // have to make a sequential scan over the scan
350
+ // line data to reconstruct the line offset table.
351
+ //
352
+
353
+ complete = false;
354
+ reconstructLineOffsets (is, lineOrder, lineOffsets);
355
+ break;
356
+ }
357
+ }
358
+ }
359
+
360
+
361
+ void
362
+ readPixelData (InputStreamMutex *streamData,
363
+ ScanLineInputFile::Data *ifd,
364
+ int minY,
365
+ char *&buffer,
366
+ int &dataSize)
367
+ {
368
+ //
369
+ // Read a single line buffer from the input file.
370
+ //
371
+ // If the input file is not memory-mapped, we copy the pixel data into
372
+ // into the array pointed to by buffer. If the file is memory-mapped,
373
+ // then we change where buffer points to instead of writing into the
374
+ // array (hence buffer needs to be a reference to a char *).
375
+ //
376
+
377
+ int lineBufferNumber = (minY - ifd->minY) / ifd->linesInBuffer;
378
+
379
+ Int64 lineOffset = ifd->lineOffsets[lineBufferNumber];
380
+
381
+ if (lineOffset == 0)
382
+ THROW (IEX_NAMESPACE::InputExc, "Scan line " << minY << " is missing.");
383
+
384
+ //
385
+ // Seek to the start of the scan line in the file,
386
+ // if necessary.
387
+ //
388
+
389
+ if ( !isMultiPart(ifd->version) )
390
+ {
391
+ if (ifd->nextLineBufferMinY != minY)
392
+ streamData->is->seekg (lineOffset);
393
+ }
394
+ else
395
+ {
396
+ //
397
+ // In a multi-part file, the file pointer may have been moved by
398
+ // other parts, so we have to ask tellg() where we are.
399
+ //
400
+ if (streamData->is->tellg() != ifd->lineOffsets[lineBufferNumber])
401
+ streamData->is->seekg (lineOffset);
402
+ }
403
+
404
+ //
405
+ // Read the data block's header.
406
+ //
407
+
408
+ int yInFile;
409
+
410
+ //
411
+ // Read the part number when we are dealing with a multi-part file.
412
+ //
413
+ if (isMultiPart(ifd->version))
414
+ {
415
+ int partNumber;
416
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, partNumber);
417
+ if (partNumber != ifd->partNumber)
418
+ {
419
+ THROW (IEX_NAMESPACE::ArgExc, "Unexpected part number " << partNumber
420
+ << ", should be " << ifd->partNumber << ".");
421
+ }
422
+ }
423
+
424
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, yInFile);
425
+ OPENEXR_IMF_INTERNAL_NAMESPACE::Xdr::read <OPENEXR_IMF_INTERNAL_NAMESPACE::StreamIO> (*streamData->is, dataSize);
426
+
427
+ if (yInFile != minY)
428
+ throw IEX_NAMESPACE::InputExc ("Unexpected data block y coordinate.");
429
+
430
+ if (dataSize > (int) ifd->lineBufferSize)
431
+ throw IEX_NAMESPACE::InputExc ("Unexpected data block length.");
432
+
433
+ //
434
+ // Read the pixel data.
435
+ //
436
+
437
+ if (streamData->is->isMemoryMapped ())
438
+ buffer = streamData->is->readMemoryMapped (dataSize);
439
+ else
440
+ streamData->is->read (buffer, dataSize);
441
+
442
+ //
443
+ // Keep track of which scan line is the next one in
444
+ // the file, so that we can avoid redundant seekg()
445
+ // operations (seekg() can be fairly expensive).
446
+ //
447
+
448
+ if (ifd->lineOrder == INCREASING_Y)
449
+ ifd->nextLineBufferMinY = minY + ifd->linesInBuffer;
450
+ else
451
+ ifd->nextLineBufferMinY = minY - ifd->linesInBuffer;
452
+ }
453
+
454
+
455
+
456
+ //
457
+ // A LineBufferTask encapsulates the task uncompressing a set of
458
+ // scanlines (line buffer) and copying them into the frame buffer.
459
+ //
460
+
461
+ class LineBufferTask : public Task
462
+ {
463
+ public:
464
+
465
+ LineBufferTask (TaskGroup *group,
466
+ ScanLineInputFile::Data *ifd,
467
+ LineBuffer *lineBuffer,
468
+ int scanLineMin,
469
+ int scanLineMax,
470
+ OptimizationMode optimizationMode);
471
+
472
+ virtual ~LineBufferTask ();
473
+
474
+ virtual void execute ();
475
+
476
+ private:
477
+
478
+ ScanLineInputFile::Data * _ifd;
479
+ LineBuffer * _lineBuffer;
480
+ int _scanLineMin;
481
+ int _scanLineMax;
482
+ OptimizationMode _optimizationMode;
483
+ };
484
+
485
+
486
+ LineBufferTask::LineBufferTask
487
+ (TaskGroup *group,
488
+ ScanLineInputFile::Data *ifd,
489
+ LineBuffer *lineBuffer,
490
+ int scanLineMin,
491
+ int scanLineMax,OptimizationMode optimizationMode)
492
+ :
493
+ Task (group),
494
+ _ifd (ifd),
495
+ _lineBuffer (lineBuffer),
496
+ _scanLineMin (scanLineMin),
497
+ _scanLineMax (scanLineMax),
498
+ _optimizationMode(optimizationMode)
499
+ {
500
+ // empty
501
+ }
502
+
503
+
504
+ LineBufferTask::~LineBufferTask ()
505
+ {
506
+ //
507
+ // Signal that the line buffer is now free
508
+ //
509
+
510
+ _lineBuffer->post ();
511
+ }
512
+
513
+
514
+ void
515
+ LineBufferTask::execute ()
516
+ {
517
+ try
518
+ {
519
+ //
520
+ // Uncompress the data, if necessary
521
+ //
522
+
523
+ if (_lineBuffer->uncompressedData == 0)
524
+ {
525
+ int uncompressedSize = 0;
526
+ int maxY = min (_lineBuffer->maxY, _ifd->maxY);
527
+
528
+ for (int i = _lineBuffer->minY - _ifd->minY;
529
+ i <= maxY - _ifd->minY;
530
+ ++i)
531
+ {
532
+ uncompressedSize += (int) _ifd->bytesPerLine[i];
533
+ }
534
+
535
+ if (_lineBuffer->compressor &&
536
+ _lineBuffer->dataSize < uncompressedSize)
537
+ {
538
+ _lineBuffer->format = _lineBuffer->compressor->format();
539
+
540
+ _lineBuffer->dataSize = _lineBuffer->compressor->uncompress
541
+ (_lineBuffer->buffer,
542
+ _lineBuffer->dataSize,
543
+ _lineBuffer->minY,
544
+ _lineBuffer->uncompressedData);
545
+ }
546
+ else
547
+ {
548
+ //
549
+ // If the line is uncompressed, it's in XDR format,
550
+ // regardless of the compressor's output format.
551
+ //
552
+
553
+ _lineBuffer->format = Compressor::XDR;
554
+ _lineBuffer->uncompressedData = _lineBuffer->buffer;
555
+ }
556
+ }
557
+
558
+ int yStart, yStop, dy;
559
+
560
+ if (_ifd->lineOrder == INCREASING_Y)
561
+ {
562
+ yStart = _scanLineMin;
563
+ yStop = _scanLineMax + 1;
564
+ dy = 1;
565
+ }
566
+ else
567
+ {
568
+ yStart = _scanLineMax;
569
+ yStop = _scanLineMin - 1;
570
+ dy = -1;
571
+ }
572
+
573
+ for (int y = yStart; y != yStop; y += dy)
574
+ {
575
+ //
576
+ // Convert one scan line's worth of pixel data back
577
+ // from the machine-independent representation, and
578
+ // store the result in the frame buffer.
579
+ //
580
+
581
+ const char *readPtr = _lineBuffer->uncompressedData +
582
+ _ifd->offsetInLineBuffer[y - _ifd->minY];
583
+
584
+ //
585
+ // Iterate over all image channels.
586
+ //
587
+
588
+ for (unsigned int i = 0; i < _ifd->slices.size(); ++i)
589
+ {
590
+ //
591
+ // Test if scan line y of this channel contains any data
592
+ // (the scan line contains data only if y % ySampling == 0).
593
+ //
594
+
595
+ const InSliceInfo &slice = _ifd->slices[i];
596
+
597
+ if (modp (y, slice.ySampling) != 0)
598
+ continue;
599
+
600
+ //
601
+ // Find the x coordinates of the leftmost and rightmost
602
+ // sampled pixels (i.e. pixels within the data window
603
+ // for which x % xSampling == 0).
604
+ //
605
+
606
+ int dMinX = divp (_ifd->minX, slice.xSampling);
607
+ int dMaxX = divp (_ifd->maxX, slice.xSampling);
608
+
609
+ //
610
+ // Fill the frame buffer with pixel data.
611
+ //
612
+
613
+ if (slice.skip)
614
+ {
615
+ //
616
+ // The file contains data for this channel, but
617
+ // the frame buffer contains no slice for this channel.
618
+ //
619
+
620
+ skipChannel (readPtr, slice.typeInFile, dMaxX - dMinX + 1);
621
+ }
622
+ else
623
+ {
624
+ //
625
+ // The frame buffer contains a slice for this channel.
626
+ //
627
+
628
+ char *linePtr = slice.base +
629
+ divp (y, slice.ySampling) *
630
+ slice.yStride;
631
+
632
+ char *writePtr = linePtr + dMinX * slice.xStride;
633
+ char *endPtr = linePtr + dMaxX * slice.xStride;
634
+
635
+ copyIntoFrameBuffer (readPtr, writePtr, endPtr,
636
+ slice.xStride, slice.fill,
637
+ slice.fillValue, _lineBuffer->format,
638
+ slice.typeInFrameBuffer,
639
+ slice.typeInFile);
640
+ }
641
+ }
642
+ }
643
+ }
644
+ catch (std::exception &e)
645
+ {
646
+ if (!_lineBuffer->hasException)
647
+ {
648
+ _lineBuffer->exception = e.what();
649
+ _lineBuffer->hasException = true;
650
+ }
651
+ }
652
+ catch (...)
653
+ {
654
+ if (!_lineBuffer->hasException)
655
+ {
656
+ _lineBuffer->exception = "unrecognized exception";
657
+ _lineBuffer->hasException = true;
658
+ }
659
+ }
660
+ }
661
+
662
+
663
+ #ifdef IMF_HAVE_SSE2
664
+ //
665
+ // IIF format is more restricted than a perfectly generic one,
666
+ // so it is possible to perform some optimizations.
667
+ //
668
+ class LineBufferTaskIIF : public Task
669
+ {
670
+ public:
671
+
672
+ LineBufferTaskIIF (TaskGroup *group,
673
+ ScanLineInputFile::Data *ifd,
674
+ LineBuffer *lineBuffer,
675
+ int scanLineMin,
676
+ int scanLineMax,
677
+ OptimizationMode optimizationMode);
678
+
679
+ virtual ~LineBufferTaskIIF ();
680
+
681
+ virtual void execute ();
682
+
683
+ template<typename TYPE>
684
+ void getWritePointer (int y,
685
+ unsigned short*& pOutWritePointerRight,
686
+ size_t& outPixelsToCopySSE,
687
+ size_t& outPixelsToCopyNormal,int bank=0) const;
688
+
689
+ template<typename TYPE>
690
+ void getWritePointerStereo (int y,
691
+ unsigned short*& outWritePointerRight,
692
+ unsigned short*& outWritePointerLeft,
693
+ size_t& outPixelsToCopySSE,
694
+ size_t& outPixelsToCopyNormal) const;
695
+
696
+ private:
697
+
698
+ ScanLineInputFile::Data * _ifd;
699
+ LineBuffer * _lineBuffer;
700
+ int _scanLineMin;
701
+ int _scanLineMax;
702
+ OptimizationMode _optimizationMode;
703
+
704
+ };
705
+
706
+ LineBufferTaskIIF::LineBufferTaskIIF
707
+ (TaskGroup *group,
708
+ ScanLineInputFile::Data *ifd,
709
+ LineBuffer *lineBuffer,
710
+ int scanLineMin,
711
+ int scanLineMax,
712
+ OptimizationMode optimizationMode
713
+ )
714
+ :
715
+ Task (group),
716
+ _ifd (ifd),
717
+ _lineBuffer (lineBuffer),
718
+ _scanLineMin (scanLineMin),
719
+ _scanLineMax (scanLineMax),
720
+ _optimizationMode (optimizationMode)
721
+ {
722
+ /*
723
+ //
724
+ // indicates the optimised path has been taken
725
+ //
726
+ static bool could_optimise=false;
727
+ if(could_optimise==false)
728
+ {
729
+ std::cerr << " optimised path\n";
730
+ could_optimise=true;
731
+ }
732
+ */
733
+ }
734
+
735
+ LineBufferTaskIIF::~LineBufferTaskIIF ()
736
+ {
737
+ //
738
+ // Signal that the line buffer is now free
739
+ //
740
+
741
+ _lineBuffer->post ();
742
+ }
743
+
744
+ // Return 0 if we are to skip because of sampling
745
+ // channelBank is 0 for the first group of channels, 1 for the second
746
+ template<typename TYPE>
747
+ void LineBufferTaskIIF::getWritePointer
748
+ (int y,
749
+ unsigned short*& outWritePointerRight,
750
+ size_t& outPixelsToCopySSE,
751
+ size_t& outPixelsToCopyNormal,
752
+ int channelBank
753
+ ) const
754
+ {
755
+ // Channels are saved alphabetically, so the order is B G R.
756
+ // The last slice (R) will give us the location of our write pointer.
757
+ // The only slice that we support skipping is alpha, i.e. the first one.
758
+ // This does not impact the write pointer or the pixels to copy at all.
759
+
760
+ size_t nbSlicesInBank = _ifd->optimizationData.size();
761
+
762
+ int sizeOfSingleValue = sizeof(TYPE);
763
+
764
+ if(_ifd->optimizationData.size()>4)
765
+ {
766
+ // there are two banks - we only copy one at once
767
+ nbSlicesInBank/=2;
768
+ }
769
+
770
+
771
+ size_t firstChannel = 0;
772
+ if(channelBank==1)
773
+ {
774
+ firstChannel = _ifd->optimizationData.size()/2;
775
+ }
776
+
777
+ sliceOptimizationData& firstSlice = _ifd->optimizationData[firstChannel];
778
+
779
+ if (modp (y, firstSlice.ySampling) != 0)
780
+ {
781
+ outPixelsToCopySSE = 0;
782
+ outPixelsToCopyNormal = 0;
783
+ outWritePointerRight = 0;
784
+ }
785
+
786
+ const char* linePtr1 = firstSlice.base +
787
+ divp (y, firstSlice.ySampling) *
788
+ firstSlice.yStride;
789
+
790
+ int dMinX1 = divp (_ifd->minX, firstSlice.xSampling);
791
+ int dMaxX1 = divp (_ifd->maxX, firstSlice.xSampling);
792
+
793
+ // Construct the writePtr so that we start writing at
794
+ // linePtr + Min offset in the line.
795
+ outWritePointerRight = (unsigned short*)(linePtr1 +
796
+ dMinX1 * firstSlice.xStride );
797
+
798
+ size_t bytesToCopy = ((linePtr1 + dMaxX1 * firstSlice.xStride ) -
799
+ (linePtr1 + dMinX1 * firstSlice.xStride )) + 2;
800
+ size_t shortsToCopy = bytesToCopy / sizeOfSingleValue;
801
+ size_t pixelsToCopy = (shortsToCopy / nbSlicesInBank ) + 1;
802
+
803
+ // We only support writing to SSE if we have no pixels to copy normally
804
+ outPixelsToCopySSE = pixelsToCopy / 8;
805
+ outPixelsToCopyNormal = pixelsToCopy % 8;
806
+
807
+ }
808
+
809
+
810
+ template<typename TYPE>
811
+ void LineBufferTaskIIF::getWritePointerStereo
812
+ (int y,
813
+ unsigned short*& outWritePointerRight,
814
+ unsigned short*& outWritePointerLeft,
815
+ size_t& outPixelsToCopySSE,
816
+ size_t& outPixelsToCopyNormal) const
817
+ {
818
+ getWritePointer<TYPE>(y,outWritePointerRight,outPixelsToCopySSE,outPixelsToCopyNormal,0);
819
+
820
+
821
+ if(outWritePointerRight)
822
+ {
823
+ getWritePointer<TYPE>(y,outWritePointerLeft,outPixelsToCopySSE,outPixelsToCopyNormal,1);
824
+ }
825
+
826
+ }
827
+
828
+ void
829
+ LineBufferTaskIIF::execute()
830
+ {
831
+ try
832
+ {
833
+ //
834
+ // Uncompress the data, if necessary
835
+ //
836
+
837
+ if (_lineBuffer->uncompressedData == 0)
838
+ {
839
+ int uncompressedSize = 0;
840
+ int maxY = min (_lineBuffer->maxY, _ifd->maxY);
841
+
842
+ for (int i = _lineBuffer->minY - _ifd->minY;
843
+ i <= maxY - _ifd->minY;
844
+ ++i)
845
+ {
846
+ uncompressedSize += (int) _ifd->bytesPerLine[i];
847
+ }
848
+
849
+ if (_lineBuffer->compressor &&
850
+ _lineBuffer->dataSize < uncompressedSize)
851
+ {
852
+ _lineBuffer->format = _lineBuffer->compressor->format();
853
+
854
+ _lineBuffer->dataSize =
855
+ _lineBuffer->compressor->uncompress (_lineBuffer->buffer,
856
+ _lineBuffer->dataSize,
857
+ _lineBuffer->minY,
858
+ _lineBuffer->uncompressedData);
859
+ }
860
+ else
861
+ {
862
+ //
863
+ // If the line is uncompressed, it's in XDR format,
864
+ // regardless of the compressor's output format.
865
+ //
866
+
867
+ _lineBuffer->format = Compressor::XDR;
868
+ _lineBuffer->uncompressedData = _lineBuffer->buffer;
869
+ }
870
+ }
871
+
872
+ int yStart, yStop, dy;
873
+
874
+ if (_ifd->lineOrder == INCREASING_Y)
875
+ {
876
+ yStart = _scanLineMin;
877
+ yStop = _scanLineMax + 1;
878
+ dy = 1;
879
+ }
880
+ else
881
+ {
882
+ yStart = _scanLineMax;
883
+ yStop = _scanLineMin - 1;
884
+ dy = -1;
885
+ }
886
+
887
+ for (int y = yStart; y != yStop; y += dy)
888
+ {
889
+ if (modp (y, _optimizationMode._ySampling) != 0)
890
+ continue;
891
+
892
+ //
893
+ // Convert one scan line's worth of pixel data back
894
+ // from the machine-independent representation, and
895
+ // store the result in the frame buffer.
896
+ //
897
+
898
+ // Set the readPtr to read at the start of uncompressedData
899
+ // but with an offet based on calculated array.
900
+ // _ifd->offsetInLineBuffer contains offsets based on which
901
+ // line we are currently processing.
902
+ // Stride will be taken into consideration later.
903
+
904
+
905
+ const char* readPtr = _lineBuffer->uncompressedData +
906
+ _ifd->offsetInLineBuffer[y - _ifd->minY];
907
+
908
+ size_t pixelsToCopySSE = 0;
909
+ size_t pixelsToCopyNormal = 0;
910
+
911
+ unsigned short* writePtrLeft = 0;
912
+ unsigned short* writePtrRight = 0;
913
+
914
+ size_t channels = _ifd->optimizationData.size();
915
+
916
+ if(channels>4)
917
+ {
918
+ getWritePointerStereo<half>(y, writePtrRight, writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal);
919
+ }
920
+ else
921
+ {
922
+ getWritePointer<half>(y, writePtrRight, pixelsToCopySSE, pixelsToCopyNormal);
923
+ }
924
+
925
+ if (writePtrRight == 0 && pixelsToCopySSE == 0 && pixelsToCopyNormal == 0)
926
+ {
927
+ continue;
928
+ }
929
+
930
+
931
+ //
932
+ // support reading up to eight channels
933
+ //
934
+ unsigned short* readPointers[8];
935
+
936
+ for (size_t i = 0; i < channels ; ++i)
937
+ {
938
+ readPointers[i] = (unsigned short*)readPtr + (_ifd->optimizationData[i].offset * (pixelsToCopySSE * 8 + pixelsToCopyNormal));
939
+ }
940
+
941
+ //RGB only
942
+ if(channels==3 || channels == 6 )
943
+ {
944
+ optimizedWriteToRGB(readPointers[0], readPointers[1], readPointers[2], writePtrRight, pixelsToCopySSE, pixelsToCopyNormal);
945
+
946
+ //stereo RGB
947
+ if( channels == 6)
948
+ {
949
+ optimizedWriteToRGB(readPointers[3], readPointers[4], readPointers[5], writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal);
950
+ }
951
+ //RGBA
952
+ }else if(channels==4 || channels==8)
953
+ {
954
+
955
+ if(_ifd->optimizationData[3].fill)
956
+ {
957
+ optimizedWriteToRGBAFillA(readPointers[0], readPointers[1], readPointers[2], _ifd->optimizationData[3].fillValue.bits() , writePtrRight, pixelsToCopySSE, pixelsToCopyNormal);
958
+ }else{
959
+ optimizedWriteToRGBA(readPointers[0], readPointers[1], readPointers[2], readPointers[3] , writePtrRight, pixelsToCopySSE, pixelsToCopyNormal);
960
+ }
961
+
962
+ //stereo RGBA
963
+ if( channels == 8)
964
+ {
965
+ if(_ifd->optimizationData[7].fill)
966
+ {
967
+ optimizedWriteToRGBAFillA(readPointers[4], readPointers[5], readPointers[6], _ifd->optimizationData[7].fillValue.bits() , writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal);
968
+ }else{
969
+ optimizedWriteToRGBA(readPointers[4], readPointers[5], readPointers[6], readPointers[7] , writePtrLeft, pixelsToCopySSE, pixelsToCopyNormal);
970
+ }
971
+ }
972
+ }
973
+ else {
974
+ throw(IEX_NAMESPACE::LogicExc("IIF mode called with incorrect channel pattern"));
975
+ }
976
+
977
+ // If we are in NO_OPTIMIZATION mode, this class will never
978
+ // get instantiated, so no need to check for it and duplicate
979
+ // the code.
980
+ }
981
+ }
982
+ catch (std::exception &e)
983
+ {
984
+ if (!_lineBuffer->hasException)
985
+ {
986
+ _lineBuffer->exception = e.what();
987
+ _lineBuffer->hasException = true;
988
+ }
989
+ }
990
+ catch (...)
991
+ {
992
+ if (!_lineBuffer->hasException)
993
+ {
994
+ _lineBuffer->exception = "unrecognized exception";
995
+ _lineBuffer->hasException = true;
996
+ }
997
+ }
998
+ }
999
+ #endif
1000
+
1001
+
1002
+ Task *
1003
+ newLineBufferTask (TaskGroup *group,
1004
+ InputStreamMutex *streamData,
1005
+ ScanLineInputFile::Data *ifd,
1006
+ int number,
1007
+ int scanLineMin,
1008
+ int scanLineMax,
1009
+ OptimizationMode optimizationMode)
1010
+ {
1011
+ //
1012
+ // Wait for a line buffer to become available, fill the line
1013
+ // buffer with raw data from the file if necessary, and create
1014
+ // a new LineBufferTask whose execute() method will uncompress
1015
+ // the contents of the buffer and copy the pixels into the
1016
+ // frame buffer.
1017
+ //
1018
+
1019
+ LineBuffer *lineBuffer = ifd->getLineBuffer (number);
1020
+
1021
+ try
1022
+ {
1023
+ lineBuffer->wait ();
1024
+
1025
+ if (lineBuffer->number != number)
1026
+ {
1027
+ lineBuffer->minY = ifd->minY + number * ifd->linesInBuffer;
1028
+ lineBuffer->maxY = lineBuffer->minY + ifd->linesInBuffer - 1;
1029
+
1030
+ lineBuffer->number = number;
1031
+ lineBuffer->uncompressedData = 0;
1032
+
1033
+ readPixelData (streamData, ifd, lineBuffer->minY,
1034
+ lineBuffer->buffer,
1035
+ lineBuffer->dataSize);
1036
+ }
1037
+ }
1038
+ catch (std::exception &e)
1039
+ {
1040
+ if (!lineBuffer->hasException)
1041
+ {
1042
+ lineBuffer->exception = e.what();
1043
+ lineBuffer->hasException = true;
1044
+ }
1045
+ lineBuffer->number = -1;
1046
+ lineBuffer->post();
1047
+ throw;
1048
+ }
1049
+ catch (...)
1050
+ {
1051
+ //
1052
+ // Reading from the file caused an exception.
1053
+ // Signal that the line buffer is free, and
1054
+ // re-throw the exception.
1055
+ //
1056
+
1057
+ lineBuffer->exception = "unrecognized exception";
1058
+ lineBuffer->hasException = true;
1059
+ lineBuffer->number = -1;
1060
+ lineBuffer->post();
1061
+ throw;
1062
+ }
1063
+
1064
+ scanLineMin = max (lineBuffer->minY, scanLineMin);
1065
+ scanLineMax = min (lineBuffer->maxY, scanLineMax);
1066
+
1067
+
1068
+ Task* retTask = 0;
1069
+
1070
+ #ifdef IMF_HAVE_SSE2
1071
+ if (optimizationMode._optimizable)
1072
+ {
1073
+
1074
+ retTask = new LineBufferTaskIIF (group, ifd, lineBuffer,
1075
+ scanLineMin, scanLineMax,
1076
+ optimizationMode);
1077
+
1078
+ }
1079
+ else
1080
+ #endif
1081
+ {
1082
+ retTask = new LineBufferTask (group, ifd, lineBuffer,
1083
+ scanLineMin, scanLineMax,
1084
+ optimizationMode);
1085
+ }
1086
+
1087
+ return retTask;
1088
+
1089
+ }
1090
+
1091
+
1092
+
1093
+
1094
+ } // namespace
1095
+
1096
+
1097
+ void ScanLineInputFile::initialize(const Header& header)
1098
+ {
1099
+ try
1100
+ {
1101
+ _data->header = header;
1102
+
1103
+ _data->lineOrder = _data->header.lineOrder();
1104
+
1105
+ const Box2i &dataWindow = _data->header.dataWindow();
1106
+
1107
+ _data->minX = dataWindow.min.x;
1108
+ _data->maxX = dataWindow.max.x;
1109
+ _data->minY = dataWindow.min.y;
1110
+ _data->maxY = dataWindow.max.y;
1111
+
1112
+ size_t maxBytesPerLine = bytesPerLineTable (_data->header,
1113
+ _data->bytesPerLine);
1114
+
1115
+ for (size_t i = 0; i < _data->lineBuffers.size(); i++)
1116
+ {
1117
+ _data->lineBuffers[i] = new LineBuffer (newCompressor
1118
+ (_data->header.compression(),
1119
+ maxBytesPerLine,
1120
+ _data->header));
1121
+ }
1122
+
1123
+ _data->linesInBuffer =
1124
+ numLinesInBuffer (_data->lineBuffers[0]->compressor);
1125
+
1126
+ _data->lineBufferSize = maxBytesPerLine * _data->linesInBuffer;
1127
+
1128
+ if (!_streamData->is->isMemoryMapped())
1129
+ {
1130
+ for (size_t i = 0; i < _data->lineBuffers.size(); i++)
1131
+ {
1132
+ _data->lineBuffers[i]->buffer = (char *) EXRAllocAligned(_data->lineBufferSize*sizeof(char),16);
1133
+ }
1134
+ }
1135
+ _data->nextLineBufferMinY = _data->minY - 1;
1136
+
1137
+ offsetInLineBufferTable (_data->bytesPerLine,
1138
+ _data->linesInBuffer,
1139
+ _data->offsetInLineBuffer);
1140
+
1141
+ int lineOffsetSize = (dataWindow.max.y - dataWindow.min.y +
1142
+ _data->linesInBuffer) / _data->linesInBuffer;
1143
+
1144
+ _data->lineOffsets.resize (lineOffsetSize);
1145
+ }
1146
+ catch (...)
1147
+ {
1148
+ delete _data;
1149
+ _data=NULL;
1150
+ throw;
1151
+ }
1152
+ }
1153
+
1154
+
1155
+ ScanLineInputFile::ScanLineInputFile(InputPartData* part)
1156
+ {
1157
+ if (part->header.type() != SCANLINEIMAGE)
1158
+ throw IEX_NAMESPACE::ArgExc("Can't build a ScanLineInputFile from a type-mismatched part.");
1159
+
1160
+ _data = new Data(part->numThreads);
1161
+ _streamData = part->mutex;
1162
+ _data->memoryMapped = _streamData->is->isMemoryMapped();
1163
+
1164
+ _data->version = part->version;
1165
+
1166
+ initialize(part->header);
1167
+
1168
+ _data->lineOffsets = part->chunkOffsets;
1169
+
1170
+ _data->partNumber = part->partNumber;
1171
+ //
1172
+ // (TODO) change this code later.
1173
+ // The completeness of the file should be detected in MultiPartInputFile.
1174
+ //
1175
+ _data->fileIsComplete = true;
1176
+ }
1177
+
1178
+
1179
+ ScanLineInputFile::ScanLineInputFile
1180
+ (const Header &header,
1181
+ OPENEXR_IMF_INTERNAL_NAMESPACE::IStream *is,
1182
+ int numThreads)
1183
+ :
1184
+ _data (new Data (numThreads)),
1185
+ _streamData (new InputStreamMutex())
1186
+ {
1187
+ _streamData->is = is;
1188
+ _data->memoryMapped = is->isMemoryMapped();
1189
+
1190
+ initialize(header);
1191
+
1192
+ //
1193
+ // (TODO) this is nasty - we need a better way of working out what type of file has been used.
1194
+ // in any case I believe this constructor only gets used with single part files
1195
+ // and 'version' currently only tracks multipart state, so setting to 0 (not multipart) works for us
1196
+ //
1197
+
1198
+ _data->version=0;
1199
+ readLineOffsets (*_streamData->is,
1200
+ _data->lineOrder,
1201
+ _data->lineOffsets,
1202
+ _data->fileIsComplete);
1203
+ }
1204
+
1205
+
1206
+ ScanLineInputFile::~ScanLineInputFile ()
1207
+ {
1208
+ if (!_data->memoryMapped)
1209
+ {
1210
+ for (size_t i = 0; i < _data->lineBuffers.size(); i++)
1211
+ {
1212
+ EXRFreeAligned(_data->lineBuffers[i]->buffer);
1213
+ }
1214
+ }
1215
+
1216
+
1217
+ //
1218
+ // ScanLineInputFile should never delete the stream,
1219
+ // because it does not own the stream.
1220
+ // We just delete the Mutex here.
1221
+ //
1222
+ if (_data->partNumber == -1)
1223
+ delete _streamData;
1224
+
1225
+ delete _data;
1226
+ }
1227
+
1228
+
1229
+ const char *
1230
+ ScanLineInputFile::fileName () const
1231
+ {
1232
+ return _streamData->is->fileName();
1233
+ }
1234
+
1235
+
1236
+ const Header &
1237
+ ScanLineInputFile::header () const
1238
+ {
1239
+ return _data->header;
1240
+ }
1241
+
1242
+
1243
+ int
1244
+ ScanLineInputFile::version () const
1245
+ {
1246
+ return _data->version;
1247
+ }
1248
+
1249
+
1250
+ namespace
1251
+ {
1252
+
1253
+
1254
+ // returns the optimization state for the given arrangement of frame bufers
1255
+ // this assumes:
1256
+ // both the file and framebuffer are half float data
1257
+ // both the file and framebuffer have xSampling and ySampling=1
1258
+ // entries in optData are sorted into their interleave order (i.e. by base address)
1259
+ // These tests are done by SetFrameBuffer as it is building optData
1260
+ //
1261
+ OptimizationMode
1262
+ detectOptimizationMode (const vector<sliceOptimizationData>& optData)
1263
+ {
1264
+ OptimizationMode w;
1265
+
1266
+ // need to be compiled with SSE optimisations: if not, just returns false
1267
+ #if IMF_HAVE_SSE2
1268
+
1269
+
1270
+ // only handle reading 3,4,6 or 8 channels
1271
+ switch(optData.size())
1272
+ {
1273
+ case 3 : break;
1274
+ case 4 : break;
1275
+ case 6 : break;
1276
+ case 8 : break;
1277
+ default :
1278
+ return w;
1279
+ }
1280
+
1281
+ //
1282
+ // the point at which data switches between the primary and secondary bank
1283
+ //
1284
+ size_t bankSize = optData.size()>4 ? optData.size()/2 : optData.size();
1285
+
1286
+ for(size_t i=0;i<optData.size();i++)
1287
+ {
1288
+ const sliceOptimizationData& data = optData[i];
1289
+ // can't fill anything other than channel 3 or channel 7
1290
+ if(data.fill)
1291
+ {
1292
+ if(i!=3 && i!=7)
1293
+ {
1294
+ return w;
1295
+ }
1296
+ }
1297
+
1298
+ // cannot have gaps in the channel layout, so the stride must be (number of channels written in the bank)*2
1299
+ if(data.xStride !=bankSize*2)
1300
+ {
1301
+ return w;
1302
+ }
1303
+
1304
+ // each bank of channels must be channel interleaved: each channel base pointer must be (previous channel+2)
1305
+ // this also means channel sampling pattern must be consistent, as must yStride
1306
+ if(i!=0 && i!=bankSize)
1307
+ {
1308
+ if(data.base!=optData[i-1].base+2)
1309
+ {
1310
+ return w;
1311
+ }
1312
+ }
1313
+ if(i!=0)
1314
+ {
1315
+
1316
+ if(data.yStride!=optData[i-1].yStride)
1317
+ {
1318
+ return w;
1319
+ }
1320
+ }
1321
+ }
1322
+
1323
+
1324
+ w._ySampling=optData[0].ySampling;
1325
+ w._optimizable=true;
1326
+
1327
+ #endif
1328
+
1329
+ return w;
1330
+ }
1331
+
1332
+
1333
+ } // Anonymous namespace
1334
+
1335
+ void
1336
+ ScanLineInputFile::setFrameBuffer (const FrameBuffer &frameBuffer)
1337
+ {
1338
+ Lock lock (*_streamData);
1339
+
1340
+
1341
+
1342
+ const ChannelList &channels = _data->header.channels();
1343
+ for (FrameBuffer::ConstIterator j = frameBuffer.begin();
1344
+ j != frameBuffer.end();
1345
+ ++j)
1346
+ {
1347
+ ChannelList::ConstIterator i = channels.find (j.name());
1348
+
1349
+ if (i == channels.end())
1350
+ continue;
1351
+
1352
+ if (i.channel().xSampling != j.slice().xSampling ||
1353
+ i.channel().ySampling != j.slice().ySampling)
1354
+ THROW (IEX_NAMESPACE::ArgExc, "X and/or y subsampling factors "
1355
+ "of \"" << i.name() << "\" channel "
1356
+ "of input file \"" << fileName() << "\" are "
1357
+ "not compatible with the frame buffer's "
1358
+ "subsampling factors.");
1359
+ }
1360
+
1361
+ // optimization is possible if this is a little endian system
1362
+ // and both inputs and outputs are half floats
1363
+ //
1364
+ bool optimizationPossible = true;
1365
+
1366
+ if (!GLOBAL_SYSTEM_LITTLE_ENDIAN)
1367
+ {
1368
+ optimizationPossible =false;
1369
+ }
1370
+
1371
+ vector<sliceOptimizationData> optData;
1372
+
1373
+
1374
+ //
1375
+ // Initialize the slice table for readPixels().
1376
+ //
1377
+
1378
+ vector<InSliceInfo> slices;
1379
+ ChannelList::ConstIterator i = channels.begin();
1380
+
1381
+ // current offset of channel: pixel data starts at offset*width into the
1382
+ // decompressed scanline buffer
1383
+ size_t offset = 0;
1384
+
1385
+ for (FrameBuffer::ConstIterator j = frameBuffer.begin();
1386
+ j != frameBuffer.end();
1387
+ ++j)
1388
+ {
1389
+ while (i != channels.end() && strcmp (i.name(), j.name()) < 0)
1390
+ {
1391
+ //
1392
+ // Channel i is present in the file but not
1393
+ // in the frame buffer; data for channel i
1394
+ // will be skipped during readPixels().
1395
+ //
1396
+
1397
+ slices.push_back (InSliceInfo (i.channel().type,
1398
+ i.channel().type,
1399
+ 0, // base
1400
+ 0, // xStride
1401
+ 0, // yStride
1402
+ i.channel().xSampling,
1403
+ i.channel().ySampling,
1404
+ false, // fill
1405
+ true, // skip
1406
+ 0.0)); // fillValue
1407
+
1408
+ switch(i.channel().type)
1409
+ {
1410
+ case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF :
1411
+ offset++;
1412
+ break;
1413
+ case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT :
1414
+ offset+=2;
1415
+ break;
1416
+ case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT :
1417
+ offset+=2;
1418
+ break;
1419
+ }
1420
+ ++i;
1421
+ }
1422
+
1423
+ bool fill = false;
1424
+
1425
+ if (i == channels.end() || strcmp (i.name(), j.name()) > 0)
1426
+ {
1427
+ //
1428
+ // Channel i is present in the frame buffer, but not in the file.
1429
+ // In the frame buffer, slice j will be filled with a default value.
1430
+ //
1431
+
1432
+ fill = true;
1433
+ }
1434
+
1435
+ slices.push_back (InSliceInfo (j.slice().type,
1436
+ fill? j.slice().type:
1437
+ i.channel().type,
1438
+ j.slice().base,
1439
+ j.slice().xStride,
1440
+ j.slice().yStride,
1441
+ j.slice().xSampling,
1442
+ j.slice().ySampling,
1443
+ fill,
1444
+ false, // skip
1445
+ j.slice().fillValue));
1446
+
1447
+ if(!fill && i.channel().type!=OPENEXR_IMF_INTERNAL_NAMESPACE::HALF)
1448
+ {
1449
+ optimizationPossible = false;
1450
+ }
1451
+
1452
+ if(j.slice().type != OPENEXR_IMF_INTERNAL_NAMESPACE::HALF)
1453
+ {
1454
+ optimizationPossible = false;
1455
+ }
1456
+ if(j.slice().xSampling!=1 || j.slice().ySampling!=1)
1457
+ {
1458
+ optimizationPossible = false;
1459
+ }
1460
+
1461
+
1462
+ if(optimizationPossible)
1463
+ {
1464
+ sliceOptimizationData dat;
1465
+ dat.base = j.slice().base;
1466
+ dat.fill = fill;
1467
+ dat.fillValue = j.slice().fillValue;
1468
+ dat.offset = offset;
1469
+ dat.xStride = j.slice().xStride;
1470
+ dat.yStride = j.slice().yStride;
1471
+ dat.xSampling = j.slice().xSampling;
1472
+ dat.ySampling = j.slice().ySampling;
1473
+ optData.push_back(dat);
1474
+ }
1475
+
1476
+ if(!fill)
1477
+ {
1478
+ switch(i.channel().type)
1479
+ {
1480
+ case OPENEXR_IMF_INTERNAL_NAMESPACE::HALF :
1481
+ offset++;
1482
+ break;
1483
+ case OPENEXR_IMF_INTERNAL_NAMESPACE::FLOAT :
1484
+ offset+=2;
1485
+ break;
1486
+ case OPENEXR_IMF_INTERNAL_NAMESPACE::UINT :
1487
+ offset+=2;
1488
+ break;
1489
+ }
1490
+ }
1491
+
1492
+
1493
+
1494
+ if (i != channels.end() && !fill)
1495
+ ++i;
1496
+ }
1497
+
1498
+
1499
+ if(optimizationPossible)
1500
+ {
1501
+ //
1502
+ // check optimisibility
1503
+ // based on channel ordering and fill channel positions
1504
+ //
1505
+ sort(optData.begin(),optData.end());
1506
+ _data->optimizationMode = detectOptimizationMode(optData);
1507
+ }
1508
+
1509
+ if(!optimizationPossible || _data->optimizationMode._optimizable==false)
1510
+ {
1511
+ optData = vector<sliceOptimizationData>();
1512
+ _data->optimizationMode._optimizable=false;
1513
+ }
1514
+
1515
+ //
1516
+ // Store the new frame buffer.
1517
+ //
1518
+
1519
+ _data->frameBuffer = frameBuffer;
1520
+ _data->slices = slices;
1521
+ _data->optimizationData = optData;
1522
+ }
1523
+
1524
+
1525
+ const FrameBuffer &
1526
+ ScanLineInputFile::frameBuffer () const
1527
+ {
1528
+ Lock lock (*_streamData);
1529
+ return _data->frameBuffer;
1530
+ }
1531
+
1532
+
1533
+ bool
1534
+ ScanLineInputFile::isComplete () const
1535
+ {
1536
+ return _data->fileIsComplete;
1537
+ }
1538
+
1539
+ bool ScanLineInputFile::isOptimizationEnabled() const
1540
+ {
1541
+ if (_data->slices.size() == 0)
1542
+ throw IEX_NAMESPACE::ArgExc ("No frame buffer specified "
1543
+ "as pixel data destination.");
1544
+
1545
+ return _data->optimizationMode._optimizable;
1546
+ }
1547
+
1548
+
1549
+ void
1550
+ ScanLineInputFile::readPixels (int scanLine1, int scanLine2)
1551
+ {
1552
+ try
1553
+ {
1554
+ Lock lock (*_streamData);
1555
+
1556
+ if (_data->slices.size() == 0)
1557
+ throw IEX_NAMESPACE::ArgExc ("No frame buffer specified "
1558
+ "as pixel data destination.");
1559
+
1560
+ int scanLineMin = min (scanLine1, scanLine2);
1561
+ int scanLineMax = max (scanLine1, scanLine2);
1562
+
1563
+ if (scanLineMin < _data->minY || scanLineMax > _data->maxY)
1564
+ throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside "
1565
+ "the image file's data window.");
1566
+
1567
+ //
1568
+ // We impose a numbering scheme on the lineBuffers where the first
1569
+ // scanline is contained in lineBuffer 1.
1570
+ //
1571
+ // Determine the first and last lineBuffer numbers in this scanline
1572
+ // range. We always attempt to read the scanlines in the order that
1573
+ // they are stored in the file.
1574
+ //
1575
+
1576
+ int start, stop, dl;
1577
+
1578
+ if (_data->lineOrder == INCREASING_Y)
1579
+ {
1580
+ start = (scanLineMin - _data->minY) / _data->linesInBuffer;
1581
+ stop = (scanLineMax - _data->minY) / _data->linesInBuffer + 1;
1582
+ dl = 1;
1583
+ }
1584
+ else
1585
+ {
1586
+ start = (scanLineMax - _data->minY) / _data->linesInBuffer;
1587
+ stop = (scanLineMin - _data->minY) / _data->linesInBuffer - 1;
1588
+ dl = -1;
1589
+ }
1590
+
1591
+ //
1592
+ // Create a task group for all line buffer tasks. When the
1593
+ // task group goes out of scope, the destructor waits until
1594
+ // all tasks are complete.
1595
+ //
1596
+
1597
+ {
1598
+ TaskGroup taskGroup;
1599
+
1600
+ //
1601
+ // Add the line buffer tasks.
1602
+ //
1603
+ // The tasks will execute in the order that they are created
1604
+ // because we lock the line buffers during construction and the
1605
+ // constructors are called by the main thread. Hence, in order
1606
+ // for a successive task to execute the previous task which
1607
+ // used that line buffer must have completed already.
1608
+ //
1609
+
1610
+ for (int l = start; l != stop; l += dl)
1611
+ {
1612
+ ThreadPool::addGlobalTask (newLineBufferTask (&taskGroup,
1613
+ _streamData,
1614
+ _data, l,
1615
+ scanLineMin,
1616
+ scanLineMax,
1617
+ _data->optimizationMode));
1618
+ }
1619
+
1620
+ //
1621
+ // finish all tasks
1622
+ //
1623
+ }
1624
+
1625
+ //
1626
+ // Exeption handling:
1627
+ //
1628
+ // LineBufferTask::execute() may have encountered exceptions, but
1629
+ // those exceptions occurred in another thread, not in the thread
1630
+ // that is executing this call to ScanLineInputFile::readPixels().
1631
+ // LineBufferTask::execute() has caught all exceptions and stored
1632
+ // the exceptions' what() strings in the line buffers.
1633
+ // Now we check if any line buffer contains a stored exception; if
1634
+ // this is the case then we re-throw the exception in this thread.
1635
+ // (It is possible that multiple line buffers contain stored
1636
+ // exceptions. We re-throw the first exception we find and
1637
+ // ignore all others.)
1638
+ //
1639
+
1640
+ const string *exception = 0;
1641
+
1642
+ for (size_t i = 0; i < _data->lineBuffers.size(); ++i)
1643
+ {
1644
+ LineBuffer *lineBuffer = _data->lineBuffers[i];
1645
+
1646
+ if (lineBuffer->hasException && !exception)
1647
+ exception = &lineBuffer->exception;
1648
+
1649
+ lineBuffer->hasException = false;
1650
+ }
1651
+
1652
+ if (exception)
1653
+ throw IEX_NAMESPACE::IoExc (*exception);
1654
+ }
1655
+ catch (IEX_NAMESPACE::BaseExc &e)
1656
+ {
1657
+ REPLACE_EXC (e, "Error reading pixel data from image "
1658
+ "file \"" << fileName() << "\". " << e);
1659
+ throw;
1660
+ }
1661
+ }
1662
+
1663
+
1664
+ void
1665
+ ScanLineInputFile::readPixels (int scanLine)
1666
+ {
1667
+ readPixels (scanLine, scanLine);
1668
+ }
1669
+
1670
+
1671
+ void
1672
+ ScanLineInputFile::rawPixelData (int firstScanLine,
1673
+ const char *&pixelData,
1674
+ int &pixelDataSize)
1675
+ {
1676
+ try
1677
+ {
1678
+ Lock lock (*_streamData);
1679
+
1680
+ if (firstScanLine < _data->minY || firstScanLine > _data->maxY)
1681
+ {
1682
+ throw IEX_NAMESPACE::ArgExc ("Tried to read scan line outside "
1683
+ "the image file's data window.");
1684
+ }
1685
+
1686
+ int minY = lineBufferMinY
1687
+ (firstScanLine, _data->minY, _data->linesInBuffer);
1688
+
1689
+ readPixelData
1690
+ (_streamData, _data, minY, _data->lineBuffers[0]->buffer, pixelDataSize);
1691
+
1692
+ pixelData = _data->lineBuffers[0]->buffer;
1693
+ }
1694
+ catch (IEX_NAMESPACE::BaseExc &e)
1695
+ {
1696
+ REPLACE_EXC (e, "Error reading pixel data from image "
1697
+ "file \"" << fileName() << "\". " << e);
1698
+ throw;
1699
+ }
1700
+ }
1701
+
1702
+ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT