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