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,2055 @@
1
+ ///////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // Copyright (c) 2011, Industrial Light & Magic, a division of Lucas
4
+ // Digital Ltd. LLC
5
+ //
6
+ // All rights reserved.
7
+ //
8
+ // Redistribution and use in source and binary forms, with or without
9
+ // modification, are permitted provided that the following conditions are
10
+ // met:
11
+ // * Redistributions of source code must retain the above copyright
12
+ // notice, this list of conditions and the following disclaimer.
13
+ // * Redistributions in binary form must reproduce the above
14
+ // copyright notice, this list of conditions and the following disclaimer
15
+ // in the documentation and/or other materials provided with the
16
+ // distribution.
17
+ // * Neither the name of Industrial Light & Magic nor the names of
18
+ // its contributors may be used to endorse or promote products derived
19
+ // from this software without specific prior written permission.
20
+ //
21
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ //
33
+ ///////////////////////////////////////////////////////////////////////////
34
+
35
+ //-----------------------------------------------------------------------------
36
+ //
37
+ // class DeepTiledOutputFile
38
+ //
39
+ //-----------------------------------------------------------------------------
40
+
41
+ #include "ImfDeepTiledOutputFile.h"
42
+ #include "ImfDeepTiledInputFile.h"
43
+ #include "ImfDeepTiledInputPart.h"
44
+ #include "ImfInputFile.h"
45
+ #include "ImfTileDescriptionAttribute.h"
46
+ #include "ImfPreviewImageAttribute.h"
47
+ #include "ImfChannelList.h"
48
+ #include "ImfMisc.h"
49
+ #include "ImfTiledMisc.h"
50
+ #include "ImfStdIO.h"
51
+ #include "ImfCompressor.h"
52
+ #include "ImfOutputStreamMutex.h"
53
+ #include "ImfOutputPartData.h"
54
+ #include "ImfArray.h"
55
+ #include "ImfXdr.h"
56
+ #include "ImfVersion.h"
57
+ #include "ImfTileOffsets.h"
58
+ #include "ImfThreading.h"
59
+ #include "ImfPartType.h"
60
+
61
+ #include "ImathBox.h"
62
+
63
+ #include "IlmThreadPool.h"
64
+ #include "IlmThreadSemaphore.h"
65
+ #include "IlmThreadMutex.h"
66
+
67
+ #include "Iex.h"
68
+
69
+ #include <string>
70
+ #include <vector>
71
+ #include <fstream>
72
+ #include <assert.h>
73
+ #include <map>
74
+ #include <algorithm>
75
+
76
+ #include "ImfNamespace.h"
77
+
78
+ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
79
+
80
+ using IMATH_NAMESPACE::Box2i;
81
+ using IMATH_NAMESPACE::V2i;
82
+ using std::string;
83
+ using std::vector;
84
+ using std::ofstream;
85
+ using std::map;
86
+ using std::min;
87
+ using std::max;
88
+ using std::swap;
89
+ using ILMTHREAD_NAMESPACE::Mutex;
90
+ using ILMTHREAD_NAMESPACE::Lock;
91
+ using ILMTHREAD_NAMESPACE::Semaphore;
92
+ using ILMTHREAD_NAMESPACE::Task;
93
+ using ILMTHREAD_NAMESPACE::TaskGroup;
94
+ using ILMTHREAD_NAMESPACE::ThreadPool;
95
+
96
+ namespace {
97
+
98
+ struct TOutSliceInfo
99
+ {
100
+ PixelType type;
101
+ const char * base;
102
+ size_t sampleStride;
103
+ size_t xStride;
104
+ size_t yStride;
105
+ bool zero;
106
+ int xTileCoords;
107
+ int yTileCoords;
108
+
109
+ TOutSliceInfo (PixelType type = HALF,
110
+ size_t sampleStride = 0,
111
+ size_t xStride = 0,
112
+ size_t yStride = 0,
113
+ bool zero = false,
114
+ int xTileCoords = 0,
115
+ int yTileCoords = 0);
116
+ };
117
+
118
+
119
+ TOutSliceInfo::TOutSliceInfo (PixelType t,
120
+ size_t spst,
121
+ size_t xStride,
122
+ size_t yStride,
123
+ bool z,
124
+ int xtc,
125
+ int ytc)
126
+ :
127
+ type (t),
128
+ sampleStride (spst),
129
+ xStride(xStride),
130
+ yStride(yStride),
131
+ zero (z),
132
+ xTileCoords (xtc),
133
+ yTileCoords (ytc)
134
+ {
135
+ // empty
136
+ }
137
+
138
+
139
+ struct TileCoord
140
+ {
141
+ int dx;
142
+ int dy;
143
+ int lx;
144
+ int ly;
145
+
146
+
147
+ TileCoord (int xTile = 0, int yTile = 0,
148
+ int xLevel = 0, int yLevel = 0)
149
+ :
150
+ dx (xTile), dy (yTile),
151
+ lx (xLevel), ly (yLevel)
152
+ {
153
+ // empty
154
+ }
155
+
156
+
157
+ bool
158
+ operator < (const TileCoord &other) const
159
+ {
160
+ return (ly < other.ly) ||
161
+ (ly == other.ly && lx < other.lx) ||
162
+ ((ly == other.ly && lx == other.lx) &&
163
+ ((dy < other.dy) || (dy == other.dy && dx < other.dx)));
164
+ }
165
+
166
+
167
+ bool
168
+ operator == (const TileCoord &other) const
169
+ {
170
+ return lx == other.lx &&
171
+ ly == other.ly &&
172
+ dx == other.dx &&
173
+ dy == other.dy;
174
+ }
175
+ };
176
+
177
+
178
+ struct BufferedTile
179
+ {
180
+ char * pixelData;
181
+ Int64 pixelDataSize;
182
+ Int64 unpackedDataSize;
183
+ char * sampleCountTableData;
184
+ Int64 sampleCountTableSize;
185
+
186
+ BufferedTile (const char *data, int size, int unpackedSize,
187
+ const char *tableData, int tableSize):
188
+ pixelData (0),
189
+ pixelDataSize(size),
190
+ unpackedDataSize(unpackedSize),
191
+ sampleCountTableData(0),
192
+ sampleCountTableSize(tableSize)
193
+ {
194
+ pixelData = new char[pixelDataSize];
195
+ memcpy (pixelData, data, pixelDataSize);
196
+
197
+ sampleCountTableData = new char[tableSize];
198
+ memcpy (sampleCountTableData, tableData, tableSize);
199
+ }
200
+
201
+ ~BufferedTile()
202
+ {
203
+ delete [] pixelData;
204
+ delete [] sampleCountTableData;
205
+ }
206
+ };
207
+
208
+
209
+ typedef map <TileCoord, BufferedTile *> TileMap;
210
+
211
+
212
+ struct TileBuffer
213
+ {
214
+ Array<char> buffer;
215
+ const char * dataPtr;
216
+ Int64 dataSize;
217
+ Int64 uncompressedSize;
218
+ Compressor * compressor;
219
+ Array<char> sampleCountTableBuffer;
220
+ const char * sampleCountTablePtr;
221
+ Int64 sampleCountTableSize;
222
+ Compressor* sampleCountTableCompressor;
223
+ TileCoord tileCoord;
224
+ bool hasException;
225
+ string exception;
226
+
227
+ TileBuffer ();
228
+ ~TileBuffer ();
229
+
230
+ inline void wait () {_sem.wait();}
231
+ inline void post () {_sem.post();}
232
+
233
+ protected:
234
+
235
+ Semaphore _sem;
236
+ };
237
+
238
+
239
+ TileBuffer::TileBuffer ():
240
+ dataPtr (0),
241
+ dataSize (0),
242
+ compressor (0),
243
+ sampleCountTablePtr (0),
244
+ sampleCountTableCompressor (0),
245
+ hasException (false),
246
+ exception (),
247
+ _sem (1)
248
+ {
249
+ // empty
250
+ }
251
+
252
+
253
+ TileBuffer::~TileBuffer ()
254
+ {
255
+ if (compressor != 0)
256
+ delete compressor;
257
+
258
+ if (sampleCountTableCompressor != 0)
259
+ delete sampleCountTableCompressor;
260
+ }
261
+
262
+
263
+ } // namespace
264
+
265
+
266
+ struct DeepTiledOutputFile::Data
267
+ {
268
+ Header header; // the image header
269
+ int version; // file format version
270
+ bool multipart; // file is multipart
271
+ TileDescription tileDesc; // describes the tile layout
272
+ DeepFrameBuffer frameBuffer; // framebuffer to write into
273
+ Int64 previewPosition;
274
+ LineOrder lineOrder; // the file's lineorder
275
+ int minX; // data window's min x coord
276
+ int maxX; // data window's max x coord
277
+ int minY; // data window's min y coord
278
+ int maxY; // data window's max x coord
279
+
280
+ int numXLevels; // number of x levels
281
+ int numYLevels; // number of y levels
282
+ int * numXTiles; // number of x tiles at a level
283
+ int * numYTiles; // number of y tiles at a level
284
+
285
+ TileOffsets tileOffsets; // stores offsets in file for
286
+ // each tile
287
+
288
+ Compressor::Format format; // compressor's data format
289
+ vector<TOutSliceInfo*> slices; // info about channels in file
290
+
291
+ vector<TileBuffer*> tileBuffers;
292
+
293
+ Int64 tileOffsetsPosition; // position of the tile index
294
+
295
+ TileMap tileMap; // the map of buffered tiles
296
+ TileCoord nextTileToWrite;
297
+
298
+ int partNumber; // the output part number
299
+
300
+ char* sampleCountSliceBase; // the pointer to the number
301
+ // of samples in each pixel
302
+ int sampleCountXStride; // the x stride for sampleCountSliceBase
303
+ int sampleCountYStride; // the y stride for sampleCountSliceBase
304
+ int sampleCountXTileCoords; // using x coordinates relative to current tile
305
+ int sampleCountYTileCoords; // using y coordinates relative to current tile
306
+
307
+ Int64 maxSampleCountTableSize;// the max size in bytes for a pixel
308
+ // sample count table
309
+ OutputStreamMutex* _streamData;
310
+ bool _deleteStream;
311
+
312
+ Data (int numThreads);
313
+ ~Data ();
314
+
315
+ inline TileBuffer * getTileBuffer (int number);
316
+ // hash function from tile
317
+ // buffer coords into our
318
+ // vector of tile buffers
319
+
320
+ int& getSampleCount(int x, int y);
321
+ // get the number of samples
322
+ // in each pixel
323
+
324
+ TileCoord nextTileCoord (const TileCoord &a);
325
+ };
326
+
327
+
328
+ DeepTiledOutputFile::Data::Data (int numThreads):
329
+ numXTiles(0),
330
+ numYTiles(0),
331
+ tileOffsetsPosition (0),
332
+ partNumber(-1),
333
+ _streamData(NULL),
334
+ _deleteStream(true)
335
+ {
336
+ //
337
+ // We need at least one tileBuffer, but if threading is used,
338
+ // to keep n threads busy we need 2*n tileBuffers
339
+ //
340
+
341
+ tileBuffers.resize (max (1, 2 * numThreads));
342
+ for (size_t i = 0; i < tileBuffers.size(); i++)
343
+ tileBuffers[i] = 0;
344
+ }
345
+
346
+
347
+ DeepTiledOutputFile::Data::~Data ()
348
+ {
349
+ delete [] numXTiles;
350
+ delete [] numYTiles;
351
+
352
+ //
353
+ // Delete all the tile buffers, if any still happen to exist
354
+ //
355
+
356
+ for (TileMap::iterator i = tileMap.begin(); i != tileMap.end(); ++i)
357
+ delete i->second;
358
+
359
+ for (size_t i = 0; i < tileBuffers.size(); i++)
360
+ if (tileBuffers[i] != 0)
361
+ delete tileBuffers[i];
362
+
363
+ for (size_t i = 0; i < slices.size(); i++)
364
+ delete slices[i];
365
+ }
366
+
367
+
368
+ int&
369
+ DeepTiledOutputFile::Data::getSampleCount(int x, int y)
370
+ {
371
+ return sampleCount(sampleCountSliceBase,
372
+ sampleCountXStride,
373
+ sampleCountYStride,
374
+ x, y);
375
+ }
376
+
377
+
378
+ TileBuffer*
379
+ DeepTiledOutputFile::Data::getTileBuffer (int number)
380
+ {
381
+ return tileBuffers[number % tileBuffers.size()];
382
+ }
383
+
384
+
385
+ TileCoord
386
+ DeepTiledOutputFile::Data::nextTileCoord (const TileCoord &a)
387
+ {
388
+ TileCoord b = a;
389
+
390
+ if (lineOrder == INCREASING_Y)
391
+ {
392
+ b.dx++;
393
+
394
+ if (b.dx >= numXTiles[b.lx])
395
+ {
396
+ b.dx = 0;
397
+ b.dy++;
398
+
399
+ if (b.dy >= numYTiles[b.ly])
400
+ {
401
+ //
402
+ // the next tile is in the next level
403
+ //
404
+
405
+ b.dy = 0;
406
+
407
+ switch (tileDesc.mode)
408
+ {
409
+ case ONE_LEVEL:
410
+ case MIPMAP_LEVELS:
411
+
412
+ b.lx++;
413
+ b.ly++;
414
+ break;
415
+
416
+ case RIPMAP_LEVELS:
417
+
418
+ b.lx++;
419
+
420
+ if (b.lx >= numXLevels)
421
+ {
422
+ b.lx = 0;
423
+ b.ly++;
424
+
425
+ #ifdef DEBUG
426
+ assert (b.ly <= numYLevels);
427
+ #endif
428
+ }
429
+ break;
430
+ case NUM_LEVELMODES :
431
+ throw IEX_NAMESPACE::LogicExc("unknown level mode computing nextTileCoord");
432
+ }
433
+ }
434
+ }
435
+ }
436
+ else if (lineOrder == DECREASING_Y)
437
+ {
438
+ b.dx++;
439
+
440
+ if (b.dx >= numXTiles[b.lx])
441
+ {
442
+ b.dx = 0;
443
+ b.dy--;
444
+
445
+ if (b.dy < 0)
446
+ {
447
+ //
448
+ // the next tile is in the next level
449
+ //
450
+
451
+ switch (tileDesc.mode)
452
+ {
453
+ case ONE_LEVEL:
454
+ case MIPMAP_LEVELS:
455
+
456
+ b.lx++;
457
+ b.ly++;
458
+ break;
459
+
460
+ case RIPMAP_LEVELS:
461
+
462
+ b.lx++;
463
+
464
+ if (b.lx >= numXLevels)
465
+ {
466
+ b.lx = 0;
467
+ b.ly++;
468
+
469
+ #ifdef DEBUG
470
+ assert (b.ly <= numYLevels);
471
+ #endif
472
+ }
473
+ break;
474
+ case NUM_LEVELMODES :
475
+ throw IEX_NAMESPACE::LogicExc("unknown level mode computing nextTileCoord");
476
+ }
477
+
478
+ if (b.ly < numYLevels)
479
+ b.dy = numYTiles[b.ly] - 1;
480
+ }
481
+ }
482
+ }else if(lineOrder==RANDOM_Y)
483
+ {
484
+ THROW (IEX_NAMESPACE::ArgExc,
485
+ "can't compute next tile from randomly ordered image: use getTilesInOrder instead");
486
+
487
+ }
488
+
489
+ return b;
490
+ }
491
+
492
+
493
+ namespace {
494
+
495
+ void
496
+ writeTileData (DeepTiledOutputFile::Data *ofd,
497
+ int dx, int dy,
498
+ int lx, int ly,
499
+ const char pixelData[],
500
+ Int64 pixelDataSize,
501
+ Int64 unpackedDataSize,
502
+ const char sampleCountTableData[],
503
+ Int64 sampleCountTableSize)
504
+ {
505
+
506
+ //
507
+ // Store a block of pixel data in the output file, and try
508
+ // to keep track of the current writing position the file,
509
+ // without calling tellp() (tellp() can be fairly expensive).
510
+ //
511
+
512
+ Int64 currentPosition = ofd->_streamData->currentPosition;
513
+ ofd->_streamData->currentPosition = 0;
514
+
515
+ if (currentPosition == 0)
516
+ currentPosition = ofd->_streamData->os->tellp();
517
+
518
+ ofd->tileOffsets (dx, dy, lx, ly) = currentPosition;
519
+
520
+ #ifdef DEBUG
521
+ assert (ofd->_streamData->os->tellp() == currentPosition);
522
+ #endif
523
+
524
+ //
525
+ // Write the tile header.
526
+ //
527
+
528
+ if (ofd->multipart)
529
+ {
530
+ Xdr::write <StreamIO> (*ofd->_streamData->os, ofd->partNumber);
531
+ }
532
+ Xdr::write <StreamIO> (*ofd->_streamData->os, dx);
533
+ Xdr::write <StreamIO> (*ofd->_streamData->os, dy);
534
+ Xdr::write <StreamIO> (*ofd->_streamData->os, lx);
535
+ Xdr::write <StreamIO> (*ofd->_streamData->os, ly);
536
+
537
+ //
538
+ // Write the packed size of the pixel sample count table (64 bits)
539
+ //
540
+
541
+ Xdr::write <StreamIO> (*ofd->_streamData->os, sampleCountTableSize);
542
+
543
+ //
544
+ // Write the packed and unpacked data size (64 bits each)
545
+ //
546
+
547
+ Xdr::write <StreamIO> (*ofd->_streamData->os, pixelDataSize);
548
+ Xdr::write <StreamIO> (*ofd->_streamData->os, unpackedDataSize);
549
+
550
+ //
551
+ // Write the compressed pixel sample count table.
552
+ //
553
+
554
+ ofd->_streamData->os->write (sampleCountTableData, sampleCountTableSize);
555
+
556
+ //
557
+ // Write the compressed data.
558
+ //
559
+
560
+ ofd->_streamData->os->write (pixelData, pixelDataSize);
561
+
562
+ //
563
+ // Keep current position in the file so that we can avoid
564
+ // redundant seekg() operations (seekg() can be fairly expensive).
565
+ //
566
+
567
+ ofd->_streamData->currentPosition = currentPosition +
568
+ 4 * Xdr::size<int>() + // dx, dy, lx, ly,
569
+ 3 * Xdr::size<Int64>() + // sampleCountTableSize,
570
+ // pixelDataSize,
571
+ // unpackedDataSize
572
+ sampleCountTableSize +
573
+ pixelDataSize;
574
+
575
+ if (ofd->multipart)
576
+ {
577
+ ofd->_streamData->currentPosition += Xdr::size<int>();
578
+ }
579
+ }
580
+
581
+
582
+
583
+ void
584
+ bufferedTileWrite (
585
+ DeepTiledOutputFile::Data *ofd,
586
+ int dx, int dy,
587
+ int lx, int ly,
588
+ const char pixelData[],
589
+ Int64 pixelDataSize,
590
+ Int64 unpackedDataSize,
591
+ const char sampleCountTableData[],
592
+ Int64 sampleCountTableSize)
593
+ {
594
+ //
595
+ // Check if a tile with coordinates (dx,dy,lx,ly) has already been written.
596
+ //
597
+
598
+ if (ofd->tileOffsets (dx, dy, lx, ly))
599
+ {
600
+ THROW (IEX_NAMESPACE::ArgExc,
601
+ "Attempt to write tile "
602
+ "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") "
603
+ "more than once.");
604
+ }
605
+
606
+ //
607
+ // If tiles can be written in random order, then don't buffer anything.
608
+ //
609
+
610
+ if (ofd->lineOrder == RANDOM_Y)
611
+ {
612
+ writeTileData (ofd, dx, dy, lx, ly,
613
+ pixelData, pixelDataSize, unpackedDataSize,
614
+ sampleCountTableData, sampleCountTableSize);
615
+ return;
616
+ }
617
+
618
+ //
619
+ // If the tiles cannot be written in random order, then check if a
620
+ // tile with coordinates (dx,dy,lx,ly) has already been buffered.
621
+ //
622
+
623
+ TileCoord currentTile = TileCoord(dx, dy, lx, ly);
624
+
625
+ if (ofd->tileMap.find (currentTile) != ofd->tileMap.end())
626
+ {
627
+ THROW (IEX_NAMESPACE::ArgExc,
628
+ "Attempt to write tile "
629
+ "(" << dx << ", " << dy << ", " << lx << ", " << ly << ") "
630
+ "more than once.");
631
+ }
632
+
633
+ //
634
+ // If all the tiles before this one have already been written to the file,
635
+ // then write this tile immediately and check if we have buffered tiles
636
+ // that can be written after this tile.
637
+ //
638
+ // Otherwise, buffer the tile so it can be written to file later.
639
+ //
640
+
641
+ if (ofd->nextTileToWrite == currentTile)
642
+ {
643
+ writeTileData (ofd, dx, dy, lx, ly,
644
+ pixelData, pixelDataSize, unpackedDataSize,
645
+ sampleCountTableData, sampleCountTableSize);
646
+ ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite);
647
+
648
+ TileMap::iterator i = ofd->tileMap.find (ofd->nextTileToWrite);
649
+
650
+ //
651
+ // Step through the tiles and write all successive buffered tiles after
652
+ // the current one.
653
+ //
654
+
655
+ while(i != ofd->tileMap.end())
656
+ {
657
+ //
658
+ // Write the tile, and then delete the tile's buffered data
659
+ //
660
+
661
+ writeTileData (ofd,
662
+ i->first.dx, i->first.dy,
663
+ i->first.lx, i->first.ly,
664
+ i->second->pixelData,
665
+ i->second->pixelDataSize,
666
+ i->second->unpackedDataSize,
667
+ i->second->sampleCountTableData,
668
+ i->second->sampleCountTableSize);
669
+
670
+ delete i->second;
671
+ ofd->tileMap.erase (i);
672
+
673
+ //
674
+ // Proceed to the next tile
675
+ //
676
+
677
+ ofd->nextTileToWrite = ofd->nextTileCoord (ofd->nextTileToWrite);
678
+ i = ofd->tileMap.find (ofd->nextTileToWrite);
679
+ }
680
+ }
681
+ else
682
+ {
683
+ //
684
+ // Create a new BufferedTile, copy the pixelData into it, and
685
+ // insert it into the tileMap.
686
+ //
687
+
688
+ ofd->tileMap[currentTile] =
689
+ new BufferedTile ((const char *)pixelData, pixelDataSize, unpackedDataSize,
690
+ sampleCountTableData, sampleCountTableSize);
691
+ }
692
+ }
693
+
694
+
695
+ void
696
+ convertToXdr (DeepTiledOutputFile::Data *ofd,
697
+ Array<char>& tileBuffer,
698
+ int numScanLines,
699
+ vector<Int64>& bytesPerLine)
700
+ {
701
+ //
702
+ // Convert the contents of a TiledOutputFile's tileBuffer from the
703
+ // machine's native representation to Xdr format. This function is called
704
+ // by writeTile(), below, if the compressor wanted its input pixel data
705
+ // in the machine's native format, but then failed to compress the data
706
+ // (most compressors will expand rather than compress random input data).
707
+ //
708
+ // Note that this routine assumes that the machine's native representation
709
+ // of the pixel data has the same size as the Xdr representation. This
710
+ // makes it possible to convert the pixel data in place, without an
711
+ // intermediate temporary buffer.
712
+ //
713
+
714
+ //
715
+ // Set these to point to the start of the tile.
716
+ // We will write to toPtr, and read from fromPtr.
717
+ //
718
+
719
+ char *writePtr = tileBuffer;
720
+ const char *readPtr = writePtr;
721
+
722
+ //
723
+ // Iterate over all scan lines in the tile.
724
+ //
725
+
726
+ for (int y = 0; y < numScanLines; ++y)
727
+ {
728
+ //
729
+ // Iterate over all slices in the file.
730
+ //
731
+
732
+ for (unsigned int i = 0; i < ofd->slices.size(); ++i)
733
+ {
734
+ const TOutSliceInfo &slice = *ofd->slices[i];
735
+
736
+ //
737
+ // Convert the samples in place.
738
+ //
739
+
740
+ Int64 numPixelsPerScanLine = bytesPerLine[y];
741
+
742
+ convertInPlace (writePtr, readPtr, slice.type,
743
+ numPixelsPerScanLine);
744
+ }
745
+ }
746
+
747
+ #ifdef DEBUG
748
+
749
+ assert (writePtr == readPtr);
750
+
751
+ #endif
752
+ }
753
+
754
+
755
+ //
756
+ // A TileBufferTask encapsulates the task of copying a tile from
757
+ // the user's framebuffer into a LineBuffer and compressing the data
758
+ // if necessary.
759
+ //
760
+
761
+ class TileBufferTask: public Task
762
+ {
763
+ public:
764
+
765
+ TileBufferTask (TaskGroup *group,
766
+ DeepTiledOutputFile::Data *ofd,
767
+ int number,
768
+ int dx, int dy,
769
+ int lx, int ly);
770
+
771
+ virtual ~TileBufferTask ();
772
+
773
+ virtual void execute ();
774
+
775
+ private:
776
+
777
+ DeepTiledOutputFile::Data * _ofd;
778
+ TileBuffer * _tileBuffer;
779
+ };
780
+
781
+
782
+ TileBufferTask::TileBufferTask
783
+ (TaskGroup *group,
784
+ DeepTiledOutputFile::Data *ofd,
785
+ int number,
786
+ int dx, int dy,
787
+ int lx, int ly)
788
+ :
789
+ Task (group),
790
+ _ofd (ofd),
791
+ _tileBuffer (_ofd->getTileBuffer (number))
792
+ {
793
+ //
794
+ // Wait for the tileBuffer to become available
795
+ //
796
+
797
+ _tileBuffer->wait ();
798
+ _tileBuffer->tileCoord = TileCoord (dx, dy, lx, ly);
799
+ }
800
+
801
+
802
+ TileBufferTask::~TileBufferTask ()
803
+ {
804
+ //
805
+ // Signal that the tile buffer is now free
806
+ //
807
+
808
+ _tileBuffer->post ();
809
+ }
810
+
811
+
812
+ void
813
+ TileBufferTask::execute ()
814
+ {
815
+ try
816
+ {
817
+ //
818
+ // First copy the pixel data from the frame buffer
819
+ // into the tile buffer
820
+ //
821
+ // Convert one tile's worth of pixel data to
822
+ // a machine-independent representation, and store
823
+ // the result in _tileBuffer->buffer.
824
+ //
825
+
826
+ Box2i tileRange = OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile (
827
+ _ofd->tileDesc,
828
+ _ofd->minX, _ofd->maxX,
829
+ _ofd->minY, _ofd->maxY,
830
+ _tileBuffer->tileCoord.dx,
831
+ _tileBuffer->tileCoord.dy,
832
+ _tileBuffer->tileCoord.lx,
833
+ _tileBuffer->tileCoord.ly);
834
+
835
+ int numScanLines = tileRange.max.y - tileRange.min.y + 1;
836
+ // int numPixelsPerScanLine = tileRange.max.x - tileRange.min.x + 1;
837
+
838
+ //
839
+ // Get the bytes for each line.
840
+ //
841
+
842
+ vector<Int64> bytesPerLine(_ofd->tileDesc.ySize);
843
+ vector<int> xOffsets(_ofd->slices.size());
844
+ vector<int> yOffsets(_ofd->slices.size());
845
+ for (size_t i = 0; i < _ofd->slices.size(); i++)
846
+ {
847
+ const TOutSliceInfo &slice = *_ofd->slices[i];
848
+ xOffsets[i] = slice.xTileCoords * tileRange.min.x;
849
+ yOffsets[i] = slice.yTileCoords * tileRange.min.y;
850
+ }
851
+
852
+ calculateBytesPerLine(_ofd->header,
853
+ _ofd->sampleCountSliceBase,
854
+ _ofd->sampleCountXStride,
855
+ _ofd->sampleCountYStride,
856
+ tileRange.min.x, tileRange.max.x,
857
+ tileRange.min.y, tileRange.max.y,
858
+ xOffsets, yOffsets,
859
+ bytesPerLine);
860
+
861
+ //
862
+ // Allocate the memory for internal buffer.
863
+ // (TODO) more efficient memory management?
864
+ //
865
+
866
+ Int64 totalBytes = 0;
867
+ Int64 maxBytesPerTileLine = 0;
868
+ for (size_t i = 0; i < bytesPerLine.size(); i++)
869
+ {
870
+ totalBytes += bytesPerLine[i];
871
+ if (bytesPerLine[i] > maxBytesPerTileLine)
872
+ maxBytesPerTileLine = bytesPerLine[i];
873
+ }
874
+ _tileBuffer->buffer.resizeErase(totalBytes);
875
+
876
+ char *writePtr = _tileBuffer->buffer;
877
+
878
+ //
879
+ // Iterate over the scan lines in the tile.
880
+ //
881
+
882
+ int xOffsetForSampleCount =
883
+ (_ofd->sampleCountXTileCoords == 0) ? 0 : tileRange.min.x;
884
+ int yOffsetForSampleCount =
885
+ (_ofd->sampleCountYTileCoords == 0) ? 0 : tileRange.min.y;
886
+
887
+ for (int y = tileRange.min.y; y <= tileRange.max.y; ++y)
888
+ {
889
+ //
890
+ // Iterate over all image channels.
891
+ //
892
+
893
+ for (unsigned int i = 0; i < _ofd->slices.size(); ++i)
894
+ {
895
+ const TOutSliceInfo &slice = *_ofd->slices[i];
896
+
897
+
898
+ //
899
+ // Fill the tile buffer with pixel data.
900
+ //
901
+
902
+ if (slice.zero)
903
+ {
904
+ //
905
+ // The frame buffer contains no data for this channel.
906
+ // Store zeroes in _data->tileBuffer.
907
+ //
908
+
909
+ fillChannelWithZeroes (writePtr, _ofd->format, slice.type,
910
+ bytesPerLine[y - tileRange.min.y]);
911
+ }
912
+ else
913
+ {
914
+ //
915
+ // The frame buffer contains data for this channel.
916
+ //
917
+
918
+
919
+ int xOffsetForData = slice.xTileCoords ? tileRange.min.x : 0;
920
+ int yOffsetForData = slice.yTileCoords ? tileRange.min.y : 0;
921
+
922
+ // (TOOD) treat sample count offsets differently.
923
+ copyFromDeepFrameBuffer (writePtr,
924
+ slice.base,
925
+ _ofd->sampleCountSliceBase,
926
+ _ofd->sampleCountXStride,
927
+ _ofd->sampleCountYStride,
928
+ y,
929
+ tileRange.min.x,
930
+ tileRange.max.x,
931
+ xOffsetForSampleCount,
932
+ yOffsetForSampleCount,
933
+ xOffsetForData,
934
+ yOffsetForData,
935
+ slice.sampleStride,
936
+ slice.xStride,
937
+ slice.yStride,
938
+ _ofd->format,
939
+ slice.type);
940
+ #if defined(DEBUG)
941
+ assert(writePtr-_tileBuffer->buffer<=totalBytes);
942
+ #endif
943
+ }
944
+ }
945
+ }
946
+
947
+ //
948
+ // Compress the pixel sample count table.
949
+ //
950
+
951
+ char* ptr = _tileBuffer->sampleCountTableBuffer;
952
+ Int64 tableDataSize = 0;
953
+ for (int i = tileRange.min.y; i <= tileRange.max.y; i++)
954
+ {
955
+ int count = 0;
956
+ for (int j = tileRange.min.x; j <= tileRange.max.x; j++)
957
+ {
958
+ count += _ofd->getSampleCount(j - xOffsetForSampleCount,
959
+ i - yOffsetForSampleCount);
960
+ Xdr::write <CharPtrIO> (ptr, count);
961
+ tableDataSize += sizeof (int);
962
+ }
963
+ }
964
+
965
+ if(_tileBuffer->sampleCountTableCompressor)
966
+ {
967
+ _tileBuffer->sampleCountTableSize =
968
+ _tileBuffer->sampleCountTableCompressor->compress (
969
+ _tileBuffer->sampleCountTableBuffer,
970
+ tableDataSize,
971
+ tileRange.min.y,
972
+ _tileBuffer->sampleCountTablePtr);
973
+ }
974
+
975
+ //
976
+ // If we can't make data shrink (or compression was disabled), then just use the raw data.
977
+ //
978
+
979
+ if ( ! _tileBuffer->sampleCountTableCompressor ||
980
+ _tileBuffer->sampleCountTableSize >= _ofd->maxSampleCountTableSize)
981
+ {
982
+ _tileBuffer->sampleCountTableSize = _ofd->maxSampleCountTableSize;
983
+ _tileBuffer->sampleCountTablePtr = _tileBuffer->sampleCountTableBuffer;
984
+ }
985
+
986
+ //
987
+ // Compress the contents of the tileBuffer,
988
+ // and store the compressed data in the output file.
989
+ //
990
+
991
+ _tileBuffer->dataSize = writePtr - _tileBuffer->buffer;
992
+ _tileBuffer->uncompressedSize = _tileBuffer->dataSize;
993
+ _tileBuffer->dataPtr = _tileBuffer->buffer;
994
+
995
+ // (TODO) don't do this all the time.
996
+ if (_tileBuffer->compressor != 0)
997
+ delete _tileBuffer->compressor;
998
+ _tileBuffer->compressor = newTileCompressor
999
+ (_ofd->header.compression(),
1000
+ maxBytesPerTileLine,
1001
+ _ofd->tileDesc.ySize,
1002
+ _ofd->header);
1003
+
1004
+ if (_tileBuffer->compressor)
1005
+ {
1006
+ const char *compPtr;
1007
+
1008
+ Int64 compSize = _tileBuffer->compressor->compressTile
1009
+ (_tileBuffer->dataPtr,
1010
+ _tileBuffer->dataSize,
1011
+ tileRange, compPtr);
1012
+
1013
+ if (compSize < _tileBuffer->dataSize)
1014
+ {
1015
+ _tileBuffer->dataSize = compSize;
1016
+ _tileBuffer->dataPtr = compPtr;
1017
+ }
1018
+ else if (_ofd->format == Compressor::NATIVE)
1019
+ {
1020
+ //
1021
+ // The data did not shrink during compression, but
1022
+ // we cannot write to the file using native format,
1023
+ // so we need to convert the lineBuffer to Xdr.
1024
+ //
1025
+
1026
+ convertToXdr (_ofd, _tileBuffer->buffer, numScanLines,
1027
+ bytesPerLine);
1028
+ }
1029
+ }
1030
+ }
1031
+ catch (std::exception &e)
1032
+ {
1033
+ if (!_tileBuffer->hasException)
1034
+ {
1035
+ _tileBuffer->exception = e.what ();
1036
+ _tileBuffer->hasException = true;
1037
+ }
1038
+ }
1039
+ catch (...)
1040
+ {
1041
+ if (!_tileBuffer->hasException)
1042
+ {
1043
+ _tileBuffer->exception = "unrecognized exception";
1044
+ _tileBuffer->hasException = true;
1045
+ }
1046
+ }
1047
+ }
1048
+
1049
+ } // namespace
1050
+
1051
+
1052
+ DeepTiledOutputFile::DeepTiledOutputFile
1053
+ (const char fileName[],
1054
+ const Header &header,
1055
+ int numThreads)
1056
+ :
1057
+ _data (new Data (numThreads))
1058
+
1059
+ {
1060
+ _data->_streamData=new OutputStreamMutex();
1061
+ _data->_deleteStream =true;
1062
+ try
1063
+ {
1064
+ header.sanityCheck (true);
1065
+ _data->_streamData->os = new StdOFStream (fileName);
1066
+ initialize (header);
1067
+ _data->_streamData->currentPosition = _data->_streamData->os->tellp();
1068
+
1069
+ // Write header and empty offset table to the file.
1070
+ writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header);
1071
+ _data->previewPosition = _data->header.writeTo (*_data->_streamData->os, true);
1072
+ _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_data->_streamData->os);
1073
+ _data->multipart = false;
1074
+ }
1075
+ catch (IEX_NAMESPACE::BaseExc &e)
1076
+ {
1077
+ if (_data && _data->_streamData && _data->_streamData->os) delete _data->_streamData->os;
1078
+ if (_data && _data->_streamData) delete _data->_streamData;
1079
+ if (_data) delete _data;
1080
+
1081
+ REPLACE_EXC (e, "Cannot open image file "
1082
+ "\"" << fileName << "\". " << e);
1083
+ throw;
1084
+ }
1085
+ catch (...)
1086
+ {
1087
+ if (_data && _data->_streamData && _data->_streamData->os) delete _data->_streamData->os;
1088
+ if (_data->_streamData) delete _data->_streamData;
1089
+ if (_data) delete _data;
1090
+
1091
+ throw;
1092
+ }
1093
+ }
1094
+
1095
+
1096
+ DeepTiledOutputFile::DeepTiledOutputFile
1097
+ (OPENEXR_IMF_INTERNAL_NAMESPACE::OStream &os,
1098
+ const Header &header,
1099
+ int numThreads)
1100
+ :
1101
+ _data (new Data (numThreads))
1102
+ {
1103
+ _data->_streamData=new OutputStreamMutex();
1104
+ _data->_deleteStream=false;
1105
+
1106
+ try
1107
+ {
1108
+ header.sanityCheck(true);
1109
+ _data->_streamData->os = &os;
1110
+ initialize (header);
1111
+ _data->_streamData->currentPosition = _data->_streamData->os->tellp();
1112
+
1113
+ // Write header and empty offset table to the file.
1114
+ writeMagicNumberAndVersionField(*_data->_streamData->os, _data->header);
1115
+ _data->previewPosition = _data->header.writeTo (*_data->_streamData->os, true);
1116
+ _data->tileOffsetsPosition = _data->tileOffsets.writeTo (*_data->_streamData->os);
1117
+ _data->multipart = false;
1118
+ }
1119
+ catch (IEX_NAMESPACE::BaseExc &e)
1120
+ {
1121
+ if (_data && _data->_streamData) delete _data->_streamData;
1122
+ if (_data) delete _data;
1123
+
1124
+ REPLACE_EXC (e, "Cannot open image file "
1125
+ "\"" << os.fileName() << "\". " << e);
1126
+ throw;
1127
+ }
1128
+ catch (...)
1129
+ {
1130
+ if (_data && _data->_streamData) delete _data->_streamData;
1131
+ if (_data) delete _data;
1132
+
1133
+ throw;
1134
+ }
1135
+ }
1136
+
1137
+ DeepTiledOutputFile::DeepTiledOutputFile(const OutputPartData* part)
1138
+ {
1139
+
1140
+ try
1141
+ {
1142
+ if (part->header.type() != DEEPTILE)
1143
+ throw IEX_NAMESPACE::ArgExc("Can't build a DeepTiledOutputFile from "
1144
+ "a type-mismatched part.");
1145
+
1146
+ _data = new Data (part->numThreads);
1147
+ _data->_streamData=part->mutex;
1148
+ _data->_deleteStream=false;
1149
+ initialize(part->header);
1150
+ _data->partNumber = part->partNumber;
1151
+ _data->tileOffsetsPosition = part->chunkOffsetTablePosition;
1152
+ _data->previewPosition = part->previewPosition;
1153
+ _data->multipart = part->multipart;
1154
+ }
1155
+ catch (IEX_NAMESPACE::BaseExc &e)
1156
+ {
1157
+ if (_data) delete _data;
1158
+
1159
+ REPLACE_EXC (e, "Cannot initialize output part "
1160
+ "\"" << part->partNumber << "\". " << e);
1161
+ throw;
1162
+ }
1163
+ catch (...)
1164
+ {
1165
+ if (_data) delete _data;
1166
+
1167
+ throw;
1168
+ }
1169
+ }
1170
+
1171
+ void
1172
+ DeepTiledOutputFile::initialize (const Header &header)
1173
+ {
1174
+ _data->header = header;
1175
+ _data->header.setType(DEEPTILE);
1176
+ _data->lineOrder = _data->header.lineOrder();
1177
+
1178
+ //
1179
+ // Check that the file is indeed tiled
1180
+ //
1181
+
1182
+ _data->tileDesc = _data->header.tileDescription();
1183
+
1184
+ //
1185
+ // Save the dataWindow information
1186
+ //
1187
+
1188
+ const Box2i &dataWindow = _data->header.dataWindow();
1189
+ _data->minX = dataWindow.min.x;
1190
+ _data->maxX = dataWindow.max.x;
1191
+ _data->minY = dataWindow.min.y;
1192
+ _data->maxY = dataWindow.max.y;
1193
+
1194
+ //
1195
+ // Precompute level and tile information to speed up utility functions
1196
+ //
1197
+
1198
+ precalculateTileInfo (_data->tileDesc,
1199
+ _data->minX, _data->maxX,
1200
+ _data->minY, _data->maxY,
1201
+ _data->numXTiles, _data->numYTiles,
1202
+ _data->numXLevels, _data->numYLevels);
1203
+
1204
+ //
1205
+ // Determine the first tile coordinate that we will be writing
1206
+ // if the file is not RANDOM_Y.
1207
+ //
1208
+
1209
+ _data->nextTileToWrite = (_data->lineOrder == INCREASING_Y)?
1210
+ TileCoord (0, 0, 0, 0):
1211
+ TileCoord (0, _data->numYTiles[0] - 1, 0, 0);
1212
+
1213
+ Compressor* compressor = newTileCompressor
1214
+ (_data->header.compression(),
1215
+ 0,
1216
+ _data->tileDesc.ySize,
1217
+ _data->header);
1218
+
1219
+ _data->format = defaultFormat (compressor);
1220
+
1221
+ if (compressor != 0)
1222
+ delete compressor;
1223
+
1224
+ _data->tileOffsets = TileOffsets (_data->tileDesc.mode,
1225
+ _data->numXLevels,
1226
+ _data->numYLevels,
1227
+ _data->numXTiles,
1228
+ _data->numYTiles);
1229
+
1230
+ //ignore the existing value of chunkCount - correct it if it's wrong
1231
+ _data->header.setChunkCount(getChunkOffsetTableSize(_data->header,true));
1232
+
1233
+ _data->maxSampleCountTableSize = _data->tileDesc.ySize *
1234
+ _data->tileDesc.xSize *
1235
+ sizeof(int);
1236
+
1237
+
1238
+ for (size_t i = 0; i < _data->tileBuffers.size(); i++)
1239
+ {
1240
+ _data->tileBuffers[i] = new TileBuffer ();
1241
+
1242
+ _data->tileBuffers[i]->sampleCountTableBuffer.
1243
+ resizeErase(_data->maxSampleCountTableSize);
1244
+
1245
+ char * p = &(_data->tileBuffers[i]->sampleCountTableBuffer[0]);
1246
+ memset (p, 0, _data->maxSampleCountTableSize);
1247
+
1248
+ _data->tileBuffers[i]->sampleCountTableCompressor =
1249
+ newCompressor (_data->header.compression(),
1250
+ _data->maxSampleCountTableSize,
1251
+ _data->header);
1252
+ }
1253
+ }
1254
+
1255
+
1256
+ DeepTiledOutputFile::~DeepTiledOutputFile ()
1257
+ {
1258
+ if (_data)
1259
+ {
1260
+ {
1261
+ Lock lock(*_data->_streamData);
1262
+ Int64 originalPosition = _data->_streamData->os->tellp();
1263
+
1264
+ if (_data->tileOffsetsPosition > 0)
1265
+ {
1266
+ try
1267
+ {
1268
+ _data->_streamData->os->seekp (_data->tileOffsetsPosition);
1269
+ _data->tileOffsets.writeTo (*_data->_streamData->os);
1270
+
1271
+ //
1272
+ // Restore the original position.
1273
+ //
1274
+ _data->_streamData->os->seekp (originalPosition);
1275
+ }
1276
+ catch (...)
1277
+ {
1278
+ //
1279
+ // We cannot safely throw any exceptions from here.
1280
+ // This destructor may have been called because the
1281
+ // stack is currently being unwound for another
1282
+ // exception.
1283
+ //
1284
+ }
1285
+ }
1286
+ }
1287
+
1288
+ if (_data->_deleteStream && _data->_streamData)
1289
+ delete _data->_streamData->os;
1290
+
1291
+ //
1292
+ // (TODO) we should have a way to tell if the stream data is owned by
1293
+ // this file or by a parent multipart file.
1294
+ //
1295
+
1296
+ if (_data->partNumber == -1 && _data->_streamData)
1297
+ delete _data->_streamData;
1298
+
1299
+ delete _data;
1300
+ }
1301
+ }
1302
+
1303
+
1304
+ const char *
1305
+ DeepTiledOutputFile::fileName () const
1306
+ {
1307
+ return _data->_streamData->os->fileName();
1308
+ }
1309
+
1310
+
1311
+ const Header &
1312
+ DeepTiledOutputFile::header () const
1313
+ {
1314
+ return _data->header;
1315
+ }
1316
+
1317
+
1318
+ void
1319
+ DeepTiledOutputFile::setFrameBuffer (const DeepFrameBuffer &frameBuffer)
1320
+ {
1321
+ Lock lock (*_data->_streamData);
1322
+
1323
+ //
1324
+ // Check if the new frame buffer descriptor
1325
+ // is compatible with the image file header.
1326
+ //
1327
+
1328
+ const ChannelList &channels = _data->header.channels();
1329
+
1330
+ for (ChannelList::ConstIterator i = channels.begin();
1331
+ i != channels.end();
1332
+ ++i)
1333
+ {
1334
+ DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name());
1335
+
1336
+ if (j == frameBuffer.end())
1337
+ continue;
1338
+
1339
+ if (i.channel().type != j.slice().type)
1340
+ THROW (IEX_NAMESPACE::ArgExc, "Pixel type of \"" << i.name() << "\" channel "
1341
+ "of output file \"" << fileName() << "\" is "
1342
+ "not compatible with the frame buffer's "
1343
+ "pixel type.");
1344
+
1345
+ if (j.slice().xSampling != 1 || j.slice().ySampling != 1)
1346
+ THROW (IEX_NAMESPACE::ArgExc, "All channels in a tiled file must have"
1347
+ "sampling (1,1).");
1348
+ }
1349
+
1350
+ //
1351
+ // Store the pixel sample count table.
1352
+ //
1353
+
1354
+ const Slice& sampleCountSlice = frameBuffer.getSampleCountSlice();
1355
+ if (sampleCountSlice.base == 0)
1356
+ {
1357
+ throw IEX_NAMESPACE::ArgExc ("Invalid base pointer, please set a proper sample count slice.");
1358
+ }
1359
+ else
1360
+ {
1361
+ _data->sampleCountSliceBase = sampleCountSlice.base;
1362
+ _data->sampleCountXStride = sampleCountSlice.xStride;
1363
+ _data->sampleCountYStride = sampleCountSlice.yStride;
1364
+ _data->sampleCountXTileCoords = sampleCountSlice.xTileCoords;
1365
+ _data->sampleCountYTileCoords = sampleCountSlice.yTileCoords;
1366
+ }
1367
+
1368
+ //
1369
+ // Initialize slice table for writePixels().
1370
+ // Pixel sample count slice is not presented in the header,
1371
+ // so it wouldn't be added here.
1372
+ // Store the pixel base pointer table.
1373
+ //
1374
+
1375
+ vector<TOutSliceInfo*> slices;
1376
+
1377
+ for (ChannelList::ConstIterator i = channels.begin();
1378
+ i != channels.end();
1379
+ ++i)
1380
+ {
1381
+ DeepFrameBuffer::ConstIterator j = frameBuffer.find (i.name());
1382
+
1383
+ if (j == frameBuffer.end())
1384
+ {
1385
+ //
1386
+ // Channel i is not present in the frame buffer.
1387
+ // In the file, channel i will contain only zeroes.
1388
+ //
1389
+
1390
+ slices.push_back (new TOutSliceInfo (i.channel().type,
1391
+ 0, // sampleStride,
1392
+ 0, // xStride
1393
+ 0, // yStride
1394
+ true)); // zero
1395
+ }
1396
+ else
1397
+ {
1398
+ //
1399
+ // Channel i is present in the frame buffer.
1400
+ //
1401
+
1402
+ slices.push_back (new TOutSliceInfo (j.slice().type,
1403
+ j.slice().sampleStride,
1404
+ j.slice().xStride,
1405
+ j.slice().yStride,
1406
+ false, // zero
1407
+ (j.slice().xTileCoords)? 1: 0,
1408
+ (j.slice().yTileCoords)? 1: 0));
1409
+
1410
+ TOutSliceInfo* slice = slices.back();
1411
+ slice->base = j.slice().base;
1412
+
1413
+ }
1414
+ }
1415
+
1416
+ //
1417
+ // Store the new frame buffer.
1418
+ //
1419
+
1420
+ _data->frameBuffer = frameBuffer;
1421
+
1422
+ for (size_t i = 0; i < _data->slices.size(); i++)
1423
+ delete _data->slices[i];
1424
+ _data->slices = slices;
1425
+ }
1426
+
1427
+
1428
+ const DeepFrameBuffer &
1429
+ DeepTiledOutputFile::frameBuffer () const
1430
+ {
1431
+ Lock lock (*_data->_streamData);
1432
+ return _data->frameBuffer;
1433
+ }
1434
+
1435
+
1436
+ void
1437
+ DeepTiledOutputFile::writeTiles (int dx1, int dx2, int dy1, int dy2,
1438
+ int lx, int ly)
1439
+ {
1440
+ try
1441
+ {
1442
+ Lock lock (*_data->_streamData);
1443
+
1444
+ if (_data->slices.size() == 0)
1445
+ throw IEX_NAMESPACE::ArgExc ("No frame buffer specified "
1446
+ "as pixel data source.");
1447
+
1448
+ if (!isValidTile (dx1, dy1, lx, ly) || !isValidTile (dx2, dy2, lx, ly))
1449
+ throw IEX_NAMESPACE::ArgExc ("Tile coordinates are invalid.");
1450
+
1451
+ if (!isValidLevel (lx, ly))
1452
+ THROW (IEX_NAMESPACE::ArgExc,
1453
+ "Level coordinate "
1454
+ "(" << lx << ", " << ly << ") "
1455
+ "is invalid.");
1456
+ //
1457
+ // Determine the first and last tile coordinates in both dimensions
1458
+ // based on the file's lineOrder
1459
+ //
1460
+
1461
+ if (dx1 > dx2)
1462
+ swap (dx1, dx2);
1463
+
1464
+ if (dy1 > dy2)
1465
+ swap (dy1, dy2);
1466
+
1467
+ int dyStart = dy1;
1468
+ int dyStop = dy2 + 1;
1469
+ int dY = 1;
1470
+
1471
+ if (_data->lineOrder == DECREASING_Y)
1472
+ {
1473
+ dyStart = dy2;
1474
+ dyStop = dy1 - 1;
1475
+ dY = -1;
1476
+ }
1477
+
1478
+ int numTiles = (dx2 - dx1 + 1) * (dy2 - dy1 + 1);
1479
+ int numTasks = min ((int)_data->tileBuffers.size(), numTiles);
1480
+
1481
+ //
1482
+ // Create a task group for all tile buffer tasks. When the
1483
+ // task group goes out of scope, the destructor waits until
1484
+ // all tasks are complete.
1485
+ //
1486
+
1487
+ {
1488
+ TaskGroup taskGroup;
1489
+
1490
+ //
1491
+ // Add in the initial compression tasks to the thread pool
1492
+ //
1493
+
1494
+ int nextCompBuffer = 0;
1495
+ int dxComp = dx1;
1496
+ int dyComp = dyStart;
1497
+
1498
+ while (nextCompBuffer < numTasks)
1499
+ {
1500
+ ThreadPool::addGlobalTask (new TileBufferTask (&taskGroup,
1501
+ _data,
1502
+ nextCompBuffer++,
1503
+ dxComp, dyComp,
1504
+ lx, ly));
1505
+ dxComp++;
1506
+
1507
+ if (dxComp > dx2)
1508
+ {
1509
+ dxComp = dx1;
1510
+ dyComp += dY;
1511
+ }
1512
+ }
1513
+
1514
+ //
1515
+ // Write the compressed buffers and add in more compression
1516
+ // tasks until done
1517
+ //
1518
+
1519
+ int nextWriteBuffer = 0;
1520
+ int dxWrite = dx1;
1521
+ int dyWrite = dyStart;
1522
+
1523
+ while (nextWriteBuffer < numTiles)
1524
+ {
1525
+ //
1526
+ // Wait until the nextWriteBuffer is ready to be written
1527
+ //
1528
+
1529
+ TileBuffer* writeBuffer =
1530
+ _data->getTileBuffer (nextWriteBuffer);
1531
+
1532
+ writeBuffer->wait();
1533
+
1534
+ //
1535
+ // Write the tilebuffer
1536
+ //
1537
+
1538
+ bufferedTileWrite ( _data, dxWrite, dyWrite, lx, ly,
1539
+ writeBuffer->dataPtr,
1540
+ writeBuffer->dataSize,
1541
+ writeBuffer->uncompressedSize,
1542
+ writeBuffer->sampleCountTablePtr,
1543
+ writeBuffer->sampleCountTableSize);
1544
+
1545
+ //
1546
+ // Release the lock on nextWriteBuffer
1547
+ //
1548
+
1549
+ writeBuffer->post();
1550
+
1551
+ //
1552
+ // If there are no more tileBuffers to compress, then
1553
+ // only continue to write out remaining tileBuffers,
1554
+ // otherwise keep adding compression tasks.
1555
+ //
1556
+
1557
+ if (nextCompBuffer < numTiles)
1558
+ {
1559
+ //
1560
+ // add nextCompBuffer as a compression Task
1561
+ //
1562
+
1563
+ ThreadPool::addGlobalTask
1564
+ (new TileBufferTask (&taskGroup,
1565
+ _data,
1566
+ nextCompBuffer,
1567
+ dxComp, dyComp,
1568
+ lx, ly));
1569
+ }
1570
+
1571
+ nextWriteBuffer++;
1572
+ dxWrite++;
1573
+
1574
+ if (dxWrite > dx2)
1575
+ {
1576
+ dxWrite = dx1;
1577
+ dyWrite += dY;
1578
+ }
1579
+
1580
+ nextCompBuffer++;
1581
+ dxComp++;
1582
+
1583
+ if (dxComp > dx2)
1584
+ {
1585
+ dxComp = dx1;
1586
+ dyComp += dY;
1587
+ }
1588
+ }
1589
+
1590
+ //
1591
+ // finish all tasks
1592
+ //
1593
+ }
1594
+
1595
+ //
1596
+ // Exeption handling:
1597
+ //
1598
+ // TileBufferTask::execute() may have encountered exceptions, but
1599
+ // those exceptions occurred in another thread, not in the thread
1600
+ // that is executing this call to TiledOutputFile::writeTiles().
1601
+ // TileBufferTask::execute() has caught all exceptions and stored
1602
+ // the exceptions' what() strings in the tile buffers.
1603
+ // Now we check if any tile buffer contains a stored exception; if
1604
+ // this is the case then we re-throw the exception in this thread.
1605
+ // (It is possible that multiple tile buffers contain stored
1606
+ // exceptions. We re-throw the first exception we find and
1607
+ // ignore all others.)
1608
+ //
1609
+
1610
+ const string *exception = 0;
1611
+
1612
+ for (size_t i = 0; i < _data->tileBuffers.size(); ++i)
1613
+ {
1614
+ TileBuffer *tileBuffer = _data->tileBuffers[i];
1615
+
1616
+ if (tileBuffer->hasException && !exception)
1617
+ exception = &tileBuffer->exception;
1618
+
1619
+ tileBuffer->hasException = false;
1620
+ }
1621
+
1622
+ if (exception)
1623
+ throw IEX_NAMESPACE::IoExc (*exception);
1624
+ }
1625
+ catch (IEX_NAMESPACE::BaseExc &e)
1626
+ {
1627
+ REPLACE_EXC (e, "Failed to write pixel data to image "
1628
+ "file \"" << fileName() << "\". " << e);
1629
+ throw;
1630
+ }
1631
+ }
1632
+
1633
+
1634
+ void
1635
+ DeepTiledOutputFile::writeTiles (int dx1, int dxMax, int dyMin, int dyMax, int l)
1636
+ {
1637
+ writeTiles (dx1, dxMax, dyMin, dyMax, l, l);
1638
+ }
1639
+
1640
+
1641
+ void
1642
+ DeepTiledOutputFile::writeTile (int dx, int dy, int lx, int ly)
1643
+ {
1644
+ writeTiles (dx, dx, dy, dy, lx, ly);
1645
+ }
1646
+
1647
+
1648
+ void
1649
+ DeepTiledOutputFile::writeTile (int dx, int dy, int l)
1650
+ {
1651
+ writeTile(dx, dy, l, l);
1652
+ }
1653
+
1654
+
1655
+ void
1656
+ DeepTiledOutputFile::copyPixels (DeepTiledInputFile &in)
1657
+ {
1658
+
1659
+ //
1660
+ // Check if this file's and and the InputFile's
1661
+ // headers are compatible.
1662
+ //
1663
+
1664
+ const Header &hdr = _data->header;
1665
+ const Header &inHdr = in.header();
1666
+
1667
+
1668
+
1669
+ if (!(hdr.tileDescription() == inHdr.tileDescription()))
1670
+ THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image "
1671
+ "file \"" << in.fileName() << "\" to image "
1672
+ "file \"" << fileName() << "\" failed. "
1673
+ "The files have different tile descriptions.");
1674
+
1675
+ if (!(hdr.dataWindow() == inHdr.dataWindow()))
1676
+ THROW (IEX_NAMESPACE::ArgExc, "Cannot copy pixels from image "
1677
+ "file \"" << in.fileName() << "\" to image "
1678
+ "file \"" << fileName() << "\". The "
1679
+ "files have different data windows.");
1680
+
1681
+ if (!(hdr.lineOrder() == inHdr.lineOrder()))
1682
+ THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image "
1683
+ "file \"" << in.fileName() << "\" to image "
1684
+ "file \"" << fileName() << "\" failed. "
1685
+ "The files have different line orders.");
1686
+
1687
+ if (!(hdr.compression() == inHdr.compression()))
1688
+ THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image "
1689
+ "file \"" << in.fileName() << "\" to image "
1690
+ "file \"" << fileName() << "\" failed. "
1691
+ "The files use different compression methods.");
1692
+
1693
+ if (!(hdr.channels() == inHdr.channels()))
1694
+ THROW (IEX_NAMESPACE::ArgExc, "Quick pixel copy from image "
1695
+ "file \"" << in.fileName() << "\" to image "
1696
+ "file \"" << fileName() << "\" "
1697
+ "failed. The files have different channel "
1698
+ "lists.");
1699
+
1700
+
1701
+ // Verify that no pixel data have been written to this file yet.
1702
+ //
1703
+
1704
+ if (!_data->tileOffsets.isEmpty())
1705
+ THROW (IEX_NAMESPACE::LogicExc, "Quick pixel copy from image "
1706
+ "file \"" << in.fileName() << "\" to image "
1707
+ "file \"" << _data->_streamData->os->fileName() << "\" "
1708
+ "failed. \"" << fileName() << "\" "
1709
+ "already contains pixel data.");
1710
+
1711
+
1712
+ int numAllTiles = in.totalTiles();
1713
+
1714
+ Lock lock (*_data->_streamData);
1715
+
1716
+ //
1717
+ // special handling for random tiles
1718
+ //
1719
+
1720
+ vector<int> dx_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1);
1721
+ vector<int> dy_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1);
1722
+ vector<int> lx_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1);
1723
+ vector<int> ly_list(_data->lineOrder==RANDOM_Y ? numAllTiles : 1);
1724
+
1725
+ if(_data->lineOrder==RANDOM_Y)
1726
+ {
1727
+ in.getTileOrder(&dx_list[0],&dy_list[0],&lx_list[0],&ly_list[0]);
1728
+ _data->nextTileToWrite.dx=dx_list[0];
1729
+ _data->nextTileToWrite.dy=dy_list[0];
1730
+ _data->nextTileToWrite.lx=lx_list[0];
1731
+ _data->nextTileToWrite.ly=ly_list[0];
1732
+ }
1733
+
1734
+
1735
+ vector<char> data(4096);
1736
+ for (int i = 0; i < numAllTiles; ++i)
1737
+ {
1738
+
1739
+ int dx = _data->nextTileToWrite.dx;
1740
+ int dy = _data->nextTileToWrite.dy;
1741
+ int lx = _data->nextTileToWrite.lx;
1742
+ int ly = _data->nextTileToWrite.ly;
1743
+
1744
+ Int64 dataSize = data.size();
1745
+
1746
+ in.rawTileData (dx, dy, lx, ly, &data[0], dataSize);
1747
+ if(dataSize>data.size())
1748
+ {
1749
+ data.resize(dataSize);
1750
+ in.rawTileData (dx, dy, lx, ly, &data[0], dataSize);
1751
+ }
1752
+ Int64 sampleCountTableSize = *(Int64 *)(&data[0] + 16);
1753
+ Int64 pixelDataSize = *(Int64 *)(&data[0] + 24);
1754
+ Int64 unpackedPixelDataSize = *(Int64 *)(&data[0] + 32);
1755
+ char * sampleCountTable = &data[0]+40;
1756
+ char * pixelData = sampleCountTable + sampleCountTableSize;
1757
+
1758
+ writeTileData (_data, dx, dy, lx, ly, pixelData, pixelDataSize,unpackedPixelDataSize,sampleCountTable,sampleCountTableSize);
1759
+
1760
+
1761
+ if(_data->lineOrder==RANDOM_Y)
1762
+ {
1763
+ if(i<numAllTiles-1)
1764
+ {
1765
+ _data->nextTileToWrite.dx=dx_list[i+1];
1766
+ _data->nextTileToWrite.dy=dy_list[i+1];
1767
+ _data->nextTileToWrite.lx=lx_list[i+1];
1768
+ _data->nextTileToWrite.ly=ly_list[i+1];
1769
+ }
1770
+ }else{
1771
+ _data->nextTileToWrite = _data->nextTileCoord (_data->nextTileToWrite);
1772
+ }
1773
+
1774
+ }
1775
+ }
1776
+
1777
+
1778
+ void
1779
+ DeepTiledOutputFile::copyPixels (DeepTiledInputPart &in)
1780
+ {
1781
+ copyPixels(*in.file);
1782
+ }
1783
+
1784
+
1785
+ unsigned int
1786
+ DeepTiledOutputFile::tileXSize () const
1787
+ {
1788
+ return _data->tileDesc.xSize;
1789
+ }
1790
+
1791
+
1792
+ unsigned int
1793
+ DeepTiledOutputFile::tileYSize () const
1794
+ {
1795
+ return _data->tileDesc.ySize;
1796
+ }
1797
+
1798
+
1799
+ LevelMode
1800
+ DeepTiledOutputFile::levelMode () const
1801
+ {
1802
+ return _data->tileDesc.mode;
1803
+ }
1804
+
1805
+
1806
+ LevelRoundingMode
1807
+ DeepTiledOutputFile::levelRoundingMode () const
1808
+ {
1809
+ return _data->tileDesc.roundingMode;
1810
+ }
1811
+
1812
+
1813
+ int
1814
+ DeepTiledOutputFile::numLevels () const
1815
+ {
1816
+ if (levelMode() == RIPMAP_LEVELS)
1817
+ THROW (IEX_NAMESPACE::LogicExc, "Error calling numLevels() on image "
1818
+ "file \"" << fileName() << "\" "
1819
+ "(numLevels() is not defined for RIPMAPs).");
1820
+ return _data->numXLevels;
1821
+ }
1822
+
1823
+
1824
+ int
1825
+ DeepTiledOutputFile::numXLevels () const
1826
+ {
1827
+ return _data->numXLevels;
1828
+ }
1829
+
1830
+
1831
+ int
1832
+ DeepTiledOutputFile::numYLevels () const
1833
+ {
1834
+ return _data->numYLevels;
1835
+ }
1836
+
1837
+
1838
+ bool
1839
+ DeepTiledOutputFile::isValidLevel (int lx, int ly) const
1840
+ {
1841
+ if (lx < 0 || ly < 0)
1842
+ return false;
1843
+
1844
+ if (levelMode() == MIPMAP_LEVELS && lx != ly)
1845
+ return false;
1846
+
1847
+ if (lx >= numXLevels() || ly >= numYLevels())
1848
+ return false;
1849
+
1850
+ return true;
1851
+ }
1852
+
1853
+
1854
+ int
1855
+ DeepTiledOutputFile::levelWidth (int lx) const
1856
+ {
1857
+ try
1858
+ {
1859
+ int retVal = levelSize (_data->minX, _data->maxX, lx,
1860
+ _data->tileDesc.roundingMode);
1861
+
1862
+ return retVal;
1863
+ }
1864
+ catch (IEX_NAMESPACE::BaseExc &e)
1865
+ {
1866
+ REPLACE_EXC (e, "Error calling levelWidth() on image "
1867
+ "file \"" << fileName() << "\". " << e);
1868
+ throw;
1869
+ }
1870
+ }
1871
+
1872
+
1873
+ int
1874
+ DeepTiledOutputFile::levelHeight (int ly) const
1875
+ {
1876
+ try
1877
+ {
1878
+ return levelSize (_data->minY, _data->maxY, ly,
1879
+ _data->tileDesc.roundingMode);
1880
+ }
1881
+ catch (IEX_NAMESPACE::BaseExc &e)
1882
+ {
1883
+ REPLACE_EXC (e, "Error calling levelHeight() on image "
1884
+ "file \"" << fileName() << "\". " << e);
1885
+ throw;
1886
+ }
1887
+ }
1888
+
1889
+
1890
+ int
1891
+ DeepTiledOutputFile::numXTiles (int lx) const
1892
+ {
1893
+ if (lx < 0 || lx >= _data->numXLevels)
1894
+ THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image "
1895
+ "file \"" << _data->_streamData->os->fileName() << "\" "
1896
+ "(Argument is not in valid range).");
1897
+
1898
+ return _data->numXTiles[lx];
1899
+ }
1900
+
1901
+
1902
+ int
1903
+ DeepTiledOutputFile::numYTiles (int ly) const
1904
+ {
1905
+ if (ly < 0 || ly >= _data->numYLevels)
1906
+ THROW (IEX_NAMESPACE::LogicExc, "Error calling numXTiles() on image "
1907
+ "file \"" << _data->_streamData->os->fileName() << "\" "
1908
+ "(Argument is not in valid range).");
1909
+
1910
+ return _data->numYTiles[ly];
1911
+ }
1912
+
1913
+
1914
+ Box2i
1915
+ DeepTiledOutputFile::dataWindowForLevel (int l) const
1916
+ {
1917
+ return dataWindowForLevel (l, l);
1918
+ }
1919
+
1920
+
1921
+ Box2i
1922
+ DeepTiledOutputFile::dataWindowForLevel (int lx, int ly) const
1923
+ {
1924
+ try
1925
+ {
1926
+ return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForLevel (
1927
+ _data->tileDesc,
1928
+ _data->minX, _data->maxX,
1929
+ _data->minY, _data->maxY,
1930
+ lx, ly);
1931
+ }
1932
+ catch (IEX_NAMESPACE::BaseExc &e)
1933
+ {
1934
+ REPLACE_EXC (e, "Error calling dataWindowForLevel() on image "
1935
+ "file \"" << fileName() << "\". " << e);
1936
+ throw;
1937
+ }
1938
+ }
1939
+
1940
+
1941
+ Box2i
1942
+ DeepTiledOutputFile::dataWindowForTile (int dx, int dy, int l) const
1943
+ {
1944
+ return dataWindowForTile (dx, dy, l, l);
1945
+ }
1946
+
1947
+
1948
+ Box2i
1949
+ DeepTiledOutputFile::dataWindowForTile (int dx, int dy, int lx, int ly) const
1950
+ {
1951
+ try
1952
+ {
1953
+ if (!isValidTile (dx, dy, lx, ly))
1954
+ throw IEX_NAMESPACE::ArgExc ("Arguments not in valid range.");
1955
+
1956
+ return OPENEXR_IMF_INTERNAL_NAMESPACE::dataWindowForTile (
1957
+ _data->tileDesc,
1958
+ _data->minX, _data->maxX,
1959
+ _data->minY, _data->maxY,
1960
+ dx, dy,
1961
+ lx, ly);
1962
+ }
1963
+ catch (IEX_NAMESPACE::BaseExc &e)
1964
+ {
1965
+ REPLACE_EXC (e, "Error calling dataWindowForTile() on image "
1966
+ "file \"" << fileName() << "\". " << e);
1967
+ throw;
1968
+ }
1969
+ }
1970
+
1971
+
1972
+ bool
1973
+ DeepTiledOutputFile::isValidTile (int dx, int dy, int lx, int ly) const
1974
+ {
1975
+ return ((lx < _data->numXLevels && lx >= 0) &&
1976
+ (ly < _data->numYLevels && ly >= 0) &&
1977
+ (dx < _data->numXTiles[lx] && dx >= 0) &&
1978
+ (dy < _data->numYTiles[ly] && dy >= 0));
1979
+ }
1980
+
1981
+
1982
+ void
1983
+ DeepTiledOutputFile::updatePreviewImage (const PreviewRgba newPixels[])
1984
+ {
1985
+ Lock lock (*_data->_streamData);
1986
+
1987
+ if (_data->previewPosition <= 0)
1988
+ THROW (IEX_NAMESPACE::LogicExc, "Cannot update preview image pixels. "
1989
+ "File \"" << fileName() << "\" does not "
1990
+ "contain a preview image.");
1991
+
1992
+ //
1993
+ // Store the new pixels in the header's preview image attribute.
1994
+ //
1995
+
1996
+ PreviewImageAttribute &pia =
1997
+ _data->header.typedAttribute <PreviewImageAttribute> ("preview");
1998
+
1999
+ PreviewImage &pi = pia.value();
2000
+ PreviewRgba *pixels = pi.pixels();
2001
+ int numPixels = pi.width() * pi.height();
2002
+
2003
+ for (int i = 0; i < numPixels; ++i)
2004
+ pixels[i] = newPixels[i];
2005
+
2006
+ //
2007
+ // Save the current file position, jump to the position in
2008
+ // the file where the preview image starts, store the new
2009
+ // preview image, and jump back to the saved file position.
2010
+ //
2011
+
2012
+ Int64 savedPosition = _data->_streamData->os->tellp();
2013
+
2014
+ try
2015
+ {
2016
+ _data->_streamData->os->seekp (_data->previewPosition);
2017
+ pia.writeValueTo (*_data->_streamData->os, _data->version);
2018
+ _data->_streamData->os->seekp (savedPosition);
2019
+ }
2020
+ catch (IEX_NAMESPACE::BaseExc &e)
2021
+ {
2022
+ REPLACE_EXC (e, "Cannot update preview image pixels for "
2023
+ "file \"" << fileName() << "\". " << e);
2024
+ throw;
2025
+ }
2026
+ }
2027
+
2028
+
2029
+ void
2030
+ DeepTiledOutputFile::breakTile
2031
+ (int dx, int dy,
2032
+ int lx, int ly,
2033
+ int offset,
2034
+ int length,
2035
+ char c)
2036
+ {
2037
+ Lock lock (*_data->_streamData);
2038
+
2039
+ Int64 position = _data->tileOffsets (dx, dy, lx, ly);
2040
+
2041
+ if (!position)
2042
+ THROW (IEX_NAMESPACE::ArgExc,
2043
+ "Cannot overwrite tile "
2044
+ "(" << dx << ", " << dy << ", " << lx << "," << ly << "). "
2045
+ "The tile has not yet been stored in "
2046
+ "file \"" << fileName() << "\".");
2047
+
2048
+ _data->_streamData->currentPosition = 0;
2049
+ _data->_streamData->os->seekp (position + offset);
2050
+
2051
+ for (int i = 0; i < length; ++i)
2052
+ _data->_streamData->os->write (&c, 1);
2053
+ }
2054
+
2055
+ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT