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,1252 @@
1
+ ///////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // Copyright (c) 2002-2012, Industrial Light & Magic, a division of Lucas
4
+ // Digital Ltd. LLC
5
+ //
6
+ // All rights reserved.
7
+ //
8
+ // Redistribution and use in source and binary forms, with or without
9
+ // modification, are permitted provided that the following conditions are
10
+ // met:
11
+ // * Redistributions of source code must retain the above copyright
12
+ // notice, this list of conditions and the following disclaimer.
13
+ // * Redistributions in binary form must reproduce the above
14
+ // copyright notice, this list of conditions and the following disclaimer
15
+ // in the documentation and/or other materials provided with the
16
+ // distribution.
17
+ // * Neither the name of Industrial Light & Magic nor the names of
18
+ // its contributors may be used to endorse or promote products derived
19
+ // from this software without specific prior written permission.
20
+ //
21
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ //
33
+ ///////////////////////////////////////////////////////////////////////////
34
+
35
+
36
+
37
+
38
+
39
+ //----------------------------------------------------------------------------
40
+ //
41
+ // Implementation of non-template items declared in ImathMatrixAlgo.h
42
+ //
43
+ //----------------------------------------------------------------------------
44
+
45
+ #include "ImathMatrixAlgo.h"
46
+ #include <cmath>
47
+ #include <algorithm>
48
+
49
+ #if defined(OPENEXR_DLL)
50
+ #define EXPORT_CONST __declspec(dllexport)
51
+ #else
52
+ #define EXPORT_CONST const
53
+ #endif
54
+
55
+ IMATH_INTERNAL_NAMESPACE_SOURCE_ENTER
56
+
57
+ EXPORT_CONST M33f identity33f ( 1, 0, 0,
58
+ 0, 1, 0,
59
+ 0, 0, 1);
60
+
61
+ EXPORT_CONST M33d identity33d ( 1, 0, 0,
62
+ 0, 1, 0,
63
+ 0, 0, 1);
64
+
65
+ EXPORT_CONST M44f identity44f ( 1, 0, 0, 0,
66
+ 0, 1, 0, 0,
67
+ 0, 0, 1, 0,
68
+ 0, 0, 0, 1);
69
+
70
+ EXPORT_CONST M44d identity44d ( 1, 0, 0, 0,
71
+ 0, 1, 0, 0,
72
+ 0, 0, 1, 0,
73
+ 0, 0, 0, 1);
74
+
75
+ namespace
76
+ {
77
+
78
+ class KahanSum
79
+ {
80
+ public:
81
+ KahanSum() : _total(0), _correction(0) {}
82
+
83
+ void
84
+ operator+= (const double val)
85
+ {
86
+ const double y = val - _correction;
87
+ const double t = _total + y;
88
+ _correction = (t - _total) - y;
89
+ _total = t;
90
+ }
91
+
92
+ double get() const
93
+ {
94
+ return _total;
95
+ }
96
+
97
+ private:
98
+ double _total;
99
+ double _correction;
100
+ };
101
+
102
+ }
103
+
104
+ template <typename T>
105
+ M44d
106
+ procrustesRotationAndTranslation (const Vec3<T>* A, const Vec3<T>* B, const T* weights, const size_t numPoints, const bool doScale)
107
+ {
108
+ if (numPoints == 0)
109
+ return M44d();
110
+
111
+ // Always do the accumulation in double precision:
112
+ V3d Acenter (0.0);
113
+ V3d Bcenter (0.0);
114
+ double weightsSum = 0.0;
115
+
116
+ if (weights == 0)
117
+ {
118
+ for (int i = 0; i < numPoints; ++i)
119
+ {
120
+ Acenter += (V3d) A[i];
121
+ Bcenter += (V3d) B[i];
122
+ }
123
+ weightsSum = (double) numPoints;
124
+ }
125
+ else
126
+ {
127
+ for (int i = 0; i < numPoints; ++i)
128
+ {
129
+ const double w = weights[i];
130
+ weightsSum += w;
131
+
132
+ Acenter += w * (V3d) A[i];
133
+ Bcenter += w * (V3d) B[i];
134
+ }
135
+ }
136
+
137
+ if (weightsSum == 0)
138
+ return M44d();
139
+
140
+ Acenter /= weightsSum;
141
+ Bcenter /= weightsSum;
142
+
143
+ //
144
+ // Find Q such that |Q*A - B| (actually A-Acenter and B-Bcenter, weighted)
145
+ // is minimized in the least squares sense.
146
+ // From Golub/Van Loan, p.601
147
+ //
148
+ // A,B are 3xn
149
+ // Let C = B A^T (where A is 3xn and B^T is nx3, so C is 3x3)
150
+ // Compute the SVD: C = U D V^T (U,V rotations, D diagonal).
151
+ // Throw away the D part, and return Q = U V^T
152
+ M33d C (0.0);
153
+ if (weights == 0)
154
+ {
155
+ for (int i = 0; i < numPoints; ++i)
156
+ C += outerProduct ((V3d) B[i] - Bcenter, (V3d) A[i] - Acenter);
157
+ }
158
+ else
159
+ {
160
+ for (int i = 0; i < numPoints; ++i)
161
+ {
162
+ const double w = weights[i];
163
+ C += outerProduct (w * ((V3d) B[i] - Bcenter), (V3d) A[i] - Acenter);
164
+ }
165
+ }
166
+
167
+ M33d U, V;
168
+ V3d S;
169
+ jacobiSVD (C, U, S, V, IMATH_INTERNAL_NAMESPACE::limits<double>::epsilon(), true);
170
+
171
+ // We want Q.transposed() here since we are going to be using it in the
172
+ // Imath style (multiplying vectors on the right, v' = v*A^T):
173
+ const M33d Qt = V * U.transposed();
174
+
175
+ double s = 1.0;
176
+ if (doScale && numPoints > 1)
177
+ {
178
+ // Finding a uniform scale: let us assume the Q is completely fixed
179
+ // at this point (solving for both simultaneously seems much harder).
180
+ // We are trying to compute (again, per Golub and van Loan)
181
+ // min || s*A*Q - B ||_F
182
+ // Notice that we've jammed a uniform scale in front of the Q.
183
+ // Now, the Frobenius norm (the least squares norm over matrices)
184
+ // has the neat property that it is equivalent to minimizing the trace
185
+ // of M^T*M (see your friendly neighborhood linear algebra text for a
186
+ // derivation). Thus, we can expand this out as
187
+ // min tr (s*A*Q - B)^T*(s*A*Q - B)
188
+ // = min tr(Q^T*A^T*s*s*A*Q) + tr(B^T*B) - 2*tr(Q^T*A^T*s*B) by linearity of the trace
189
+ // = min s^2 tr(A^T*A) + tr(B^T*B) - 2*s*tr(Q^T*A^T*B) using the fact that the trace is invariant
190
+ // under similarity transforms Q*M*Q^T
191
+ // If we differentiate w.r.t. s and set this to 0, we get
192
+ // 0 = 2*s*tr(A^T*A) - 2*tr(Q^T*A^T*B)
193
+ // so
194
+ // 2*s*tr(A^T*A) = 2*s*tr(Q^T*A^T*B)
195
+ // s = tr(Q^T*A^T*B) / tr(A^T*A)
196
+
197
+ KahanSum traceATA;
198
+ if (weights == 0)
199
+ {
200
+ for (int i = 0; i < numPoints; ++i)
201
+ traceATA += ((V3d) A[i] - Acenter).length2();
202
+ }
203
+ else
204
+ {
205
+ for (int i = 0; i < numPoints; ++i)
206
+ traceATA += ((double) weights[i]) * ((V3d) A[i] - Acenter).length2();
207
+ }
208
+
209
+ KahanSum traceBATQ;
210
+ for (int i = 0; i < 3; ++i)
211
+ for (int j = 0; j < 3; ++j)
212
+ traceBATQ += Qt[j][i] * C[i][j];
213
+
214
+ s = traceBATQ.get() / traceATA.get();
215
+ }
216
+
217
+ // Q is the rotation part of what we want to return.
218
+ // The entire transform is:
219
+ // (translate origin to Bcenter) * Q * (translate Acenter to origin)
220
+ // last first
221
+ // The effect of this on a point is:
222
+ // (translate origin to Bcenter) * Q * (translate Acenter to origin) * point
223
+ // = (translate origin to Bcenter) * Q * (-Acenter + point)
224
+ // = (translate origin to Bcenter) * (-Q*Acenter + Q*point)
225
+ // = (translate origin to Bcenter) * (translate Q*Acenter to origin) * Q*point
226
+ // = (translate Q*Acenter to Bcenter) * Q*point
227
+ // So what we want to return is:
228
+ // (translate Q*Acenter to Bcenter) * Q
229
+ //
230
+ // In block form, this is:
231
+ // [ 1 0 0 | ] [ 0 ] [ 1 0 0 | ] [ 1 0 0 | ] [ | ] [ ]
232
+ // [ 0 1 0 tb ] [ s*Q 0 ] [ 0 1 0 -ta ] = [ 0 1 0 tb ] [ s*Q -s*Q*ta ] = [ Q tb-s*Q*ta ]
233
+ // [ 0 0 1 | ] [ 0 ] [ 0 0 1 | ] [ 0 0 1 | ] [ | ] [ ]
234
+ // [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ] [ 0 0 0 1 ]
235
+ // (ofc the whole thing is transposed for Imath).
236
+ const V3d translate = Bcenter - s*Acenter*Qt;
237
+
238
+ return M44d (s*Qt.x[0][0], s*Qt.x[0][1], s*Qt.x[0][2], T(0),
239
+ s*Qt.x[1][0], s*Qt.x[1][1], s*Qt.x[1][2], T(0),
240
+ s*Qt.x[2][0], s*Qt.x[2][1], s*Qt.x[2][2], T(0),
241
+ translate.x, translate.y, translate.z, T(1));
242
+ } // procrustesRotationAndTranslation
243
+
244
+ template <typename T>
245
+ M44d
246
+ procrustesRotationAndTranslation (const Vec3<T>* A, const Vec3<T>* B, const size_t numPoints, const bool doScale)
247
+ {
248
+ return procrustesRotationAndTranslation (A, B, (const T*) 0, numPoints, doScale);
249
+ } // procrustesRotationAndTranslation
250
+
251
+
252
+ template IMATH_EXPORT M44d procrustesRotationAndTranslation (const V3d* from, const V3d* to, const size_t numPoints, const bool doScale);
253
+ template IMATH_EXPORT M44d procrustesRotationAndTranslation (const V3f* from, const V3f* to, const size_t numPoints, const bool doScale);
254
+ template IMATH_EXPORT M44d procrustesRotationAndTranslation (const V3d* from, const V3d* to, const double* weights, const size_t numPoints, const bool doScale);
255
+ template IMATH_EXPORT M44d procrustesRotationAndTranslation (const V3f* from, const V3f* to, const float* weights, const size_t numPoints, const bool doScale);
256
+
257
+
258
+ namespace
259
+ {
260
+
261
+ // Applies the 2x2 Jacobi rotation
262
+ // [ c s 0 ] [ 1 0 0 ] [ c 0 s ]
263
+ // [ -s c 0 ] or [ 0 c s ] or [ 0 1 0 ]
264
+ // [ 0 0 1 ] [ 0 -s c ] [ -s 0 c ]
265
+ // from the right; that is, computes
266
+ // J * A
267
+ // for the Jacobi rotation J and the matrix A. This is efficient because we
268
+ // only need to touch exactly the 2 columns that are affected, so we never
269
+ // need to explicitly construct the J matrix.
270
+ template <typename T, int j, int k>
271
+ void
272
+ jacobiRotateRight (IMATH_INTERNAL_NAMESPACE::Matrix33<T>& A,
273
+ const T c,
274
+ const T s)
275
+ {
276
+ for (int i = 0; i < 3; ++i)
277
+ {
278
+ const T tau1 = A[i][j];
279
+ const T tau2 = A[i][k];
280
+ A[i][j] = c * tau1 - s * tau2;
281
+ A[i][k] = s * tau1 + c * tau2;
282
+ }
283
+ }
284
+
285
+ template <typename T>
286
+ void
287
+ jacobiRotateRight (IMATH_INTERNAL_NAMESPACE::Matrix44<T>& A,
288
+ const int j,
289
+ const int k,
290
+ const T c,
291
+ const T s)
292
+ {
293
+ for (int i = 0; i < 4; ++i)
294
+ {
295
+ const T tau1 = A[i][j];
296
+ const T tau2 = A[i][k];
297
+ A[i][j] = c * tau1 - s * tau2;
298
+ A[i][k] = s * tau1 + c * tau2;
299
+ }
300
+ }
301
+
302
+ // This routine solves the 2x2 SVD:
303
+ // [ c1 s1 ] [ w x ] [ c2 s2 ] [ d1 0 ]
304
+ // [ ] [ ] [ ] = [ ]
305
+ // [ -s1 c1 ] [ y z ] [ -s2 c2 ] [ 0 d2 ]
306
+ // where
307
+ // [ w x ]
308
+ // A = [ ]
309
+ // [ y z ]
310
+ // is the subset of A consisting of the [j,k] entries, A([j k], [j k]) in
311
+ // Matlab parlance. The method is the 'USVD' algorithm described in the
312
+ // following paper:
313
+ // 'Computation of the Singular Value Decomposition using Mesh-Connected Processors'
314
+ // by Richard P. Brent, Franklin T. Luk, and Charles Van Loan
315
+ // It breaks the computation into two steps: the first symmetrizes the matrix,
316
+ // and the second diagonalizes the symmetric matrix.
317
+ template <typename T, int j, int k, int l>
318
+ bool
319
+ twoSidedJacobiRotation (IMATH_INTERNAL_NAMESPACE::Matrix33<T>& A,
320
+ IMATH_INTERNAL_NAMESPACE::Matrix33<T>& U,
321
+ IMATH_INTERNAL_NAMESPACE::Matrix33<T>& V,
322
+ const T tol)
323
+ {
324
+ // Load everything into local variables to make things easier on the
325
+ // optimizer:
326
+ const T w = A[j][j];
327
+ const T x = A[j][k];
328
+ const T y = A[k][j];
329
+ const T z = A[k][k];
330
+
331
+ // We will keep track of whether we're actually performing any rotations,
332
+ // since if the matrix is already diagonal we'll end up with the identity
333
+ // as our Jacobi rotation and we can short-circuit.
334
+ bool changed = false;
335
+
336
+ // The first step is to symmetrize the 2x2 matrix,
337
+ // [ c s ]^T [ w x ] = [ p q ]
338
+ // [ -s c ] [ y z ] [ q r ]
339
+ T mu_1 = w + z;
340
+ T mu_2 = x - y;
341
+
342
+ T c, s;
343
+ if (std::abs(mu_2) <= tol*std::abs(mu_1)) // Already symmetric (to tolerance)
344
+ { // Note that the <= is important here
345
+ c = T(1); // because we want to bypass the computation
346
+ s = T(0); // of rho if mu_1 = mu_2 = 0.
347
+
348
+ const T p = w;
349
+ const T r = z;
350
+ mu_1 = r - p;
351
+ mu_2 = x + y;
352
+ }
353
+ else
354
+ {
355
+ const T rho = mu_1 / mu_2;
356
+ s = T(1) / std::sqrt (T(1) + rho*rho); // TODO is there a native inverse square root function?
357
+ if (rho < 0)
358
+ s = -s;
359
+ c = s * rho;
360
+
361
+ mu_1 = s * (x + y) + c * (z - w); // = r - p
362
+ mu_2 = T(2) * (c * x - s * z); // = 2*q
363
+
364
+ changed = true;
365
+ }
366
+
367
+ // The second stage diagonalizes,
368
+ // [ c2 s2 ]^T [ p q ] [ c2 s2 ] = [ d1 0 ]
369
+ // [ -s2 c2 ] [ q r ] [ -s2 c2 ] [ 0 d2 ]
370
+ T c_2, s_2;
371
+ if (std::abs(mu_2) <= tol*std::abs(mu_1))
372
+ {
373
+ c_2 = T(1);
374
+ s_2 = T(0);
375
+ }
376
+ else
377
+ {
378
+ const T rho_2 = mu_1 / mu_2;
379
+ T t_2 = T(1) / (std::abs(rho_2) + std::sqrt(1 + rho_2*rho_2));
380
+ if (rho_2 < 0)
381
+ t_2 = -t_2;
382
+ c_2 = T(1) / std::sqrt (T(1) + t_2*t_2);
383
+ s_2 = c_2 * t_2;
384
+
385
+ changed = true;
386
+ }
387
+
388
+ const T c_1 = c_2 * c - s_2 * s;
389
+ const T s_1 = s_2 * c + c_2 * s;
390
+
391
+ if (!changed)
392
+ {
393
+ // We've decided that the off-diagonal entries are already small
394
+ // enough, so we'll set them to zero. This actually appears to result
395
+ // in smaller errors than leaving them be, possibly because it prevents
396
+ // us from trying to do extra rotations later that we don't need.
397
+ A[k][j] = 0;
398
+ A[j][k] = 0;
399
+ return false;
400
+ }
401
+
402
+ const T d_1 = c_1*(w*c_2 - x*s_2) - s_1*(y*c_2 - z*s_2);
403
+ const T d_2 = s_1*(w*s_2 + x*c_2) + c_1*(y*s_2 + z*c_2);
404
+
405
+ // For the entries we just zeroed out, we'll just set them to 0, since
406
+ // they should be 0 up to machine precision.
407
+ A[j][j] = d_1;
408
+ A[k][k] = d_2;
409
+ A[k][j] = 0;
410
+ A[j][k] = 0;
411
+
412
+ // Rotate the entries that _weren't_ involved in the 2x2 SVD:
413
+ {
414
+ // Rotate on the left by
415
+ // [ c1 s1 0 ]^T [ c1 0 s1 ]^T [ 1 0 0 ]^T
416
+ // [ -s1 c1 0 ] or [ 0 1 0 ] or [ 0 c1 s1 ]
417
+ // [ 0 0 1 ] [ -s1 0 c1 ] [ 0 -s1 c1 ]
418
+ // This has the effect of adding the (weighted) ith and jth _rows_ to
419
+ // each other.
420
+ const T tau1 = A[j][l];
421
+ const T tau2 = A[k][l];
422
+ A[j][l] = c_1 * tau1 - s_1 * tau2;
423
+ A[k][l] = s_1 * tau1 + c_1 * tau2;
424
+ }
425
+
426
+ {
427
+ // Rotate on the right by
428
+ // [ c2 s2 0 ] [ c2 0 s2 ] [ 1 0 0 ]
429
+ // [ -s2 c2 0 ] or [ 0 1 0 ] or [ 0 c2 s2 ]
430
+ // [ 0 0 1 ] [ -s2 0 c2 ] [ 0 -s2 c2 ]
431
+ // This has the effect of adding the (weighted) ith and jth _columns_ to
432
+ // each other.
433
+ const T tau1 = A[l][j];
434
+ const T tau2 = A[l][k];
435
+ A[l][j] = c_2 * tau1 - s_2 * tau2;
436
+ A[l][k] = s_2 * tau1 + c_2 * tau2;
437
+ }
438
+
439
+ // Now apply the rotations to U and V:
440
+ // Remember that we have
441
+ // R1^T * A * R2 = D
442
+ // This is in the 2x2 case, but after doing a bunch of these
443
+ // we will get something like this for the 3x3 case:
444
+ // ... R1b^T * R1a^T * A * R2a * R2b * ... = D
445
+ // ----------------- ---------------
446
+ // = U^T = V
447
+ // So,
448
+ // U = R1a * R1b * ...
449
+ // V = R2a * R2b * ...
450
+ jacobiRotateRight<T, j, k> (U, c_1, s_1);
451
+ jacobiRotateRight<T, j, k> (V, c_2, s_2);
452
+
453
+ return true;
454
+ }
455
+
456
+ template <typename T>
457
+ bool
458
+ twoSidedJacobiRotation (IMATH_INTERNAL_NAMESPACE::Matrix44<T>& A,
459
+ int j,
460
+ int k,
461
+ IMATH_INTERNAL_NAMESPACE::Matrix44<T>& U,
462
+ IMATH_INTERNAL_NAMESPACE::Matrix44<T>& V,
463
+ const T tol)
464
+ {
465
+ // Load everything into local variables to make things easier on the
466
+ // optimizer:
467
+ const T w = A[j][j];
468
+ const T x = A[j][k];
469
+ const T y = A[k][j];
470
+ const T z = A[k][k];
471
+
472
+ // We will keep track of whether we're actually performing any rotations,
473
+ // since if the matrix is already diagonal we'll end up with the identity
474
+ // as our Jacobi rotation and we can short-circuit.
475
+ bool changed = false;
476
+
477
+ // The first step is to symmetrize the 2x2 matrix,
478
+ // [ c s ]^T [ w x ] = [ p q ]
479
+ // [ -s c ] [ y z ] [ q r ]
480
+ T mu_1 = w + z;
481
+ T mu_2 = x - y;
482
+
483
+ T c, s;
484
+ if (std::abs(mu_2) <= tol*std::abs(mu_1)) // Already symmetric (to tolerance)
485
+ { // Note that the <= is important here
486
+ c = T(1); // because we want to bypass the computation
487
+ s = T(0); // of rho if mu_1 = mu_2 = 0.
488
+
489
+ const T p = w;
490
+ const T r = z;
491
+ mu_1 = r - p;
492
+ mu_2 = x + y;
493
+ }
494
+ else
495
+ {
496
+ const T rho = mu_1 / mu_2;
497
+ s = T(1) / std::sqrt (T(1) + rho*rho); // TODO is there a native inverse square root function?
498
+ if (rho < 0)
499
+ s = -s;
500
+ c = s * rho;
501
+
502
+ mu_1 = s * (x + y) + c * (z - w); // = r - p
503
+ mu_2 = T(2) * (c * x - s * z); // = 2*q
504
+
505
+ changed = true;
506
+ }
507
+
508
+ // The second stage diagonalizes,
509
+ // [ c2 s2 ]^T [ p q ] [ c2 s2 ] = [ d1 0 ]
510
+ // [ -s2 c2 ] [ q r ] [ -s2 c2 ] [ 0 d2 ]
511
+ T c_2, s_2;
512
+ if (std::abs(mu_2) <= tol*std::abs(mu_1))
513
+ {
514
+ c_2 = T(1);
515
+ s_2 = T(0);
516
+ }
517
+ else
518
+ {
519
+ const T rho_2 = mu_1 / mu_2;
520
+ T t_2 = T(1) / (std::abs(rho_2) + std::sqrt(1 + rho_2*rho_2));
521
+ if (rho_2 < 0)
522
+ t_2 = -t_2;
523
+ c_2 = T(1) / std::sqrt (T(1) + t_2*t_2);
524
+ s_2 = c_2 * t_2;
525
+
526
+ changed = true;
527
+ }
528
+
529
+ const T c_1 = c_2 * c - s_2 * s;
530
+ const T s_1 = s_2 * c + c_2 * s;
531
+
532
+ if (!changed)
533
+ {
534
+ // We've decided that the off-diagonal entries are already small
535
+ // enough, so we'll set them to zero. This actually appears to result
536
+ // in smaller errors than leaving them be, possibly because it prevents
537
+ // us from trying to do extra rotations later that we don't need.
538
+ A[k][j] = 0;
539
+ A[j][k] = 0;
540
+ return false;
541
+ }
542
+
543
+ const T d_1 = c_1*(w*c_2 - x*s_2) - s_1*(y*c_2 - z*s_2);
544
+ const T d_2 = s_1*(w*s_2 + x*c_2) + c_1*(y*s_2 + z*c_2);
545
+
546
+ // For the entries we just zeroed out, we'll just set them to 0, since
547
+ // they should be 0 up to machine precision.
548
+ A[j][j] = d_1;
549
+ A[k][k] = d_2;
550
+ A[k][j] = 0;
551
+ A[j][k] = 0;
552
+
553
+ // Rotate the entries that _weren't_ involved in the 2x2 SVD:
554
+ for (int l = 0; l < 4; ++l)
555
+ {
556
+ if (l == j || l == k)
557
+ continue;
558
+
559
+ // Rotate on the left by
560
+ // [ 1 ]
561
+ // [ . ]
562
+ // [ c2 s2 ] j
563
+ // [ 1 ]
564
+ // [ -s2 c2 ] k
565
+ // [ . ]
566
+ // [ 1 ]
567
+ // j k
568
+ //
569
+ // This has the effect of adding the (weighted) ith and jth _rows_ to
570
+ // each other.
571
+ const T tau1 = A[j][l];
572
+ const T tau2 = A[k][l];
573
+ A[j][l] = c_1 * tau1 - s_1 * tau2;
574
+ A[k][l] = s_1 * tau1 + c_1 * tau2;
575
+ }
576
+
577
+ for (int l = 0; l < 4; ++l)
578
+ {
579
+ // We set the A[j/k][j/k] entries already
580
+ if (l == j || l == k)
581
+ continue;
582
+
583
+ // Rotate on the right by
584
+ // [ 1 ]
585
+ // [ . ]
586
+ // [ c2 s2 ] j
587
+ // [ 1 ]
588
+ // [ -s2 c2 ] k
589
+ // [ . ]
590
+ // [ 1 ]
591
+ // j k
592
+ //
593
+ // This has the effect of adding the (weighted) ith and jth _columns_ to
594
+ // each other.
595
+ const T tau1 = A[l][j];
596
+ const T tau2 = A[l][k];
597
+ A[l][j] = c_2 * tau1 - s_2 * tau2;
598
+ A[l][k] = s_2 * tau1 + c_2 * tau2;
599
+ }
600
+
601
+ // Now apply the rotations to U and V:
602
+ // Remember that we have
603
+ // R1^T * A * R2 = D
604
+ // This is in the 2x2 case, but after doing a bunch of these
605
+ // we will get something like this for the 3x3 case:
606
+ // ... R1b^T * R1a^T * A * R2a * R2b * ... = D
607
+ // ----------------- ---------------
608
+ // = U^T = V
609
+ // So,
610
+ // U = R1a * R1b * ...
611
+ // V = R2a * R2b * ...
612
+ jacobiRotateRight (U, j, k, c_1, s_1);
613
+ jacobiRotateRight (V, j, k, c_2, s_2);
614
+
615
+ return true;
616
+ }
617
+
618
+ template <typename T>
619
+ void
620
+ swapColumns (IMATH_INTERNAL_NAMESPACE::Matrix33<T>& A, int j, int k)
621
+ {
622
+ for (int i = 0; i < 3; ++i)
623
+ std::swap (A[i][j], A[i][k]);
624
+ }
625
+
626
+ template <typename T>
627
+ T
628
+ maxOffDiag (const IMATH_INTERNAL_NAMESPACE::Matrix33<T>& A)
629
+ {
630
+ T result = 0;
631
+ result = std::max (result, std::abs (A[0][1]));
632
+ result = std::max (result, std::abs (A[0][2]));
633
+ result = std::max (result, std::abs (A[1][0]));
634
+ result = std::max (result, std::abs (A[1][2]));
635
+ result = std::max (result, std::abs (A[2][0]));
636
+ result = std::max (result, std::abs (A[2][1]));
637
+ return result;
638
+ }
639
+
640
+ template <typename T>
641
+ T
642
+ maxOffDiag (const IMATH_INTERNAL_NAMESPACE::Matrix44<T>& A)
643
+ {
644
+ T result = 0;
645
+ for (int i = 0; i < 4; ++i)
646
+ {
647
+ for (int j = 0; j < 4; ++j)
648
+ {
649
+ if (i != j)
650
+ result = std::max (result, std::abs (A[i][j]));
651
+ }
652
+ }
653
+
654
+ return result;
655
+ }
656
+
657
+ template <typename T>
658
+ void
659
+ twoSidedJacobiSVD (IMATH_INTERNAL_NAMESPACE::Matrix33<T> A,
660
+ IMATH_INTERNAL_NAMESPACE::Matrix33<T>& U,
661
+ IMATH_INTERNAL_NAMESPACE::Vec3<T>& S,
662
+ IMATH_INTERNAL_NAMESPACE::Matrix33<T>& V,
663
+ const T tol,
664
+ const bool forcePositiveDeterminant)
665
+ {
666
+ // The two-sided Jacobi SVD works by repeatedly zeroing out
667
+ // off-diagonal entries of the matrix, 2 at a time. Basically,
668
+ // we can take our 3x3 matrix,
669
+ // [* * *]
670
+ // [* * *]
671
+ // [* * *]
672
+ // and use a pair of orthogonal transforms to zero out, say, the
673
+ // pair of entries (0, 1) and (1, 0):
674
+ // [ c1 s1 ] [* * *] [ c2 s2 ] [* *]
675
+ // [-s1 c1 ] [* * *] [-s2 c2 ] = [ * *]
676
+ // [ 1] [* * *] [ 1] [* * *]
677
+ // When we go to zero out the next pair of entries (say, (0, 2) and (2, 0))
678
+ // then we don't expect those entries to stay 0:
679
+ // [ c1 s1 ] [* *] [ c2 s2 ] [* * ]
680
+ // [-s1 c1 ] [ * *] [-s2 c2 ] = [* * *]
681
+ // [ 1] [* * *] [ 1] [ * *]
682
+ // However, if we keep doing this, we'll find that the off-diagonal entries
683
+ // converge to 0 fairly quickly (convergence should be roughly cubic). The
684
+ // result is a diagonal A matrix and a bunch of orthogonal transforms:
685
+ // [* * *] [* ]
686
+ // L1 L2 ... Ln [* * *] Rn ... R2 R1 = [ * ]
687
+ // [* * *] [ *]
688
+ // ------------ ------- ------------ -------
689
+ // U^T A V S
690
+ // This turns out to be highly accurate because (1) orthogonal transforms
691
+ // are extremely stable to compute and apply (this is why QR factorization
692
+ // works so well, FWIW) and because (2) by applying everything to the original
693
+ // matrix A instead of computing (A^T * A) we avoid any precision loss that
694
+ // would result from that.
695
+ U.makeIdentity();
696
+ V.makeIdentity();
697
+
698
+ const int maxIter = 20; // In case we get really unlucky, prevents infinite loops
699
+ const T absTol = tol * maxOffDiag (A); // Tolerance is in terms of the maximum
700
+ if (absTol != 0) // _off-diagonal_ entry.
701
+ {
702
+ int numIter = 0;
703
+ do
704
+ {
705
+ ++numIter;
706
+ bool changed = twoSidedJacobiRotation<T, 0, 1, 2> (A, U, V, tol);
707
+ changed = twoSidedJacobiRotation<T, 0, 2, 1> (A, U, V, tol) || changed;
708
+ changed = twoSidedJacobiRotation<T, 1, 2, 0> (A, U, V, tol) || changed;
709
+ if (!changed)
710
+ break;
711
+ } while (maxOffDiag(A) > absTol && numIter < maxIter);
712
+ }
713
+
714
+ // The off-diagonal entries are (effectively) 0, so whatever's left on the
715
+ // diagonal are the singular values:
716
+ S.x = A[0][0];
717
+ S.y = A[1][1];
718
+ S.z = A[2][2];
719
+
720
+ // Nothing thus far has guaranteed that the singular values are positive,
721
+ // so let's go back through and flip them if not (since by contract we are
722
+ // supposed to return all positive SVs):
723
+ for (int i = 0; i < 3; ++i)
724
+ {
725
+ if (S[i] < 0)
726
+ {
727
+ // If we flip S[i], we need to flip the corresponding column of U
728
+ // (we could also pick V if we wanted; it doesn't really matter):
729
+ S[i] = -S[i];
730
+ for (int j = 0; j < 3; ++j)
731
+ U[j][i] = -U[j][i];
732
+ }
733
+ }
734
+
735
+ // Order the singular values from largest to smallest; this requires
736
+ // exactly two passes through the data using bubble sort:
737
+ for (int i = 0; i < 2; ++i)
738
+ {
739
+ for (int j = 0; j < (2 - i); ++j)
740
+ {
741
+ // No absolute values necessary since we already ensured that
742
+ // they're positive:
743
+ if (S[j] < S[j+1])
744
+ {
745
+ // If we swap singular values we also have to swap
746
+ // corresponding columns in U and V:
747
+ std::swap (S[j], S[j+1]);
748
+ swapColumns (U, j, j+1);
749
+ swapColumns (V, j, j+1);
750
+ }
751
+ }
752
+ }
753
+
754
+ if (forcePositiveDeterminant)
755
+ {
756
+ // We want to guarantee that the returned matrices always have positive
757
+ // determinant. We can do this by adding the appropriate number of
758
+ // matrices of the form:
759
+ // [ 1 ]
760
+ // L = [ 1 ]
761
+ // [ -1 ]
762
+ // Note that L' = L and L*L = Identity. Thus we can add:
763
+ // U*L*L*S*V = (U*L)*(L*S)*V
764
+ // if U has a negative determinant, and
765
+ // U*S*L*L*V = U*(S*L)*(L*V)
766
+ // if V has a neg. determinant.
767
+ if (U.determinant() < 0)
768
+ {
769
+ for (int i = 0; i < 3; ++i)
770
+ U[i][2] = -U[i][2];
771
+ S.z = -S.z;
772
+ }
773
+
774
+ if (V.determinant() < 0)
775
+ {
776
+ for (int i = 0; i < 3; ++i)
777
+ V[i][2] = -V[i][2];
778
+ S.z = -S.z;
779
+ }
780
+ }
781
+ }
782
+
783
+ template <typename T>
784
+ void
785
+ twoSidedJacobiSVD (IMATH_INTERNAL_NAMESPACE::Matrix44<T> A,
786
+ IMATH_INTERNAL_NAMESPACE::Matrix44<T>& U,
787
+ IMATH_INTERNAL_NAMESPACE::Vec4<T>& S,
788
+ IMATH_INTERNAL_NAMESPACE::Matrix44<T>& V,
789
+ const T tol,
790
+ const bool forcePositiveDeterminant)
791
+ {
792
+ // Please see the Matrix33 version for a detailed description of the algorithm.
793
+ U.makeIdentity();
794
+ V.makeIdentity();
795
+
796
+ const int maxIter = 20; // In case we get really unlucky, prevents infinite loops
797
+ const T absTol = tol * maxOffDiag (A); // Tolerance is in terms of the maximum
798
+ if (absTol != 0) // _off-diagonal_ entry.
799
+ {
800
+ int numIter = 0;
801
+ do
802
+ {
803
+ ++numIter;
804
+ bool changed = twoSidedJacobiRotation (A, 0, 1, U, V, tol);
805
+ changed = twoSidedJacobiRotation (A, 0, 2, U, V, tol) || changed;
806
+ changed = twoSidedJacobiRotation (A, 0, 3, U, V, tol) || changed;
807
+ changed = twoSidedJacobiRotation (A, 1, 2, U, V, tol) || changed;
808
+ changed = twoSidedJacobiRotation (A, 1, 3, U, V, tol) || changed;
809
+ changed = twoSidedJacobiRotation (A, 2, 3, U, V, tol) || changed;
810
+ if (!changed)
811
+ break;
812
+ } while (maxOffDiag(A) > absTol && numIter < maxIter);
813
+ }
814
+
815
+ // The off-diagonal entries are (effectively) 0, so whatever's left on the
816
+ // diagonal are the singular values:
817
+ S[0] = A[0][0];
818
+ S[1] = A[1][1];
819
+ S[2] = A[2][2];
820
+ S[3] = A[3][3];
821
+
822
+ // Nothing thus far has guaranteed that the singular values are positive,
823
+ // so let's go back through and flip them if not (since by contract we are
824
+ // supposed to return all positive SVs):
825
+ for (int i = 0; i < 4; ++i)
826
+ {
827
+ if (S[i] < 0)
828
+ {
829
+ // If we flip S[i], we need to flip the corresponding column of U
830
+ // (we could also pick V if we wanted; it doesn't really matter):
831
+ S[i] = -S[i];
832
+ for (int j = 0; j < 4; ++j)
833
+ U[j][i] = -U[j][i];
834
+ }
835
+ }
836
+
837
+ // Order the singular values from largest to smallest using insertion sort:
838
+ for (int i = 1; i < 4; ++i)
839
+ {
840
+ const IMATH_INTERNAL_NAMESPACE::Vec4<T> uCol (U[0][i], U[1][i], U[2][i], U[3][i]);
841
+ const IMATH_INTERNAL_NAMESPACE::Vec4<T> vCol (V[0][i], V[1][i], V[2][i], V[3][i]);
842
+ const T sVal = S[i];
843
+
844
+ int j = i - 1;
845
+ while (std::abs (S[j]) < std::abs (sVal))
846
+ {
847
+ for (int k = 0; k < 4; ++k)
848
+ U[k][j+1] = U[k][j];
849
+ for (int k = 0; k < 4; ++k)
850
+ V[k][j+1] = V[k][j];
851
+ S[j+1] = S[j];
852
+
853
+ --j;
854
+ if (j < 0)
855
+ break;
856
+ }
857
+
858
+ for (int k = 0; k < 4; ++k)
859
+ U[k][j+1] = uCol[k];
860
+ for (int k = 0; k < 4; ++k)
861
+ V[k][j+1] = vCol[k];
862
+ S[j+1] = sVal;
863
+ }
864
+
865
+ if (forcePositiveDeterminant)
866
+ {
867
+ // We want to guarantee that the returned matrices always have positive
868
+ // determinant. We can do this by adding the appropriate number of
869
+ // matrices of the form:
870
+ // [ 1 ]
871
+ // L = [ 1 ]
872
+ // [ 1 ]
873
+ // [ -1 ]
874
+ // Note that L' = L and L*L = Identity. Thus we can add:
875
+ // U*L*L*S*V = (U*L)*(L*S)*V
876
+ // if U has a negative determinant, and
877
+ // U*S*L*L*V = U*(S*L)*(L*V)
878
+ // if V has a neg. determinant.
879
+ if (U.determinant() < 0)
880
+ {
881
+ for (int i = 0; i < 4; ++i)
882
+ U[i][3] = -U[i][3];
883
+ S[3] = -S[3];
884
+ }
885
+
886
+ if (V.determinant() < 0)
887
+ {
888
+ for (int i = 0; i < 4; ++i)
889
+ V[i][3] = -V[i][3];
890
+ S[3] = -S[3];
891
+ }
892
+ }
893
+ }
894
+
895
+ }
896
+
897
+ template <typename T>
898
+ void
899
+ jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix33<T>& A,
900
+ IMATH_INTERNAL_NAMESPACE::Matrix33<T>& U,
901
+ IMATH_INTERNAL_NAMESPACE::Vec3<T>& S,
902
+ IMATH_INTERNAL_NAMESPACE::Matrix33<T>& V,
903
+ const T tol,
904
+ const bool forcePositiveDeterminant)
905
+ {
906
+ twoSidedJacobiSVD (A, U, S, V, tol, forcePositiveDeterminant);
907
+ }
908
+
909
+ template <typename T>
910
+ void
911
+ jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix44<T>& A,
912
+ IMATH_INTERNAL_NAMESPACE::Matrix44<T>& U,
913
+ IMATH_INTERNAL_NAMESPACE::Vec4<T>& S,
914
+ IMATH_INTERNAL_NAMESPACE::Matrix44<T>& V,
915
+ const T tol,
916
+ const bool forcePositiveDeterminant)
917
+ {
918
+ twoSidedJacobiSVD (A, U, S, V, tol, forcePositiveDeterminant);
919
+ }
920
+
921
+ template IMATH_EXPORT void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix33<float>& A,
922
+ IMATH_INTERNAL_NAMESPACE::Matrix33<float>& U,
923
+ IMATH_INTERNAL_NAMESPACE::Vec3<float>& S,
924
+ IMATH_INTERNAL_NAMESPACE::Matrix33<float>& V,
925
+ const float tol,
926
+ const bool forcePositiveDeterminant);
927
+ template IMATH_EXPORT void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix33<double>& A,
928
+ IMATH_INTERNAL_NAMESPACE::Matrix33<double>& U,
929
+ IMATH_INTERNAL_NAMESPACE::Vec3<double>& S,
930
+ IMATH_INTERNAL_NAMESPACE::Matrix33<double>& V,
931
+ const double tol,
932
+ const bool forcePositiveDeterminant);
933
+ template IMATH_EXPORT void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix44<float>& A,
934
+ IMATH_INTERNAL_NAMESPACE::Matrix44<float>& U,
935
+ IMATH_INTERNAL_NAMESPACE::Vec4<float>& S,
936
+ IMATH_INTERNAL_NAMESPACE::Matrix44<float>& V,
937
+ const float tol,
938
+ const bool forcePositiveDeterminant);
939
+ template IMATH_EXPORT void jacobiSVD (const IMATH_INTERNAL_NAMESPACE::Matrix44<double>& A,
940
+ IMATH_INTERNAL_NAMESPACE::Matrix44<double>& U,
941
+ IMATH_INTERNAL_NAMESPACE::Vec4<double>& S,
942
+ IMATH_INTERNAL_NAMESPACE::Matrix44<double>& V,
943
+ const double tol,
944
+ const bool forcePositiveDeterminant);
945
+
946
+ namespace
947
+ {
948
+
949
+ template <int j, int k, typename TM>
950
+ inline
951
+ void
952
+ jacobiRotateRight (TM& A,
953
+ const typename TM::BaseType s,
954
+ const typename TM::BaseType tau)
955
+ {
956
+ typedef typename TM::BaseType T;
957
+
958
+ for (unsigned int i = 0; i < TM::dimensions(); ++i)
959
+ {
960
+ const T nu1 = A[i][j];
961
+ const T nu2 = A[i][k];
962
+ A[i][j] -= s * (nu2 + tau * nu1);
963
+ A[i][k] += s * (nu1 - tau * nu2);
964
+ }
965
+ }
966
+
967
+ template <int j, int k, int l, typename T>
968
+ bool
969
+ jacobiRotation (Matrix33<T>& A,
970
+ Matrix33<T>& V,
971
+ Vec3<T>& Z,
972
+ const T tol)
973
+ {
974
+ // Load everything into local variables to make things easier on the
975
+ // optimizer:
976
+ const T x = A[j][j];
977
+ const T y = A[j][k];
978
+ const T z = A[k][k];
979
+
980
+ // The first stage diagonalizes,
981
+ // [ c s ]^T [ x y ] [ c -s ] = [ d1 0 ]
982
+ // [ -s c ] [ y z ] [ s c ] [ 0 d2 ]
983
+ const T mu1 = z - x;
984
+ const T mu2 = 2 * y;
985
+
986
+ if (std::abs(mu2) <= tol*std::abs(mu1))
987
+ {
988
+ // We've decided that the off-diagonal entries are already small
989
+ // enough, so we'll set them to zero. This actually appears to result
990
+ // in smaller errors than leaving them be, possibly because it prevents
991
+ // us from trying to do extra rotations later that we don't need.
992
+ A[j][k] = 0;
993
+ return false;
994
+ }
995
+ const T rho = mu1 / mu2;
996
+ const T t = (rho < 0 ? T(-1) : T(1)) / (std::abs(rho) + std::sqrt(1 + rho*rho));
997
+ const T c = T(1) / std::sqrt (T(1) + t*t);
998
+ const T s = t * c;
999
+ const T tau = s / (T(1) + c);
1000
+ const T h = t * y;
1001
+
1002
+ // Update diagonal elements.
1003
+ Z[j] -= h;
1004
+ Z[k] += h;
1005
+ A[j][j] -= h;
1006
+ A[k][k] += h;
1007
+
1008
+ // For the entries we just zeroed out, we'll just set them to 0, since
1009
+ // they should be 0 up to machine precision.
1010
+ A[j][k] = 0;
1011
+
1012
+ // We only update upper triagnular elements of A, since
1013
+ // A is supposed to be symmetric.
1014
+ T& offd1 = l < j ? A[l][j] : A[j][l];
1015
+ T& offd2 = l < k ? A[l][k] : A[k][l];
1016
+ const T nu1 = offd1;
1017
+ const T nu2 = offd2;
1018
+ offd1 = nu1 - s * (nu2 + tau * nu1);
1019
+ offd2 = nu2 + s * (nu1 - tau * nu2);
1020
+
1021
+ // Apply rotation to V
1022
+ jacobiRotateRight<j, k> (V, s, tau);
1023
+
1024
+ return true;
1025
+ }
1026
+
1027
+ template <int j, int k, int l1, int l2, typename T>
1028
+ bool
1029
+ jacobiRotation (Matrix44<T>& A,
1030
+ Matrix44<T>& V,
1031
+ Vec4<T>& Z,
1032
+ const T tol)
1033
+ {
1034
+ const T x = A[j][j];
1035
+ const T y = A[j][k];
1036
+ const T z = A[k][k];
1037
+
1038
+ const T mu1 = z - x;
1039
+ const T mu2 = T(2) * y;
1040
+
1041
+ // Let's see if rho^(-1) = mu2 / mu1 is less than tol
1042
+ // This test also checks if rho^2 will overflow
1043
+ // when tol^(-1) < sqrt(limits<T>::max()).
1044
+ if (std::abs(mu2) <= tol*std::abs(mu1))
1045
+ {
1046
+ A[j][k] = 0;
1047
+ return true;
1048
+ }
1049
+
1050
+ const T rho = mu1 / mu2;
1051
+ const T t = (rho < 0 ? T(-1) : T(1)) / (std::abs(rho) + std::sqrt(1 + rho*rho));
1052
+ const T c = T(1) / std::sqrt (T(1) + t*t);
1053
+ const T s = c * t;
1054
+ const T tau = s / (T(1) + c);
1055
+ const T h = t * y;
1056
+
1057
+ Z[j] -= h;
1058
+ Z[k] += h;
1059
+ A[j][j] -= h;
1060
+ A[k][k] += h;
1061
+ A[j][k] = 0;
1062
+
1063
+ {
1064
+ T& offd1 = l1 < j ? A[l1][j] : A[j][l1];
1065
+ T& offd2 = l1 < k ? A[l1][k] : A[k][l1];
1066
+ const T nu1 = offd1;
1067
+ const T nu2 = offd2;
1068
+ offd1 -= s * (nu2 + tau * nu1);
1069
+ offd2 += s * (nu1 - tau * nu2);
1070
+ }
1071
+
1072
+ {
1073
+ T& offd1 = l2 < j ? A[l2][j] : A[j][l2];
1074
+ T& offd2 = l2 < k ? A[l2][k] : A[k][l2];
1075
+ const T nu1 = offd1;
1076
+ const T nu2 = offd2;
1077
+ offd1 -= s * (nu2 + tau * nu1);
1078
+ offd2 += s * (nu1 - tau * nu2);
1079
+ }
1080
+
1081
+ jacobiRotateRight<j, k> (V, s, tau);
1082
+
1083
+ return true;
1084
+ }
1085
+
1086
+ template <typename TM>
1087
+ inline
1088
+ typename TM::BaseType
1089
+ maxOffDiagSymm (const TM& A)
1090
+ {
1091
+ typedef typename TM::BaseType T;
1092
+ T result = 0;
1093
+ for (unsigned int i = 0; i < TM::dimensions(); ++i)
1094
+ for (unsigned int j = i+1; j < TM::dimensions(); ++j)
1095
+ result = std::max (result, std::abs (A[i][j]));
1096
+
1097
+ return result;
1098
+ }
1099
+
1100
+ } // namespace
1101
+
1102
+ template <typename T>
1103
+ void
1104
+ jacobiEigenSolver (Matrix33<T>& A,
1105
+ Vec3<T>& S,
1106
+ Matrix33<T>& V,
1107
+ const T tol)
1108
+ {
1109
+ V.makeIdentity();
1110
+ for(int i = 0; i < 3; ++i) {
1111
+ S[i] = A[i][i];
1112
+ }
1113
+
1114
+ const int maxIter = 20; // In case we get really unlucky, prevents infinite loops
1115
+ const T absTol = tol * maxOffDiagSymm (A); // Tolerance is in terms of the maximum
1116
+ if (absTol != 0) // _off-diagonal_ entry.
1117
+ {
1118
+ int numIter = 0;
1119
+ do
1120
+ {
1121
+ // Z is for accumulating small changes (h) to diagonal entries
1122
+ // of A for one sweep. Adding h's directly to A might cause
1123
+ // a cancellation effect when h is relatively very small to
1124
+ // the corresponding diagonal entry of A and
1125
+ // this will increase numerical errors
1126
+ Vec3<T> Z(0, 0, 0);
1127
+ ++numIter;
1128
+ bool changed = jacobiRotation<0, 1, 2> (A, V, Z, tol);
1129
+ changed = jacobiRotation<0, 2, 1> (A, V, Z, tol) || changed;
1130
+ changed = jacobiRotation<1, 2, 0> (A, V, Z, tol) || changed;
1131
+ // One sweep passed. Add accumulated changes (Z) to singular values (S)
1132
+ // Update diagonal elements of A for better accuracy as well.
1133
+ for(int i = 0; i < 3; ++i) {
1134
+ A[i][i] = S[i] += Z[i];
1135
+ }
1136
+ if (!changed)
1137
+ break;
1138
+ } while (maxOffDiagSymm(A) > absTol && numIter < maxIter);
1139
+ }
1140
+ }
1141
+
1142
+ template <typename T>
1143
+ void
1144
+ jacobiEigenSolver (Matrix44<T>& A,
1145
+ Vec4<T>& S,
1146
+ Matrix44<T>& V,
1147
+ const T tol)
1148
+ {
1149
+ V.makeIdentity();
1150
+
1151
+ for(int i = 0; i < 4; ++i) {
1152
+ S[i] = A[i][i];
1153
+ }
1154
+
1155
+ const int maxIter = 20; // In case we get really unlucky, prevents infinite loops
1156
+ const T absTol = tol * maxOffDiagSymm (A); // Tolerance is in terms of the maximum
1157
+ if (absTol != 0) // _off-diagonal_ entry.
1158
+ {
1159
+ int numIter = 0;
1160
+ do
1161
+ {
1162
+ ++numIter;
1163
+ Vec4<T> Z(0, 0, 0, 0);
1164
+ bool changed = jacobiRotation<0, 1, 2, 3> (A, V, Z, tol);
1165
+ changed = jacobiRotation<0, 2, 1, 3> (A, V, Z, tol) || changed;
1166
+ changed = jacobiRotation<0, 3, 1, 2> (A, V, Z, tol) || changed;
1167
+ changed = jacobiRotation<1, 2, 0, 3> (A, V, Z, tol) || changed;
1168
+ changed = jacobiRotation<1, 3, 0, 2> (A, V, Z, tol) || changed;
1169
+ changed = jacobiRotation<2, 3, 0, 1> (A, V, Z, tol) || changed;
1170
+ for(int i = 0; i < 4; ++i) {
1171
+ A[i][i] = S[i] += Z[i];
1172
+ }
1173
+ if (!changed)
1174
+ break;
1175
+ } while (maxOffDiagSymm(A) > absTol && numIter < maxIter);
1176
+ }
1177
+ }
1178
+
1179
+ template <typename TM, typename TV>
1180
+ void
1181
+ maxEigenVector (TM& A, TV& V)
1182
+ {
1183
+ TV S;
1184
+ TM MV;
1185
+ jacobiEigenSolver(A, S, MV);
1186
+
1187
+ int maxIdx(0);
1188
+ for(unsigned int i = 1; i < TV::dimensions(); ++i)
1189
+ {
1190
+ if(std::abs(S[i]) > std::abs(S[maxIdx]))
1191
+ maxIdx = i;
1192
+ }
1193
+
1194
+ for(unsigned int i = 0; i < TV::dimensions(); ++i)
1195
+ V[i] = MV[i][maxIdx];
1196
+ }
1197
+
1198
+ template <typename TM, typename TV>
1199
+ void
1200
+ minEigenVector (TM& A, TV& V)
1201
+ {
1202
+ TV S;
1203
+ TM MV;
1204
+ jacobiEigenSolver(A, S, MV);
1205
+
1206
+ int minIdx(0);
1207
+ for(unsigned int i = 1; i < TV::dimensions(); ++i)
1208
+ {
1209
+ if(std::abs(S[i]) < std::abs(S[minIdx]))
1210
+ minIdx = i;
1211
+ }
1212
+
1213
+ for(unsigned int i = 0; i < TV::dimensions(); ++i)
1214
+ V[i] = MV[i][minIdx];
1215
+ }
1216
+
1217
+ template IMATH_EXPORT void jacobiEigenSolver (Matrix33<float>& A,
1218
+ Vec3<float>& S,
1219
+ Matrix33<float>& V,
1220
+ const float tol);
1221
+ template IMATH_EXPORT void jacobiEigenSolver (Matrix33<double>& A,
1222
+ Vec3<double>& S,
1223
+ Matrix33<double>& V,
1224
+ const double tol);
1225
+ template IMATH_EXPORT void jacobiEigenSolver (Matrix44<float>& A,
1226
+ Vec4<float>& S,
1227
+ Matrix44<float>& V,
1228
+ const float tol);
1229
+ template IMATH_EXPORT void jacobiEigenSolver (Matrix44<double>& A,
1230
+ Vec4<double>& S,
1231
+ Matrix44<double>& V,
1232
+ const double tol);
1233
+
1234
+ template IMATH_EXPORT void maxEigenVector (Matrix33<float>& A,
1235
+ Vec3<float>& S);
1236
+ template IMATH_EXPORT void maxEigenVector (Matrix44<float>& A,
1237
+ Vec4<float>& S);
1238
+ template IMATH_EXPORT void maxEigenVector (Matrix33<double>& A,
1239
+ Vec3<double>& S);
1240
+ template IMATH_EXPORT void maxEigenVector (Matrix44<double>& A,
1241
+ Vec4<double>& S);
1242
+
1243
+ template IMATH_EXPORT void minEigenVector (Matrix33<float>& A,
1244
+ Vec3<float>& S);
1245
+ template IMATH_EXPORT void minEigenVector (Matrix44<float>& A,
1246
+ Vec4<float>& S);
1247
+ template IMATH_EXPORT void minEigenVector (Matrix33<double>& A,
1248
+ Vec3<double>& S);
1249
+ template IMATH_EXPORT void minEigenVector (Matrix44<double>& A,
1250
+ Vec4<double>& S);
1251
+
1252
+ IMATH_INTERNAL_NAMESPACE_SOURCE_EXIT