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,3424 @@
1
+ ///////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // Copyright (c) 2009-2014 DreamWorks Animation LLC.
4
+ //
5
+ // All rights reserved.
6
+ //
7
+ // Redistribution and use in source and binary forms, with or without
8
+ // modification, are permitted provided that the following conditions are
9
+ // met:
10
+ // * Redistributions of source code must retain the above copyright
11
+ // notice, this list of conditions and the following disclaimer.
12
+ // * Redistributions in binary form must reproduce the above
13
+ // copyright notice, this list of conditions and the following disclaimer
14
+ // in the documentation and/or other materials provided with the
15
+ // distribution.
16
+ // * Neither the name of DreamWorks Animation nor the names of
17
+ // its contributors may be used to endorse or promote products derived
18
+ // from this software without specific prior written permission.
19
+ //
20
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ //
32
+ ///////////////////////////////////////////////////////////////////////////
33
+
34
+ //---------------------------------------------------
35
+ //
36
+ // class DwaCompressor -- Store lossy RGB data by quantizing
37
+ // DCT components.
38
+ //
39
+ // First, we try and figure out what compression strategy to take
40
+ // based in channel name. For RGB channels, we want a lossy method
41
+ // described below. But, if we have alpha, we should do something
42
+ // different (and probably using RLE). If we have depth, or velocity,
43
+ // or something else, just fall back to ZIP. The rules for deciding
44
+ // which strategy to use are setup in initializeDefaultChannelRules().
45
+ // When writing a file, the relevant rules needed to decode are written
46
+ // into the start of the data block, making a self-contained file.
47
+ // If initializeDefaultChannelRules() doesn't quite suite your naming
48
+ // conventions, you can adjust the rules without breaking decoder
49
+ // compatability.
50
+ //
51
+ // If we're going to lossy compress R, G, or B channels, it's easier
52
+ // to toss bits in a more perceptual uniform space. One could argue
53
+ // at length as to what constitutes perceptually uniform, expecially
54
+ // when storing either scene/input/focal plane referred and output referred
55
+ // data.
56
+ //
57
+ // We'll compromise. For values <= 1, we use a traditional power function
58
+ // (without any of that straight-line business at the bottom). For values > 1,
59
+ // we want something more like a log function, since power functions blow
60
+ // up. At 1, we want a smooth blend between the functions. So, we use a
61
+ // piecewise function that does just that - see dwaLookups.cpp for
62
+ // a little more detail.
63
+ //
64
+ // Also, if we find that we have R, G, and B channels from the same layer,
65
+ // we can get a bit more compression efficiency by transforming to a Y'CbCr
66
+ // space. We use the 709 transform, but with Cb,Cr = 0 for an input of
67
+ // (0, 0, 0), instead of the traditional Cb,Cr = .5. Shifting the zero point
68
+ // makes no sense with large range data. Transforms are done to from
69
+ // the perceptual space data, not the linear-light space data (R'G'B' ->
70
+ // (Y'CbCr, not RGB -> YCbCr).
71
+ //
72
+ // Next, we forward DCT the data. This is done with a floating
73
+ // point DCT, as we don't really have control over the src range. The
74
+ // resulting values are dropped to half-float precision.
75
+ //
76
+ // Now, we need to quantize. Quantization departs from the usual way
77
+ // of dividing and rounding. Instead, we start with some floating
78
+ // point "base-error" value. From this, we can derive quantization
79
+ // error for each DCT component. Take the standard JPEG quantization
80
+ // tables and normalize them by the smallest value. Then, multiply
81
+ // the normalized quant tables by our base-error value. This gives
82
+ // a range of errors for each DCT component.
83
+ //
84
+ // For each DCT component, we want to find a quantized value that
85
+ // is within +- the per-component error. Pick the quantized value
86
+ // that has the fewest bits set in its' binary representation.
87
+ // Brute-forcing the search would make for extremly inefficient
88
+ // compression. Fortunatly, we can precompute a table to assist
89
+ // with this search.
90
+ //
91
+ // For each 16-bit float value, there are at most 15 other values with
92
+ // fewer bits set. We can precompute these values in a compact form, since
93
+ // many source values have far fewer that 15 possible quantized values.
94
+ // Now, instead of searching the entire range +- the component error,
95
+ // we can just search at most 15 quantization candidates. The search can
96
+ // be accelerated a bit more by sorting the candidates by the
97
+ // number of bits set, in increasing order. Then, the search can stop
98
+ // once a candidate is found w/i the per-component quantization
99
+ // error range.
100
+ //
101
+ // The quantization strategy has the side-benefit that there is no
102
+ // de-quantization step upon decode, so we don't bother recording
103
+ // the quantization table.
104
+ //
105
+ // Ok. So we now have quantized values. Time for entropy coding. We
106
+ // can use either static Huffman or zlib/DEFLATE. The static Huffman
107
+ // is more efficient at compacting data, but can have a greater
108
+ // overhead, especially for smaller tile/strip sizes.
109
+ //
110
+ // There is some additional fun, like ZIP compressing the DC components
111
+ // instead of Huffman/zlib, which helps make things slightly smaller.
112
+ //
113
+ // Compression level is controlled by setting an int/float/double attribute
114
+ // on the header named "dwaCompressionLevel". This is a thinly veiled name for
115
+ // the "base-error" value mentioned above. The "base-error" is just
116
+ // dwaCompressionLevel / 100000. The default value of 45.0 is generally
117
+ // pretty good at generating "visually lossless" values at reasonable
118
+ // data rates. Setting dwaCompressionLevel to 0 should result in no additional
119
+ // quantization at the quantization stage (though there may be
120
+ // quantization in practice at the CSC/DCT steps). But if you really
121
+ // want lossless compression, there are pleanty of other choices
122
+ // of compressors ;)
123
+ //
124
+ // When dealing with FLOAT source buffers, we first quantize the source
125
+ // to HALF and continue down as we would for HALF source.
126
+ //
127
+ //---------------------------------------------------
128
+
129
+
130
+ #include "ImfDwaCompressor.h"
131
+ #include "ImfDwaCompressorSimd.h"
132
+
133
+ #include "ImfChannelList.h"
134
+ #include "ImfStandardAttributes.h"
135
+ #include "ImfHeader.h"
136
+ #include "ImfHuf.h"
137
+ #include "ImfInt64.h"
138
+ #include "ImfIntAttribute.h"
139
+ #include "ImfIO.h"
140
+ #include "ImfMisc.h"
141
+ #include "ImfNamespace.h"
142
+ #include "ImfRle.h"
143
+ #include "ImfSimd.h"
144
+ #include "ImfSystemSpecific.h"
145
+ #include "ImfXdr.h"
146
+ #include "ImfZip.h"
147
+
148
+ #include "ImathFun.h"
149
+ #include "ImathBox.h"
150
+ #include "ImathVec.h"
151
+ #include "half.h"
152
+
153
+ #include "dwaLookups.h"
154
+
155
+ #include <vector>
156
+ #include <string>
157
+ #include <cctype>
158
+ #include <cassert>
159
+ #include <algorithm>
160
+
161
+ // Windows specific addition to prevent the indirect import of the redefined min/max macros
162
+ #if defined _WIN32 || defined _WIN64
163
+ #ifdef NOMINMAX
164
+ #undef NOMINMAX
165
+ #endif
166
+ #define NOMINMAX
167
+ #endif
168
+ #include <zlib.h>
169
+
170
+
171
+ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
172
+
173
+
174
+ namespace {
175
+
176
+ //
177
+ // Function pointer to dispatch to an approprate
178
+ // convertFloatToHalf64_* impl, based on runtime cpu checking.
179
+ // Should be initialized in DwaCompressor::initializeFuncs()
180
+ //
181
+
182
+ void (*convertFloatToHalf64)(unsigned short*, float*) =
183
+ convertFloatToHalf64_scalar;
184
+
185
+ //
186
+ // Function pointer for dispatching a fromHalfZigZag_ impl
187
+ //
188
+
189
+ void (*fromHalfZigZag)(unsigned short*, float*) =
190
+ fromHalfZigZag_scalar;
191
+
192
+ //
193
+ // Dispatch the inverse DCT on an 8x8 block, where the last
194
+ // n rows can be all zeros. The n=0 case converts the full block.
195
+ //
196
+ void (*dctInverse8x8_0)(float*) = dctInverse8x8_scalar<0>;
197
+ void (*dctInverse8x8_1)(float*) = dctInverse8x8_scalar<1>;
198
+ void (*dctInverse8x8_2)(float*) = dctInverse8x8_scalar<2>;
199
+ void (*dctInverse8x8_3)(float*) = dctInverse8x8_scalar<3>;
200
+ void (*dctInverse8x8_4)(float*) = dctInverse8x8_scalar<4>;
201
+ void (*dctInverse8x8_5)(float*) = dctInverse8x8_scalar<5>;
202
+ void (*dctInverse8x8_6)(float*) = dctInverse8x8_scalar<6>;
203
+ void (*dctInverse8x8_7)(float*) = dctInverse8x8_scalar<7>;
204
+
205
+ } // namespace
206
+
207
+
208
+ struct DwaCompressor::ChannelData
209
+ {
210
+ std::string name;
211
+ CompressorScheme compression;
212
+ int xSampling;
213
+ int ySampling;
214
+ PixelType type;
215
+ bool pLinear;
216
+
217
+ int width;
218
+ int height;
219
+
220
+ //
221
+ // Incoming and outgoing data is scanline interleaved, and it's much
222
+ // easier to operate on contiguous data. Assuming the planare unc
223
+ // buffer is to hold RLE data, we need to rearrange to make bytes
224
+ // adjacent.
225
+ //
226
+
227
+ char *planarUncBuffer;
228
+ char *planarUncBufferEnd;
229
+
230
+ char *planarUncRle[4];
231
+ char *planarUncRleEnd[4];
232
+
233
+ PixelType planarUncType;
234
+ int planarUncSize;
235
+ };
236
+
237
+
238
+ struct DwaCompressor::CscChannelSet
239
+ {
240
+ int idx[3];
241
+ };
242
+
243
+
244
+ struct DwaCompressor::Classifier
245
+ {
246
+ Classifier (std::string suffix,
247
+ CompressorScheme scheme,
248
+ PixelType type,
249
+ int cscIdx,
250
+ bool caseInsensitive):
251
+ _suffix(suffix),
252
+ _scheme(scheme),
253
+ _type(type),
254
+ _cscIdx(cscIdx),
255
+ _caseInsensitive(caseInsensitive)
256
+ {
257
+ if (caseInsensitive)
258
+ transform(_suffix.begin(), _suffix.end(), _suffix.begin(), tolower);
259
+ }
260
+
261
+ Classifier (const char *&ptr, int size)
262
+ {
263
+ if (size <= 0)
264
+ throw Iex::InputExc("Error uncompressing DWA data"
265
+ " (truncated rule).");
266
+
267
+ {
268
+ char suffix[Name::SIZE];
269
+ memset (suffix, 0, Name::SIZE);
270
+ Xdr::read<CharPtrIO> (ptr, std::min(size, Name::SIZE-1), suffix);
271
+ _suffix = std::string(suffix);
272
+ }
273
+
274
+ if (size < _suffix.length() + 1 + 2*Xdr::size<char>())
275
+ throw Iex::InputExc("Error uncompressing DWA data"
276
+ " (truncated rule).");
277
+
278
+ char value;
279
+ Xdr::read<CharPtrIO> (ptr, value);
280
+
281
+ _cscIdx = (int)(value >> 4) - 1;
282
+ if (_cscIdx < -1 || _cscIdx >= 3)
283
+ throw Iex::InputExc("Error uncompressing DWA data"
284
+ " (corrupt cscIdx rule).");
285
+
286
+ _scheme = (CompressorScheme)((value >> 2) & 3);
287
+ if (_scheme < 0 || _scheme >= NUM_COMPRESSOR_SCHEMES)
288
+ throw Iex::InputExc("Error uncompressing DWA data"
289
+ " (corrupt scheme rule).");
290
+
291
+ _caseInsensitive = (value & 1 ? true : false);
292
+
293
+ Xdr::read<CharPtrIO> (ptr, value);
294
+ if (value < 0 || value >= NUM_PIXELTYPES)
295
+ throw Iex::InputExc("Error uncompressing DWA data"
296
+ " (corrupt rule).");
297
+ _type = (PixelType)value;
298
+ }
299
+
300
+ bool match (const std::string &suffix, const PixelType type) const
301
+ {
302
+ if (_type != type) return false;
303
+
304
+ if (_caseInsensitive)
305
+ {
306
+ std::string tmp(suffix);
307
+ transform(tmp.begin(), tmp.end(), tmp.begin(), tolower);
308
+ return tmp == _suffix;
309
+ }
310
+
311
+ return suffix == _suffix;
312
+ }
313
+
314
+ size_t size () const
315
+ {
316
+ // string length + \0
317
+ size_t sizeBytes = _suffix.length() + 1;
318
+
319
+ // 1 byte for scheme / cscIdx / caseInsensitive, and 1 byte for type
320
+ sizeBytes += 2 * Xdr::size<char>();
321
+
322
+ return sizeBytes;
323
+ }
324
+
325
+ void write (char *&ptr) const
326
+ {
327
+ Xdr::write<CharPtrIO> (ptr, _suffix.c_str());
328
+
329
+ // Encode _cscIdx (-1-3) in the upper 4 bits,
330
+ // _scheme (0-2) in the next 2 bits
331
+ // _caseInsen in the bottom bit
332
+ unsigned char value = 0;
333
+ value |= ((unsigned char)(_cscIdx+1) & 15) << 4;
334
+ value |= ((unsigned char)_scheme & 3) << 2;
335
+ value |= (unsigned char)_caseInsensitive & 1;
336
+
337
+ Xdr::write<CharPtrIO> (ptr, value);
338
+ Xdr::write<CharPtrIO> (ptr, (unsigned char)_type);
339
+ }
340
+
341
+ std::string _suffix;
342
+ CompressorScheme _scheme;
343
+ PixelType _type;
344
+ int _cscIdx;
345
+ bool _caseInsensitive;
346
+ };
347
+
348
+
349
+ //
350
+ // Base class for the LOSSY_DCT decoder classes
351
+ //
352
+
353
+ class DwaCompressor::LossyDctDecoderBase
354
+ {
355
+ public:
356
+
357
+ LossyDctDecoderBase
358
+ (char *packedAc,
359
+ char *packedDc,
360
+ const unsigned short *toLinear,
361
+ int width,
362
+ int height);
363
+
364
+ virtual ~LossyDctDecoderBase ();
365
+
366
+ void execute();
367
+
368
+ //
369
+ // These return number of items, not bytes. Each item
370
+ // is an unsigned short
371
+ //
372
+
373
+ int numAcValuesEncoded() const { return _packedAcCount; }
374
+ int numDcValuesEncoded() const { return _packedDcCount; }
375
+
376
+ protected:
377
+
378
+ //
379
+ // Un-RLE the packed AC components into
380
+ // a half buffer. The half block should
381
+ // be the full 8x8 block (in zig-zag order
382
+ // still), not the first AC component.
383
+ //
384
+ // currAcComp is advanced as bytes are decoded.
385
+ //
386
+ // This returns the index of the last non-zero
387
+ // value in the buffer - with the index into zig zag
388
+ // order data. If we return 0, we have DC only data.
389
+ //
390
+
391
+ int unRleAc (unsigned short *&currAcComp,
392
+ unsigned short *halfZigBlock);
393
+
394
+
395
+ //
396
+ // if NATIVE and XDR are really the same values, we can
397
+ // skip some processing and speed things along
398
+ //
399
+
400
+ bool _isNativeXdr;
401
+
402
+
403
+ //
404
+ // Counts of how many items have been packed into the
405
+ // AC and DC buffers
406
+ //
407
+
408
+ int _packedAcCount;
409
+ int _packedDcCount;
410
+
411
+
412
+ //
413
+ // AC and DC buffers to pack
414
+ //
415
+
416
+ char *_packedAc;
417
+ char *_packedDc;
418
+
419
+
420
+ //
421
+ // half -> half LUT to transform from nonlinear to linear
422
+ //
423
+
424
+ const unsigned short *_toLinear;
425
+
426
+
427
+ //
428
+ // image dimensions
429
+ //
430
+
431
+ int _width;
432
+ int _height;
433
+
434
+
435
+ //
436
+ // Pointers to the start of each scanlines, to be filled on decode
437
+ // Generally, these will be filled by the subclasses.
438
+ //
439
+
440
+ std::vector< std::vector<char *> > _rowPtrs;
441
+
442
+
443
+ //
444
+ // The type of each data that _rowPtrs[i] is referring. Layout
445
+ // is in the same order as _rowPtrs[].
446
+ //
447
+
448
+ std::vector<PixelType> _type;
449
+ std::vector<SimdAlignedBuffer64f> _dctData;
450
+ };
451
+
452
+
453
+ //
454
+ // Used to decode a single channel of LOSSY_DCT data.
455
+ //
456
+
457
+ class DwaCompressor::LossyDctDecoder: public LossyDctDecoderBase
458
+ {
459
+ public:
460
+
461
+ //
462
+ // toLinear is a half-float LUT to convert the encoded values
463
+ // back to linear light. If you want to skip this step, pass
464
+ // in NULL here.
465
+ //
466
+
467
+ LossyDctDecoder
468
+ (std::vector<char *> &rowPtrs,
469
+ char *packedAc,
470
+ char *packedDc,
471
+ const unsigned short *toLinear,
472
+ int width,
473
+ int height,
474
+ PixelType type)
475
+ :
476
+ LossyDctDecoderBase(packedAc, packedDc, toLinear, width, height)
477
+ {
478
+ _rowPtrs.push_back(rowPtrs);
479
+ _type.push_back(type);
480
+ }
481
+
482
+ virtual ~LossyDctDecoder () {}
483
+ };
484
+
485
+
486
+ //
487
+ // Used to decode 3 channels of LOSSY_DCT data that
488
+ // are grouped together and color space converted.
489
+ //
490
+
491
+ class DwaCompressor::LossyDctDecoderCsc: public LossyDctDecoderBase
492
+ {
493
+ public:
494
+
495
+ //
496
+ // toLinear is a half-float LUT to convert the encoded values
497
+ // back to linear light. If you want to skip this step, pass
498
+ // in NULL here.
499
+ //
500
+
501
+ LossyDctDecoderCsc
502
+ (std::vector<char *> &rowPtrsR,
503
+ std::vector<char *> &rowPtrsG,
504
+ std::vector<char *> &rowPtrsB,
505
+ char *packedAc,
506
+ char *packedDc,
507
+ const unsigned short *toLinear,
508
+ int width,
509
+ int height,
510
+ PixelType typeR,
511
+ PixelType typeG,
512
+ PixelType typeB)
513
+ :
514
+ LossyDctDecoderBase(packedAc, packedDc, toLinear, width, height)
515
+ {
516
+ _rowPtrs.push_back(rowPtrsR);
517
+ _rowPtrs.push_back(rowPtrsG);
518
+ _rowPtrs.push_back(rowPtrsB);
519
+ _type.push_back(typeR);
520
+ _type.push_back(typeG);
521
+ _type.push_back(typeB);
522
+ }
523
+
524
+ virtual ~LossyDctDecoderCsc () {}
525
+ };
526
+
527
+
528
+ //
529
+ // Base class for encoding using the lossy DCT scheme
530
+ //
531
+
532
+ class DwaCompressor::LossyDctEncoderBase
533
+ {
534
+ public:
535
+
536
+ LossyDctEncoderBase
537
+ (float quantBaseError,
538
+ char *packedAc,
539
+ char *packedDc,
540
+ const unsigned short *toNonlinear,
541
+ int width,
542
+ int height);
543
+
544
+ virtual ~LossyDctEncoderBase ();
545
+
546
+ void execute ();
547
+
548
+ //
549
+ // These return number of items, not bytes. Each item
550
+ // is an unsigned short
551
+ //
552
+
553
+ int numAcValuesEncoded () const {return _numAcComp;}
554
+ int numDcValuesEncoded () const {return _numDcComp;}
555
+
556
+ protected:
557
+
558
+ void toZigZag (half *dst, half *src);
559
+ int countSetBits (unsigned short src);
560
+ half quantize (half src, float errorTolerance);
561
+ void rleAc (half *block, unsigned short *&acPtr);
562
+
563
+ float _quantBaseError;
564
+
565
+ int _width,
566
+ _height;
567
+ const unsigned short *_toNonlinear;
568
+
569
+ int _numAcComp,
570
+ _numDcComp;
571
+
572
+ std::vector< std::vector<const char *> > _rowPtrs;
573
+ std::vector<PixelType> _type;
574
+ std::vector<SimdAlignedBuffer64f> _dctData;
575
+
576
+
577
+ //
578
+ // Pointers to the buffers where AC and DC
579
+ // DCT components should be packed for
580
+ // lossless compression downstream
581
+ //
582
+
583
+ char *_packedAc;
584
+ char *_packedDc;
585
+
586
+
587
+ //
588
+ // Our "quantization tables" - the example JPEG tables,
589
+ // normalized so that the smallest value in each is 1.0.
590
+ // This gives us a relationship between error in DCT
591
+ // components
592
+ //
593
+
594
+ float _quantTableY[64];
595
+ float _quantTableCbCr[64];
596
+ };
597
+
598
+
599
+
600
+ //
601
+ // Single channel lossy DCT encoder
602
+ //
603
+
604
+ class DwaCompressor::LossyDctEncoder: public LossyDctEncoderBase
605
+ {
606
+ public:
607
+
608
+ LossyDctEncoder
609
+ (float quantBaseError,
610
+ std::vector<const char *> &rowPtrs,
611
+ char *packedAc,
612
+ char *packedDc,
613
+ const unsigned short *toNonlinear,
614
+ int width,
615
+ int height,
616
+ PixelType type)
617
+ :
618
+ LossyDctEncoderBase
619
+ (quantBaseError, packedAc, packedDc, toNonlinear, width, height)
620
+ {
621
+ _rowPtrs.push_back(rowPtrs);
622
+ _type.push_back(type);
623
+ }
624
+
625
+ virtual ~LossyDctEncoder () {}
626
+ };
627
+
628
+
629
+ //
630
+ // RGB channel lossy DCT encoder
631
+ //
632
+
633
+ class DwaCompressor::LossyDctEncoderCsc: public LossyDctEncoderBase
634
+ {
635
+ public:
636
+
637
+ LossyDctEncoderCsc
638
+ (float quantBaseError,
639
+ std::vector<const char *> &rowPtrsR,
640
+ std::vector<const char *> &rowPtrsG,
641
+ std::vector<const char *> &rowPtrsB,
642
+ char *packedAc,
643
+ char *packedDc,
644
+ const unsigned short *toNonlinear,
645
+ int width,
646
+ int height,
647
+ PixelType typeR,
648
+ PixelType typeG,
649
+ PixelType typeB)
650
+ :
651
+ LossyDctEncoderBase
652
+ (quantBaseError, packedAc, packedDc, toNonlinear, width, height)
653
+ {
654
+ _type.push_back(typeR);
655
+ _type.push_back(typeG);
656
+ _type.push_back(typeB);
657
+
658
+ _rowPtrs.push_back(rowPtrsR);
659
+ _rowPtrs.push_back(rowPtrsG);
660
+ _rowPtrs.push_back(rowPtrsB);
661
+ }
662
+
663
+ virtual ~LossyDctEncoderCsc () {}
664
+ };
665
+
666
+
667
+ // ==============================================================
668
+ //
669
+ // LossyDctDecoderBase
670
+ //
671
+ // --------------------------------------------------------------
672
+
673
+ DwaCompressor::LossyDctDecoderBase::LossyDctDecoderBase
674
+ (char *packedAc,
675
+ char *packedDc,
676
+ const unsigned short *toLinear,
677
+ int width,
678
+ int height)
679
+ :
680
+ _isNativeXdr(false),
681
+ _packedAcCount(0),
682
+ _packedDcCount(0),
683
+ _packedAc(packedAc),
684
+ _packedDc(packedDc),
685
+ _toLinear(toLinear),
686
+ _width(width),
687
+ _height(height)
688
+ {
689
+ if (_toLinear == 0)
690
+ _toLinear = dwaCompressorNoOp;
691
+
692
+ _isNativeXdr = GLOBAL_SYSTEM_LITTLE_ENDIAN;
693
+ }
694
+
695
+
696
+ DwaCompressor::LossyDctDecoderBase::~LossyDctDecoderBase () {}
697
+
698
+
699
+ void
700
+ DwaCompressor::LossyDctDecoderBase::execute ()
701
+ {
702
+ int numComp = _rowPtrs.size();
703
+ int lastNonZero = 0;
704
+ int numBlocksX = (int) ceil ((float)_width / 8.0f);
705
+ int numBlocksY = (int) ceil ((float)_height / 8.0f);
706
+ int leftoverX = _width - (numBlocksX-1) * 8;
707
+ int leftoverY = _height - (numBlocksY-1) * 8;
708
+
709
+ int numFullBlocksX = (int)floor ((float)_width / 8.0f);
710
+
711
+ unsigned short tmpShortNative = 0;
712
+ unsigned short tmpShortXdr = 0;
713
+ const char *tmpConstCharPtr = 0;
714
+
715
+ unsigned short *currAcComp = (unsigned short *)_packedAc;
716
+ std::vector<unsigned short *> currDcComp (_rowPtrs.size());
717
+ std::vector<SimdAlignedBuffer64us> halfZigBlock (_rowPtrs.size());
718
+
719
+ if (_type.size() != _rowPtrs.size())
720
+ throw Iex::BaseExc ("Row pointers and types mismatch in count");
721
+
722
+ if ((_rowPtrs.size() != 3) && (_rowPtrs.size() != 1))
723
+ throw Iex::NoImplExc ("Only 1 and 3 channel encoding is supported");
724
+
725
+ _dctData.resize(numComp);
726
+
727
+ //
728
+ // Allocate a temp aligned buffer to hold a rows worth of full
729
+ // 8x8 half-float blocks
730
+ //
731
+
732
+ unsigned char *rowBlockHandle = new unsigned char
733
+ [numComp * numBlocksX * 64 * sizeof(unsigned short) + _SSE_ALIGNMENT];
734
+
735
+ unsigned short *rowBlock[3];
736
+
737
+ rowBlock[0] = (unsigned short*)rowBlockHandle;
738
+
739
+ for (int i = 0; i < _SSE_ALIGNMENT; ++i)
740
+ {
741
+ if (((size_t)(rowBlockHandle + i) & _SSE_ALIGNMENT_MASK) == 0)
742
+ rowBlock[0] = (unsigned short *)(rowBlockHandle + i);
743
+ }
744
+
745
+ for (int comp = 1; comp < numComp; ++comp)
746
+ rowBlock[comp] = rowBlock[comp - 1] + numBlocksX * 64;
747
+
748
+ //
749
+ // Pack DC components together by common plane, so we can get
750
+ // a little more out of differencing them. We'll always have
751
+ // one component per block, so we can computed offsets.
752
+ //
753
+
754
+ currDcComp[0] = (unsigned short *)_packedDc;
755
+
756
+ for (unsigned int comp = 1; comp < numComp; ++comp)
757
+ currDcComp[comp] = currDcComp[comp - 1] + numBlocksX * numBlocksY;
758
+
759
+ for (int blocky = 0; blocky < numBlocksY; ++blocky)
760
+ {
761
+ int maxY = 8;
762
+
763
+ if (blocky == numBlocksY-1)
764
+ maxY = leftoverY;
765
+
766
+ int maxX = 8;
767
+
768
+ for (int blockx = 0; blockx < numBlocksX; ++blockx)
769
+ {
770
+ if (blockx == numBlocksX-1)
771
+ maxX = leftoverX;
772
+
773
+ //
774
+ // If we can detect that the block is constant values
775
+ // (all components only have DC values, and all AC is 0),
776
+ // we can do everything only on 1 value, instead of all
777
+ // 64.
778
+ //
779
+ // This won't really help for regular images, but it is
780
+ // meant more for layers with large swaths of black
781
+ //
782
+
783
+ bool blockIsConstant = true;
784
+
785
+ for (unsigned int comp = 0; comp < numComp; ++comp)
786
+ {
787
+
788
+ //
789
+ // DC component is stored separately
790
+ //
791
+
792
+ #ifdef IMF_HAVE_SSE2
793
+ {
794
+ __m128i *dst = (__m128i*)halfZigBlock[comp]._buffer;
795
+
796
+ dst[7] = _mm_setzero_si128();
797
+ dst[6] = _mm_setzero_si128();
798
+ dst[5] = _mm_setzero_si128();
799
+ dst[4] = _mm_setzero_si128();
800
+ dst[3] = _mm_setzero_si128();
801
+ dst[2] = _mm_setzero_si128();
802
+ dst[1] = _mm_setzero_si128();
803
+ dst[0] = _mm_insert_epi16
804
+ (_mm_setzero_si128(), *currDcComp[comp]++, 0);
805
+ }
806
+ #else /* IMF_HAVE_SSE2 */
807
+
808
+ memset (halfZigBlock[comp]._buffer, 0, 64 * 2);
809
+ halfZigBlock[comp]._buffer[0] = *currDcComp[comp]++;
810
+
811
+ #endif /* IMF_HAVE_SSE2 */
812
+
813
+ _packedDcCount++;
814
+
815
+ //
816
+ // UnRLE the AC. This will modify currAcComp
817
+ //
818
+
819
+ lastNonZero = unRleAc (currAcComp, halfZigBlock[comp]._buffer);
820
+
821
+ //
822
+ // Convert from XDR to NATIVE
823
+ //
824
+
825
+ if (!_isNativeXdr)
826
+ {
827
+ for (int i = 0; i < 64; ++i)
828
+ {
829
+ tmpShortXdr = halfZigBlock[comp]._buffer[i];
830
+ tmpConstCharPtr = (const char *)&tmpShortXdr;
831
+
832
+ Xdr::read<CharPtrIO> (tmpConstCharPtr, tmpShortNative);
833
+
834
+ halfZigBlock[comp]._buffer[i] = tmpShortNative;
835
+ }
836
+ }
837
+
838
+ if (lastNonZero == 0)
839
+ {
840
+ //
841
+ // DC only case - AC components are all 0
842
+ //
843
+
844
+ half h;
845
+
846
+ h.setBits (halfZigBlock[comp]._buffer[0]);
847
+ _dctData[comp]._buffer[0] = (float)h;
848
+
849
+ dctInverse8x8DcOnly (_dctData[comp]._buffer);
850
+ }
851
+ else
852
+ {
853
+ //
854
+ // We have some AC components that are non-zero.
855
+ // Can't use the 'constant block' optimization
856
+ //
857
+
858
+ blockIsConstant = false;
859
+
860
+ //
861
+ // Un-Zig zag
862
+ //
863
+
864
+ (*fromHalfZigZag)
865
+ (halfZigBlock[comp]._buffer, _dctData[comp]._buffer);
866
+
867
+ //
868
+ // Zig-Zag indices in normal layout are as follows:
869
+ //
870
+ // 0 1 3 6 10 15 21 28
871
+ // 2 4 7 11 16 22 29 36
872
+ // 5 8 12 17 23 30 37 43
873
+ // 9 13 18 24 31 38 44 49
874
+ // 14 19 25 32 39 45 50 54
875
+ // 20 26 33 40 46 51 55 58
876
+ // 27 34 41 47 52 56 59 61
877
+ // 35 42 48 53 57 60 62 63
878
+ //
879
+ // If lastNonZero is less than the first item on
880
+ // each row, we know that the whole row is zero and
881
+ // can be skipped in the row-oriented part of the
882
+ // iDCT.
883
+ //
884
+ // The unrolled logic here is:
885
+ //
886
+ // if lastNonZero < rowStartIdx[i],
887
+ // zeroedRows = rowsEmpty[i]
888
+ //
889
+ // where:
890
+ //
891
+ // const int rowStartIdx[] = {2, 5, 9, 14, 20, 27, 35};
892
+ // const int rowsEmpty[] = {7, 6, 5, 4, 3, 2, 1};
893
+ //
894
+
895
+ if (lastNonZero < 2)
896
+ dctInverse8x8_7(_dctData[comp]._buffer);
897
+ else if (lastNonZero < 5)
898
+ dctInverse8x8_6(_dctData[comp]._buffer);
899
+ else if (lastNonZero < 9)
900
+ dctInverse8x8_5(_dctData[comp]._buffer);
901
+ else if (lastNonZero < 14)
902
+ dctInverse8x8_4(_dctData[comp]._buffer);
903
+ else if (lastNonZero < 20)
904
+ dctInverse8x8_3(_dctData[comp]._buffer);
905
+ else if (lastNonZero < 27)
906
+ dctInverse8x8_2(_dctData[comp]._buffer);
907
+ else if (lastNonZero < 35)
908
+ dctInverse8x8_1(_dctData[comp]._buffer);
909
+ else
910
+ dctInverse8x8_0(_dctData[comp]._buffer);
911
+ }
912
+ }
913
+
914
+ //
915
+ // Perform the CSC
916
+ //
917
+
918
+ if (numComp == 3)
919
+ {
920
+ if (!blockIsConstant)
921
+ {
922
+ csc709Inverse64 (_dctData[0]._buffer,
923
+ _dctData[1]._buffer,
924
+ _dctData[2]._buffer);
925
+
926
+ }
927
+ else
928
+ {
929
+ csc709Inverse (_dctData[0]._buffer[0],
930
+ _dctData[1]._buffer[0],
931
+ _dctData[2]._buffer[0]);
932
+ }
933
+ }
934
+
935
+ //
936
+ // Float -> Half conversion.
937
+ //
938
+ // If the block has a constant value, just convert the first pixel.
939
+ //
940
+
941
+ for (unsigned int comp = 0; comp < numComp; ++comp)
942
+ {
943
+ if (!blockIsConstant)
944
+ {
945
+ (*convertFloatToHalf64)
946
+ (&rowBlock[comp][blockx*64], _dctData[comp]._buffer);
947
+ }
948
+ else
949
+ {
950
+ #if IMF_HAVE_SSE2
951
+
952
+ __m128i *dst = (__m128i*)&rowBlock[comp][blockx*64];
953
+
954
+ dst[0] = _mm_set1_epi16
955
+ (((half)_dctData[comp]._buffer[0]).bits());
956
+
957
+ dst[1] = dst[0];
958
+ dst[2] = dst[0];
959
+ dst[3] = dst[0];
960
+ dst[4] = dst[0];
961
+ dst[5] = dst[0];
962
+ dst[6] = dst[0];
963
+ dst[7] = dst[0];
964
+
965
+ #else /* IMF_HAVE_SSE2 */
966
+
967
+ unsigned short *dst = &rowBlock[comp][blockx*64];
968
+
969
+ dst[0] = ((half)_dctData[comp]._buffer[0]).bits();
970
+
971
+ for (int i = 1; i < 64; ++i)
972
+ {
973
+ dst[i] = dst[0];
974
+ }
975
+
976
+ #endif /* IMF_HAVE_SSE2 */
977
+ } // blockIsConstant
978
+ } // comp
979
+ } // blockx
980
+
981
+ //
982
+ // At this point, we have half-float nonlinear value blocked
983
+ // in rowBlock[][]. We need to unblock the data, transfer
984
+ // back to linear, and write the results in the _rowPtrs[].
985
+ //
986
+ // There is a fast-path for aligned rows, which helps
987
+ // things a little. Since this fast path is only valid
988
+ // for full 8-element wide blocks, the partial x blocks
989
+ // are broken into a separate loop below.
990
+ //
991
+ // At the moment, the fast path requires:
992
+ // * sse support
993
+ // * aligned row pointers
994
+ // * full 8-element wide blocks
995
+ //
996
+
997
+ for (int comp = 0; comp < numComp; ++comp)
998
+ {
999
+ //
1000
+ // Test if we can use the fast path
1001
+ //
1002
+
1003
+ #ifdef IMF_HAVE_SSE2
1004
+
1005
+ bool fastPath = true;
1006
+
1007
+ for (int y = 8 * blocky; y < 8 * blocky + maxY; ++y)
1008
+ {
1009
+ if ((size_t)_rowPtrs[comp][y] & _SSE_ALIGNMENT_MASK)
1010
+ fastPath = false;
1011
+ }
1012
+
1013
+ if (fastPath)
1014
+ {
1015
+ //
1016
+ // Handle all the full X blocks, in a fast path with sse2 and
1017
+ // aligned row pointers
1018
+ //
1019
+
1020
+ for (int y=8*blocky; y<8*blocky+maxY; ++y)
1021
+ {
1022
+ __m128i *dst = (__m128i *)_rowPtrs[comp][y];
1023
+ __m128i *src = (__m128i *)&rowBlock[comp][(y & 0x7) * 8];
1024
+
1025
+
1026
+ for (int blockx = 0; blockx < numFullBlocksX; ++blockx)
1027
+ {
1028
+ //
1029
+ // These may need some twiddling.
1030
+ // Run with multiples of 8
1031
+ //
1032
+
1033
+ _mm_prefetch ((char *)(src + 16), _MM_HINT_NTA);
1034
+
1035
+ unsigned short i0 = _mm_extract_epi16 (*src, 0);
1036
+ unsigned short i1 = _mm_extract_epi16 (*src, 1);
1037
+ unsigned short i2 = _mm_extract_epi16 (*src, 2);
1038
+ unsigned short i3 = _mm_extract_epi16 (*src, 3);
1039
+
1040
+ unsigned short i4 = _mm_extract_epi16 (*src, 4);
1041
+ unsigned short i5 = _mm_extract_epi16 (*src, 5);
1042
+ unsigned short i6 = _mm_extract_epi16 (*src, 6);
1043
+ unsigned short i7 = _mm_extract_epi16 (*src, 7);
1044
+
1045
+ i0 = _toLinear[i0];
1046
+ i1 = _toLinear[i1];
1047
+ i2 = _toLinear[i2];
1048
+ i3 = _toLinear[i3];
1049
+
1050
+ i4 = _toLinear[i4];
1051
+ i5 = _toLinear[i5];
1052
+ i6 = _toLinear[i6];
1053
+ i7 = _toLinear[i7];
1054
+
1055
+ *dst = _mm_insert_epi16 (_mm_setzero_si128(), i0, 0);
1056
+ *dst = _mm_insert_epi16 (*dst, i1, 1);
1057
+ *dst = _mm_insert_epi16 (*dst, i2, 2);
1058
+ *dst = _mm_insert_epi16 (*dst, i3, 3);
1059
+
1060
+ *dst = _mm_insert_epi16 (*dst, i4, 4);
1061
+ *dst = _mm_insert_epi16 (*dst, i5, 5);
1062
+ *dst = _mm_insert_epi16 (*dst, i6, 6);
1063
+ *dst = _mm_insert_epi16 (*dst, i7, 7);
1064
+
1065
+ src += 8;
1066
+ dst++;
1067
+ }
1068
+ }
1069
+ }
1070
+ else
1071
+ {
1072
+
1073
+ #endif /* IMF_HAVE_SSE2 */
1074
+
1075
+ //
1076
+ // Basic scalar kinda slow path for handling the full X blocks
1077
+ //
1078
+
1079
+ for (int y = 8 * blocky; y < 8 * blocky + maxY; ++y)
1080
+ {
1081
+ unsigned short *dst = (unsigned short *)_rowPtrs[comp][y];
1082
+
1083
+ for (int blockx = 0; blockx < numFullBlocksX; ++blockx)
1084
+ {
1085
+ unsigned short *src =
1086
+ &rowBlock[comp][blockx * 64 + ((y & 0x7) * 8)];
1087
+
1088
+ dst[0] = _toLinear[src[0]];
1089
+ dst[1] = _toLinear[src[1]];
1090
+ dst[2] = _toLinear[src[2]];
1091
+ dst[3] = _toLinear[src[3]];
1092
+
1093
+ dst[4] = _toLinear[src[4]];
1094
+ dst[5] = _toLinear[src[5]];
1095
+ dst[6] = _toLinear[src[6]];
1096
+ dst[7] = _toLinear[src[7]];
1097
+
1098
+ dst += 8;
1099
+ }
1100
+ }
1101
+
1102
+ #ifdef IMF_HAVE_SSE2
1103
+
1104
+ }
1105
+
1106
+ #endif /* IMF_HAVE_SSE2 */
1107
+
1108
+ //
1109
+ // If we have partial X blocks, deal with all those now
1110
+ // Since this should be minimal work, there currently
1111
+ // is only one path that should work for everyone.
1112
+ //
1113
+
1114
+ if (numFullBlocksX != numBlocksX)
1115
+ {
1116
+ for (int y = 8 * blocky; y < 8 * blocky + maxY; ++y)
1117
+ {
1118
+ unsigned short *src = (unsigned short *)
1119
+ &rowBlock[comp][numFullBlocksX * 64 + ((y & 0x7) * 8)];
1120
+
1121
+ unsigned short *dst = (unsigned short *)_rowPtrs[comp][y];
1122
+
1123
+ dst += 8 * numFullBlocksX;
1124
+
1125
+ for (int x = 0; x < maxX; ++x)
1126
+ {
1127
+ *dst++ = _toLinear[*src++];
1128
+ }
1129
+ }
1130
+ }
1131
+ } // comp
1132
+ } // blocky
1133
+
1134
+ //
1135
+ // Walk over all the channels that are of type FLOAT.
1136
+ // Convert from HALF XDR back to FLOAT XDR.
1137
+ //
1138
+
1139
+ for (unsigned int chan = 0; chan < numComp; ++chan)
1140
+ {
1141
+
1142
+ if (_type[chan] != FLOAT)
1143
+ continue;
1144
+
1145
+ std::vector<unsigned short> halfXdr (_width);
1146
+
1147
+ for (int y=0; y<_height; ++y)
1148
+ {
1149
+ char *floatXdrPtr = _rowPtrs[chan][y];
1150
+
1151
+ memcpy(&halfXdr[0], floatXdrPtr, _width*sizeof(unsigned short));
1152
+
1153
+ const char *halfXdrPtr = (const char *)(&halfXdr[0]);
1154
+
1155
+ for (int x=0; x<_width; ++x)
1156
+ {
1157
+ half tmpHalf;
1158
+
1159
+ Xdr::read<CharPtrIO> (halfXdrPtr, tmpHalf);
1160
+ Xdr::write<CharPtrIO> (floatXdrPtr, (float)tmpHalf);
1161
+
1162
+ //
1163
+ // Xdr::write and Xdr::read will advance the ptrs
1164
+ //
1165
+ }
1166
+ }
1167
+ }
1168
+
1169
+ delete[] rowBlockHandle;
1170
+ }
1171
+
1172
+
1173
+ //
1174
+ // Un-RLE the packed AC components into
1175
+ // a half buffer. The half block should
1176
+ // be the full 8x8 block (in zig-zag order
1177
+ // still), not the first AC component.
1178
+ //
1179
+ // currAcComp is advanced as bytes are decoded.
1180
+ //
1181
+ // This returns the index of the last non-zero
1182
+ // value in the buffer - with the index into zig zag
1183
+ // order data. If we return 0, we have DC only data.
1184
+ //
1185
+ // This is assuminging that halfZigBlock is zero'ed
1186
+ // prior to calling
1187
+ //
1188
+
1189
+ int
1190
+ DwaCompressor::LossyDctDecoderBase::unRleAc
1191
+ (unsigned short *&currAcComp,
1192
+ unsigned short *halfZigBlock)
1193
+ {
1194
+ //
1195
+ // Un-RLE the RLE'd blocks. If we find an item whose
1196
+ // high byte is 0xff, then insert the number of 0's
1197
+ // as indicated by the low byte.
1198
+ //
1199
+ // Otherwise, just copy the number verbaitm.
1200
+ //
1201
+
1202
+ int lastNonZero = 0;
1203
+ int dctComp = 1;
1204
+
1205
+ //
1206
+ // Start with a zero'ed block, so we don't have to
1207
+ // write when we hit a run symbol
1208
+ //
1209
+
1210
+ while (dctComp < 64)
1211
+ {
1212
+ if (*currAcComp == 0xff00)
1213
+ {
1214
+ //
1215
+ // End of block
1216
+ //
1217
+
1218
+ dctComp = 64;
1219
+
1220
+ }
1221
+ else if ((*currAcComp) >> 8 == 0xff)
1222
+ {
1223
+ //
1224
+ // Run detected! Insert 0's.
1225
+ //
1226
+ // Since the block has been zeroed, just advance the ptr
1227
+ //
1228
+
1229
+ dctComp += (*currAcComp) & 0xff;
1230
+ }
1231
+ else
1232
+ {
1233
+ //
1234
+ // Not a run, just copy over the value
1235
+ //
1236
+
1237
+ lastNonZero = dctComp;
1238
+ halfZigBlock[dctComp] = *currAcComp;
1239
+
1240
+ dctComp++;
1241
+ }
1242
+
1243
+ _packedAcCount++;
1244
+ currAcComp++;
1245
+ }
1246
+
1247
+ return lastNonZero;
1248
+ }
1249
+
1250
+
1251
+ // ==============================================================
1252
+ //
1253
+ // LossyDctEncoderBase
1254
+ //
1255
+ // --------------------------------------------------------------
1256
+
1257
+ DwaCompressor::LossyDctEncoderBase::LossyDctEncoderBase
1258
+ (float quantBaseError,
1259
+ char *packedAc,
1260
+ char *packedDc,
1261
+ const unsigned short *toNonlinear,
1262
+ int width,
1263
+ int height)
1264
+ :
1265
+ _quantBaseError(quantBaseError),
1266
+ _width(width),
1267
+ _height(height),
1268
+ _toNonlinear(toNonlinear),
1269
+ _numAcComp(0),
1270
+ _numDcComp(0),
1271
+ _packedAc(packedAc),
1272
+ _packedDc(packedDc)
1273
+ {
1274
+ //
1275
+ // Here, we take the generic JPEG quantization tables and
1276
+ // normalize them by the smallest component in each table.
1277
+ // This gives us a relationship amongst the DCT components,
1278
+ // in terms of how sensitive each component is to
1279
+ // error.
1280
+ //
1281
+ // A higher normalized value means we can quantize more,
1282
+ // and a small normalized value means we can quantize less.
1283
+ //
1284
+ // Eventually, we will want an acceptable quantization
1285
+ // error range for each component. We find this by
1286
+ // multiplying some user-specified level (_quantBaseError)
1287
+ // by the normalized table (_quantTableY, _quantTableCbCr) to
1288
+ // find the acceptable quantization error range.
1289
+ //
1290
+ // The quantization table is not needed for decoding, and
1291
+ // is not transmitted. So, if you want to get really fancy,
1292
+ // you could derive some content-dependent quantization
1293
+ // table, and the decoder would not need to be changed. But,
1294
+ // for now, we'll just use statice quantization tables.
1295
+ //
1296
+
1297
+ int jpegQuantTableY[] =
1298
+ {
1299
+ 16, 11, 10, 16, 24, 40, 51, 61,
1300
+ 12, 12, 14, 19, 26, 58, 60, 55,
1301
+ 14, 13, 16, 24, 40, 57, 69, 56,
1302
+ 14, 17, 22, 29, 51, 87, 80, 62,
1303
+ 18, 22, 37, 56, 68, 109, 103, 77,
1304
+ 24, 35, 55, 64, 81, 104, 113, 92,
1305
+ 49, 64, 78, 87, 103, 121, 120, 101,
1306
+ 72, 92, 95, 98, 112, 100, 103, 99
1307
+ };
1308
+
1309
+ int jpegQuantTableYMin = 10;
1310
+
1311
+ int jpegQuantTableCbCr[] =
1312
+ {
1313
+ 17, 18, 24, 47, 99, 99, 99, 99,
1314
+ 18, 21, 26, 66, 99, 99, 99, 99,
1315
+ 24, 26, 56, 99, 99, 99, 99, 99,
1316
+ 47, 66, 99, 99, 99, 99, 99, 99,
1317
+ 99, 99, 99, 99, 99, 99, 99, 99,
1318
+ 99, 99, 99, 99, 99, 99, 99, 99,
1319
+ 99, 99, 99, 99, 99, 99, 99, 99,
1320
+ 99, 99, 99, 99, 99, 99, 99, 99
1321
+ };
1322
+
1323
+ int jpegQuantTableCbCrMin = 17;
1324
+
1325
+ for (int idx = 0; idx < 64; ++idx)
1326
+ {
1327
+ _quantTableY[idx] = static_cast<float> (jpegQuantTableY[idx]) /
1328
+ static_cast<float> (jpegQuantTableYMin);
1329
+
1330
+ _quantTableCbCr[idx] = static_cast<float> (jpegQuantTableCbCr[idx]) /
1331
+ static_cast<float> (jpegQuantTableCbCrMin);
1332
+ }
1333
+
1334
+ if (_quantBaseError < 0)
1335
+ quantBaseError = 0;
1336
+ }
1337
+
1338
+
1339
+ DwaCompressor::LossyDctEncoderBase::~LossyDctEncoderBase ()
1340
+ {
1341
+ }
1342
+
1343
+
1344
+ //
1345
+ // Given three channels of source data, encoding by first applying
1346
+ // a color space conversion to a YCbCr space. Otherwise, if we only
1347
+ // have one channel, just encode it as is.
1348
+ //
1349
+ // Other numbers of channels are somewhat unexpected at this point,
1350
+ // and will throw an exception.
1351
+ //
1352
+
1353
+ void
1354
+ DwaCompressor::LossyDctEncoderBase::execute ()
1355
+ {
1356
+ int numBlocksX = (int)ceil ((float)_width / 8.0f);
1357
+ int numBlocksY = (int)ceil ((float)_height/ 8.0f);
1358
+
1359
+ half halfZigCoef[64];
1360
+ half halfCoef[64];
1361
+
1362
+ std::vector<unsigned short *> currDcComp (_rowPtrs.size());
1363
+ unsigned short *currAcComp = (unsigned short *)_packedAc;
1364
+
1365
+ _dctData.resize (_rowPtrs.size());
1366
+ _numAcComp = 0;
1367
+ _numDcComp = 0;
1368
+
1369
+ assert (_type.size() == _rowPtrs.size());
1370
+ assert ((_rowPtrs.size() == 3) || (_rowPtrs.size() == 1));
1371
+
1372
+ //
1373
+ // Allocate a temp half buffer to quantize into for
1374
+ // any FLOAT source channels.
1375
+ //
1376
+
1377
+ int tmpHalfBufferElements = 0;
1378
+
1379
+ for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan)
1380
+ if (_type[chan] == FLOAT)
1381
+ tmpHalfBufferElements += _width * _height;
1382
+
1383
+ std::vector<unsigned short> tmpHalfBuffer (tmpHalfBufferElements);
1384
+
1385
+ char *tmpHalfBufferPtr = 0;
1386
+
1387
+ if (tmpHalfBufferElements)
1388
+ tmpHalfBufferPtr = (char *)&tmpHalfBuffer[0];
1389
+
1390
+ //
1391
+ // Run over all the float scanlines, quantizing,
1392
+ // and re-assigning _rowPtr[y]. We need to translate
1393
+ // FLOAT XDR to HALF XDR.
1394
+ //
1395
+
1396
+ for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan)
1397
+ {
1398
+ if (_type[chan] != FLOAT)
1399
+ continue;
1400
+
1401
+ for (int y = 0; y < _height; ++y)
1402
+ {
1403
+ float src = 0;
1404
+ const char *srcXdr = _rowPtrs[chan][y];
1405
+ char *dstXdr = tmpHalfBufferPtr;
1406
+
1407
+ for (int x = 0; x < _width; ++x)
1408
+ {
1409
+
1410
+ Xdr::read<CharPtrIO> (srcXdr, src);
1411
+ Xdr::write<CharPtrIO> (dstXdr, ((half)src).bits());
1412
+
1413
+ //
1414
+ // Xdr::read and Xdr::write will advance the ptr
1415
+ //
1416
+ }
1417
+
1418
+ _rowPtrs[chan][y] = (const char *)tmpHalfBufferPtr;
1419
+ tmpHalfBufferPtr += _width * sizeof (unsigned short);
1420
+ }
1421
+ }
1422
+
1423
+ //
1424
+ // Pack DC components together by common plane, so we can get
1425
+ // a little more out of differencing them. We'll always have
1426
+ // one component per block, so we can computed offsets.
1427
+ //
1428
+
1429
+ currDcComp[0] = (unsigned short *)_packedDc;
1430
+
1431
+ for (unsigned int chan = 1; chan < _rowPtrs.size(); ++chan)
1432
+ currDcComp[chan] = currDcComp[chan-1] + numBlocksX * numBlocksY;
1433
+
1434
+ for (int blocky = 0; blocky < numBlocksY; ++blocky)
1435
+ {
1436
+ for (int blockx = 0; blockx < numBlocksX; ++blockx)
1437
+ {
1438
+ half h;
1439
+ unsigned short tmpShortXdr, tmpShortNative;
1440
+ char *tmpCharPtr;
1441
+
1442
+ for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan)
1443
+ {
1444
+ //
1445
+ // Break the source into 8x8 blocks. If we don't
1446
+ // fit at the edges, mirror.
1447
+ //
1448
+ // Also, convert from linear to nonlinear representation.
1449
+ // Our source is assumed to be XDR, and we need to convert
1450
+ // to NATIVE prior to converting to float.
1451
+ //
1452
+ // If we're converting linear -> nonlinear, assume that the
1453
+ // XDR -> NATIVE conversion is built into the lookup. Otherwise,
1454
+ // we'll need to explicitly do it.
1455
+ //
1456
+
1457
+ for (int y = 0; y < 8; ++y)
1458
+ {
1459
+ for (int x = 0; x < 8; ++x)
1460
+ {
1461
+ int vx = 8 * blockx + x;
1462
+ int vy = 8 * blocky + y;
1463
+
1464
+ if (vx >= _width)
1465
+ vx = _width - (vx - (_width - 1));
1466
+
1467
+ if (vx < 0) vx = _width-1;
1468
+
1469
+ if (vy >=_height)
1470
+ vy = _height - (vy - (_height - 1));
1471
+
1472
+ if (vy < 0) vy = _height-1;
1473
+
1474
+ tmpShortXdr =
1475
+ ((const unsigned short *)(_rowPtrs[chan])[vy])[vx];
1476
+
1477
+ if (_toNonlinear)
1478
+ {
1479
+ h.setBits (_toNonlinear[tmpShortXdr]);
1480
+ }
1481
+ else
1482
+ {
1483
+ const char *tmpConstCharPtr =
1484
+ (const char *)(&tmpShortXdr);
1485
+
1486
+ Xdr::read<CharPtrIO>
1487
+ (tmpConstCharPtr, tmpShortNative);
1488
+
1489
+ h.setBits(tmpShortNative);
1490
+ }
1491
+
1492
+ _dctData[chan]._buffer[y * 8 + x] = (float)h;
1493
+ } // x
1494
+ } // y
1495
+ } // chan
1496
+
1497
+ //
1498
+ // Color space conversion
1499
+ //
1500
+
1501
+ if (_rowPtrs.size() == 3)
1502
+ {
1503
+ csc709Forward64 (_dctData[0]._buffer,
1504
+ _dctData[1]._buffer,
1505
+ _dctData[2]._buffer);
1506
+ }
1507
+
1508
+ for (unsigned int chan = 0; chan < _rowPtrs.size(); ++chan)
1509
+ {
1510
+ //
1511
+ // Forward DCT
1512
+ //
1513
+
1514
+ dctForward8x8(_dctData[chan]._buffer);
1515
+
1516
+ //
1517
+ // Quantize to half, and zigzag
1518
+ //
1519
+
1520
+ if (chan == 0)
1521
+ {
1522
+ for (int i = 0; i < 64; ++i)
1523
+ {
1524
+ halfCoef[i] =
1525
+ quantize ((half)_dctData[chan]._buffer[i],
1526
+ _quantBaseError*_quantTableY[i]);
1527
+ }
1528
+ }
1529
+ else
1530
+ {
1531
+ for (int i = 0; i < 64; ++i)
1532
+ {
1533
+ halfCoef[i] =
1534
+ quantize ((half)_dctData[chan]._buffer[i],
1535
+ _quantBaseError*_quantTableCbCr[i]);
1536
+ }
1537
+ }
1538
+
1539
+ toZigZag (halfZigCoef, halfCoef);
1540
+
1541
+ //
1542
+ // Convert from NATIVE back to XDR, before we write out
1543
+ //
1544
+
1545
+ for (int i = 0; i < 64; ++i)
1546
+ {
1547
+ tmpCharPtr = (char *)&tmpShortXdr;
1548
+ Xdr::write<CharPtrIO>(tmpCharPtr, halfZigCoef[i].bits());
1549
+ halfZigCoef[i].setBits(tmpShortXdr);
1550
+ }
1551
+
1552
+ //
1553
+ // Save the DC component separately, to be compressed on
1554
+ // its own.
1555
+ //
1556
+
1557
+ *currDcComp[chan]++ = halfZigCoef[0].bits();
1558
+ _numDcComp++;
1559
+
1560
+ //
1561
+ // Then RLE the AC components (which will record the count
1562
+ // of the resulting number of items)
1563
+ //
1564
+
1565
+ rleAc (halfZigCoef, currAcComp);
1566
+ } // chan
1567
+ } // blockx
1568
+ } // blocky
1569
+ }
1570
+
1571
+
1572
+ //
1573
+ // Reorder from zig-zag order to normal ordering
1574
+ //
1575
+
1576
+ void
1577
+ DwaCompressor::LossyDctEncoderBase::toZigZag (half *dst, half *src)
1578
+ {
1579
+ const int remap[] =
1580
+ {
1581
+ 0,
1582
+ 1, 8,
1583
+ 16, 9, 2,
1584
+ 3, 10, 17, 24,
1585
+ 32, 25, 18, 11, 4,
1586
+ 5, 12, 19, 26, 33, 40,
1587
+ 48, 41, 34, 27, 20, 13, 6,
1588
+ 7, 14, 21, 28, 35, 42, 49, 56,
1589
+ 57, 50, 43, 36, 29, 22, 15,
1590
+ 23, 30, 37, 44, 51, 58,
1591
+ 59, 52, 45, 38, 31,
1592
+ 39, 46, 53, 60,
1593
+ 61, 54, 47,
1594
+ 55, 62,
1595
+ 63
1596
+ };
1597
+
1598
+ for (int i=0; i<64; ++i)
1599
+ dst[i] = src[remap[i]];
1600
+ }
1601
+
1602
+
1603
+ //
1604
+ // Precomputing the bit count runs faster than using
1605
+ // the builtin instruction, at least in one case..
1606
+ //
1607
+ // Precomputing 8-bits is no slower than 16-bits,
1608
+ // and saves a fair bit of overhead..
1609
+ //
1610
+
1611
+ int
1612
+ DwaCompressor::LossyDctEncoderBase::countSetBits (unsigned short src)
1613
+ {
1614
+ static const unsigned short numBitsSet[256] =
1615
+ {
1616
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
1617
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
1618
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
1619
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
1620
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
1621
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
1622
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
1623
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
1624
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
1625
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
1626
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
1627
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
1628
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
1629
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
1630
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
1631
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
1632
+ };
1633
+
1634
+ return numBitsSet[src & 0xff] + numBitsSet[src >> 8];
1635
+ }
1636
+
1637
+
1638
+ //
1639
+ // Take a DCT coefficient, as well as an acceptable error. Search
1640
+ // nearby values within the error tolerance, that have fewer
1641
+ // bits set.
1642
+ //
1643
+ // The list of candidates has been pre-computed and sorted
1644
+ // in order of increasing numbers of bits set. This way, we
1645
+ // can stop searching as soon as we find a candidate that
1646
+ // is within the error tolerance.
1647
+ //
1648
+
1649
+ half
1650
+ DwaCompressor::LossyDctEncoderBase::quantize (half src, float errorTolerance)
1651
+ {
1652
+ half tmp;
1653
+ float srcFloat = (float)src;
1654
+ int numSetBits = countSetBits(src.bits());
1655
+ const unsigned short *closest = closestData + closestDataOffset[src.bits()];
1656
+
1657
+ for (int targetNumSetBits = numSetBits - 1;
1658
+ targetNumSetBits >= 0;
1659
+ --targetNumSetBits)
1660
+ {
1661
+ tmp.setBits (*closest);
1662
+
1663
+ if (fabs ((float)tmp - srcFloat) < errorTolerance)
1664
+ return tmp;
1665
+
1666
+ closest++;
1667
+ }
1668
+
1669
+ return src;
1670
+ }
1671
+
1672
+
1673
+ //
1674
+ // RLE the zig-zag of the AC components + copy over
1675
+ // into another tmp buffer
1676
+ //
1677
+ // Try to do a simple RLE scheme to reduce run's of 0's. This
1678
+ // differs from the jpeg EOB case, since EOB just indicates that
1679
+ // the rest of the block is zero. In our case, we have lots of
1680
+ // NaN symbols, which shouldn't be allowed to occur in DCT
1681
+ // coefficents - so we'll use them for encoding runs.
1682
+ //
1683
+ // If the high byte is 0xff, then we have a run of 0's, of length
1684
+ // given by the low byte. For example, 0xff03 would be a run
1685
+ // of 3 0's, starting at the current location.
1686
+ //
1687
+ // block is our block of 64 coefficients
1688
+ // acPtr a pointer to back the RLE'd values into.
1689
+ //
1690
+ // This will advance the counter, _numAcComp.
1691
+ //
1692
+
1693
+ void
1694
+ DwaCompressor::LossyDctEncoderBase::rleAc
1695
+ (half *block,
1696
+ unsigned short *&acPtr)
1697
+ {
1698
+ int dctComp = 1;
1699
+ unsigned short rleSymbol = 0x0;
1700
+
1701
+ while (dctComp < 64)
1702
+ {
1703
+ int runLen = 1;
1704
+
1705
+ //
1706
+ // If we don't have a 0, output verbatim
1707
+ //
1708
+
1709
+ if (block[dctComp].bits() != rleSymbol)
1710
+ {
1711
+ *acPtr++ = block[dctComp].bits();
1712
+ _numAcComp++;
1713
+
1714
+ dctComp += runLen;
1715
+ continue;
1716
+ }
1717
+
1718
+ //
1719
+ // We're sitting on a 0, so see how big the run is.
1720
+ //
1721
+
1722
+ while ((dctComp+runLen < 64) &&
1723
+ (block[dctComp+runLen].bits() == rleSymbol))
1724
+ {
1725
+ runLen++;
1726
+ }
1727
+
1728
+ //
1729
+ // If the run len is too small, just output verbatim
1730
+ // otherwise output our run token
1731
+ //
1732
+ // Originally, we wouldn't have a separate symbol for
1733
+ // "end of block". But in some experimentation, it looks
1734
+ // like using 0xff00 for "end of block" can save a bit
1735
+ // of space.
1736
+ //
1737
+
1738
+ if (runLen == 1)
1739
+ {
1740
+ runLen = 1;
1741
+ *acPtr++ = block[dctComp].bits();
1742
+ _numAcComp++;
1743
+
1744
+ //
1745
+ // Using 0xff00 for "end of block"
1746
+ //
1747
+ }
1748
+ else if (runLen + dctComp == 64)
1749
+ {
1750
+ //
1751
+ // Signal EOB
1752
+ //
1753
+
1754
+ *acPtr++ = 0xff00;
1755
+ _numAcComp++;
1756
+ }
1757
+ else
1758
+ {
1759
+ //
1760
+ // Signal normal run
1761
+ //
1762
+
1763
+ *acPtr++ = 0xff00 | runLen;
1764
+ _numAcComp++;
1765
+ }
1766
+
1767
+ //
1768
+ // Advance by runLen
1769
+ //
1770
+
1771
+ dctComp += runLen;
1772
+ }
1773
+ }
1774
+
1775
+
1776
+ // ==============================================================
1777
+ //
1778
+ // DwaCompressor
1779
+ //
1780
+ // --------------------------------------------------------------
1781
+
1782
+ //
1783
+ // DwaCompressor()
1784
+ //
1785
+
1786
+ DwaCompressor::DwaCompressor
1787
+ (const Header &hdr,
1788
+ int maxScanLineSize,
1789
+ int numScanLines,
1790
+ AcCompression acCompression)
1791
+ :
1792
+ Compressor(hdr),
1793
+ _acCompression(acCompression),
1794
+ _maxScanLineSize(maxScanLineSize),
1795
+ _numScanLines(numScanLines),
1796
+ _channels(hdr.channels()),
1797
+ _packedAcBuffer(0),
1798
+ _packedAcBufferSize(0),
1799
+ _packedDcBuffer(0),
1800
+ _packedDcBufferSize(0),
1801
+ _rleBuffer(0),
1802
+ _rleBufferSize(0),
1803
+ _outBuffer(0),
1804
+ _outBufferSize(0),
1805
+ _zip(0),
1806
+ _dwaCompressionLevel(45.0)
1807
+ {
1808
+ _min[0] = hdr.dataWindow().min.x;
1809
+ _min[1] = hdr.dataWindow().min.y;
1810
+ _max[0] = hdr.dataWindow().max.x;
1811
+ _max[1] = hdr.dataWindow().max.y;
1812
+
1813
+ for (int i=0; i < NUM_COMPRESSOR_SCHEMES; ++i)
1814
+ {
1815
+ _planarUncBuffer[i] = 0;
1816
+ _planarUncBufferSize[i] = 0;
1817
+ }
1818
+
1819
+ //
1820
+ // Check the header for a quality attribute
1821
+ //
1822
+
1823
+ if (hasDwaCompressionLevel (hdr))
1824
+ _dwaCompressionLevel = dwaCompressionLevel (hdr);
1825
+ }
1826
+
1827
+
1828
+ DwaCompressor::~DwaCompressor()
1829
+ {
1830
+ delete[] _packedAcBuffer;
1831
+ delete[] _packedDcBuffer;
1832
+ delete[] _rleBuffer;
1833
+ delete[] _outBuffer;
1834
+ delete _zip;
1835
+
1836
+ for (int i=0; i<NUM_COMPRESSOR_SCHEMES; ++i)
1837
+ delete[] _planarUncBuffer[i];
1838
+ }
1839
+
1840
+
1841
+ int
1842
+ DwaCompressor::numScanLines() const
1843
+ {
1844
+ return _numScanLines;
1845
+ }
1846
+
1847
+
1848
+ Imf::Compressor::Format
1849
+ DwaCompressor::format() const
1850
+ {
1851
+ if (GLOBAL_SYSTEM_LITTLE_ENDIAN)
1852
+ return NATIVE;
1853
+ else
1854
+ return XDR;
1855
+ }
1856
+
1857
+
1858
+ int
1859
+ DwaCompressor::compress
1860
+ (const char *inPtr,
1861
+ int inSize,
1862
+ int minY,
1863
+ const char *&outPtr)
1864
+ {
1865
+ return compress
1866
+ (inPtr,
1867
+ inSize,
1868
+ Imath::Box2i (Imath::V2i (_min[0], minY),
1869
+ Imath::V2i (_max[0], minY + numScanLines() - 1)),
1870
+ outPtr);
1871
+ }
1872
+
1873
+
1874
+ int
1875
+ DwaCompressor::compressTile
1876
+ (const char *inPtr,
1877
+ int inSize,
1878
+ Imath::Box2i range,
1879
+ const char *&outPtr)
1880
+ {
1881
+ return compress (inPtr, inSize, range, outPtr);
1882
+ }
1883
+
1884
+
1885
+ int
1886
+ DwaCompressor::compress
1887
+ (const char *inPtr,
1888
+ int inSize,
1889
+ Imath::Box2i range,
1890
+ const char *&outPtr)
1891
+ {
1892
+ const char *inDataPtr = inPtr;
1893
+ char *packedAcEnd = 0;
1894
+ char *packedDcEnd = 0;
1895
+ int fileVersion = 2; // Starting with 2, we write the channel
1896
+ // classification rules into the file
1897
+
1898
+ if (fileVersion < 2)
1899
+ initializeLegacyChannelRules();
1900
+ else
1901
+ initializeDefaultChannelRules();
1902
+
1903
+ size_t outBufferSize = 0;
1904
+ initializeBuffers(outBufferSize);
1905
+
1906
+ unsigned short channelRuleSize = 0;
1907
+ std::vector<Classifier> channelRules;
1908
+ if (fileVersion >= 2)
1909
+ {
1910
+ relevantChannelRules(channelRules);
1911
+
1912
+ channelRuleSize = Xdr::size<unsigned short>();
1913
+ for (size_t i = 0; i < channelRules.size(); ++i)
1914
+ channelRuleSize += channelRules[i].size();
1915
+ }
1916
+
1917
+ //
1918
+ // Remember to allocate _outBuffer, if we haven't done so already.
1919
+ //
1920
+
1921
+ outBufferSize += channelRuleSize;
1922
+ if (outBufferSize > _outBufferSize)
1923
+ {
1924
+ _outBufferSize = outBufferSize;
1925
+ if (_outBuffer == 0)
1926
+ delete[] _outBuffer;
1927
+ _outBuffer = new char[outBufferSize];
1928
+ }
1929
+
1930
+ char *outDataPtr = &_outBuffer[NUM_SIZES_SINGLE * sizeof(Imf::Int64) +
1931
+ channelRuleSize];
1932
+
1933
+ //
1934
+ // We might not be dealing with any color data, in which
1935
+ // case the AC buffer size will be 0, and deferencing
1936
+ // a vector will not be a good thing to do.
1937
+ //
1938
+
1939
+ if (_packedAcBuffer)
1940
+ packedAcEnd = _packedAcBuffer;
1941
+
1942
+ if (_packedDcBuffer)
1943
+ packedDcEnd = _packedDcBuffer;
1944
+
1945
+ #define OBIDX(x) (Int64 *)&_outBuffer[x * sizeof (Int64)]
1946
+
1947
+ Int64 *version = OBIDX (VERSION);
1948
+ Int64 *unknownUncompressedSize = OBIDX (UNKNOWN_UNCOMPRESSED_SIZE);
1949
+ Int64 *unknownCompressedSize = OBIDX (UNKNOWN_COMPRESSED_SIZE);
1950
+ Int64 *acCompressedSize = OBIDX (AC_COMPRESSED_SIZE);
1951
+ Int64 *dcCompressedSize = OBIDX (DC_COMPRESSED_SIZE);
1952
+ Int64 *rleCompressedSize = OBIDX (RLE_COMPRESSED_SIZE);
1953
+ Int64 *rleUncompressedSize = OBIDX (RLE_UNCOMPRESSED_SIZE);
1954
+ Int64 *rleRawSize = OBIDX (RLE_RAW_SIZE);
1955
+
1956
+ Int64 *totalAcUncompressedCount = OBIDX (AC_UNCOMPRESSED_COUNT);
1957
+ Int64 *totalDcUncompressedCount = OBIDX (DC_UNCOMPRESSED_COUNT);
1958
+
1959
+ Int64 *acCompression = OBIDX (AC_COMPRESSION);
1960
+
1961
+ int minX = range.min.x;
1962
+ int maxX = std::min(range.max.x, _max[0]);
1963
+ int minY = range.min.y;
1964
+ int maxY = std::min(range.max.y, _max[1]);
1965
+
1966
+ //
1967
+ // Zero all the numbers in the chunk header
1968
+ //
1969
+
1970
+ memset (_outBuffer, 0, NUM_SIZES_SINGLE * sizeof (Int64));
1971
+
1972
+ //
1973
+ // Setup the AC compression strategy and the version in the data block,
1974
+ // then write the relevant channel classification rules if needed
1975
+ //
1976
+ *version = fileVersion;
1977
+ *acCompression = _acCompression;
1978
+
1979
+ setupChannelData (minX, minY, maxX, maxY);
1980
+
1981
+ if (fileVersion >= 2)
1982
+ {
1983
+ char *writePtr = &_outBuffer[NUM_SIZES_SINGLE * sizeof(Imf::Int64)];
1984
+ Xdr::write<CharPtrIO> (writePtr, channelRuleSize);
1985
+
1986
+ for (size_t i = 0; i < channelRules.size(); ++i)
1987
+ channelRules[i].write(writePtr);
1988
+ }
1989
+
1990
+ //
1991
+ // Determine the start of each row in the input buffer
1992
+ // Channels are interleaved by scanline
1993
+ //
1994
+
1995
+ std::vector<bool> encodedChannels (_channelData.size());
1996
+ std::vector< std::vector<const char *> > rowPtrs (_channelData.size());
1997
+
1998
+ for (unsigned int chan = 0; chan < _channelData.size(); ++chan)
1999
+ encodedChannels[chan] = false;
2000
+
2001
+ inDataPtr = inPtr;
2002
+
2003
+ for (int y = minY; y <= maxY; ++y)
2004
+ {
2005
+ for (unsigned int chan = 0; chan < _channelData.size(); ++chan)
2006
+ {
2007
+
2008
+ ChannelData *cd = &_channelData[chan];
2009
+
2010
+ if (Imath::modp(y, cd->ySampling) != 0)
2011
+ continue;
2012
+
2013
+ rowPtrs[chan].push_back(inDataPtr);
2014
+ inDataPtr += cd->width * Imf::pixelTypeSize(cd->type);
2015
+ }
2016
+ }
2017
+
2018
+ inDataPtr = inPtr;
2019
+
2020
+ //
2021
+ // Make a pass over all our CSC sets and try to encode them first
2022
+ //
2023
+
2024
+ for (unsigned int csc = 0; csc < _cscSets.size(); ++csc)
2025
+ {
2026
+
2027
+ LossyDctEncoderCsc encoder
2028
+ (_dwaCompressionLevel / 100000.f,
2029
+ rowPtrs[_cscSets[csc].idx[0]],
2030
+ rowPtrs[_cscSets[csc].idx[1]],
2031
+ rowPtrs[_cscSets[csc].idx[2]],
2032
+ packedAcEnd,
2033
+ packedDcEnd,
2034
+ dwaCompressorToNonlinear,
2035
+ _channelData[_cscSets[csc].idx[0]].width,
2036
+ _channelData[_cscSets[csc].idx[0]].height,
2037
+ _channelData[_cscSets[csc].idx[0]].type,
2038
+ _channelData[_cscSets[csc].idx[1]].type,
2039
+ _channelData[_cscSets[csc].idx[2]].type);
2040
+
2041
+ encoder.execute();
2042
+
2043
+ *totalAcUncompressedCount += encoder.numAcValuesEncoded();
2044
+ *totalDcUncompressedCount += encoder.numDcValuesEncoded();
2045
+
2046
+ packedAcEnd += encoder.numAcValuesEncoded() * sizeof(unsigned short);
2047
+ packedDcEnd += encoder.numDcValuesEncoded() * sizeof(unsigned short);
2048
+
2049
+ encodedChannels[_cscSets[csc].idx[0]] = true;
2050
+ encodedChannels[_cscSets[csc].idx[1]] = true;
2051
+ encodedChannels[_cscSets[csc].idx[2]] = true;
2052
+ }
2053
+
2054
+ for (unsigned int chan = 0; chan < _channelData.size(); ++chan)
2055
+ {
2056
+ ChannelData *cd = &_channelData[chan];
2057
+
2058
+ if (encodedChannels[chan])
2059
+ continue;
2060
+
2061
+ switch (cd->compression)
2062
+ {
2063
+ case LOSSY_DCT:
2064
+
2065
+ //
2066
+ // For LOSSY_DCT, treat this just like the CSC'd case,
2067
+ // but only operate on one channel
2068
+ //
2069
+
2070
+ {
2071
+ const unsigned short *nonlinearLut = 0;
2072
+
2073
+ if (!cd->pLinear)
2074
+ nonlinearLut = dwaCompressorToNonlinear;
2075
+
2076
+ LossyDctEncoder encoder
2077
+ (_dwaCompressionLevel / 100000.f,
2078
+ rowPtrs[chan],
2079
+ packedAcEnd,
2080
+ packedDcEnd,
2081
+ nonlinearLut,
2082
+ cd->width,
2083
+ cd->height,
2084
+ cd->type);
2085
+
2086
+ encoder.execute();
2087
+
2088
+ *totalAcUncompressedCount += encoder.numAcValuesEncoded();
2089
+ *totalDcUncompressedCount += encoder.numDcValuesEncoded();
2090
+
2091
+ packedAcEnd +=
2092
+ encoder.numAcValuesEncoded() * sizeof (unsigned short);
2093
+
2094
+ packedDcEnd +=
2095
+ encoder.numDcValuesEncoded() * sizeof (unsigned short);
2096
+ }
2097
+
2098
+ break;
2099
+
2100
+ case RLE:
2101
+
2102
+ //
2103
+ // For RLE, bash the bytes up so that the first bytes of each
2104
+ // pixel are contingous, as are the second bytes, and so on.
2105
+ //
2106
+
2107
+ for (unsigned int y = 0; y < rowPtrs[chan].size(); ++y)
2108
+ {
2109
+ const char *row = rowPtrs[chan][y];
2110
+
2111
+ for (int x = 0; x < cd->width; ++x)
2112
+ {
2113
+ for (int byte = 0;
2114
+ byte < Imf::pixelTypeSize (cd->type);
2115
+ ++byte)
2116
+ {
2117
+
2118
+ *cd->planarUncRleEnd[byte]++ = *row++;
2119
+ }
2120
+ }
2121
+
2122
+ *rleRawSize += cd->width * Imf::pixelTypeSize(cd->type);
2123
+ }
2124
+
2125
+ break;
2126
+
2127
+ case UNKNOWN:
2128
+
2129
+ //
2130
+ // Otherwise, just copy data over verbatim
2131
+ //
2132
+
2133
+ {
2134
+ int scanlineSize = cd->width * Imf::pixelTypeSize(cd->type);
2135
+
2136
+ for (unsigned int y = 0; y < rowPtrs[chan].size(); ++y)
2137
+ {
2138
+ memcpy (cd->planarUncBufferEnd,
2139
+ rowPtrs[chan][y],
2140
+ scanlineSize);
2141
+
2142
+ cd->planarUncBufferEnd += scanlineSize;
2143
+ }
2144
+
2145
+ *unknownUncompressedSize += cd->planarUncSize;
2146
+ }
2147
+
2148
+ break;
2149
+
2150
+ default:
2151
+
2152
+ assert (false);
2153
+ }
2154
+
2155
+ encodedChannels[chan] = true;
2156
+ }
2157
+
2158
+ //
2159
+ // Pack the Unknown data into the output buffer first. Instead of
2160
+ // just copying it uncompressed, try zlib compression at least.
2161
+ //
2162
+
2163
+ if (*unknownUncompressedSize > 0)
2164
+ {
2165
+ uLongf inSize = (uLongf)(*unknownUncompressedSize);
2166
+ uLongf outSize = (uLongf)(ceil ((float)inSize * 1.01f) + 100);
2167
+
2168
+ if (Z_OK != ::compress2 ((Bytef *)outDataPtr,
2169
+ &outSize,
2170
+ (const Bytef *)_planarUncBuffer[UNKNOWN],
2171
+ inSize,
2172
+ 9))
2173
+ {
2174
+ throw Iex::BaseExc ("Data compression (zlib) failed.");
2175
+ }
2176
+
2177
+ outDataPtr += outSize;
2178
+ *unknownCompressedSize = outSize;
2179
+ }
2180
+
2181
+ //
2182
+ // Now, pack all the Lossy DCT coefficients into our output
2183
+ // buffer, with Huffman encoding.
2184
+ //
2185
+ // Also, record the compressed size and the number of
2186
+ // uncompressed componentns we have.
2187
+ //
2188
+
2189
+ if (*totalAcUncompressedCount > 0)
2190
+ {
2191
+ switch (_acCompression)
2192
+ {
2193
+ case STATIC_HUFFMAN:
2194
+
2195
+ *acCompressedSize = (int)
2196
+ hufCompress((unsigned short *)_packedAcBuffer,
2197
+ (int)*totalAcUncompressedCount,
2198
+ outDataPtr);
2199
+ break;
2200
+
2201
+ case DEFLATE:
2202
+
2203
+ {
2204
+ uLongf destLen = (uLongf)
2205
+ (2 * (*totalAcUncompressedCount) * sizeof (unsigned short));
2206
+
2207
+ if (Z_OK != ::compress2
2208
+ ((Bytef *)outDataPtr,
2209
+ &destLen,
2210
+ (Bytef *)_packedAcBuffer,
2211
+ (uLong)(*totalAcUncompressedCount
2212
+ * sizeof (unsigned short)),
2213
+ 9))
2214
+ {
2215
+ throw Iex::InputExc ("Data compression (zlib) failed.");
2216
+ }
2217
+
2218
+ *acCompressedSize = destLen;
2219
+ }
2220
+
2221
+ break;
2222
+
2223
+ default:
2224
+
2225
+ assert (false);
2226
+ }
2227
+
2228
+ outDataPtr += *acCompressedSize;
2229
+ }
2230
+
2231
+ //
2232
+ // Handle the DC components separately
2233
+ //
2234
+
2235
+ if (*totalDcUncompressedCount > 0)
2236
+ {
2237
+ *dcCompressedSize = _zip->compress
2238
+ (_packedDcBuffer,
2239
+ (int)(*totalDcUncompressedCount) * sizeof (unsigned short),
2240
+ outDataPtr);
2241
+
2242
+ outDataPtr += *dcCompressedSize;
2243
+ }
2244
+
2245
+ //
2246
+ // If we have RLE data, first RLE encode it and set the uncompressed
2247
+ // size. Then, deflate the results and set the compressed size.
2248
+ //
2249
+
2250
+ if (*rleRawSize > 0)
2251
+ {
2252
+ *rleUncompressedSize = rleCompress
2253
+ ((int)(*rleRawSize),
2254
+ _planarUncBuffer[RLE],
2255
+ (signed char *)_rleBuffer);
2256
+
2257
+ uLongf dstLen =
2258
+ (uLongf)ceil (1.01f * (float) * rleUncompressedSize) + 24;
2259
+
2260
+ if (Z_OK != ::compress2
2261
+ ((Bytef *)outDataPtr,
2262
+ &dstLen,
2263
+ (Bytef *)_rleBuffer,
2264
+ (uLong)(*rleUncompressedSize),
2265
+ 9))
2266
+ {
2267
+ throw Iex::BaseExc ("Error compressing RLE'd data.");
2268
+ }
2269
+
2270
+ *rleCompressedSize = dstLen;
2271
+ outDataPtr += *rleCompressedSize;
2272
+ }
2273
+
2274
+ //
2275
+ // Flip the counters to XDR format
2276
+ //
2277
+
2278
+ for (int i = 0; i < NUM_SIZES_SINGLE; ++i)
2279
+ {
2280
+ Int64 src = *(((Int64 *)_outBuffer) + i);
2281
+ char *dst = (char *)(((Int64 *)_outBuffer) + i);
2282
+
2283
+ Xdr::write<CharPtrIO> (dst, src);
2284
+ }
2285
+
2286
+ //
2287
+ // We're done - compute the number of bytes we packed
2288
+ //
2289
+
2290
+ outPtr = _outBuffer;
2291
+
2292
+ return static_cast<int>(outDataPtr - _outBuffer + 1);
2293
+ }
2294
+
2295
+
2296
+ int
2297
+ DwaCompressor::uncompress
2298
+ (const char *inPtr,
2299
+ int inSize,
2300
+ int minY,
2301
+ const char *&outPtr)
2302
+ {
2303
+ return uncompress (inPtr,
2304
+ inSize,
2305
+ Imath::Box2i (Imath::V2i (_min[0], minY),
2306
+ Imath::V2i (_max[0], minY + numScanLines() - 1)),
2307
+ outPtr);
2308
+ }
2309
+
2310
+
2311
+ int
2312
+ DwaCompressor::uncompressTile
2313
+ (const char *inPtr,
2314
+ int inSize,
2315
+ Imath::Box2i range,
2316
+ const char *&outPtr)
2317
+ {
2318
+ return uncompress (inPtr, inSize, range, outPtr);
2319
+ }
2320
+
2321
+
2322
+ int
2323
+ DwaCompressor::uncompress
2324
+ (const char *inPtr,
2325
+ int inSize,
2326
+ Imath::Box2i range,
2327
+ const char *&outPtr)
2328
+ {
2329
+ int minX = range.min.x;
2330
+ int maxX = std::min (range.max.x, _max[0]);
2331
+ int minY = range.min.y;
2332
+ int maxY = std::min (range.max.y, _max[1]);
2333
+
2334
+ int headerSize = NUM_SIZES_SINGLE*sizeof(Int64);
2335
+ if (inSize < headerSize)
2336
+ {
2337
+ throw Iex::InputExc("Error uncompressing DWA data"
2338
+ "(truncated header).");
2339
+ }
2340
+
2341
+ //
2342
+ // Flip the counters from XDR to NATIVE
2343
+ //
2344
+
2345
+ for (int i = 0; i < NUM_SIZES_SINGLE; ++i)
2346
+ {
2347
+ Int64 *dst = (((Int64 *)inPtr) + i);
2348
+ const char *src = (char *)(((Int64 *)inPtr) + i);
2349
+
2350
+ Xdr::read<CharPtrIO> (src, *dst);
2351
+ }
2352
+
2353
+ //
2354
+ // Unwind all the counter info
2355
+ //
2356
+
2357
+ const Int64 *inPtr64 = (const Int64*) inPtr;
2358
+
2359
+ Int64 version = *(inPtr64 + VERSION);
2360
+ Int64 unknownUncompressedSize = *(inPtr64 + UNKNOWN_UNCOMPRESSED_SIZE);
2361
+ Int64 unknownCompressedSize = *(inPtr64 + UNKNOWN_COMPRESSED_SIZE);
2362
+ Int64 acCompressedSize = *(inPtr64 + AC_COMPRESSED_SIZE);
2363
+ Int64 dcCompressedSize = *(inPtr64 + DC_COMPRESSED_SIZE);
2364
+ Int64 rleCompressedSize = *(inPtr64 + RLE_COMPRESSED_SIZE);
2365
+ Int64 rleUncompressedSize = *(inPtr64 + RLE_UNCOMPRESSED_SIZE);
2366
+ Int64 rleRawSize = *(inPtr64 + RLE_RAW_SIZE);
2367
+
2368
+ Int64 totalAcUncompressedCount = *(inPtr64 + AC_UNCOMPRESSED_COUNT);
2369
+ Int64 totalDcUncompressedCount = *(inPtr64 + DC_UNCOMPRESSED_COUNT);
2370
+
2371
+ Int64 acCompression = *(inPtr64 + AC_COMPRESSION);
2372
+
2373
+ Int64 compressedSize = unknownCompressedSize +
2374
+ acCompressedSize +
2375
+ dcCompressedSize +
2376
+ rleCompressedSize;
2377
+
2378
+ const char *dataPtr = inPtr + NUM_SIZES_SINGLE * sizeof(Int64);
2379
+
2380
+ if (inSize < headerSize + compressedSize)
2381
+ {
2382
+ throw Iex::InputExc("Error uncompressing DWA data"
2383
+ "(truncated file).");
2384
+ }
2385
+
2386
+ if (unknownUncompressedSize < 0 ||
2387
+ unknownCompressedSize < 0 ||
2388
+ acCompressedSize < 0 ||
2389
+ dcCompressedSize < 0 ||
2390
+ rleCompressedSize < 0 ||
2391
+ rleUncompressedSize < 0 ||
2392
+ rleRawSize < 0 ||
2393
+ totalAcUncompressedCount < 0 ||
2394
+ totalDcUncompressedCount < 0)
2395
+ {
2396
+ throw Iex::InputExc("Error uncompressing DWA data"
2397
+ " (corrupt header).");
2398
+ }
2399
+
2400
+ if (version < 2)
2401
+ initializeLegacyChannelRules();
2402
+ else
2403
+ {
2404
+ unsigned short ruleSize = 0;
2405
+ Xdr::read<CharPtrIO>(dataPtr, ruleSize);
2406
+
2407
+ if (ruleSize < 0)
2408
+ throw Iex::InputExc("Error uncompressing DWA data"
2409
+ " (corrupt header file).");
2410
+
2411
+ headerSize += ruleSize;
2412
+ if (inSize < headerSize + compressedSize)
2413
+ throw Iex::InputExc("Error uncompressing DWA data"
2414
+ " (truncated file).");
2415
+
2416
+ _channelRules.clear();
2417
+ ruleSize -= Xdr::size<unsigned short> ();
2418
+ while (ruleSize > 0)
2419
+ {
2420
+ Classifier rule(dataPtr, ruleSize);
2421
+
2422
+ _channelRules.push_back(rule);
2423
+ ruleSize -= rule.size();
2424
+ }
2425
+ }
2426
+
2427
+
2428
+ size_t outBufferSize = 0;
2429
+ initializeBuffers(outBufferSize);
2430
+
2431
+ //
2432
+ // Allocate _outBuffer, if we haven't done so already
2433
+ //
2434
+
2435
+ if (_maxScanLineSize * numScanLines() > _outBufferSize)
2436
+ {
2437
+ _outBufferSize = _maxScanLineSize * numScanLines();
2438
+ if (_outBuffer != 0)
2439
+ delete[] _outBuffer;
2440
+ _outBuffer = new char[_maxScanLineSize * numScanLines()];
2441
+ }
2442
+
2443
+
2444
+ char *outBufferEnd = _outBuffer;
2445
+
2446
+
2447
+ //
2448
+ // Find the start of the RLE packed AC components and
2449
+ // the DC components for each channel. This will be handy
2450
+ // if you want to decode the channels in parallel later on.
2451
+ //
2452
+
2453
+ char *packedAcBufferEnd = 0;
2454
+
2455
+ if (_packedAcBuffer)
2456
+ packedAcBufferEnd = _packedAcBuffer;
2457
+
2458
+ char *packedDcBufferEnd = 0;
2459
+
2460
+ if (_packedDcBuffer)
2461
+ packedDcBufferEnd = _packedDcBuffer;
2462
+
2463
+ //
2464
+ // UNKNOWN data is packed first, followed by the
2465
+ // Huffman-compressed AC, then the DC values,
2466
+ // and then the zlib compressed RLE data.
2467
+ //
2468
+
2469
+ const char *compressedUnknownBuf = dataPtr;
2470
+
2471
+ const char *compressedAcBuf = compressedUnknownBuf +
2472
+ static_cast<ptrdiff_t>(unknownCompressedSize);
2473
+ const char *compressedDcBuf = compressedAcBuf +
2474
+ static_cast<ptrdiff_t>(acCompressedSize);
2475
+ const char *compressedRleBuf = compressedDcBuf +
2476
+ static_cast<ptrdiff_t>(dcCompressedSize);
2477
+
2478
+ //
2479
+ // Sanity check that the version is something we expect. Right now,
2480
+ // we can decode version 0, 1, and 2. v1 adds 'end of block' symbols
2481
+ // to the AC RLE. v2 adds channel classification rules at the
2482
+ // start of the data block.
2483
+ //
2484
+
2485
+ if ((version < 0) || (version > 2))
2486
+ throw Iex::InputExc ("Invalid version of compressed data block");
2487
+
2488
+ setupChannelData(minX, minY, maxX, maxY);
2489
+
2490
+ //
2491
+ // Uncompress the UNKNOWN data into _planarUncBuffer[UNKNOWN]
2492
+ //
2493
+
2494
+ if (unknownCompressedSize > 0)
2495
+ {
2496
+ uLongf outSize = static_cast<uLongf>(
2497
+ ceil( (float)unknownUncompressedSize * 1.01) + 100);
2498
+
2499
+ if (unknownUncompressedSize < 0 ||
2500
+ outSize > _planarUncBufferSize[UNKNOWN])
2501
+ {
2502
+ throw Iex::InputExc("Error uncompressing DWA data"
2503
+ "(corrupt header).");
2504
+ }
2505
+
2506
+ if (Z_OK != ::uncompress
2507
+ ((Bytef *)_planarUncBuffer[UNKNOWN],
2508
+ &outSize,
2509
+ (Bytef *)compressedUnknownBuf,
2510
+ (uLong)unknownCompressedSize))
2511
+ {
2512
+ throw Iex::BaseExc("Error uncompressing UNKNOWN data.");
2513
+ }
2514
+ }
2515
+
2516
+ //
2517
+ // Uncompress the AC data into _packedAcBuffer
2518
+ //
2519
+
2520
+ if (acCompressedSize > 0)
2521
+ {
2522
+ if (totalAcUncompressedCount*sizeof(unsigned short) > _packedAcBufferSize)
2523
+ {
2524
+ throw Iex::InputExc("Error uncompressing DWA data"
2525
+ "(corrupt header).");
2526
+ }
2527
+
2528
+ //
2529
+ // Don't trust the user to get it right, look in the file.
2530
+ //
2531
+
2532
+ switch (acCompression)
2533
+ {
2534
+ case STATIC_HUFFMAN:
2535
+
2536
+ hufUncompress
2537
+ (compressedAcBuf,
2538
+ (int)acCompressedSize,
2539
+ (unsigned short *)_packedAcBuffer,
2540
+ (int)totalAcUncompressedCount);
2541
+
2542
+ break;
2543
+
2544
+ case DEFLATE:
2545
+ {
2546
+ uLongf destLen =
2547
+ (int)(totalAcUncompressedCount) * sizeof (unsigned short);
2548
+
2549
+ if (Z_OK != ::uncompress
2550
+ ((Bytef *)_packedAcBuffer,
2551
+ &destLen,
2552
+ (Bytef *)compressedAcBuf,
2553
+ (uLong)acCompressedSize))
2554
+ {
2555
+ throw Iex::InputExc ("Data decompression (zlib) failed.");
2556
+ }
2557
+
2558
+ if (totalAcUncompressedCount * sizeof (unsigned short) !=
2559
+ destLen)
2560
+ {
2561
+ throw Iex::InputExc ("AC data corrupt.");
2562
+ }
2563
+ }
2564
+ break;
2565
+
2566
+ default:
2567
+
2568
+ throw Iex::NoImplExc ("Unknown AC Compression");
2569
+ break;
2570
+ }
2571
+ }
2572
+
2573
+ //
2574
+ // Uncompress the DC data into _packedDcBuffer
2575
+ //
2576
+
2577
+ if (dcCompressedSize > 0)
2578
+ {
2579
+ if (totalDcUncompressedCount*sizeof(unsigned short) > _packedDcBufferSize)
2580
+ {
2581
+ throw Iex::InputExc("Error uncompressing DWA data"
2582
+ "(corrupt header).");
2583
+ }
2584
+
2585
+ if (_zip->uncompress
2586
+ (compressedDcBuf, (int)dcCompressedSize, _packedDcBuffer)
2587
+ != (int)totalDcUncompressedCount * sizeof (unsigned short))
2588
+ {
2589
+ throw Iex::BaseExc("DC data corrupt.");
2590
+ }
2591
+ }
2592
+
2593
+ //
2594
+ // Uncompress the RLE data into _rleBuffer, then unRLE the results
2595
+ // into _planarUncBuffer[RLE]
2596
+ //
2597
+
2598
+ if (rleRawSize > 0)
2599
+ {
2600
+ if (rleUncompressedSize > _rleBufferSize ||
2601
+ rleRawSize > _planarUncBufferSize[RLE])
2602
+ {
2603
+ throw Iex::InputExc("Error uncompressing DWA data"
2604
+ "(corrupt header).");
2605
+ }
2606
+
2607
+ uLongf dstLen = (uLongf)rleUncompressedSize;
2608
+
2609
+ if (Z_OK != ::uncompress
2610
+ ((Bytef *)_rleBuffer,
2611
+ &dstLen,
2612
+ (Bytef *)compressedRleBuf,
2613
+ (uLong)rleCompressedSize))
2614
+ {
2615
+ throw Iex::BaseExc("Error uncompressing RLE data.");
2616
+ }
2617
+
2618
+ if (dstLen != rleUncompressedSize)
2619
+ throw Iex::BaseExc("RLE data corrupted");
2620
+
2621
+ if (rleUncompress
2622
+ ((int)rleUncompressedSize,
2623
+ (int)rleRawSize,
2624
+ (signed char *)_rleBuffer,
2625
+ _planarUncBuffer[RLE]) != rleRawSize)
2626
+ {
2627
+ throw Iex::BaseExc("RLE data corrupted");
2628
+ }
2629
+ }
2630
+
2631
+ //
2632
+ // Determine the start of each row in the output buffer
2633
+ //
2634
+
2635
+ std::vector<bool> decodedChannels (_channelData.size());
2636
+ std::vector< std::vector<char *> > rowPtrs (_channelData.size());
2637
+
2638
+ for (unsigned int chan = 0; chan < _channelData.size(); ++chan)
2639
+ decodedChannels[chan] = false;
2640
+
2641
+ outBufferEnd = _outBuffer;
2642
+
2643
+ for (int y = minY; y <= maxY; ++y)
2644
+ {
2645
+ for (unsigned int chan = 0; chan < _channelData.size(); ++chan)
2646
+ {
2647
+ ChannelData *cd = &_channelData[chan];
2648
+
2649
+ if (Imath::modp (y, cd->ySampling) != 0)
2650
+ continue;
2651
+
2652
+ rowPtrs[chan].push_back (outBufferEnd);
2653
+ outBufferEnd += cd->width * Imf::pixelTypeSize (cd->type);
2654
+ }
2655
+ }
2656
+
2657
+ //
2658
+ // Setup to decode each block of 3 channels that need to
2659
+ // be handled together
2660
+ //
2661
+
2662
+ for (unsigned int csc = 0; csc < _cscSets.size(); ++csc)
2663
+ {
2664
+ int rChan = _cscSets[csc].idx[0];
2665
+ int gChan = _cscSets[csc].idx[1];
2666
+ int bChan = _cscSets[csc].idx[2];
2667
+
2668
+
2669
+ LossyDctDecoderCsc decoder
2670
+ (rowPtrs[rChan],
2671
+ rowPtrs[gChan],
2672
+ rowPtrs[bChan],
2673
+ packedAcBufferEnd,
2674
+ packedDcBufferEnd,
2675
+ dwaCompressorToLinear,
2676
+ _channelData[rChan].width,
2677
+ _channelData[rChan].height,
2678
+ _channelData[rChan].type,
2679
+ _channelData[gChan].type,
2680
+ _channelData[bChan].type);
2681
+
2682
+ decoder.execute();
2683
+
2684
+ packedAcBufferEnd +=
2685
+ decoder.numAcValuesEncoded() * sizeof (unsigned short);
2686
+
2687
+ packedDcBufferEnd +=
2688
+ decoder.numDcValuesEncoded() * sizeof (unsigned short);
2689
+
2690
+ decodedChannels[rChan] = true;
2691
+ decodedChannels[gChan] = true;
2692
+ decodedChannels[bChan] = true;
2693
+ }
2694
+
2695
+ //
2696
+ // Setup to handle the remaining channels by themselves
2697
+ //
2698
+
2699
+ for (unsigned int chan = 0; chan < _channelData.size(); ++chan)
2700
+ {
2701
+ if (decodedChannels[chan])
2702
+ continue;
2703
+
2704
+ ChannelData *cd = &_channelData[chan];
2705
+ int pixelSize = Imf::pixelTypeSize (cd->type);
2706
+
2707
+ switch (cd->compression)
2708
+ {
2709
+ case LOSSY_DCT:
2710
+
2711
+ //
2712
+ // Setup a single-channel lossy DCT decoder pointing
2713
+ // at the output buffer
2714
+ //
2715
+
2716
+ {
2717
+ const unsigned short *linearLut = 0;
2718
+
2719
+ if (!cd->pLinear)
2720
+ linearLut = dwaCompressorToLinear;
2721
+
2722
+ LossyDctDecoder decoder
2723
+ (rowPtrs[chan],
2724
+ packedAcBufferEnd,
2725
+ packedDcBufferEnd,
2726
+ linearLut,
2727
+ cd->width,
2728
+ cd->height,
2729
+ cd->type);
2730
+
2731
+ decoder.execute();
2732
+
2733
+ packedAcBufferEnd +=
2734
+ decoder.numAcValuesEncoded() * sizeof (unsigned short);
2735
+
2736
+ packedDcBufferEnd +=
2737
+ decoder.numDcValuesEncoded() * sizeof (unsigned short);
2738
+ }
2739
+
2740
+ break;
2741
+
2742
+ case RLE:
2743
+
2744
+ //
2745
+ // For the RLE case, the data has been un-RLE'd into
2746
+ // planarUncRleEnd[], but is still split out by bytes.
2747
+ // We need to rearrange the bytes back into the correct
2748
+ // order in the output buffer;
2749
+ //
2750
+
2751
+ {
2752
+ int row = 0;
2753
+
2754
+ for (int y = minY; y <= maxY; ++y)
2755
+ {
2756
+ if (Imath::modp (y, cd->ySampling) != 0)
2757
+ continue;
2758
+
2759
+ char *dst = rowPtrs[chan][row];
2760
+
2761
+ if (pixelSize == 2)
2762
+ {
2763
+ interleaveByte2 (dst,
2764
+ cd->planarUncRleEnd[0],
2765
+ cd->planarUncRleEnd[1],
2766
+ cd->width);
2767
+
2768
+ cd->planarUncRleEnd[0] += cd->width;
2769
+ cd->planarUncRleEnd[1] += cd->width;
2770
+ }
2771
+ else
2772
+ {
2773
+ for (int x = 0; x < cd->width; ++x)
2774
+ {
2775
+ for (int byte = 0; byte < pixelSize; ++byte)
2776
+ {
2777
+ *dst++ = *cd->planarUncRleEnd[byte]++;
2778
+ }
2779
+ }
2780
+ }
2781
+
2782
+ row++;
2783
+ }
2784
+ }
2785
+
2786
+ break;
2787
+
2788
+ case UNKNOWN:
2789
+
2790
+ //
2791
+ // In the UNKNOWN case, data is already in planarUncBufferEnd
2792
+ // and just needs to copied over to the output buffer
2793
+ //
2794
+
2795
+ {
2796
+ int row = 0;
2797
+ int dstScanlineSize = cd->width * Imf::pixelTypeSize (cd->type);
2798
+
2799
+ for (int y = minY; y <= maxY; ++y)
2800
+ {
2801
+ if (Imath::modp (y, cd->ySampling) != 0)
2802
+ continue;
2803
+
2804
+ memcpy (rowPtrs[chan][row],
2805
+ cd->planarUncBufferEnd,
2806
+ dstScanlineSize);
2807
+
2808
+ cd->planarUncBufferEnd += dstScanlineSize;
2809
+ row++;
2810
+ }
2811
+ }
2812
+
2813
+ break;
2814
+
2815
+ default:
2816
+
2817
+ throw Iex::NoImplExc ("Unhandled compression scheme case");
2818
+ break;
2819
+ }
2820
+
2821
+ decodedChannels[chan] = true;
2822
+ }
2823
+
2824
+ //
2825
+ // Return a ptr to _outBuffer
2826
+ //
2827
+
2828
+ outPtr = _outBuffer;
2829
+ return (int)(outBufferEnd - _outBuffer);
2830
+ }
2831
+
2832
+
2833
+ // static
2834
+ void
2835
+ DwaCompressor::initializeFuncs()
2836
+ {
2837
+ convertFloatToHalf64 = convertFloatToHalf64_scalar;
2838
+ fromHalfZigZag = fromHalfZigZag_scalar;
2839
+
2840
+ CpuId cpuId;
2841
+
2842
+ //
2843
+ // Setup HALF <-> FLOAT conversion implementations
2844
+ //
2845
+
2846
+ if (cpuId.avx && cpuId.f16c)
2847
+ {
2848
+ convertFloatToHalf64 = convertFloatToHalf64_f16c;
2849
+ fromHalfZigZag = fromHalfZigZag_f16c;
2850
+ }
2851
+
2852
+ //
2853
+ // Setup inverse DCT implementations
2854
+ //
2855
+
2856
+ dctInverse8x8_0 = dctInverse8x8_scalar<0>;
2857
+ dctInverse8x8_1 = dctInverse8x8_scalar<1>;
2858
+ dctInverse8x8_2 = dctInverse8x8_scalar<2>;
2859
+ dctInverse8x8_3 = dctInverse8x8_scalar<3>;
2860
+ dctInverse8x8_4 = dctInverse8x8_scalar<4>;
2861
+ dctInverse8x8_5 = dctInverse8x8_scalar<5>;
2862
+ dctInverse8x8_6 = dctInverse8x8_scalar<6>;
2863
+ dctInverse8x8_7 = dctInverse8x8_scalar<7>;
2864
+
2865
+ if (cpuId.avx)
2866
+ {
2867
+ dctInverse8x8_0 = dctInverse8x8_avx<0>;
2868
+ dctInverse8x8_1 = dctInverse8x8_avx<1>;
2869
+ dctInverse8x8_2 = dctInverse8x8_avx<2>;
2870
+ dctInverse8x8_3 = dctInverse8x8_avx<3>;
2871
+ dctInverse8x8_4 = dctInverse8x8_avx<4>;
2872
+ dctInverse8x8_5 = dctInverse8x8_avx<5>;
2873
+ dctInverse8x8_6 = dctInverse8x8_avx<6>;
2874
+ dctInverse8x8_7 = dctInverse8x8_avx<7>;
2875
+ }
2876
+ else if (cpuId.sse2)
2877
+ {
2878
+ dctInverse8x8_0 = dctInverse8x8_sse2<0>;
2879
+ dctInverse8x8_1 = dctInverse8x8_sse2<1>;
2880
+ dctInverse8x8_2 = dctInverse8x8_sse2<2>;
2881
+ dctInverse8x8_3 = dctInverse8x8_sse2<3>;
2882
+ dctInverse8x8_4 = dctInverse8x8_sse2<4>;
2883
+ dctInverse8x8_5 = dctInverse8x8_sse2<5>;
2884
+ dctInverse8x8_6 = dctInverse8x8_sse2<6>;
2885
+ dctInverse8x8_7 = dctInverse8x8_sse2<7>;
2886
+ }
2887
+ }
2888
+
2889
+
2890
+ //
2891
+ // Handle channel classification and buffer allocation once we know
2892
+ // how to classify channels
2893
+ //
2894
+
2895
+ void
2896
+ DwaCompressor::initializeBuffers (size_t &outBufferSize)
2897
+ {
2898
+ classifyChannels (_channels, _channelData, _cscSets);
2899
+
2900
+ //
2901
+ // _outBuffer needs to be big enough to hold all our
2902
+ // compressed data - which could vary depending on what sort
2903
+ // of channels we have.
2904
+ //
2905
+
2906
+ int maxOutBufferSize = 0;
2907
+ int numLossyDctChans = 0;
2908
+ int unknownBufferSize = 0;
2909
+ int rleBufferSize = 0;
2910
+
2911
+ int maxLossyDctAcSize = (int)ceil ((float)numScanLines() / 8.0f) *
2912
+ (int)ceil ((float)(_max[0] - _min[0] + 1) / 8.0f) *
2913
+ 63 * sizeof (unsigned short);
2914
+
2915
+ int maxLossyDctDcSize = (int)ceil ((float)numScanLines() / 8.0f) *
2916
+ (int)ceil ((float)(_max[0] - _min[0] + 1) / 8.0f) *
2917
+ sizeof (unsigned short);
2918
+
2919
+ for (unsigned int chan = 0; chan < _channelData.size(); ++chan)
2920
+ {
2921
+ switch (_channelData[chan].compression)
2922
+ {
2923
+ case LOSSY_DCT:
2924
+
2925
+ //
2926
+ // This is the size of the number of packed
2927
+ // components, plus the requirements for
2928
+ // maximum Huffman encoding size.
2929
+ //
2930
+
2931
+ maxOutBufferSize += 2 * maxLossyDctAcSize + 65536;
2932
+ numLossyDctChans++;
2933
+ break;
2934
+
2935
+ case RLE:
2936
+ {
2937
+ //
2938
+ // RLE, if gone horribly wrong, could double the size
2939
+ // of the source data.
2940
+ //
2941
+
2942
+ int rleAmount = 2 * numScanLines() * (_max[0] - _min[0] + 1) *
2943
+ Imf::pixelTypeSize (_channelData[chan].type);
2944
+
2945
+ rleBufferSize += rleAmount;
2946
+ }
2947
+ break;
2948
+
2949
+
2950
+ case UNKNOWN:
2951
+
2952
+ unknownBufferSize += numScanLines() * (_max[0] - _min[0] + 1) *
2953
+ Imf::pixelTypeSize (_channelData[chan].type);
2954
+ break;
2955
+
2956
+ default:
2957
+
2958
+ throw Iex::NoImplExc ("Unhandled compression scheme case");
2959
+ break;
2960
+ }
2961
+ }
2962
+
2963
+ //
2964
+ // Also, since the results of the RLE are packed into
2965
+ // the output buffer, we need the extra room there. But
2966
+ // we're going to zlib compress() the data we pack,
2967
+ // which could take slightly more space
2968
+ //
2969
+
2970
+ maxOutBufferSize += (int)(ceil (1.01f * (float)rleBufferSize) + 100);
2971
+
2972
+ //
2973
+ // And the same goes for the UNKNOWN data
2974
+ //
2975
+
2976
+ maxOutBufferSize += (int)(ceil (1.01f * (float)unknownBufferSize) + 100);
2977
+
2978
+ //
2979
+ // Allocate a zip/deflate compressor big enought to hold the DC data
2980
+ // and include it's compressed results in the size requirements
2981
+ // for our output buffer
2982
+ //
2983
+
2984
+ if (_zip == 0)
2985
+ _zip = new Zip (maxLossyDctDcSize * numLossyDctChans);
2986
+ else if (_zip->maxRawSize() < maxLossyDctDcSize * numLossyDctChans)
2987
+ {
2988
+ delete _zip;
2989
+ _zip = new Zip (maxLossyDctDcSize * numLossyDctChans);
2990
+ }
2991
+
2992
+
2993
+ maxOutBufferSize += _zip->maxCompressedSize();
2994
+
2995
+ //
2996
+ // We also need to reserve space at the head of the buffer to
2997
+ // write out the size of our various packed and compressed data.
2998
+ //
2999
+
3000
+ maxOutBufferSize += NUM_SIZES_SINGLE * sizeof (Int64);
3001
+
3002
+
3003
+ //
3004
+ // Later, we're going to hijack outBuffer for the result of
3005
+ // both encoding and decoding. So it needs to be big enough
3006
+ // to hold either a buffers' worth of uncompressed or
3007
+ // compressed data
3008
+ //
3009
+ // For encoding, we'll need _outBuffer to hold maxOutBufferSize bytes,
3010
+ // but for decoding, we only need it to be maxScanLineSize*numScanLines.
3011
+ // Cache the max size for now, and alloc the buffer when we either
3012
+ // encode or decode.
3013
+ //
3014
+
3015
+ outBufferSize = maxOutBufferSize;
3016
+
3017
+
3018
+ //
3019
+ // _packedAcBuffer holds the quantized DCT coefficients prior
3020
+ // to Huffman encoding
3021
+ //
3022
+
3023
+ if (maxLossyDctAcSize * numLossyDctChans > _packedAcBufferSize)
3024
+ {
3025
+ _packedAcBufferSize = maxLossyDctAcSize * numLossyDctChans;
3026
+ if (_packedAcBuffer != 0)
3027
+ delete[] _packedAcBuffer;
3028
+ _packedAcBuffer = new char[_packedAcBufferSize];
3029
+ }
3030
+
3031
+ //
3032
+ // _packedDcBuffer holds one quantized DCT coef per 8x8 block
3033
+ //
3034
+
3035
+ if (maxLossyDctDcSize * numLossyDctChans > _packedDcBufferSize)
3036
+ {
3037
+ _packedDcBufferSize = maxLossyDctDcSize * numLossyDctChans;
3038
+ if (_packedDcBuffer != 0)
3039
+ delete[] _packedDcBuffer;
3040
+ _packedDcBuffer = new char[_packedDcBufferSize];
3041
+ }
3042
+
3043
+ if (rleBufferSize > _rleBufferSize)
3044
+ {
3045
+ _rleBufferSize = rleBufferSize;
3046
+ if (_rleBuffer != 0)
3047
+ delete[] _rleBuffer;
3048
+ _rleBuffer = new char[rleBufferSize];
3049
+ }
3050
+
3051
+ //
3052
+ // The planar uncompressed buffer will hold float data for LOSSY_DCT
3053
+ // compressed values, and whatever the native type is for other
3054
+ // channels. We're going to use this to hold data in a planar
3055
+ // format, as opposed to the native interleaved format we take
3056
+ // into compress() and give back from uncompress().
3057
+ //
3058
+ // This also makes it easier to compress the UNKNOWN and RLE data
3059
+ // all in one swoop (for each compression scheme).
3060
+ //
3061
+
3062
+ int planarUncBufferSize[NUM_COMPRESSOR_SCHEMES];
3063
+ for (int i=0; i<NUM_COMPRESSOR_SCHEMES; ++i)
3064
+ planarUncBufferSize[i] = 0;
3065
+
3066
+ for (unsigned int chan = 0; chan < _channelData.size(); ++chan)
3067
+ {
3068
+ switch (_channelData[chan].compression)
3069
+ {
3070
+ case LOSSY_DCT:
3071
+ break;
3072
+
3073
+ case RLE:
3074
+ planarUncBufferSize[RLE] +=
3075
+ numScanLines() * (_max[0] - _min[0] + 1) *
3076
+ Imf::pixelTypeSize (_channelData[chan].type);
3077
+ break;
3078
+
3079
+ case UNKNOWN:
3080
+ planarUncBufferSize[UNKNOWN] +=
3081
+ numScanLines() * (_max[0] - _min[0] + 1) *
3082
+ Imf::pixelTypeSize (_channelData[chan].type);
3083
+ break;
3084
+
3085
+ default:
3086
+ throw Iex::NoImplExc ("Unhandled compression scheme case");
3087
+ break;
3088
+ }
3089
+ }
3090
+
3091
+ //
3092
+ // UNKNOWN data is going to be zlib compressed, which needs
3093
+ // a little extra headroom
3094
+ //
3095
+
3096
+ if (planarUncBufferSize[UNKNOWN] > 0)
3097
+ {
3098
+ planarUncBufferSize[UNKNOWN] =
3099
+ (int) ceil (1.01f * (float)planarUncBufferSize[UNKNOWN]) + 100;
3100
+ }
3101
+
3102
+ for (int i = 0; i < NUM_COMPRESSOR_SCHEMES; ++i)
3103
+ {
3104
+ if (planarUncBufferSize[i] > _planarUncBufferSize[i])
3105
+ {
3106
+ _planarUncBufferSize[i] = planarUncBufferSize[i];
3107
+ if (_planarUncBuffer[i] != 0)
3108
+ delete[] _planarUncBuffer[i];
3109
+ _planarUncBuffer[i] = new char[planarUncBufferSize[i]];
3110
+ }
3111
+ }
3112
+ }
3113
+
3114
+
3115
+ //
3116
+ // Setup channel classification rules to use when writing files
3117
+ //
3118
+
3119
+ void
3120
+ DwaCompressor::initializeDefaultChannelRules ()
3121
+ {
3122
+ _channelRules.clear();
3123
+
3124
+ _channelRules.push_back (Classifier ("R", LOSSY_DCT, HALF, 0, false));
3125
+ _channelRules.push_back (Classifier ("R", LOSSY_DCT, FLOAT, 0, false));
3126
+ _channelRules.push_back (Classifier ("G", LOSSY_DCT, HALF, 1, false));
3127
+ _channelRules.push_back (Classifier ("G", LOSSY_DCT, FLOAT, 1, false));
3128
+ _channelRules.push_back (Classifier ("B", LOSSY_DCT, HALF, 2, false));
3129
+ _channelRules.push_back (Classifier ("B", LOSSY_DCT, FLOAT, 2, false));
3130
+
3131
+ _channelRules.push_back (Classifier ("Y", LOSSY_DCT, HALF, -1, false));
3132
+ _channelRules.push_back (Classifier ("Y", LOSSY_DCT, FLOAT, -1, false));
3133
+ _channelRules.push_back (Classifier ("BY", LOSSY_DCT, HALF, -1, false));
3134
+ _channelRules.push_back (Classifier ("BY", LOSSY_DCT, FLOAT, -1, false));
3135
+ _channelRules.push_back (Classifier ("RY", LOSSY_DCT, HALF, -1, false));
3136
+ _channelRules.push_back (Classifier ("RY", LOSSY_DCT, FLOAT, -1, false));
3137
+
3138
+ _channelRules.push_back (Classifier ("A", RLE, UINT, -1, false));
3139
+ _channelRules.push_back (Classifier ("A", RLE, HALF, -1, false));
3140
+ _channelRules.push_back (Classifier ("A", RLE, FLOAT, -1, false));
3141
+ }
3142
+
3143
+
3144
+ //
3145
+ // Setup channel classification rules when reading files with VERSION < 2
3146
+ //
3147
+
3148
+ void
3149
+ DwaCompressor::initializeLegacyChannelRules ()
3150
+ {
3151
+ _channelRules.clear();
3152
+
3153
+ _channelRules.push_back (Classifier ("r", LOSSY_DCT, HALF, 0, true));
3154
+ _channelRules.push_back (Classifier ("r", LOSSY_DCT, FLOAT, 0, true));
3155
+ _channelRules.push_back (Classifier ("red", LOSSY_DCT, HALF, 0, true));
3156
+ _channelRules.push_back (Classifier ("red", LOSSY_DCT, FLOAT, 0, true));
3157
+ _channelRules.push_back (Classifier ("g", LOSSY_DCT, HALF, 1, true));
3158
+ _channelRules.push_back (Classifier ("g", LOSSY_DCT, FLOAT, 1, true));
3159
+ _channelRules.push_back (Classifier ("grn", LOSSY_DCT, HALF, 1, true));
3160
+ _channelRules.push_back (Classifier ("grn", LOSSY_DCT, FLOAT, 1, true));
3161
+ _channelRules.push_back (Classifier ("green", LOSSY_DCT, HALF, 1, true));
3162
+ _channelRules.push_back (Classifier ("green", LOSSY_DCT, FLOAT, 1, true));
3163
+ _channelRules.push_back (Classifier ("b", LOSSY_DCT, HALF, 2, true));
3164
+ _channelRules.push_back (Classifier ("b", LOSSY_DCT, FLOAT, 2, true));
3165
+ _channelRules.push_back (Classifier ("blu", LOSSY_DCT, HALF, 2, true));
3166
+ _channelRules.push_back (Classifier ("blu", LOSSY_DCT, FLOAT, 2, true));
3167
+ _channelRules.push_back (Classifier ("blue", LOSSY_DCT, HALF, 2, true));
3168
+ _channelRules.push_back (Classifier ("blue", LOSSY_DCT, FLOAT, 2, true));
3169
+
3170
+ _channelRules.push_back (Classifier ("y", LOSSY_DCT, HALF, -1, true));
3171
+ _channelRules.push_back (Classifier ("y", LOSSY_DCT, FLOAT, -1, true));
3172
+ _channelRules.push_back (Classifier ("by", LOSSY_DCT, HALF, -1, true));
3173
+ _channelRules.push_back (Classifier ("by", LOSSY_DCT, FLOAT, -1, true));
3174
+ _channelRules.push_back (Classifier ("ry", LOSSY_DCT, HALF, -1, true));
3175
+ _channelRules.push_back (Classifier ("ry", LOSSY_DCT, FLOAT, -1, true));
3176
+ _channelRules.push_back (Classifier ("a", RLE, UINT, -1, true));
3177
+ _channelRules.push_back (Classifier ("a", RLE, HALF, -1, true));
3178
+ _channelRules.push_back (Classifier ("a", RLE, FLOAT, -1, true));
3179
+ }
3180
+
3181
+
3182
+ //
3183
+ // Given a set of rules and ChannelData, figure out which rules apply
3184
+ //
3185
+
3186
+ void
3187
+ DwaCompressor::relevantChannelRules (std::vector<Classifier> &rules) const
3188
+ {
3189
+ rules.clear();
3190
+
3191
+ std::vector<std::string> suffixes;
3192
+
3193
+ for (size_t cd = 0; cd < _channelData.size(); ++cd)
3194
+ {
3195
+ std::string suffix = _channelData[cd].name;
3196
+ size_t lastDot = suffix.find_last_of ('.');
3197
+
3198
+ if (lastDot != std::string::npos)
3199
+ suffix = suffix.substr (lastDot+1, std::string::npos);
3200
+
3201
+ suffixes.push_back(suffix);
3202
+ }
3203
+
3204
+
3205
+ for (size_t i = 0; i < _channelRules.size(); ++i)
3206
+ {
3207
+ for (size_t cd = 0; cd < _channelData.size(); ++cd)
3208
+ {
3209
+ if (_channelRules[i].match (suffixes[cd], _channelData[cd].type ))
3210
+ {
3211
+ rules.push_back (_channelRules[i]);
3212
+ break;
3213
+ }
3214
+ }
3215
+ }
3216
+ }
3217
+
3218
+
3219
+ //
3220
+ // Take our initial list of channels, and cache the contents.
3221
+ //
3222
+ // Determine approprate compression schemes for each channel,
3223
+ // and figure out which sets should potentially be CSC'ed
3224
+ // prior to lossy compression.
3225
+ //
3226
+
3227
+ void
3228
+ DwaCompressor::classifyChannels
3229
+ (ChannelList channels,
3230
+ std::vector<ChannelData> &chanData,
3231
+ std::vector<CscChannelSet> &cscData)
3232
+ {
3233
+ //
3234
+ // prefixMap used to map channel name prefixes to
3235
+ // potential CSC-able sets of channels.
3236
+ //
3237
+
3238
+ std::map<std::string, DwaCompressor::CscChannelSet> prefixMap;
3239
+ std::vector<DwaCompressor::CscChannelSet> tmpCscSet;
3240
+
3241
+ unsigned int numChan = 0;
3242
+
3243
+ for (ChannelList::Iterator c = channels.begin(); c != channels.end(); ++c)
3244
+ numChan++;
3245
+
3246
+ if (numChan)
3247
+ chanData.resize (numChan);
3248
+
3249
+ //
3250
+ // Cache the relevant data from the channel structs.
3251
+ //
3252
+
3253
+ unsigned int offset = 0;
3254
+
3255
+ for (ChannelList::Iterator c = channels.begin(); c != channels.end(); ++c)
3256
+ {
3257
+ chanData[offset].name = std::string (c.name());
3258
+ chanData[offset].compression = UNKNOWN;
3259
+ chanData[offset].xSampling = c.channel().xSampling;
3260
+ chanData[offset].ySampling = c.channel().ySampling;
3261
+ chanData[offset].type = c.channel().type;
3262
+ chanData[offset].pLinear = c.channel().pLinear;
3263
+
3264
+ offset++;
3265
+ }
3266
+
3267
+ //
3268
+ // Try and figure out which channels should be
3269
+ // compressed by which means.
3270
+ //
3271
+
3272
+ for (offset = 0; offset<numChan; ++offset)
3273
+ {
3274
+ std::string prefix = "";
3275
+ std::string suffix = chanData[offset].name;
3276
+ size_t lastDot = suffix.find_last_of ('.');
3277
+
3278
+ if (lastDot != std::string::npos)
3279
+ {
3280
+ prefix = suffix.substr (0, lastDot);
3281
+ suffix = suffix.substr (lastDot+1, std::string::npos);
3282
+ }
3283
+
3284
+ //
3285
+ // Make sure we have an entry in our CSC set map
3286
+ //
3287
+
3288
+ std::map<std::string, DwaCompressor::CscChannelSet>::iterator
3289
+ theSet = prefixMap.find (prefix);
3290
+
3291
+ if (theSet == prefixMap.end())
3292
+ {
3293
+ DwaCompressor::CscChannelSet tmpSet;
3294
+
3295
+ tmpSet.idx[0] =
3296
+ tmpSet.idx[1] =
3297
+ tmpSet.idx[2] = -1;
3298
+
3299
+ prefixMap[prefix] = tmpSet;
3300
+ }
3301
+
3302
+ //
3303
+ // Check the suffix against the list of classifications
3304
+ // we defined previously. If the _cscIdx is not negative,
3305
+ // it indicates that we should be part of a CSC group.
3306
+ //
3307
+
3308
+ for (std::vector<Classifier>::iterator i = _channelRules.begin();
3309
+ i != _channelRules.end();
3310
+ ++i)
3311
+ {
3312
+ if ( i->match(suffix, chanData[offset].type) )
3313
+ {
3314
+ chanData[offset].compression = i->_scheme;
3315
+
3316
+ if ( i->_cscIdx >= 0)
3317
+ prefixMap[prefix].idx[i->_cscIdx] = offset;
3318
+ }
3319
+ }
3320
+ }
3321
+
3322
+ //
3323
+ // Finally, try and find RGB sets of channels which
3324
+ // can be CSC'ed to a Y'CbCr space prior to loss, for
3325
+ // better compression.
3326
+ //
3327
+ // Walk over our set of candidates, and see who has
3328
+ // all three channels defined (and has common sampling
3329
+ // patterns, etc).
3330
+ //
3331
+
3332
+ for (std::map<std::string, DwaCompressor::CscChannelSet>::iterator
3333
+ theItem = prefixMap.begin(); theItem != prefixMap.end();
3334
+ ++theItem)
3335
+ {
3336
+ int red = (*theItem).second.idx[0];
3337
+ int grn = (*theItem).second.idx[1];
3338
+ int blu = (*theItem).second.idx[2];
3339
+
3340
+ if ((red < 0) || (grn < 0) || (blu < 0))
3341
+ continue;
3342
+
3343
+ if ((chanData[red].xSampling != chanData[grn].xSampling) ||
3344
+ (chanData[red].xSampling != chanData[blu].xSampling) ||
3345
+ (chanData[grn].xSampling != chanData[blu].xSampling) ||
3346
+ (chanData[red].ySampling != chanData[grn].ySampling) ||
3347
+ (chanData[red].ySampling != chanData[blu].ySampling) ||
3348
+ (chanData[grn].ySampling != chanData[blu].ySampling))
3349
+ {
3350
+ continue;
3351
+ }
3352
+
3353
+ tmpCscSet.push_back ((*theItem).second);
3354
+ }
3355
+
3356
+ size_t numCsc = tmpCscSet.size();
3357
+
3358
+ if (numCsc)
3359
+ cscData.resize(numCsc);
3360
+
3361
+ for (offset = 0; offset < numCsc; ++offset)
3362
+ cscData[offset] = tmpCscSet[offset];
3363
+ }
3364
+
3365
+
3366
+
3367
+ //
3368
+ // Setup some buffer pointers, determine channel sizes, things
3369
+ // like that.
3370
+ //
3371
+
3372
+ void
3373
+ DwaCompressor::setupChannelData (int minX, int minY, int maxX, int maxY)
3374
+ {
3375
+ char *planarUncBuffer[NUM_COMPRESSOR_SCHEMES];
3376
+
3377
+ for (int i=0; i<NUM_COMPRESSOR_SCHEMES; ++i)
3378
+ {
3379
+ planarUncBuffer[i] = 0;
3380
+
3381
+ if (_planarUncBuffer[i])
3382
+ planarUncBuffer[i] = _planarUncBuffer[i];
3383
+ }
3384
+
3385
+ for (unsigned int chan = 0; chan < _channelData.size(); ++chan)
3386
+ {
3387
+ ChannelData *cd = &_channelData[chan];
3388
+
3389
+ cd->width = Imf::numSamples (cd->xSampling, minX, maxX);
3390
+ cd->height = Imf::numSamples (cd->ySampling, minY, maxY);
3391
+
3392
+ cd->planarUncSize =
3393
+ cd->width * cd->height * Imf::pixelTypeSize (cd->type);
3394
+
3395
+ cd->planarUncBuffer = planarUncBuffer[cd->compression];
3396
+ cd->planarUncBufferEnd = cd->planarUncBuffer;
3397
+
3398
+ cd->planarUncRle[0] = cd->planarUncBuffer;
3399
+ cd->planarUncRleEnd[0] = cd->planarUncRle[0];
3400
+
3401
+ for (int byte = 1; byte < Imf::pixelTypeSize(cd->type); ++byte)
3402
+ {
3403
+ cd->planarUncRle[byte] =
3404
+ cd->planarUncRle[byte-1] + cd->width * cd->height;
3405
+
3406
+ cd->planarUncRleEnd[byte] =
3407
+ cd->planarUncRle[byte];
3408
+ }
3409
+
3410
+ cd->planarUncType = cd->type;
3411
+
3412
+ if (cd->compression == LOSSY_DCT)
3413
+ {
3414
+ cd->planarUncType = FLOAT;
3415
+ }
3416
+ else
3417
+ {
3418
+ planarUncBuffer[cd->compression] +=
3419
+ cd->width * cd->height * Imf::pixelTypeSize (cd->planarUncType);
3420
+ }
3421
+ }
3422
+ }
3423
+
3424
+ OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT