epeg 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (504) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/MANIFEST +5 -0
  4. data/TODO +1 -0
  5. data/epeg/.dockerignore +4 -0
  6. data/epeg/.gitignore +5 -0
  7. data/epeg/CMakeLists.txt +30 -0
  8. data/epeg/Dockerfile +23 -0
  9. data/epeg/Epeg.h +90 -0
  10. data/epeg/README.md +42 -0
  11. data/epeg/epeg_main.c +1642 -0
  12. data/epeg/epeg_private.h +85 -0
  13. data/epeg/example/.gitignore +1 -0
  14. data/epeg/example/CMakeLists.txt +20 -0
  15. data/epeg/example/example.jpg +0 -0
  16. data/epeg/example/rotatetest.c +29 -0
  17. data/epeg/example/scaletest.c +48 -0
  18. data/epeg/vendor/libjpeg-turbo-2.0.4/BUILDING.md +828 -0
  19. data/epeg/vendor/libjpeg-turbo-2.0.4/CMakeLists.txt +1420 -0
  20. data/epeg/vendor/libjpeg-turbo-2.0.4/ChangeLog.md +1494 -0
  21. data/epeg/vendor/libjpeg-turbo-2.0.4/LICENSE.md +132 -0
  22. data/epeg/vendor/libjpeg-turbo-2.0.4/README.ijg +277 -0
  23. data/epeg/vendor/libjpeg-turbo-2.0.4/README.md +356 -0
  24. data/epeg/vendor/libjpeg-turbo-2.0.4/cderror.h +137 -0
  25. data/epeg/vendor/libjpeg-turbo-2.0.4/cdjpeg.c +145 -0
  26. data/epeg/vendor/libjpeg-turbo-2.0.4/cdjpeg.h +157 -0
  27. data/epeg/vendor/libjpeg-turbo-2.0.4/change.log +315 -0
  28. data/epeg/vendor/libjpeg-turbo-2.0.4/cjpeg.1 +354 -0
  29. data/epeg/vendor/libjpeg-turbo-2.0.4/cjpeg.c +695 -0
  30. data/epeg/vendor/libjpeg-turbo-2.0.4/cmakescripts/BuildPackages.cmake +182 -0
  31. data/epeg/vendor/libjpeg-turbo-2.0.4/cmakescripts/GNUInstallDirs.cmake +416 -0
  32. data/epeg/vendor/libjpeg-turbo-2.0.4/cmakescripts/cmake_uninstall.cmake.in +24 -0
  33. data/epeg/vendor/libjpeg-turbo-2.0.4/cmakescripts/testclean.cmake +41 -0
  34. data/epeg/vendor/libjpeg-turbo-2.0.4/cmyk.h +61 -0
  35. data/epeg/vendor/libjpeg-turbo-2.0.4/coderules.txt +78 -0
  36. data/epeg/vendor/libjpeg-turbo-2.0.4/djpeg.1 +296 -0
  37. data/epeg/vendor/libjpeg-turbo-2.0.4/djpeg.c +822 -0
  38. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/annotated.html +104 -0
  39. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/bc_s.png +0 -0
  40. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/bdwn.png +0 -0
  41. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/classes.html +106 -0
  42. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/closed.png +0 -0
  43. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/doxygen-extra.css +3 -0
  44. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/doxygen.css +1184 -0
  45. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/doxygen.png +0 -0
  46. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/dynsections.js +97 -0
  47. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2blank.png +0 -0
  48. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2cl.png +0 -0
  49. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2doc.png +0 -0
  50. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2folderclosed.png +0 -0
  51. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2folderopen.png +0 -0
  52. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2lastnode.png +0 -0
  53. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2link.png +0 -0
  54. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2mlastnode.png +0 -0
  55. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2mnode.png +0 -0
  56. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2mo.png +0 -0
  57. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2node.png +0 -0
  58. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2ns.png +0 -0
  59. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2plastnode.png +0 -0
  60. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2pnode.png +0 -0
  61. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2splitbar.png +0 -0
  62. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/ftv2vertline.png +0 -0
  63. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/functions.html +134 -0
  64. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/functions_vars.html +134 -0
  65. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/group___turbo_j_p_e_g.html +2775 -0
  66. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/index.html +90 -0
  67. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/jquery.js +8 -0
  68. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/modules.html +95 -0
  69. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/nav_f.png +0 -0
  70. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/nav_g.png +0 -0
  71. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/nav_h.png +0 -0
  72. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/open.png +0 -0
  73. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_63.html +26 -0
  74. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_63.js +4 -0
  75. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_64.html +26 -0
  76. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_64.js +5 -0
  77. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_68.html +26 -0
  78. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_68.js +4 -0
  79. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_6e.html +26 -0
  80. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_6e.js +4 -0
  81. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_6f.html +26 -0
  82. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_6f.js +5 -0
  83. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_72.html +26 -0
  84. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_72.js +4 -0
  85. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_74.html +26 -0
  86. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_74.js +102 -0
  87. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_77.html +26 -0
  88. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_77.js +4 -0
  89. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_78.html +26 -0
  90. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_78.js +4 -0
  91. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_79.html +26 -0
  92. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/all_79.js +4 -0
  93. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/classes_74.html +26 -0
  94. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/classes_74.js +6 -0
  95. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/close.png +0 -0
  96. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/enums_74.html +26 -0
  97. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/enums_74.js +8 -0
  98. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/enumvalues_74.html +26 -0
  99. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/enumvalues_74.js +37 -0
  100. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/functions_74.html +26 -0
  101. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/functions_74.js +31 -0
  102. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/groups_74.html +26 -0
  103. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/groups_74.js +4 -0
  104. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/mag_sel.png +0 -0
  105. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/nomatches.html +12 -0
  106. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search.css +271 -0
  107. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search.js +809 -0
  108. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search_l.png +0 -0
  109. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search_m.png +0 -0
  110. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/search_r.png +0 -0
  111. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/typedefs_74.html +26 -0
  112. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/typedefs_74.js +5 -0
  113. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_63.html +26 -0
  114. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_63.js +4 -0
  115. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_64.html +26 -0
  116. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_64.js +5 -0
  117. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_68.html +26 -0
  118. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_68.js +4 -0
  119. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_6e.html +26 -0
  120. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_6e.js +4 -0
  121. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_6f.html +26 -0
  122. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_6f.js +5 -0
  123. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_72.html +26 -0
  124. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_72.js +4 -0
  125. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_74.html +26 -0
  126. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_74.js +10 -0
  127. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_77.html +26 -0
  128. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_77.js +4 -0
  129. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_78.html +26 -0
  130. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_78.js +4 -0
  131. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_79.html +26 -0
  132. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/search/variables_79.js +4 -0
  133. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/structtjregion.html +186 -0
  134. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/structtjscalingfactor.html +148 -0
  135. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/structtjtransform.html +212 -0
  136. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/sync_off.png +0 -0
  137. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/sync_on.png +0 -0
  138. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tab_a.png +0 -0
  139. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tab_b.png +0 -0
  140. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tab_h.png +0 -0
  141. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tab_s.png +0 -0
  142. data/epeg/vendor/libjpeg-turbo-2.0.4/doc/html/tabs.css +60 -0
  143. data/epeg/vendor/libjpeg-turbo-2.0.4/doxygen-extra.css +3 -0
  144. data/epeg/vendor/libjpeg-turbo-2.0.4/doxygen.config +16 -0
  145. data/epeg/vendor/libjpeg-turbo-2.0.4/example.txt +464 -0
  146. data/epeg/vendor/libjpeg-turbo-2.0.4/jaricom.c +157 -0
  147. data/epeg/vendor/libjpeg-turbo-2.0.4/java/CMakeLists.txt +88 -0
  148. data/epeg/vendor/libjpeg-turbo-2.0.4/java/MANIFEST.MF +2 -0
  149. data/epeg/vendor/libjpeg-turbo-2.0.4/java/README +52 -0
  150. data/epeg/vendor/libjpeg-turbo-2.0.4/java/TJBench.java +1021 -0
  151. data/epeg/vendor/libjpeg-turbo-2.0.4/java/TJExample.java +405 -0
  152. data/epeg/vendor/libjpeg-turbo-2.0.4/java/TJUnitTest.java +960 -0
  153. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/allclasses-frame.html +24 -0
  154. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/allclasses-noframe.html +24 -0
  155. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/constant-values.html +532 -0
  156. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/deprecated-list.html +252 -0
  157. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/help-doc.html +210 -0
  158. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/index-all.html +1029 -0
  159. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/index.html +71 -0
  160. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJ.html +1356 -0
  161. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJCompressor.html +926 -0
  162. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJCustomFilter.html +241 -0
  163. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJDecompressor.html +1255 -0
  164. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJException.html +340 -0
  165. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJScalingFactor.html +343 -0
  166. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJTransform.html +751 -0
  167. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/TJTransformer.html +421 -0
  168. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/YUVImage.html +765 -0
  169. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/package-frame.html +31 -0
  170. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/package-summary.html +202 -0
  171. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/org/libjpegturbo/turbojpeg/package-tree.html +160 -0
  172. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/overview-tree.html +164 -0
  173. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/package-list +1 -0
  174. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/resources/background.gif +0 -0
  175. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/resources/tab.gif +0 -0
  176. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/resources/titlebar.gif +0 -0
  177. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/resources/titlebar_end.gif +0 -0
  178. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/script.js +30 -0
  179. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/serialized-form.html +176 -0
  180. data/epeg/vendor/libjpeg-turbo-2.0.4/java/doc/stylesheet.css +474 -0
  181. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJ.java +584 -0
  182. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJCompressor.java +677 -0
  183. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJCustomFilter.java +76 -0
  184. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJDecompressor.java +931 -0
  185. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJException.java +78 -0
  186. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJLoader-unix.java.in +59 -0
  187. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJLoader-win.java.in +35 -0
  188. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJScalingFactor.java +115 -0
  189. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJTransform.java +227 -0
  190. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/TJTransformer.java +163 -0
  191. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org/libjpegturbo/turbojpeg/YUVImage.java +445 -0
  192. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org_libjpegturbo_turbojpeg_TJ.h +129 -0
  193. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org_libjpegturbo_turbojpeg_TJCompressor.h +101 -0
  194. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org_libjpegturbo_turbojpeg_TJDecompressor.h +101 -0
  195. data/epeg/vendor/libjpeg-turbo-2.0.4/java/org_libjpegturbo_turbojpeg_TJTransformer.h +29 -0
  196. data/epeg/vendor/libjpeg-turbo-2.0.4/jcapimin.c +295 -0
  197. data/epeg/vendor/libjpeg-turbo-2.0.4/jcapistd.c +162 -0
  198. data/epeg/vendor/libjpeg-turbo-2.0.4/jcarith.c +932 -0
  199. data/epeg/vendor/libjpeg-turbo-2.0.4/jccoefct.c +449 -0
  200. data/epeg/vendor/libjpeg-turbo-2.0.4/jccolext.c +144 -0
  201. data/epeg/vendor/libjpeg-turbo-2.0.4/jccolor.c +710 -0
  202. data/epeg/vendor/libjpeg-turbo-2.0.4/jcdctmgr.c +721 -0
  203. data/epeg/vendor/libjpeg-turbo-2.0.4/jchuff.c +1096 -0
  204. data/epeg/vendor/libjpeg-turbo-2.0.4/jchuff.h +42 -0
  205. data/epeg/vendor/libjpeg-turbo-2.0.4/jcicc.c +105 -0
  206. data/epeg/vendor/libjpeg-turbo-2.0.4/jcinit.c +77 -0
  207. data/epeg/vendor/libjpeg-turbo-2.0.4/jcmainct.c +162 -0
  208. data/epeg/vendor/libjpeg-turbo-2.0.4/jcmarker.c +664 -0
  209. data/epeg/vendor/libjpeg-turbo-2.0.4/jcmaster.c +640 -0
  210. data/epeg/vendor/libjpeg-turbo-2.0.4/jcomapi.c +109 -0
  211. data/epeg/vendor/libjpeg-turbo-2.0.4/jconfig.h.in +73 -0
  212. data/epeg/vendor/libjpeg-turbo-2.0.4/jconfig.txt +143 -0
  213. data/epeg/vendor/libjpeg-turbo-2.0.4/jconfigint.h.in +31 -0
  214. data/epeg/vendor/libjpeg-turbo-2.0.4/jcparam.c +541 -0
  215. data/epeg/vendor/libjpeg-turbo-2.0.4/jcphuff.c +1105 -0
  216. data/epeg/vendor/libjpeg-turbo-2.0.4/jcprepct.c +351 -0
  217. data/epeg/vendor/libjpeg-turbo-2.0.4/jcsample.c +539 -0
  218. data/epeg/vendor/libjpeg-turbo-2.0.4/jcstest.c +126 -0
  219. data/epeg/vendor/libjpeg-turbo-2.0.4/jctrans.c +400 -0
  220. data/epeg/vendor/libjpeg-turbo-2.0.4/jdapimin.c +407 -0
  221. data/epeg/vendor/libjpeg-turbo-2.0.4/jdapistd.c +639 -0
  222. data/epeg/vendor/libjpeg-turbo-2.0.4/jdarith.c +773 -0
  223. data/epeg/vendor/libjpeg-turbo-2.0.4/jdatadst-tj.c +203 -0
  224. data/epeg/vendor/libjpeg-turbo-2.0.4/jdatadst.c +293 -0
  225. data/epeg/vendor/libjpeg-turbo-2.0.4/jdatasrc-tj.c +194 -0
  226. data/epeg/vendor/libjpeg-turbo-2.0.4/jdatasrc.c +295 -0
  227. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcoefct.c +692 -0
  228. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcoefct.h +82 -0
  229. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcol565.c +384 -0
  230. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcolext.c +143 -0
  231. data/epeg/vendor/libjpeg-turbo-2.0.4/jdcolor.c +883 -0
  232. data/epeg/vendor/libjpeg-turbo-2.0.4/jdct.h +208 -0
  233. data/epeg/vendor/libjpeg-turbo-2.0.4/jddctmgr.c +352 -0
  234. data/epeg/vendor/libjpeg-turbo-2.0.4/jdhuff.c +831 -0
  235. data/epeg/vendor/libjpeg-turbo-2.0.4/jdhuff.h +238 -0
  236. data/epeg/vendor/libjpeg-turbo-2.0.4/jdicc.c +171 -0
  237. data/epeg/vendor/libjpeg-turbo-2.0.4/jdinput.c +408 -0
  238. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmainct.c +460 -0
  239. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmainct.h +71 -0
  240. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmarker.c +1377 -0
  241. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmaster.c +737 -0
  242. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmaster.h +28 -0
  243. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmerge.c +617 -0
  244. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmrg565.c +354 -0
  245. data/epeg/vendor/libjpeg-turbo-2.0.4/jdmrgext.c +184 -0
  246. data/epeg/vendor/libjpeg-turbo-2.0.4/jdphuff.c +687 -0
  247. data/epeg/vendor/libjpeg-turbo-2.0.4/jdpostct.c +294 -0
  248. data/epeg/vendor/libjpeg-turbo-2.0.4/jdsample.c +518 -0
  249. data/epeg/vendor/libjpeg-turbo-2.0.4/jdsample.h +50 -0
  250. data/epeg/vendor/libjpeg-turbo-2.0.4/jdtrans.c +155 -0
  251. data/epeg/vendor/libjpeg-turbo-2.0.4/jerror.c +251 -0
  252. data/epeg/vendor/libjpeg-turbo-2.0.4/jerror.h +316 -0
  253. data/epeg/vendor/libjpeg-turbo-2.0.4/jfdctflt.c +169 -0
  254. data/epeg/vendor/libjpeg-turbo-2.0.4/jfdctfst.c +227 -0
  255. data/epeg/vendor/libjpeg-turbo-2.0.4/jfdctint.c +288 -0
  256. data/epeg/vendor/libjpeg-turbo-2.0.4/jidctflt.c +240 -0
  257. data/epeg/vendor/libjpeg-turbo-2.0.4/jidctfst.c +371 -0
  258. data/epeg/vendor/libjpeg-turbo-2.0.4/jidctint.c +2627 -0
  259. data/epeg/vendor/libjpeg-turbo-2.0.4/jidctred.c +409 -0
  260. data/epeg/vendor/libjpeg-turbo-2.0.4/jinclude.h +88 -0
  261. data/epeg/vendor/libjpeg-turbo-2.0.4/jmemmgr.c +1179 -0
  262. data/epeg/vendor/libjpeg-turbo-2.0.4/jmemnobs.c +115 -0
  263. data/epeg/vendor/libjpeg-turbo-2.0.4/jmemsys.h +178 -0
  264. data/epeg/vendor/libjpeg-turbo-2.0.4/jmorecfg.h +421 -0
  265. data/epeg/vendor/libjpeg-turbo-2.0.4/jpeg_nbits_table.h +4098 -0
  266. data/epeg/vendor/libjpeg-turbo-2.0.4/jpegcomp.h +31 -0
  267. data/epeg/vendor/libjpeg-turbo-2.0.4/jpegint.h +368 -0
  268. data/epeg/vendor/libjpeg-turbo-2.0.4/jpeglib.h +1132 -0
  269. data/epeg/vendor/libjpeg-turbo-2.0.4/jpegtran.1 +295 -0
  270. data/epeg/vendor/libjpeg-turbo-2.0.4/jpegtran.c +601 -0
  271. data/epeg/vendor/libjpeg-turbo-2.0.4/jquant1.c +859 -0
  272. data/epeg/vendor/libjpeg-turbo-2.0.4/jquant2.c +1285 -0
  273. data/epeg/vendor/libjpeg-turbo-2.0.4/jsimd.h +117 -0
  274. data/epeg/vendor/libjpeg-turbo-2.0.4/jsimd_none.c +418 -0
  275. data/epeg/vendor/libjpeg-turbo-2.0.4/jsimddct.h +70 -0
  276. data/epeg/vendor/libjpeg-turbo-2.0.4/jstdhuff.c +143 -0
  277. data/epeg/vendor/libjpeg-turbo-2.0.4/jutils.c +133 -0
  278. data/epeg/vendor/libjpeg-turbo-2.0.4/jversion.h +52 -0
  279. data/epeg/vendor/libjpeg-turbo-2.0.4/libjpeg.map.in +11 -0
  280. data/epeg/vendor/libjpeg-turbo-2.0.4/libjpeg.txt +3144 -0
  281. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/CMakeLists.txt +1 -0
  282. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/md5.c +275 -0
  283. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/md5.h +57 -0
  284. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/md5cmp.c +59 -0
  285. data/epeg/vendor/libjpeg-turbo-2.0.4/md5/md5hl.c +125 -0
  286. data/epeg/vendor/libjpeg-turbo-2.0.4/rdbmp.c +689 -0
  287. data/epeg/vendor/libjpeg-turbo-2.0.4/rdcolmap.c +254 -0
  288. data/epeg/vendor/libjpeg-turbo-2.0.4/rdgif.c +39 -0
  289. data/epeg/vendor/libjpeg-turbo-2.0.4/rdjpgcom.1 +63 -0
  290. data/epeg/vendor/libjpeg-turbo-2.0.4/rdjpgcom.c +510 -0
  291. data/epeg/vendor/libjpeg-turbo-2.0.4/rdppm.c +766 -0
  292. data/epeg/vendor/libjpeg-turbo-2.0.4/rdrle.c +389 -0
  293. data/epeg/vendor/libjpeg-turbo-2.0.4/rdswitch.c +424 -0
  294. data/epeg/vendor/libjpeg-turbo-2.0.4/rdtarga.c +509 -0
  295. data/epeg/vendor/libjpeg-turbo-2.0.4/release/Distribution.xml.in +24 -0
  296. data/epeg/vendor/libjpeg-turbo-2.0.4/release/License.rtf +20 -0
  297. data/epeg/vendor/libjpeg-turbo-2.0.4/release/ReadMe.txt +5 -0
  298. data/epeg/vendor/libjpeg-turbo-2.0.4/release/Welcome.rtf +17 -0
  299. data/epeg/vendor/libjpeg-turbo-2.0.4/release/deb-control.in +31 -0
  300. data/epeg/vendor/libjpeg-turbo-2.0.4/release/installer.nsi.in +191 -0
  301. data/epeg/vendor/libjpeg-turbo-2.0.4/release/libjpeg.pc.in +10 -0
  302. data/epeg/vendor/libjpeg-turbo-2.0.4/release/libturbojpeg.pc.in +10 -0
  303. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makecygwinpkg.in +66 -0
  304. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makedpkg.in +115 -0
  305. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makemacpkg.in +284 -0
  306. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makerpm.in +30 -0
  307. data/epeg/vendor/libjpeg-turbo-2.0.4/release/makesrpm.in +48 -0
  308. data/epeg/vendor/libjpeg-turbo-2.0.4/release/maketarball.in +51 -0
  309. data/epeg/vendor/libjpeg-turbo-2.0.4/release/rpm.spec.in +221 -0
  310. data/epeg/vendor/libjpeg-turbo-2.0.4/release/uninstall.in +113 -0
  311. data/epeg/vendor/libjpeg-turbo-2.0.4/sharedlib/CMakeLists.txt +99 -0
  312. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/CMakeLists.txt +385 -0
  313. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/arm/jsimd.c +721 -0
  314. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/arm/jsimd_neon.S +2878 -0
  315. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/arm64/jsimd.c +798 -0
  316. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/arm64/jsimd_neon.S +3433 -0
  317. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/gas-preprocessor.in +1 -0
  318. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolext-avx2.asm +578 -0
  319. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolext-mmx.asm +476 -0
  320. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolext-sse2.asm +503 -0
  321. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolor-avx2.asm +121 -0
  322. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolor-mmx.asm +121 -0
  323. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jccolor-sse2.asm +120 -0
  324. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgray-avx2.asm +113 -0
  325. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgray-mmx.asm +113 -0
  326. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgray-sse2.asm +112 -0
  327. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgryext-avx2.asm +457 -0
  328. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgryext-mmx.asm +355 -0
  329. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcgryext-sse2.asm +382 -0
  330. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jchuff-sse2.asm +424 -0
  331. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcphuff-sse2.asm +660 -0
  332. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcsample-avx2.asm +388 -0
  333. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcsample-mmx.asm +324 -0
  334. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jcsample-sse2.asm +351 -0
  335. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolext-avx2.asm +515 -0
  336. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolext-mmx.asm +404 -0
  337. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolext-sse2.asm +458 -0
  338. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolor-avx2.asm +118 -0
  339. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolor-mmx.asm +117 -0
  340. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdcolor-sse2.asm +117 -0
  341. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmerge-avx2.asm +136 -0
  342. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmerge-mmx.asm +123 -0
  343. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmerge-sse2.asm +135 -0
  344. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmrgext-avx2.asm +575 -0
  345. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmrgext-mmx.asm +460 -0
  346. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdmrgext-sse2.asm +517 -0
  347. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdsample-avx2.asm +760 -0
  348. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdsample-mmx.asm +731 -0
  349. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jdsample-sse2.asm +724 -0
  350. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctflt-3dn.asm +318 -0
  351. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctflt-sse.asm +369 -0
  352. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctfst-mmx.asm +395 -0
  353. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctfst-sse2.asm +403 -0
  354. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctint-avx2.asm +331 -0
  355. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctint-mmx.asm +620 -0
  356. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jfdctint-sse2.asm +633 -0
  357. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctflt-3dn.asm +451 -0
  358. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctflt-sse.asm +571 -0
  359. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctflt-sse2.asm +497 -0
  360. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctfst-mmx.asm +499 -0
  361. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctfst-sse2.asm +501 -0
  362. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctint-avx2.asm +453 -0
  363. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctint-mmx.asm +851 -0
  364. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctint-sse2.asm +858 -0
  365. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctred-mmx.asm +704 -0
  366. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jidctred-sse2.asm +592 -0
  367. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquant-3dn.asm +230 -0
  368. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquant-mmx.asm +276 -0
  369. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquant-sse.asm +208 -0
  370. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquantf-sse2.asm +168 -0
  371. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquanti-avx2.asm +188 -0
  372. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jquanti-sse2.asm +201 -0
  373. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jsimd.c +1253 -0
  374. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/i386/jsimdcpu.asm +135 -0
  375. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/jsimd.h +1083 -0
  376. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jccolext-mmi.c +483 -0
  377. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jccolor-mmi.c +148 -0
  378. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jcsample-mmi.c +100 -0
  379. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jcsample.h +28 -0
  380. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jdcolext-mmi.c +424 -0
  381. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jdcolor-mmi.c +139 -0
  382. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jdsample-mmi.c +245 -0
  383. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jfdctint-mmi.c +398 -0
  384. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jidctint-mmi.c +571 -0
  385. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jquanti-mmi.c +130 -0
  386. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jsimd.c +610 -0
  387. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/jsimd_mmi.h +57 -0
  388. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/loongson/loongson-mmintrin.h +1324 -0
  389. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/mips/jsimd.c +1123 -0
  390. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/mips/jsimd_dspr2.S +4479 -0
  391. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/mips/jsimd_dspr2_asm.h +292 -0
  392. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jcolsamp.inc +135 -0
  393. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jdct.inc +31 -0
  394. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jpeg_nbits_table.inc +4097 -0
  395. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jsimdcfg.inc +93 -0
  396. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jsimdcfg.inc.h +131 -0
  397. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/nasm/jsimdext.inc +479 -0
  398. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jccolext-altivec.c +269 -0
  399. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jccolor-altivec.c +116 -0
  400. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jcgray-altivec.c +111 -0
  401. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jcgryext-altivec.c +228 -0
  402. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jcsample-altivec.c +159 -0
  403. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jcsample.h +28 -0
  404. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdcolext-altivec.c +276 -0
  405. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdcolor-altivec.c +106 -0
  406. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdmerge-altivec.c +130 -0
  407. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdmrgext-altivec.c +329 -0
  408. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jdsample-altivec.c +400 -0
  409. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jfdctfst-altivec.c +154 -0
  410. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jfdctint-altivec.c +258 -0
  411. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jidctfst-altivec.c +255 -0
  412. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jidctint-altivec.c +357 -0
  413. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jquanti-altivec.c +250 -0
  414. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jsimd.c +872 -0
  415. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/powerpc/jsimd_altivec.h +98 -0
  416. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jccolext-avx2.asm +558 -0
  417. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jccolext-sse2.asm +483 -0
  418. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jccolor-avx2.asm +121 -0
  419. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jccolor-sse2.asm +120 -0
  420. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcgray-avx2.asm +113 -0
  421. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcgray-sse2.asm +112 -0
  422. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcgryext-avx2.asm +437 -0
  423. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcgryext-sse2.asm +362 -0
  424. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jchuff-sse2.asm +346 -0
  425. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcphuff-sse2.asm +637 -0
  426. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcsample-avx2.asm +366 -0
  427. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jcsample-sse2.asm +329 -0
  428. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdcolext-avx2.asm +495 -0
  429. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdcolext-sse2.asm +438 -0
  430. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdcolor-avx2.asm +118 -0
  431. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdcolor-sse2.asm +117 -0
  432. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdmerge-avx2.asm +136 -0
  433. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdmerge-sse2.asm +135 -0
  434. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdmrgext-avx2.asm +593 -0
  435. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdmrgext-sse2.asm +535 -0
  436. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdsample-avx2.asm +695 -0
  437. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jdsample-sse2.asm +664 -0
  438. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jfdctflt-sse.asm +355 -0
  439. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jfdctfst-sse2.asm +389 -0
  440. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jfdctint-avx2.asm +320 -0
  441. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jfdctint-sse2.asm +619 -0
  442. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctflt-sse2.asm +481 -0
  443. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctfst-sse2.asm +490 -0
  444. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctint-avx2.asm +417 -0
  445. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctint-sse2.asm +846 -0
  446. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jidctred-sse2.asm +573 -0
  447. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jquantf-sse2.asm +154 -0
  448. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jquanti-avx2.asm +162 -0
  449. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jquanti-sse2.asm +187 -0
  450. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jsimd.c +1076 -0
  451. data/epeg/vendor/libjpeg-turbo-2.0.4/simd/x86_64/jsimdcpu.asm +86 -0
  452. data/epeg/vendor/libjpeg-turbo-2.0.4/structure.txt +904 -0
  453. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/nightshot_iso_100.bmp +0 -0
  454. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/nightshot_iso_100.txt +25 -0
  455. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test.scan +5 -0
  456. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test1.icc +0 -0
  457. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test1.icc.txt +20 -0
  458. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test2.icc +0 -0
  459. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/test2.icc.txt +20 -0
  460. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testimgari.jpg +0 -0
  461. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testimgint.jpg +0 -0
  462. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testorig.jpg +0 -0
  463. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testorig.ppm +4 -0
  464. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/testorig12.jpg +0 -0
  465. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/vgl_5674_0098.bmp +0 -0
  466. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/vgl_6434_0018a.bmp +0 -0
  467. data/epeg/vendor/libjpeg-turbo-2.0.4/testimages/vgl_6548_0026a.bmp +0 -0
  468. data/epeg/vendor/libjpeg-turbo-2.0.4/tjbench.c +1031 -0
  469. data/epeg/vendor/libjpeg-turbo-2.0.4/tjbenchtest.in +256 -0
  470. data/epeg/vendor/libjpeg-turbo-2.0.4/tjbenchtest.java.in +215 -0
  471. data/epeg/vendor/libjpeg-turbo-2.0.4/tjexample.c +396 -0
  472. data/epeg/vendor/libjpeg-turbo-2.0.4/tjexampletest.in +149 -0
  473. data/epeg/vendor/libjpeg-turbo-2.0.4/tjexampletest.java.in +151 -0
  474. data/epeg/vendor/libjpeg-turbo-2.0.4/tjunittest.c +931 -0
  475. data/epeg/vendor/libjpeg-turbo-2.0.4/tjutil.c +70 -0
  476. data/epeg/vendor/libjpeg-turbo-2.0.4/tjutil.h +47 -0
  477. data/epeg/vendor/libjpeg-turbo-2.0.4/transupp.c +1628 -0
  478. data/epeg/vendor/libjpeg-turbo-2.0.4/transupp.h +210 -0
  479. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg-jni.c +1246 -0
  480. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg-mapfile +65 -0
  481. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg-mapfile.jni +101 -0
  482. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg.c +2152 -0
  483. data/epeg/vendor/libjpeg-turbo-2.0.4/turbojpeg.h +1744 -0
  484. data/epeg/vendor/libjpeg-turbo-2.0.4/usage.txt +635 -0
  485. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jconfig.h.in +34 -0
  486. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg62-memsrcdst.def +108 -0
  487. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg62.def +106 -0
  488. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg7-memsrcdst.def +110 -0
  489. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg7.def +108 -0
  490. data/epeg/vendor/libjpeg-turbo-2.0.4/win/jpeg8.def +111 -0
  491. data/epeg/vendor/libjpeg-turbo-2.0.4/wizard.txt +212 -0
  492. data/epeg/vendor/libjpeg-turbo-2.0.4/wrbmp.c +558 -0
  493. data/epeg/vendor/libjpeg-turbo-2.0.4/wrgif.c +413 -0
  494. data/epeg/vendor/libjpeg-turbo-2.0.4/wrjpgcom.1 +103 -0
  495. data/epeg/vendor/libjpeg-turbo-2.0.4/wrjpgcom.c +591 -0
  496. data/epeg/vendor/libjpeg-turbo-2.0.4/wrppm.c +365 -0
  497. data/epeg/vendor/libjpeg-turbo-2.0.4/wrrle.c +309 -0
  498. data/epeg/vendor/libjpeg-turbo-2.0.4/wrtarga.c +261 -0
  499. data/epeg.c +131 -0
  500. data/epeg.gemspec +18 -0
  501. data/extconf.rb +80 -0
  502. data/test.jpg +0 -0
  503. data/test.rb +42 -0
  504. metadata +546 -0
@@ -0,0 +1,1285 @@
1
+ /*
2
+ * jquant2.c
3
+ *
4
+ * This file was part of the Independent JPEG Group's software:
5
+ * Copyright (C) 1991-1996, Thomas G. Lane.
6
+ * libjpeg-turbo Modifications:
7
+ * Copyright (C) 2009, 2014-2015, D. R. Commander.
8
+ * For conditions of distribution and use, see the accompanying README.ijg
9
+ * file.
10
+ *
11
+ * This file contains 2-pass color quantization (color mapping) routines.
12
+ * These routines provide selection of a custom color map for an image,
13
+ * followed by mapping of the image to that color map, with optional
14
+ * Floyd-Steinberg dithering.
15
+ * It is also possible to use just the second pass to map to an arbitrary
16
+ * externally-given color map.
17
+ *
18
+ * Note: ordered dithering is not supported, since there isn't any fast
19
+ * way to compute intercolor distances; it's unclear that ordered dither's
20
+ * fundamental assumptions even hold with an irregularly spaced color map.
21
+ */
22
+
23
+ #define JPEG_INTERNALS
24
+ #include "jinclude.h"
25
+ #include "jpeglib.h"
26
+
27
+ #ifdef QUANT_2PASS_SUPPORTED
28
+
29
+
30
+ /*
31
+ * This module implements the well-known Heckbert paradigm for color
32
+ * quantization. Most of the ideas used here can be traced back to
33
+ * Heckbert's seminal paper
34
+ * Heckbert, Paul. "Color Image Quantization for Frame Buffer Display",
35
+ * Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304.
36
+ *
37
+ * In the first pass over the image, we accumulate a histogram showing the
38
+ * usage count of each possible color. To keep the histogram to a reasonable
39
+ * size, we reduce the precision of the input; typical practice is to retain
40
+ * 5 or 6 bits per color, so that 8 or 4 different input values are counted
41
+ * in the same histogram cell.
42
+ *
43
+ * Next, the color-selection step begins with a box representing the whole
44
+ * color space, and repeatedly splits the "largest" remaining box until we
45
+ * have as many boxes as desired colors. Then the mean color in each
46
+ * remaining box becomes one of the possible output colors.
47
+ *
48
+ * The second pass over the image maps each input pixel to the closest output
49
+ * color (optionally after applying a Floyd-Steinberg dithering correction).
50
+ * This mapping is logically trivial, but making it go fast enough requires
51
+ * considerable care.
52
+ *
53
+ * Heckbert-style quantizers vary a good deal in their policies for choosing
54
+ * the "largest" box and deciding where to cut it. The particular policies
55
+ * used here have proved out well in experimental comparisons, but better ones
56
+ * may yet be found.
57
+ *
58
+ * In earlier versions of the IJG code, this module quantized in YCbCr color
59
+ * space, processing the raw upsampled data without a color conversion step.
60
+ * This allowed the color conversion math to be done only once per colormap
61
+ * entry, not once per pixel. However, that optimization precluded other
62
+ * useful optimizations (such as merging color conversion with upsampling)
63
+ * and it also interfered with desired capabilities such as quantizing to an
64
+ * externally-supplied colormap. We have therefore abandoned that approach.
65
+ * The present code works in the post-conversion color space, typically RGB.
66
+ *
67
+ * To improve the visual quality of the results, we actually work in scaled
68
+ * RGB space, giving G distances more weight than R, and R in turn more than
69
+ * B. To do everything in integer math, we must use integer scale factors.
70
+ * The 2/3/1 scale factors used here correspond loosely to the relative
71
+ * weights of the colors in the NTSC grayscale equation.
72
+ * If you want to use this code to quantize a non-RGB color space, you'll
73
+ * probably need to change these scale factors.
74
+ */
75
+
76
+ #define R_SCALE 2 /* scale R distances by this much */
77
+ #define G_SCALE 3 /* scale G distances by this much */
78
+ #define B_SCALE 1 /* and B by this much */
79
+
80
+ static const int c_scales[3] = { R_SCALE, G_SCALE, B_SCALE };
81
+ #define C0_SCALE c_scales[rgb_red[cinfo->out_color_space]]
82
+ #define C1_SCALE c_scales[rgb_green[cinfo->out_color_space]]
83
+ #define C2_SCALE c_scales[rgb_blue[cinfo->out_color_space]]
84
+
85
+ /*
86
+ * First we have the histogram data structure and routines for creating it.
87
+ *
88
+ * The number of bits of precision can be adjusted by changing these symbols.
89
+ * We recommend keeping 6 bits for G and 5 each for R and B.
90
+ * If you have plenty of memory and cycles, 6 bits all around gives marginally
91
+ * better results; if you are short of memory, 5 bits all around will save
92
+ * some space but degrade the results.
93
+ * To maintain a fully accurate histogram, we'd need to allocate a "long"
94
+ * (preferably unsigned long) for each cell. In practice this is overkill;
95
+ * we can get by with 16 bits per cell. Few of the cell counts will overflow,
96
+ * and clamping those that do overflow to the maximum value will give close-
97
+ * enough results. This reduces the recommended histogram size from 256Kb
98
+ * to 128Kb, which is a useful savings on PC-class machines.
99
+ * (In the second pass the histogram space is re-used for pixel mapping data;
100
+ * in that capacity, each cell must be able to store zero to the number of
101
+ * desired colors. 16 bits/cell is plenty for that too.)
102
+ * Since the JPEG code is intended to run in small memory model on 80x86
103
+ * machines, we can't just allocate the histogram in one chunk. Instead
104
+ * of a true 3-D array, we use a row of pointers to 2-D arrays. Each
105
+ * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and
106
+ * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries.
107
+ */
108
+
109
+ #define MAXNUMCOLORS (MAXJSAMPLE + 1) /* maximum size of colormap */
110
+
111
+ /* These will do the right thing for either R,G,B or B,G,R color order,
112
+ * but you may not like the results for other color orders.
113
+ */
114
+ #define HIST_C0_BITS 5 /* bits of precision in R/B histogram */
115
+ #define HIST_C1_BITS 6 /* bits of precision in G histogram */
116
+ #define HIST_C2_BITS 5 /* bits of precision in B/R histogram */
117
+
118
+ /* Number of elements along histogram axes. */
119
+ #define HIST_C0_ELEMS (1 << HIST_C0_BITS)
120
+ #define HIST_C1_ELEMS (1 << HIST_C1_BITS)
121
+ #define HIST_C2_ELEMS (1 << HIST_C2_BITS)
122
+
123
+ /* These are the amounts to shift an input value to get a histogram index. */
124
+ #define C0_SHIFT (BITS_IN_JSAMPLE - HIST_C0_BITS)
125
+ #define C1_SHIFT (BITS_IN_JSAMPLE - HIST_C1_BITS)
126
+ #define C2_SHIFT (BITS_IN_JSAMPLE - HIST_C2_BITS)
127
+
128
+
129
+ typedef UINT16 histcell; /* histogram cell; prefer an unsigned type */
130
+
131
+ typedef histcell *histptr; /* for pointers to histogram cells */
132
+
133
+ typedef histcell hist1d[HIST_C2_ELEMS]; /* typedefs for the array */
134
+ typedef hist1d *hist2d; /* type for the 2nd-level pointers */
135
+ typedef hist2d *hist3d; /* type for top-level pointer */
136
+
137
+
138
+ /* Declarations for Floyd-Steinberg dithering.
139
+ *
140
+ * Errors are accumulated into the array fserrors[], at a resolution of
141
+ * 1/16th of a pixel count. The error at a given pixel is propagated
142
+ * to its not-yet-processed neighbors using the standard F-S fractions,
143
+ * ... (here) 7/16
144
+ * 3/16 5/16 1/16
145
+ * We work left-to-right on even rows, right-to-left on odd rows.
146
+ *
147
+ * We can get away with a single array (holding one row's worth of errors)
148
+ * by using it to store the current row's errors at pixel columns not yet
149
+ * processed, but the next row's errors at columns already processed. We
150
+ * need only a few extra variables to hold the errors immediately around the
151
+ * current column. (If we are lucky, those variables are in registers, but
152
+ * even if not, they're probably cheaper to access than array elements are.)
153
+ *
154
+ * The fserrors[] array has (#columns + 2) entries; the extra entry at
155
+ * each end saves us from special-casing the first and last pixels.
156
+ * Each entry is three values long, one value for each color component.
157
+ */
158
+
159
+ #if BITS_IN_JSAMPLE == 8
160
+ typedef INT16 FSERROR; /* 16 bits should be enough */
161
+ typedef int LOCFSERROR; /* use 'int' for calculation temps */
162
+ #else
163
+ typedef JLONG FSERROR; /* may need more than 16 bits */
164
+ typedef JLONG LOCFSERROR; /* be sure calculation temps are big enough */
165
+ #endif
166
+
167
+ typedef FSERROR *FSERRPTR; /* pointer to error array */
168
+
169
+
170
+ /* Private subobject */
171
+
172
+ typedef struct {
173
+ struct jpeg_color_quantizer pub; /* public fields */
174
+
175
+ /* Space for the eventually created colormap is stashed here */
176
+ JSAMPARRAY sv_colormap; /* colormap allocated at init time */
177
+ int desired; /* desired # of colors = size of colormap */
178
+
179
+ /* Variables for accumulating image statistics */
180
+ hist3d histogram; /* pointer to the histogram */
181
+
182
+ boolean needs_zeroed; /* TRUE if next pass must zero histogram */
183
+
184
+ /* Variables for Floyd-Steinberg dithering */
185
+ FSERRPTR fserrors; /* accumulated errors */
186
+ boolean on_odd_row; /* flag to remember which row we are on */
187
+ int *error_limiter; /* table for clamping the applied error */
188
+ } my_cquantizer;
189
+
190
+ typedef my_cquantizer *my_cquantize_ptr;
191
+
192
+
193
+ /*
194
+ * Prescan some rows of pixels.
195
+ * In this module the prescan simply updates the histogram, which has been
196
+ * initialized to zeroes by start_pass.
197
+ * An output_buf parameter is required by the method signature, but no data
198
+ * is actually output (in fact the buffer controller is probably passing a
199
+ * NULL pointer).
200
+ */
201
+
202
+ METHODDEF(void)
203
+ prescan_quantize(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
204
+ JSAMPARRAY output_buf, int num_rows)
205
+ {
206
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
207
+ register JSAMPROW ptr;
208
+ register histptr histp;
209
+ register hist3d histogram = cquantize->histogram;
210
+ int row;
211
+ JDIMENSION col;
212
+ JDIMENSION width = cinfo->output_width;
213
+
214
+ for (row = 0; row < num_rows; row++) {
215
+ ptr = input_buf[row];
216
+ for (col = width; col > 0; col--) {
217
+ /* get pixel value and index into the histogram */
218
+ histp = &histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT]
219
+ [GETJSAMPLE(ptr[1]) >> C1_SHIFT]
220
+ [GETJSAMPLE(ptr[2]) >> C2_SHIFT];
221
+ /* increment, check for overflow and undo increment if so. */
222
+ if (++(*histp) <= 0)
223
+ (*histp)--;
224
+ ptr += 3;
225
+ }
226
+ }
227
+ }
228
+
229
+
230
+ /*
231
+ * Next we have the really interesting routines: selection of a colormap
232
+ * given the completed histogram.
233
+ * These routines work with a list of "boxes", each representing a rectangular
234
+ * subset of the input color space (to histogram precision).
235
+ */
236
+
237
+ typedef struct {
238
+ /* The bounds of the box (inclusive); expressed as histogram indexes */
239
+ int c0min, c0max;
240
+ int c1min, c1max;
241
+ int c2min, c2max;
242
+ /* The volume (actually 2-norm) of the box */
243
+ JLONG volume;
244
+ /* The number of nonzero histogram cells within this box */
245
+ long colorcount;
246
+ } box;
247
+
248
+ typedef box *boxptr;
249
+
250
+
251
+ LOCAL(boxptr)
252
+ find_biggest_color_pop(boxptr boxlist, int numboxes)
253
+ /* Find the splittable box with the largest color population */
254
+ /* Returns NULL if no splittable boxes remain */
255
+ {
256
+ register boxptr boxp;
257
+ register int i;
258
+ register long maxc = 0;
259
+ boxptr which = NULL;
260
+
261
+ for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
262
+ if (boxp->colorcount > maxc && boxp->volume > 0) {
263
+ which = boxp;
264
+ maxc = boxp->colorcount;
265
+ }
266
+ }
267
+ return which;
268
+ }
269
+
270
+
271
+ LOCAL(boxptr)
272
+ find_biggest_volume(boxptr boxlist, int numboxes)
273
+ /* Find the splittable box with the largest (scaled) volume */
274
+ /* Returns NULL if no splittable boxes remain */
275
+ {
276
+ register boxptr boxp;
277
+ register int i;
278
+ register JLONG maxv = 0;
279
+ boxptr which = NULL;
280
+
281
+ for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) {
282
+ if (boxp->volume > maxv) {
283
+ which = boxp;
284
+ maxv = boxp->volume;
285
+ }
286
+ }
287
+ return which;
288
+ }
289
+
290
+
291
+ LOCAL(void)
292
+ update_box(j_decompress_ptr cinfo, boxptr boxp)
293
+ /* Shrink the min/max bounds of a box to enclose only nonzero elements, */
294
+ /* and recompute its volume and population */
295
+ {
296
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
297
+ hist3d histogram = cquantize->histogram;
298
+ histptr histp;
299
+ int c0, c1, c2;
300
+ int c0min, c0max, c1min, c1max, c2min, c2max;
301
+ JLONG dist0, dist1, dist2;
302
+ long ccount;
303
+
304
+ c0min = boxp->c0min; c0max = boxp->c0max;
305
+ c1min = boxp->c1min; c1max = boxp->c1max;
306
+ c2min = boxp->c2min; c2max = boxp->c2max;
307
+
308
+ if (c0max > c0min)
309
+ for (c0 = c0min; c0 <= c0max; c0++)
310
+ for (c1 = c1min; c1 <= c1max; c1++) {
311
+ histp = &histogram[c0][c1][c2min];
312
+ for (c2 = c2min; c2 <= c2max; c2++)
313
+ if (*histp++ != 0) {
314
+ boxp->c0min = c0min = c0;
315
+ goto have_c0min;
316
+ }
317
+ }
318
+ have_c0min:
319
+ if (c0max > c0min)
320
+ for (c0 = c0max; c0 >= c0min; c0--)
321
+ for (c1 = c1min; c1 <= c1max; c1++) {
322
+ histp = &histogram[c0][c1][c2min];
323
+ for (c2 = c2min; c2 <= c2max; c2++)
324
+ if (*histp++ != 0) {
325
+ boxp->c0max = c0max = c0;
326
+ goto have_c0max;
327
+ }
328
+ }
329
+ have_c0max:
330
+ if (c1max > c1min)
331
+ for (c1 = c1min; c1 <= c1max; c1++)
332
+ for (c0 = c0min; c0 <= c0max; c0++) {
333
+ histp = &histogram[c0][c1][c2min];
334
+ for (c2 = c2min; c2 <= c2max; c2++)
335
+ if (*histp++ != 0) {
336
+ boxp->c1min = c1min = c1;
337
+ goto have_c1min;
338
+ }
339
+ }
340
+ have_c1min:
341
+ if (c1max > c1min)
342
+ for (c1 = c1max; c1 >= c1min; c1--)
343
+ for (c0 = c0min; c0 <= c0max; c0++) {
344
+ histp = &histogram[c0][c1][c2min];
345
+ for (c2 = c2min; c2 <= c2max; c2++)
346
+ if (*histp++ != 0) {
347
+ boxp->c1max = c1max = c1;
348
+ goto have_c1max;
349
+ }
350
+ }
351
+ have_c1max:
352
+ if (c2max > c2min)
353
+ for (c2 = c2min; c2 <= c2max; c2++)
354
+ for (c0 = c0min; c0 <= c0max; c0++) {
355
+ histp = &histogram[c0][c1min][c2];
356
+ for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
357
+ if (*histp != 0) {
358
+ boxp->c2min = c2min = c2;
359
+ goto have_c2min;
360
+ }
361
+ }
362
+ have_c2min:
363
+ if (c2max > c2min)
364
+ for (c2 = c2max; c2 >= c2min; c2--)
365
+ for (c0 = c0min; c0 <= c0max; c0++) {
366
+ histp = &histogram[c0][c1min][c2];
367
+ for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS)
368
+ if (*histp != 0) {
369
+ boxp->c2max = c2max = c2;
370
+ goto have_c2max;
371
+ }
372
+ }
373
+ have_c2max:
374
+
375
+ /* Update box volume.
376
+ * We use 2-norm rather than real volume here; this biases the method
377
+ * against making long narrow boxes, and it has the side benefit that
378
+ * a box is splittable iff norm > 0.
379
+ * Since the differences are expressed in histogram-cell units,
380
+ * we have to shift back to JSAMPLE units to get consistent distances;
381
+ * after which, we scale according to the selected distance scale factors.
382
+ */
383
+ dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE;
384
+ dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE;
385
+ dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE;
386
+ boxp->volume = dist0 * dist0 + dist1 * dist1 + dist2 * dist2;
387
+
388
+ /* Now scan remaining volume of box and compute population */
389
+ ccount = 0;
390
+ for (c0 = c0min; c0 <= c0max; c0++)
391
+ for (c1 = c1min; c1 <= c1max; c1++) {
392
+ histp = &histogram[c0][c1][c2min];
393
+ for (c2 = c2min; c2 <= c2max; c2++, histp++)
394
+ if (*histp != 0) {
395
+ ccount++;
396
+ }
397
+ }
398
+ boxp->colorcount = ccount;
399
+ }
400
+
401
+
402
+ LOCAL(int)
403
+ median_cut(j_decompress_ptr cinfo, boxptr boxlist, int numboxes,
404
+ int desired_colors)
405
+ /* Repeatedly select and split the largest box until we have enough boxes */
406
+ {
407
+ int n, lb;
408
+ int c0, c1, c2, cmax;
409
+ register boxptr b1, b2;
410
+
411
+ while (numboxes < desired_colors) {
412
+ /* Select box to split.
413
+ * Current algorithm: by population for first half, then by volume.
414
+ */
415
+ if (numboxes * 2 <= desired_colors) {
416
+ b1 = find_biggest_color_pop(boxlist, numboxes);
417
+ } else {
418
+ b1 = find_biggest_volume(boxlist, numboxes);
419
+ }
420
+ if (b1 == NULL) /* no splittable boxes left! */
421
+ break;
422
+ b2 = &boxlist[numboxes]; /* where new box will go */
423
+ /* Copy the color bounds to the new box. */
424
+ b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max;
425
+ b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min;
426
+ /* Choose which axis to split the box on.
427
+ * Current algorithm: longest scaled axis.
428
+ * See notes in update_box about scaling distances.
429
+ */
430
+ c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE;
431
+ c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE;
432
+ c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE;
433
+ /* We want to break any ties in favor of green, then red, blue last.
434
+ * This code does the right thing for R,G,B or B,G,R color orders only.
435
+ */
436
+ if (rgb_red[cinfo->out_color_space] == 0) {
437
+ cmax = c1; n = 1;
438
+ if (c0 > cmax) { cmax = c0; n = 0; }
439
+ if (c2 > cmax) { n = 2; }
440
+ } else {
441
+ cmax = c1; n = 1;
442
+ if (c2 > cmax) { cmax = c2; n = 2; }
443
+ if (c0 > cmax) { n = 0; }
444
+ }
445
+ /* Choose split point along selected axis, and update box bounds.
446
+ * Current algorithm: split at halfway point.
447
+ * (Since the box has been shrunk to minimum volume,
448
+ * any split will produce two nonempty subboxes.)
449
+ * Note that lb value is max for lower box, so must be < old max.
450
+ */
451
+ switch (n) {
452
+ case 0:
453
+ lb = (b1->c0max + b1->c0min) / 2;
454
+ b1->c0max = lb;
455
+ b2->c0min = lb + 1;
456
+ break;
457
+ case 1:
458
+ lb = (b1->c1max + b1->c1min) / 2;
459
+ b1->c1max = lb;
460
+ b2->c1min = lb + 1;
461
+ break;
462
+ case 2:
463
+ lb = (b1->c2max + b1->c2min) / 2;
464
+ b1->c2max = lb;
465
+ b2->c2min = lb + 1;
466
+ break;
467
+ }
468
+ /* Update stats for boxes */
469
+ update_box(cinfo, b1);
470
+ update_box(cinfo, b2);
471
+ numboxes++;
472
+ }
473
+ return numboxes;
474
+ }
475
+
476
+
477
+ LOCAL(void)
478
+ compute_color(j_decompress_ptr cinfo, boxptr boxp, int icolor)
479
+ /* Compute representative color for a box, put it in colormap[icolor] */
480
+ {
481
+ /* Current algorithm: mean weighted by pixels (not colors) */
482
+ /* Note it is important to get the rounding correct! */
483
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
484
+ hist3d histogram = cquantize->histogram;
485
+ histptr histp;
486
+ int c0, c1, c2;
487
+ int c0min, c0max, c1min, c1max, c2min, c2max;
488
+ long count;
489
+ long total = 0;
490
+ long c0total = 0;
491
+ long c1total = 0;
492
+ long c2total = 0;
493
+
494
+ c0min = boxp->c0min; c0max = boxp->c0max;
495
+ c1min = boxp->c1min; c1max = boxp->c1max;
496
+ c2min = boxp->c2min; c2max = boxp->c2max;
497
+
498
+ for (c0 = c0min; c0 <= c0max; c0++)
499
+ for (c1 = c1min; c1 <= c1max; c1++) {
500
+ histp = &histogram[c0][c1][c2min];
501
+ for (c2 = c2min; c2 <= c2max; c2++) {
502
+ if ((count = *histp++) != 0) {
503
+ total += count;
504
+ c0total += ((c0 << C0_SHIFT) + ((1 << C0_SHIFT) >> 1)) * count;
505
+ c1total += ((c1 << C1_SHIFT) + ((1 << C1_SHIFT) >> 1)) * count;
506
+ c2total += ((c2 << C2_SHIFT) + ((1 << C2_SHIFT) >> 1)) * count;
507
+ }
508
+ }
509
+ }
510
+
511
+ cinfo->colormap[0][icolor] = (JSAMPLE)((c0total + (total >> 1)) / total);
512
+ cinfo->colormap[1][icolor] = (JSAMPLE)((c1total + (total >> 1)) / total);
513
+ cinfo->colormap[2][icolor] = (JSAMPLE)((c2total + (total >> 1)) / total);
514
+ }
515
+
516
+
517
+ LOCAL(void)
518
+ select_colors(j_decompress_ptr cinfo, int desired_colors)
519
+ /* Master routine for color selection */
520
+ {
521
+ boxptr boxlist;
522
+ int numboxes;
523
+ int i;
524
+
525
+ /* Allocate workspace for box list */
526
+ boxlist = (boxptr)(*cinfo->mem->alloc_small)
527
+ ((j_common_ptr)cinfo, JPOOL_IMAGE, desired_colors * sizeof(box));
528
+ /* Initialize one box containing whole space */
529
+ numboxes = 1;
530
+ boxlist[0].c0min = 0;
531
+ boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT;
532
+ boxlist[0].c1min = 0;
533
+ boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT;
534
+ boxlist[0].c2min = 0;
535
+ boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT;
536
+ /* Shrink it to actually-used volume and set its statistics */
537
+ update_box(cinfo, &boxlist[0]);
538
+ /* Perform median-cut to produce final box list */
539
+ numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors);
540
+ /* Compute the representative color for each box, fill colormap */
541
+ for (i = 0; i < numboxes; i++)
542
+ compute_color(cinfo, &boxlist[i], i);
543
+ cinfo->actual_number_of_colors = numboxes;
544
+ TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes);
545
+ }
546
+
547
+
548
+ /*
549
+ * These routines are concerned with the time-critical task of mapping input
550
+ * colors to the nearest color in the selected colormap.
551
+ *
552
+ * We re-use the histogram space as an "inverse color map", essentially a
553
+ * cache for the results of nearest-color searches. All colors within a
554
+ * histogram cell will be mapped to the same colormap entry, namely the one
555
+ * closest to the cell's center. This may not be quite the closest entry to
556
+ * the actual input color, but it's almost as good. A zero in the cache
557
+ * indicates we haven't found the nearest color for that cell yet; the array
558
+ * is cleared to zeroes before starting the mapping pass. When we find the
559
+ * nearest color for a cell, its colormap index plus one is recorded in the
560
+ * cache for future use. The pass2 scanning routines call fill_inverse_cmap
561
+ * when they need to use an unfilled entry in the cache.
562
+ *
563
+ * Our method of efficiently finding nearest colors is based on the "locally
564
+ * sorted search" idea described by Heckbert and on the incremental distance
565
+ * calculation described by Spencer W. Thomas in chapter III.1 of Graphics
566
+ * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that
567
+ * the distances from a given colormap entry to each cell of the histogram can
568
+ * be computed quickly using an incremental method: the differences between
569
+ * distances to adjacent cells themselves differ by a constant. This allows a
570
+ * fairly fast implementation of the "brute force" approach of computing the
571
+ * distance from every colormap entry to every histogram cell. Unfortunately,
572
+ * it needs a work array to hold the best-distance-so-far for each histogram
573
+ * cell (because the inner loop has to be over cells, not colormap entries).
574
+ * The work array elements have to be JLONGs, so the work array would need
575
+ * 256Kb at our recommended precision. This is not feasible in DOS machines.
576
+ *
577
+ * To get around these problems, we apply Thomas' method to compute the
578
+ * nearest colors for only the cells within a small subbox of the histogram.
579
+ * The work array need be only as big as the subbox, so the memory usage
580
+ * problem is solved. Furthermore, we need not fill subboxes that are never
581
+ * referenced in pass2; many images use only part of the color gamut, so a
582
+ * fair amount of work is saved. An additional advantage of this
583
+ * approach is that we can apply Heckbert's locality criterion to quickly
584
+ * eliminate colormap entries that are far away from the subbox; typically
585
+ * three-fourths of the colormap entries are rejected by Heckbert's criterion,
586
+ * and we need not compute their distances to individual cells in the subbox.
587
+ * The speed of this approach is heavily influenced by the subbox size: too
588
+ * small means too much overhead, too big loses because Heckbert's criterion
589
+ * can't eliminate as many colormap entries. Empirically the best subbox
590
+ * size seems to be about 1/512th of the histogram (1/8th in each direction).
591
+ *
592
+ * Thomas' article also describes a refined method which is asymptotically
593
+ * faster than the brute-force method, but it is also far more complex and
594
+ * cannot efficiently be applied to small subboxes. It is therefore not
595
+ * useful for programs intended to be portable to DOS machines. On machines
596
+ * with plenty of memory, filling the whole histogram in one shot with Thomas'
597
+ * refined method might be faster than the present code --- but then again,
598
+ * it might not be any faster, and it's certainly more complicated.
599
+ */
600
+
601
+
602
+ /* log2(histogram cells in update box) for each axis; this can be adjusted */
603
+ #define BOX_C0_LOG (HIST_C0_BITS - 3)
604
+ #define BOX_C1_LOG (HIST_C1_BITS - 3)
605
+ #define BOX_C2_LOG (HIST_C2_BITS - 3)
606
+
607
+ #define BOX_C0_ELEMS (1 << BOX_C0_LOG) /* # of hist cells in update box */
608
+ #define BOX_C1_ELEMS (1 << BOX_C1_LOG)
609
+ #define BOX_C2_ELEMS (1 << BOX_C2_LOG)
610
+
611
+ #define BOX_C0_SHIFT (C0_SHIFT + BOX_C0_LOG)
612
+ #define BOX_C1_SHIFT (C1_SHIFT + BOX_C1_LOG)
613
+ #define BOX_C2_SHIFT (C2_SHIFT + BOX_C2_LOG)
614
+
615
+
616
+ /*
617
+ * The next three routines implement inverse colormap filling. They could
618
+ * all be folded into one big routine, but splitting them up this way saves
619
+ * some stack space (the mindist[] and bestdist[] arrays need not coexist)
620
+ * and may allow some compilers to produce better code by registerizing more
621
+ * inner-loop variables.
622
+ */
623
+
624
+ LOCAL(int)
625
+ find_nearby_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
626
+ JSAMPLE colorlist[])
627
+ /* Locate the colormap entries close enough to an update box to be candidates
628
+ * for the nearest entry to some cell(s) in the update box. The update box
629
+ * is specified by the center coordinates of its first cell. The number of
630
+ * candidate colormap entries is returned, and their colormap indexes are
631
+ * placed in colorlist[].
632
+ * This routine uses Heckbert's "locally sorted search" criterion to select
633
+ * the colors that need further consideration.
634
+ */
635
+ {
636
+ int numcolors = cinfo->actual_number_of_colors;
637
+ int maxc0, maxc1, maxc2;
638
+ int centerc0, centerc1, centerc2;
639
+ int i, x, ncolors;
640
+ JLONG minmaxdist, min_dist, max_dist, tdist;
641
+ JLONG mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */
642
+
643
+ /* Compute true coordinates of update box's upper corner and center.
644
+ * Actually we compute the coordinates of the center of the upper-corner
645
+ * histogram cell, which are the upper bounds of the volume we care about.
646
+ * Note that since ">>" rounds down, the "center" values may be closer to
647
+ * min than to max; hence comparisons to them must be "<=", not "<".
648
+ */
649
+ maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT));
650
+ centerc0 = (minc0 + maxc0) >> 1;
651
+ maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT));
652
+ centerc1 = (minc1 + maxc1) >> 1;
653
+ maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT));
654
+ centerc2 = (minc2 + maxc2) >> 1;
655
+
656
+ /* For each color in colormap, find:
657
+ * 1. its minimum squared-distance to any point in the update box
658
+ * (zero if color is within update box);
659
+ * 2. its maximum squared-distance to any point in the update box.
660
+ * Both of these can be found by considering only the corners of the box.
661
+ * We save the minimum distance for each color in mindist[];
662
+ * only the smallest maximum distance is of interest.
663
+ */
664
+ minmaxdist = 0x7FFFFFFFL;
665
+
666
+ for (i = 0; i < numcolors; i++) {
667
+ /* We compute the squared-c0-distance term, then add in the other two. */
668
+ x = GETJSAMPLE(cinfo->colormap[0][i]);
669
+ if (x < minc0) {
670
+ tdist = (x - minc0) * C0_SCALE;
671
+ min_dist = tdist * tdist;
672
+ tdist = (x - maxc0) * C0_SCALE;
673
+ max_dist = tdist * tdist;
674
+ } else if (x > maxc0) {
675
+ tdist = (x - maxc0) * C0_SCALE;
676
+ min_dist = tdist * tdist;
677
+ tdist = (x - minc0) * C0_SCALE;
678
+ max_dist = tdist * tdist;
679
+ } else {
680
+ /* within cell range so no contribution to min_dist */
681
+ min_dist = 0;
682
+ if (x <= centerc0) {
683
+ tdist = (x - maxc0) * C0_SCALE;
684
+ max_dist = tdist * tdist;
685
+ } else {
686
+ tdist = (x - minc0) * C0_SCALE;
687
+ max_dist = tdist * tdist;
688
+ }
689
+ }
690
+
691
+ x = GETJSAMPLE(cinfo->colormap[1][i]);
692
+ if (x < minc1) {
693
+ tdist = (x - minc1) * C1_SCALE;
694
+ min_dist += tdist * tdist;
695
+ tdist = (x - maxc1) * C1_SCALE;
696
+ max_dist += tdist * tdist;
697
+ } else if (x > maxc1) {
698
+ tdist = (x - maxc1) * C1_SCALE;
699
+ min_dist += tdist * tdist;
700
+ tdist = (x - minc1) * C1_SCALE;
701
+ max_dist += tdist * tdist;
702
+ } else {
703
+ /* within cell range so no contribution to min_dist */
704
+ if (x <= centerc1) {
705
+ tdist = (x - maxc1) * C1_SCALE;
706
+ max_dist += tdist * tdist;
707
+ } else {
708
+ tdist = (x - minc1) * C1_SCALE;
709
+ max_dist += tdist * tdist;
710
+ }
711
+ }
712
+
713
+ x = GETJSAMPLE(cinfo->colormap[2][i]);
714
+ if (x < minc2) {
715
+ tdist = (x - minc2) * C2_SCALE;
716
+ min_dist += tdist * tdist;
717
+ tdist = (x - maxc2) * C2_SCALE;
718
+ max_dist += tdist * tdist;
719
+ } else if (x > maxc2) {
720
+ tdist = (x - maxc2) * C2_SCALE;
721
+ min_dist += tdist * tdist;
722
+ tdist = (x - minc2) * C2_SCALE;
723
+ max_dist += tdist * tdist;
724
+ } else {
725
+ /* within cell range so no contribution to min_dist */
726
+ if (x <= centerc2) {
727
+ tdist = (x - maxc2) * C2_SCALE;
728
+ max_dist += tdist * tdist;
729
+ } else {
730
+ tdist = (x - minc2) * C2_SCALE;
731
+ max_dist += tdist * tdist;
732
+ }
733
+ }
734
+
735
+ mindist[i] = min_dist; /* save away the results */
736
+ if (max_dist < minmaxdist)
737
+ minmaxdist = max_dist;
738
+ }
739
+
740
+ /* Now we know that no cell in the update box is more than minmaxdist
741
+ * away from some colormap entry. Therefore, only colors that are
742
+ * within minmaxdist of some part of the box need be considered.
743
+ */
744
+ ncolors = 0;
745
+ for (i = 0; i < numcolors; i++) {
746
+ if (mindist[i] <= minmaxdist)
747
+ colorlist[ncolors++] = (JSAMPLE)i;
748
+ }
749
+ return ncolors;
750
+ }
751
+
752
+
753
+ LOCAL(void)
754
+ find_best_colors(j_decompress_ptr cinfo, int minc0, int minc1, int minc2,
755
+ int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[])
756
+ /* Find the closest colormap entry for each cell in the update box,
757
+ * given the list of candidate colors prepared by find_nearby_colors.
758
+ * Return the indexes of the closest entries in the bestcolor[] array.
759
+ * This routine uses Thomas' incremental distance calculation method to
760
+ * find the distance from a colormap entry to successive cells in the box.
761
+ */
762
+ {
763
+ int ic0, ic1, ic2;
764
+ int i, icolor;
765
+ register JLONG *bptr; /* pointer into bestdist[] array */
766
+ JSAMPLE *cptr; /* pointer into bestcolor[] array */
767
+ JLONG dist0, dist1; /* initial distance values */
768
+ register JLONG dist2; /* current distance in inner loop */
769
+ JLONG xx0, xx1; /* distance increments */
770
+ register JLONG xx2;
771
+ JLONG inc0, inc1, inc2; /* initial values for increments */
772
+ /* This array holds the distance to the nearest-so-far color for each cell */
773
+ JLONG bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
774
+
775
+ /* Initialize best-distance for each cell of the update box */
776
+ bptr = bestdist;
777
+ for (i = BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS - 1; i >= 0; i--)
778
+ *bptr++ = 0x7FFFFFFFL;
779
+
780
+ /* For each color selected by find_nearby_colors,
781
+ * compute its distance to the center of each cell in the box.
782
+ * If that's less than best-so-far, update best distance and color number.
783
+ */
784
+
785
+ /* Nominal steps between cell centers ("x" in Thomas article) */
786
+ #define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE)
787
+ #define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE)
788
+ #define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE)
789
+
790
+ for (i = 0; i < numcolors; i++) {
791
+ icolor = GETJSAMPLE(colorlist[i]);
792
+ /* Compute (square of) distance from minc0/c1/c2 to this color */
793
+ inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE;
794
+ dist0 = inc0 * inc0;
795
+ inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE;
796
+ dist0 += inc1 * inc1;
797
+ inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE;
798
+ dist0 += inc2 * inc2;
799
+ /* Form the initial difference increments */
800
+ inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0;
801
+ inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1;
802
+ inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2;
803
+ /* Now loop over all cells in box, updating distance per Thomas method */
804
+ bptr = bestdist;
805
+ cptr = bestcolor;
806
+ xx0 = inc0;
807
+ for (ic0 = BOX_C0_ELEMS - 1; ic0 >= 0; ic0--) {
808
+ dist1 = dist0;
809
+ xx1 = inc1;
810
+ for (ic1 = BOX_C1_ELEMS - 1; ic1 >= 0; ic1--) {
811
+ dist2 = dist1;
812
+ xx2 = inc2;
813
+ for (ic2 = BOX_C2_ELEMS - 1; ic2 >= 0; ic2--) {
814
+ if (dist2 < *bptr) {
815
+ *bptr = dist2;
816
+ *cptr = (JSAMPLE)icolor;
817
+ }
818
+ dist2 += xx2;
819
+ xx2 += 2 * STEP_C2 * STEP_C2;
820
+ bptr++;
821
+ cptr++;
822
+ }
823
+ dist1 += xx1;
824
+ xx1 += 2 * STEP_C1 * STEP_C1;
825
+ }
826
+ dist0 += xx0;
827
+ xx0 += 2 * STEP_C0 * STEP_C0;
828
+ }
829
+ }
830
+ }
831
+
832
+
833
+ LOCAL(void)
834
+ fill_inverse_cmap(j_decompress_ptr cinfo, int c0, int c1, int c2)
835
+ /* Fill the inverse-colormap entries in the update box that contains */
836
+ /* histogram cell c0/c1/c2. (Only that one cell MUST be filled, but */
837
+ /* we can fill as many others as we wish.) */
838
+ {
839
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
840
+ hist3d histogram = cquantize->histogram;
841
+ int minc0, minc1, minc2; /* lower left corner of update box */
842
+ int ic0, ic1, ic2;
843
+ register JSAMPLE *cptr; /* pointer into bestcolor[] array */
844
+ register histptr cachep; /* pointer into main cache array */
845
+ /* This array lists the candidate colormap indexes. */
846
+ JSAMPLE colorlist[MAXNUMCOLORS];
847
+ int numcolors; /* number of candidate colors */
848
+ /* This array holds the actually closest colormap index for each cell. */
849
+ JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS];
850
+
851
+ /* Convert cell coordinates to update box ID */
852
+ c0 >>= BOX_C0_LOG;
853
+ c1 >>= BOX_C1_LOG;
854
+ c2 >>= BOX_C2_LOG;
855
+
856
+ /* Compute true coordinates of update box's origin corner.
857
+ * Actually we compute the coordinates of the center of the corner
858
+ * histogram cell, which are the lower bounds of the volume we care about.
859
+ */
860
+ minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1);
861
+ minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1);
862
+ minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1);
863
+
864
+ /* Determine which colormap entries are close enough to be candidates
865
+ * for the nearest entry to some cell in the update box.
866
+ */
867
+ numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist);
868
+
869
+ /* Determine the actually nearest colors. */
870
+ find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist,
871
+ bestcolor);
872
+
873
+ /* Save the best color numbers (plus 1) in the main cache array */
874
+ c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */
875
+ c1 <<= BOX_C1_LOG;
876
+ c2 <<= BOX_C2_LOG;
877
+ cptr = bestcolor;
878
+ for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) {
879
+ for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) {
880
+ cachep = &histogram[c0 + ic0][c1 + ic1][c2];
881
+ for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) {
882
+ *cachep++ = (histcell)(GETJSAMPLE(*cptr++) + 1);
883
+ }
884
+ }
885
+ }
886
+ }
887
+
888
+
889
+ /*
890
+ * Map some rows of pixels to the output colormapped representation.
891
+ */
892
+
893
+ METHODDEF(void)
894
+ pass2_no_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
895
+ JSAMPARRAY output_buf, int num_rows)
896
+ /* This version performs no dithering */
897
+ {
898
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
899
+ hist3d histogram = cquantize->histogram;
900
+ register JSAMPROW inptr, outptr;
901
+ register histptr cachep;
902
+ register int c0, c1, c2;
903
+ int row;
904
+ JDIMENSION col;
905
+ JDIMENSION width = cinfo->output_width;
906
+
907
+ for (row = 0; row < num_rows; row++) {
908
+ inptr = input_buf[row];
909
+ outptr = output_buf[row];
910
+ for (col = width; col > 0; col--) {
911
+ /* get pixel value and index into the cache */
912
+ c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT;
913
+ c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT;
914
+ c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT;
915
+ cachep = &histogram[c0][c1][c2];
916
+ /* If we have not seen this color before, find nearest colormap entry */
917
+ /* and update the cache */
918
+ if (*cachep == 0)
919
+ fill_inverse_cmap(cinfo, c0, c1, c2);
920
+ /* Now emit the colormap index for this cell */
921
+ *outptr++ = (JSAMPLE)(*cachep - 1);
922
+ }
923
+ }
924
+ }
925
+
926
+
927
+ METHODDEF(void)
928
+ pass2_fs_dither(j_decompress_ptr cinfo, JSAMPARRAY input_buf,
929
+ JSAMPARRAY output_buf, int num_rows)
930
+ /* This version performs Floyd-Steinberg dithering */
931
+ {
932
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
933
+ hist3d histogram = cquantize->histogram;
934
+ register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */
935
+ LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */
936
+ LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */
937
+ register FSERRPTR errorptr; /* => fserrors[] at column before current */
938
+ JSAMPROW inptr; /* => current input pixel */
939
+ JSAMPROW outptr; /* => current output pixel */
940
+ histptr cachep;
941
+ int dir; /* +1 or -1 depending on direction */
942
+ int dir3; /* 3*dir, for advancing inptr & errorptr */
943
+ int row;
944
+ JDIMENSION col;
945
+ JDIMENSION width = cinfo->output_width;
946
+ JSAMPLE *range_limit = cinfo->sample_range_limit;
947
+ int *error_limit = cquantize->error_limiter;
948
+ JSAMPROW colormap0 = cinfo->colormap[0];
949
+ JSAMPROW colormap1 = cinfo->colormap[1];
950
+ JSAMPROW colormap2 = cinfo->colormap[2];
951
+ SHIFT_TEMPS
952
+
953
+ for (row = 0; row < num_rows; row++) {
954
+ inptr = input_buf[row];
955
+ outptr = output_buf[row];
956
+ if (cquantize->on_odd_row) {
957
+ /* work right to left in this row */
958
+ inptr += (width - 1) * 3; /* so point to rightmost pixel */
959
+ outptr += width - 1;
960
+ dir = -1;
961
+ dir3 = -3;
962
+ errorptr = cquantize->fserrors + (width + 1) * 3; /* => entry after last column */
963
+ cquantize->on_odd_row = FALSE; /* flip for next time */
964
+ } else {
965
+ /* work left to right in this row */
966
+ dir = 1;
967
+ dir3 = 3;
968
+ errorptr = cquantize->fserrors; /* => entry before first real column */
969
+ cquantize->on_odd_row = TRUE; /* flip for next time */
970
+ }
971
+ /* Preset error values: no error propagated to first pixel from left */
972
+ cur0 = cur1 = cur2 = 0;
973
+ /* and no error propagated to row below yet */
974
+ belowerr0 = belowerr1 = belowerr2 = 0;
975
+ bpreverr0 = bpreverr1 = bpreverr2 = 0;
976
+
977
+ for (col = width; col > 0; col--) {
978
+ /* curN holds the error propagated from the previous pixel on the
979
+ * current line. Add the error propagated from the previous line
980
+ * to form the complete error correction term for this pixel, and
981
+ * round the error term (which is expressed * 16) to an integer.
982
+ * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct
983
+ * for either sign of the error value.
984
+ * Note: errorptr points to *previous* column's array entry.
985
+ */
986
+ cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3 + 0] + 8, 4);
987
+ cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3 + 1] + 8, 4);
988
+ cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3 + 2] + 8, 4);
989
+ /* Limit the error using transfer function set by init_error_limit.
990
+ * See comments with init_error_limit for rationale.
991
+ */
992
+ cur0 = error_limit[cur0];
993
+ cur1 = error_limit[cur1];
994
+ cur2 = error_limit[cur2];
995
+ /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE.
996
+ * The maximum error is +- MAXJSAMPLE (or less with error limiting);
997
+ * this sets the required size of the range_limit array.
998
+ */
999
+ cur0 += GETJSAMPLE(inptr[0]);
1000
+ cur1 += GETJSAMPLE(inptr[1]);
1001
+ cur2 += GETJSAMPLE(inptr[2]);
1002
+ cur0 = GETJSAMPLE(range_limit[cur0]);
1003
+ cur1 = GETJSAMPLE(range_limit[cur1]);
1004
+ cur2 = GETJSAMPLE(range_limit[cur2]);
1005
+ /* Index into the cache with adjusted pixel value */
1006
+ cachep =
1007
+ &histogram[cur0 >> C0_SHIFT][cur1 >> C1_SHIFT][cur2 >> C2_SHIFT];
1008
+ /* If we have not seen this color before, find nearest colormap */
1009
+ /* entry and update the cache */
1010
+ if (*cachep == 0)
1011
+ fill_inverse_cmap(cinfo, cur0 >> C0_SHIFT, cur1 >> C1_SHIFT,
1012
+ cur2 >> C2_SHIFT);
1013
+ /* Now emit the colormap index for this cell */
1014
+ {
1015
+ register int pixcode = *cachep - 1;
1016
+ *outptr = (JSAMPLE)pixcode;
1017
+ /* Compute representation error for this pixel */
1018
+ cur0 -= GETJSAMPLE(colormap0[pixcode]);
1019
+ cur1 -= GETJSAMPLE(colormap1[pixcode]);
1020
+ cur2 -= GETJSAMPLE(colormap2[pixcode]);
1021
+ }
1022
+ /* Compute error fractions to be propagated to adjacent pixels.
1023
+ * Add these into the running sums, and simultaneously shift the
1024
+ * next-line error sums left by 1 column.
1025
+ */
1026
+ {
1027
+ register LOCFSERROR bnexterr;
1028
+
1029
+ bnexterr = cur0; /* Process component 0 */
1030
+ errorptr[0] = (FSERROR)(bpreverr0 + cur0 * 3);
1031
+ bpreverr0 = belowerr0 + cur0 * 5;
1032
+ belowerr0 = bnexterr;
1033
+ cur0 *= 7;
1034
+ bnexterr = cur1; /* Process component 1 */
1035
+ errorptr[1] = (FSERROR)(bpreverr1 + cur1 * 3);
1036
+ bpreverr1 = belowerr1 + cur1 * 5;
1037
+ belowerr1 = bnexterr;
1038
+ cur1 *= 7;
1039
+ bnexterr = cur2; /* Process component 2 */
1040
+ errorptr[2] = (FSERROR)(bpreverr2 + cur2 * 3);
1041
+ bpreverr2 = belowerr2 + cur2 * 5;
1042
+ belowerr2 = bnexterr;
1043
+ cur2 *= 7;
1044
+ }
1045
+ /* At this point curN contains the 7/16 error value to be propagated
1046
+ * to the next pixel on the current line, and all the errors for the
1047
+ * next line have been shifted over. We are therefore ready to move on.
1048
+ */
1049
+ inptr += dir3; /* Advance pixel pointers to next column */
1050
+ outptr += dir;
1051
+ errorptr += dir3; /* advance errorptr to current column */
1052
+ }
1053
+ /* Post-loop cleanup: we must unload the final error values into the
1054
+ * final fserrors[] entry. Note we need not unload belowerrN because
1055
+ * it is for the dummy column before or after the actual array.
1056
+ */
1057
+ errorptr[0] = (FSERROR)bpreverr0; /* unload prev errs into array */
1058
+ errorptr[1] = (FSERROR)bpreverr1;
1059
+ errorptr[2] = (FSERROR)bpreverr2;
1060
+ }
1061
+ }
1062
+
1063
+
1064
+ /*
1065
+ * Initialize the error-limiting transfer function (lookup table).
1066
+ * The raw F-S error computation can potentially compute error values of up to
1067
+ * +- MAXJSAMPLE. But we want the maximum correction applied to a pixel to be
1068
+ * much less, otherwise obviously wrong pixels will be created. (Typical
1069
+ * effects include weird fringes at color-area boundaries, isolated bright
1070
+ * pixels in a dark area, etc.) The standard advice for avoiding this problem
1071
+ * is to ensure that the "corners" of the color cube are allocated as output
1072
+ * colors; then repeated errors in the same direction cannot cause cascading
1073
+ * error buildup. However, that only prevents the error from getting
1074
+ * completely out of hand; Aaron Giles reports that error limiting improves
1075
+ * the results even with corner colors allocated.
1076
+ * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty
1077
+ * well, but the smoother transfer function used below is even better. Thanks
1078
+ * to Aaron Giles for this idea.
1079
+ */
1080
+
1081
+ LOCAL(void)
1082
+ init_error_limit(j_decompress_ptr cinfo)
1083
+ /* Allocate and fill in the error_limiter table */
1084
+ {
1085
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
1086
+ int *table;
1087
+ int in, out;
1088
+
1089
+ table = (int *)(*cinfo->mem->alloc_small)
1090
+ ((j_common_ptr)cinfo, JPOOL_IMAGE, (MAXJSAMPLE * 2 + 1) * sizeof(int));
1091
+ table += MAXJSAMPLE; /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */
1092
+ cquantize->error_limiter = table;
1093
+
1094
+ #define STEPSIZE ((MAXJSAMPLE + 1) / 16)
1095
+ /* Map errors 1:1 up to +- MAXJSAMPLE/16 */
1096
+ out = 0;
1097
+ for (in = 0; in < STEPSIZE; in++, out++) {
1098
+ table[in] = out; table[-in] = -out;
1099
+ }
1100
+ /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */
1101
+ for (; in < STEPSIZE * 3; in++, out += (in & 1) ? 0 : 1) {
1102
+ table[in] = out; table[-in] = -out;
1103
+ }
1104
+ /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */
1105
+ for (; in <= MAXJSAMPLE; in++) {
1106
+ table[in] = out; table[-in] = -out;
1107
+ }
1108
+ #undef STEPSIZE
1109
+ }
1110
+
1111
+
1112
+ /*
1113
+ * Finish up at the end of each pass.
1114
+ */
1115
+
1116
+ METHODDEF(void)
1117
+ finish_pass1(j_decompress_ptr cinfo)
1118
+ {
1119
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
1120
+
1121
+ /* Select the representative colors and fill in cinfo->colormap */
1122
+ cinfo->colormap = cquantize->sv_colormap;
1123
+ select_colors(cinfo, cquantize->desired);
1124
+ /* Force next pass to zero the color index table */
1125
+ cquantize->needs_zeroed = TRUE;
1126
+ }
1127
+
1128
+
1129
+ METHODDEF(void)
1130
+ finish_pass2(j_decompress_ptr cinfo)
1131
+ {
1132
+ /* no work */
1133
+ }
1134
+
1135
+
1136
+ /*
1137
+ * Initialize for each processing pass.
1138
+ */
1139
+
1140
+ METHODDEF(void)
1141
+ start_pass_2_quant(j_decompress_ptr cinfo, boolean is_pre_scan)
1142
+ {
1143
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
1144
+ hist3d histogram = cquantize->histogram;
1145
+ int i;
1146
+
1147
+ /* Only F-S dithering or no dithering is supported. */
1148
+ /* If user asks for ordered dither, give him F-S. */
1149
+ if (cinfo->dither_mode != JDITHER_NONE)
1150
+ cinfo->dither_mode = JDITHER_FS;
1151
+
1152
+ if (is_pre_scan) {
1153
+ /* Set up method pointers */
1154
+ cquantize->pub.color_quantize = prescan_quantize;
1155
+ cquantize->pub.finish_pass = finish_pass1;
1156
+ cquantize->needs_zeroed = TRUE; /* Always zero histogram */
1157
+ } else {
1158
+ /* Set up method pointers */
1159
+ if (cinfo->dither_mode == JDITHER_FS)
1160
+ cquantize->pub.color_quantize = pass2_fs_dither;
1161
+ else
1162
+ cquantize->pub.color_quantize = pass2_no_dither;
1163
+ cquantize->pub.finish_pass = finish_pass2;
1164
+
1165
+ /* Make sure color count is acceptable */
1166
+ i = cinfo->actual_number_of_colors;
1167
+ if (i < 1)
1168
+ ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1);
1169
+ if (i > MAXNUMCOLORS)
1170
+ ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
1171
+
1172
+ if (cinfo->dither_mode == JDITHER_FS) {
1173
+ size_t arraysize =
1174
+ (size_t)((cinfo->output_width + 2) * (3 * sizeof(FSERROR)));
1175
+ /* Allocate Floyd-Steinberg workspace if we didn't already. */
1176
+ if (cquantize->fserrors == NULL)
1177
+ cquantize->fserrors = (FSERRPTR)(*cinfo->mem->alloc_large)
1178
+ ((j_common_ptr)cinfo, JPOOL_IMAGE, arraysize);
1179
+ /* Initialize the propagated errors to zero. */
1180
+ jzero_far((void *)cquantize->fserrors, arraysize);
1181
+ /* Make the error-limit table if we didn't already. */
1182
+ if (cquantize->error_limiter == NULL)
1183
+ init_error_limit(cinfo);
1184
+ cquantize->on_odd_row = FALSE;
1185
+ }
1186
+
1187
+ }
1188
+ /* Zero the histogram or inverse color map, if necessary */
1189
+ if (cquantize->needs_zeroed) {
1190
+ for (i = 0; i < HIST_C0_ELEMS; i++) {
1191
+ jzero_far((void *)histogram[i],
1192
+ HIST_C1_ELEMS * HIST_C2_ELEMS * sizeof(histcell));
1193
+ }
1194
+ cquantize->needs_zeroed = FALSE;
1195
+ }
1196
+ }
1197
+
1198
+
1199
+ /*
1200
+ * Switch to a new external colormap between output passes.
1201
+ */
1202
+
1203
+ METHODDEF(void)
1204
+ new_color_map_2_quant(j_decompress_ptr cinfo)
1205
+ {
1206
+ my_cquantize_ptr cquantize = (my_cquantize_ptr)cinfo->cquantize;
1207
+
1208
+ /* Reset the inverse color map */
1209
+ cquantize->needs_zeroed = TRUE;
1210
+ }
1211
+
1212
+
1213
+ /*
1214
+ * Module initialization routine for 2-pass color quantization.
1215
+ */
1216
+
1217
+ GLOBAL(void)
1218
+ jinit_2pass_quantizer(j_decompress_ptr cinfo)
1219
+ {
1220
+ my_cquantize_ptr cquantize;
1221
+ int i;
1222
+
1223
+ cquantize = (my_cquantize_ptr)
1224
+ (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
1225
+ sizeof(my_cquantizer));
1226
+ cinfo->cquantize = (struct jpeg_color_quantizer *)cquantize;
1227
+ cquantize->pub.start_pass = start_pass_2_quant;
1228
+ cquantize->pub.new_color_map = new_color_map_2_quant;
1229
+ cquantize->fserrors = NULL; /* flag optional arrays not allocated */
1230
+ cquantize->error_limiter = NULL;
1231
+
1232
+ /* Make sure jdmaster didn't give me a case I can't handle */
1233
+ if (cinfo->out_color_components != 3)
1234
+ ERREXIT(cinfo, JERR_NOTIMPL);
1235
+
1236
+ /* Allocate the histogram/inverse colormap storage */
1237
+ cquantize->histogram = (hist3d)(*cinfo->mem->alloc_small)
1238
+ ((j_common_ptr)cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * sizeof(hist2d));
1239
+ for (i = 0; i < HIST_C0_ELEMS; i++) {
1240
+ cquantize->histogram[i] = (hist2d)(*cinfo->mem->alloc_large)
1241
+ ((j_common_ptr)cinfo, JPOOL_IMAGE,
1242
+ HIST_C1_ELEMS * HIST_C2_ELEMS * sizeof(histcell));
1243
+ }
1244
+ cquantize->needs_zeroed = TRUE; /* histogram is garbage now */
1245
+
1246
+ /* Allocate storage for the completed colormap, if required.
1247
+ * We do this now since it may affect the memory manager's space
1248
+ * calculations.
1249
+ */
1250
+ if (cinfo->enable_2pass_quant) {
1251
+ /* Make sure color count is acceptable */
1252
+ int desired = cinfo->desired_number_of_colors;
1253
+ /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */
1254
+ if (desired < 8)
1255
+ ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8);
1256
+ /* Make sure colormap indexes can be represented by JSAMPLEs */
1257
+ if (desired > MAXNUMCOLORS)
1258
+ ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS);
1259
+ cquantize->sv_colormap = (*cinfo->mem->alloc_sarray)
1260
+ ((j_common_ptr)cinfo, JPOOL_IMAGE, (JDIMENSION)desired, (JDIMENSION)3);
1261
+ cquantize->desired = desired;
1262
+ } else
1263
+ cquantize->sv_colormap = NULL;
1264
+
1265
+ /* Only F-S dithering or no dithering is supported. */
1266
+ /* If user asks for ordered dither, give him F-S. */
1267
+ if (cinfo->dither_mode != JDITHER_NONE)
1268
+ cinfo->dither_mode = JDITHER_FS;
1269
+
1270
+ /* Allocate Floyd-Steinberg workspace if necessary.
1271
+ * This isn't really needed until pass 2, but again it may affect the memory
1272
+ * manager's space calculations. Although we will cope with a later change
1273
+ * in dither_mode, we do not promise to honor max_memory_to_use if
1274
+ * dither_mode changes.
1275
+ */
1276
+ if (cinfo->dither_mode == JDITHER_FS) {
1277
+ cquantize->fserrors = (FSERRPTR)(*cinfo->mem->alloc_large)
1278
+ ((j_common_ptr)cinfo, JPOOL_IMAGE,
1279
+ (size_t)((cinfo->output_width + 2) * (3 * sizeof(FSERROR))));
1280
+ /* Might as well create the error-limiting table too. */
1281
+ init_error_limit(cinfo);
1282
+ }
1283
+ }
1284
+
1285
+ #endif /* QUANT_2PASS_SUPPORTED */