webruby 0.2.7 → 0.9.1

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 (1537) hide show
  1. checksums.yaml +4 -4
  2. data/lib/webruby/environment.rb +24 -8
  3. data/lib/webruby/rake/files.rake +6 -22
  4. data/lib/webruby/rake/general.rake +1 -1
  5. data/lib/webruby/rake/mruby.rake +1 -0
  6. data/lib/webruby/utility.rb +14 -0
  7. data/modules/mruby/AUTHORS +14 -0
  8. data/modules/mruby/CONTRIBUTING.md +7 -4
  9. data/modules/mruby/INSTALL +28 -11
  10. data/modules/mruby/MITL +13 -13
  11. data/modules/mruby/Makefile +4 -5
  12. data/modules/mruby/README.md +54 -49
  13. data/modules/mruby/Rakefile +36 -6
  14. data/modules/mruby/benchmark/ao-render.rb +1 -2
  15. data/modules/mruby/benchmark/bm_app_lc_fizzbuzz.rb +52 -0
  16. data/modules/mruby/benchmark/fib39.rb +0 -0
  17. data/modules/mruby/bintest/mrbc.rb +12 -0
  18. data/modules/mruby/build_config.rb +32 -2
  19. data/modules/mruby/doc/api/README.md +30 -0
  20. data/modules/mruby/doc/api/mruby.h.md +69 -0
  21. data/modules/mruby/doc/compile/README.md +208 -99
  22. data/modules/mruby/doc/debugger/README.md +370 -0
  23. data/modules/mruby/doc/language/Core.md +1590 -0
  24. data/modules/mruby/doc/language/README.md +9 -0
  25. data/modules/mruby/doc/language/generator.rb +15 -0
  26. data/modules/mruby/doc/language/mrbdoc/lib/mrbdoc_analyze.rb +231 -0
  27. data/modules/mruby/doc/language/mrbdoc/lib/mrbdoc_docu.rb +118 -0
  28. data/modules/mruby/doc/language/mrbdoc/mrbdoc.rb +38 -0
  29. data/modules/mruby/doc/mrbconf/README.md +160 -0
  30. data/modules/mruby/doc/mrbgems/README.md +136 -66
  31. data/modules/mruby/examples/mrbgems/c_and_ruby_extension_example/mrbgem.rake +1 -1
  32. data/modules/mruby/examples/mrbgems/c_and_ruby_extension_example/src/example.c +1 -1
  33. data/modules/mruby/examples/mrbgems/c_extension_example/mrbgem.rake +1 -1
  34. data/modules/mruby/examples/mrbgems/c_extension_example/src/example.c +1 -1
  35. data/modules/mruby/examples/mrbgems/ruby_extension_example/mrbgem.rake +1 -1
  36. data/modules/mruby/examples/targets/{ArduinoDue.rb → build_config_ArduinoDue.rb} +32 -6
  37. data/modules/mruby/examples/targets/build_config_IntelGalileo.rb +106 -0
  38. data/modules/mruby/examples/targets/{chipKitMax32.rb → build_config_chipKITMax32.rb} +26 -7
  39. data/modules/mruby/include/mrbconf.h +25 -1
  40. data/modules/mruby/include/mruby/array.h +32 -22
  41. data/modules/mruby/include/mruby/boxing_nan.h +94 -0
  42. data/modules/mruby/include/mruby/boxing_no.h +49 -0
  43. data/modules/mruby/include/mruby/boxing_word.h +119 -0
  44. data/modules/mruby/include/mruby/class.h +15 -13
  45. data/modules/mruby/include/mruby/compile.h +43 -36
  46. data/modules/mruby/include/mruby/data.h +13 -5
  47. data/modules/mruby/include/mruby/debug.h +9 -9
  48. data/modules/mruby/include/mruby/dump.h +32 -23
  49. data/modules/mruby/include/mruby/error.h +36 -0
  50. data/modules/mruby/include/mruby/gc.h +11 -6
  51. data/modules/mruby/include/mruby/hash.h +12 -12
  52. data/modules/mruby/include/mruby/irep.h +9 -3
  53. data/modules/mruby/include/mruby/khash.h +58 -41
  54. data/modules/mruby/include/mruby/numeric.h +38 -4
  55. data/modules/mruby/include/mruby/object.h +55 -0
  56. data/modules/mruby/include/mruby/opcode.h +160 -0
  57. data/modules/mruby/include/mruby/proc.h +19 -5
  58. data/modules/mruby/include/mruby/range.h +4 -3
  59. data/modules/mruby/include/mruby/re.h +20 -0
  60. data/modules/mruby/include/mruby/string.h +86 -47
  61. data/modules/mruby/include/mruby/value.h +100 -374
  62. data/modules/mruby/include/mruby/variable.h +34 -32
  63. data/modules/mruby/include/mruby/version.h +40 -0
  64. data/modules/mruby/include/mruby.h +211 -139
  65. data/modules/mruby/minirake +16 -9
  66. data/modules/mruby/mrbgems/default.gembox +12 -0
  67. data/modules/mruby/mrbgems/full-core.gembox +3 -3
  68. data/modules/mruby/mrbgems/mruby-array-ext/mrbgem.rake +1 -0
  69. data/modules/mruby/mrbgems/mruby-array-ext/mrblib/array.rb +488 -8
  70. data/modules/mruby/mrbgems/mruby-array-ext/src/array.c +57 -31
  71. data/modules/mruby/mrbgems/mruby-array-ext/test/array.rb +231 -45
  72. data/modules/mruby/mrbgems/mruby-bin-debugger/bintest/mrdb.rb +286 -0
  73. data/modules/mruby/mrbgems/mruby-bin-debugger/bintest/print.rb +701 -0
  74. data/modules/mruby/mrbgems/mruby-bin-debugger/mrbgem.rake +9 -0
  75. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.c +516 -0
  76. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apibreak.h +26 -0
  77. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.c +235 -0
  78. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apilist.h +14 -0
  79. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c +78 -0
  80. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.h +13 -0
  81. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdbreak.c +428 -0
  82. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdmisc.c +501 -0
  83. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdprint.c +58 -0
  84. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/cmdrun.c +54 -0
  85. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.c +746 -0
  86. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdb.h +163 -0
  87. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdbconf.h +16 -0
  88. data/modules/mruby/mrbgems/mruby-bin-debugger/tools/mrdb/mrdberror.h +20 -0
  89. data/modules/mruby/mrbgems/mruby-bin-mirb/bintest/mirb.rb +12 -0
  90. data/modules/mruby/mrbgems/mruby-bin-mirb/mrbgem.rake +14 -1
  91. data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +154 -72
  92. data/modules/mruby/mrbgems/mruby-bin-mruby/bintest/mruby.rb +46 -0
  93. data/modules/mruby/mrbgems/mruby-bin-mruby/mrbgem.rake +1 -0
  94. data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +37 -28
  95. data/modules/mruby/mrbgems/mruby-bin-mruby-config/mrbgem.rake +30 -0
  96. data/modules/mruby/mrbgems/mruby-bin-mruby-config/mruby-config +16 -0
  97. data/modules/mruby/mrbgems/mruby-bin-mruby-config/mruby-config.bat +30 -0
  98. data/modules/mruby/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +73 -0
  99. data/modules/mruby/mrbgems/mruby-bin-strip/mrbgem.rake +6 -0
  100. data/modules/mruby/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +155 -0
  101. data/modules/mruby/mrbgems/mruby-enum-ext/mrbgem.rake +1 -0
  102. data/modules/mruby/mrbgems/mruby-enum-ext/mrblib/enum.rb +555 -21
  103. data/modules/mruby/mrbgems/mruby-enum-ext/test/enum.rb +119 -0
  104. data/modules/mruby/mrbgems/mruby-enum-lazy/mrbgem.rake +7 -0
  105. data/modules/mruby/mrbgems/mruby-enum-lazy/mrblib/lazy.rb +150 -0
  106. data/modules/mruby/mrbgems/mruby-enum-lazy/test/lazy.rb +47 -0
  107. data/modules/mruby/mrbgems/mruby-enumerator/mrbgem.rake +7 -0
  108. data/modules/mruby/mrbgems/mruby-enumerator/mrblib/enumerator.rb +636 -0
  109. data/modules/mruby/mrbgems/mruby-enumerator/test/enumerator.rb +537 -0
  110. data/modules/mruby/mrbgems/mruby-eval/mrbgem.rake +1 -0
  111. data/modules/mruby/mrbgems/mruby-eval/src/eval.c +243 -4
  112. data/modules/mruby/mrbgems/mruby-eval/test/eval.rb +80 -0
  113. data/modules/mruby/mrbgems/mruby-exit/mrbgem.rake +1 -0
  114. data/modules/mruby/mrbgems/mruby-exit/src/mruby-exit.c +1 -1
  115. data/modules/mruby/mrbgems/mruby-fiber/mrbgem.rake +1 -0
  116. data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +157 -51
  117. data/modules/mruby/mrbgems/mruby-fiber/test/fiber.rb +179 -35
  118. data/modules/mruby/mrbgems/mruby-hash-ext/mrbgem.rake +3 -0
  119. data/modules/mruby/mrbgems/mruby-hash-ext/mrblib/hash.rb +241 -1
  120. data/modules/mruby/mrbgems/mruby-hash-ext/src/hash-ext.c +11 -19
  121. data/modules/mruby/mrbgems/mruby-hash-ext/test/hash.rb +138 -1
  122. data/modules/mruby/mrbgems/mruby-kernel-ext/mrbgem.rake +5 -0
  123. data/modules/mruby/mrbgems/mruby-kernel-ext/src/kernel.c +183 -0
  124. data/modules/mruby/mrbgems/mruby-kernel-ext/test/kernel.rb +53 -0
  125. data/modules/mruby/mrbgems/mruby-math/mrbgem.rake +1 -0
  126. data/modules/mruby/mrbgems/mruby-math/src/math.c +107 -14
  127. data/modules/mruby/mrbgems/mruby-math/test/math.rb +16 -0
  128. data/modules/mruby/mrbgems/mruby-numeric-ext/mrbgem.rake +1 -0
  129. data/modules/mruby/mrbgems/mruby-numeric-ext/mrblib/numeric_ext.rb +5 -0
  130. data/modules/mruby/mrbgems/mruby-numeric-ext/test/numeric.rb +9 -1
  131. data/modules/mruby/mrbgems/mruby-object-ext/mrbgem.rake +1 -0
  132. data/modules/mruby/mrbgems/mruby-object-ext/mrblib/object.rb +19 -0
  133. data/modules/mruby/mrbgems/mruby-object-ext/src/object.c +5 -8
  134. data/modules/mruby/mrbgems/mruby-object-ext/test/object.rb +16 -0
  135. data/modules/mruby/mrbgems/mruby-objectspace/mrbgem.rake +1 -0
  136. data/modules/mruby/mrbgems/mruby-objectspace/src/mruby_objectspace.c +121 -53
  137. data/modules/mruby/mrbgems/mruby-objectspace/test/objectspace.rb +27 -4
  138. data/modules/mruby/mrbgems/mruby-print/mrbgem.rake +1 -0
  139. data/modules/mruby/mrbgems/mruby-print/src/print.c +3 -5
  140. data/modules/mruby/mrbgems/mruby-proc-ext/mrbgem.rake +1 -0
  141. data/modules/mruby/mrbgems/mruby-proc-ext/src/proc.c +89 -19
  142. data/modules/mruby/mrbgems/mruby-proc-ext/test/proc.c +56 -0
  143. data/modules/mruby/mrbgems/mruby-proc-ext/test/proc.rb +47 -0
  144. data/modules/mruby/mrbgems/mruby-random/mrbgem.rake +1 -0
  145. data/modules/mruby/mrbgems/mruby-random/src/mt19937ar.c +30 -25
  146. data/modules/mruby/mrbgems/mruby-random/src/mt19937ar.h +6 -3
  147. data/modules/mruby/mrbgems/mruby-random/src/random.c +157 -137
  148. data/modules/mruby/mrbgems/mruby-random/src/random.h +3 -3
  149. data/modules/mruby/mrbgems/mruby-random/test/random.rb +9 -9
  150. data/modules/mruby/mrbgems/mruby-range-ext/mrbgem.rake +1 -0
  151. data/modules/mruby/mrbgems/mruby-range-ext/src/range.c +57 -3
  152. data/modules/mruby/mrbgems/mruby-range-ext/test/range.rb +9 -0
  153. data/modules/mruby/mrbgems/mruby-sprintf/mrbgem.rake +1 -0
  154. data/modules/mruby/mrbgems/mruby-sprintf/mrblib/string.rb +9 -0
  155. data/modules/mruby/mrbgems/mruby-sprintf/src/sprintf.c +29 -23
  156. data/modules/mruby/mrbgems/mruby-sprintf/test/sprintf.rb +7 -2
  157. data/modules/mruby/mrbgems/mruby-string-ext/mrbgem.rake +1 -0
  158. data/modules/mruby/mrbgems/mruby-string-ext/mrblib/string.rb +250 -11
  159. data/modules/mruby/mrbgems/mruby-string-ext/src/string.c +220 -5
  160. data/modules/mruby/mrbgems/mruby-string-ext/test/string.rb +326 -4
  161. data/modules/mruby/mrbgems/mruby-string-utf8/mrbgem.rake +2 -0
  162. data/modules/mruby/mrbgems/mruby-string-utf8/src/string.c +486 -52
  163. data/modules/mruby/mrbgems/mruby-string-utf8/test/string.rb +97 -14
  164. data/modules/mruby/mrbgems/mruby-struct/mrbgem.rake +1 -0
  165. data/modules/mruby/mrbgems/mruby-struct/mrblib/struct.rb +31 -0
  166. data/modules/mruby/mrbgems/mruby-struct/src/struct.c +178 -196
  167. data/modules/mruby/mrbgems/mruby-struct/test/struct.rb +115 -61
  168. data/modules/mruby/mrbgems/mruby-symbol-ext/mrbgem.rake +1 -0
  169. data/modules/mruby/mrbgems/mruby-symbol-ext/mrblib/symbol.rb +22 -17
  170. data/modules/mruby/mrbgems/mruby-symbol-ext/src/symbol.c +20 -11
  171. data/modules/mruby/mrbgems/mruby-symbol-ext/test/symbol.rb +14 -0
  172. data/modules/mruby/mrbgems/mruby-time/mrbgem.rake +1 -0
  173. data/modules/mruby/mrbgems/mruby-time/mrblib/time.rb +9 -0
  174. data/modules/mruby/mrbgems/mruby-time/src/time.c +98 -37
  175. data/modules/mruby/mrbgems/mruby-time/test/time.rb +152 -148
  176. data/modules/mruby/mrbgems/mruby-toplevel-ext/mrbgem.rake +1 -0
  177. data/modules/mruby/mrbgems/mruby-toplevel-ext/test/toplevel.rb +1 -1
  178. data/modules/mruby/mrblib/array.rb +110 -4
  179. data/modules/mruby/mrblib/class.rb +1 -22
  180. data/modules/mruby/mrblib/compar.rb +10 -30
  181. data/modules/mruby/mrblib/enum.rb +64 -52
  182. data/modules/mruby/mrblib/error.rb +9 -4
  183. data/modules/mruby/mrblib/hash.rb +164 -23
  184. data/modules/mruby/mrblib/kernel.rb +26 -22
  185. data/modules/mruby/mrblib/mrblib.rake +4 -4
  186. data/modules/mruby/mrblib/numeric.rb +22 -9
  187. data/modules/mruby/mrblib/range.rb +24 -2
  188. data/modules/mruby/mrblib/string.rb +15 -3
  189. data/modules/mruby/src/array.c +279 -339
  190. data/modules/mruby/src/backtrace.c +68 -16
  191. data/modules/mruby/src/class.c +539 -379
  192. data/modules/mruby/src/codegen.c +424 -207
  193. data/modules/mruby/src/compar.c +1 -1
  194. data/modules/mruby/src/crc.c +7 -6
  195. data/modules/mruby/src/debug.c +37 -36
  196. data/modules/mruby/src/dump.c +463 -213
  197. data/modules/mruby/src/enum.c +1 -1
  198. data/modules/mruby/src/error.c +91 -92
  199. data/modules/mruby/src/error.h +3 -19
  200. data/modules/mruby/src/etc.c +85 -82
  201. data/modules/mruby/src/gc.c +134 -108
  202. data/modules/mruby/src/hash.c +161 -565
  203. data/modules/mruby/src/init.c +2 -13
  204. data/modules/mruby/src/kernel.c +217 -251
  205. data/modules/mruby/src/load.c +280 -283
  206. data/modules/mruby/src/mrb_throw.h +41 -0
  207. data/modules/mruby/src/mruby_core.rake +57 -7
  208. data/modules/mruby/src/node.h +104 -104
  209. data/modules/mruby/src/numeric.c +221 -208
  210. data/modules/mruby/src/object.c +41 -42
  211. data/modules/mruby/src/opcode.h +2 -160
  212. data/modules/mruby/src/parse.y +3430 -3223
  213. data/modules/mruby/src/pool.c +13 -9
  214. data/modules/mruby/src/print.c +20 -17
  215. data/modules/mruby/src/proc.c +77 -21
  216. data/modules/mruby/src/range.c +55 -45
  217. data/modules/mruby/src/state.c +95 -31
  218. data/modules/mruby/src/string.c +462 -468
  219. data/modules/mruby/src/symbol.c +95 -85
  220. data/modules/mruby/src/variable.c +104 -74
  221. data/modules/mruby/src/version.c +13 -0
  222. data/modules/mruby/src/vm.c +528 -296
  223. data/modules/mruby/tasks/libmruby.rake +9 -5
  224. data/modules/mruby/tasks/mrbgem_spec.rake +130 -26
  225. data/modules/mruby/tasks/mrbgems.rake +21 -11
  226. data/modules/mruby/tasks/mrbgems_test.rake +46 -40
  227. data/modules/mruby/tasks/mruby_build.rake +54 -12
  228. data/modules/mruby/tasks/mruby_build_commands.rake +34 -5
  229. data/modules/mruby/tasks/mruby_build_gem.rake +25 -3
  230. data/modules/mruby/tasks/ruby_ext.rake +11 -2
  231. data/modules/mruby/tasks/toolchains/clang.rake +2 -1
  232. data/modules/mruby/tasks/toolchains/gcc.rake +26 -3
  233. data/modules/mruby/tasks/toolchains/visualcpp.rake +17 -8
  234. data/modules/mruby/test/assert.rb +30 -8
  235. data/modules/mruby/test/bintest.rb +10 -0
  236. data/modules/mruby/test/driver.c +74 -24
  237. data/modules/mruby/test/init_mrbtest.c +21 -2
  238. data/modules/mruby/test/mrbtest.rake +27 -5
  239. data/modules/mruby/test/t/argumenterror.rb +0 -5
  240. data/modules/mruby/test/t/array.rb +23 -7
  241. data/modules/mruby/test/t/bs_block.rb +32 -0
  242. data/modules/mruby/test/t/class.rb +29 -5
  243. data/modules/mruby/test/t/comparable.rb +20 -12
  244. data/modules/mruby/test/t/enumerable.rb +33 -7
  245. data/modules/mruby/test/t/exception.rb +63 -38
  246. data/modules/mruby/test/t/false.rb +2 -4
  247. data/modules/mruby/test/t/float.rb +39 -4
  248. data/modules/mruby/test/t/hash.rb +40 -6
  249. data/modules/mruby/test/t/indexerror.rb +0 -4
  250. data/modules/mruby/test/t/integer.rb +41 -5
  251. data/modules/mruby/test/t/kernel.rb +90 -3
  252. data/modules/mruby/test/t/localjumperror.rb +4 -4
  253. data/modules/mruby/test/t/methods.rb +1 -1
  254. data/modules/mruby/test/t/module.rb +43 -13
  255. data/modules/mruby/test/t/nameerror.rb +0 -4
  256. data/modules/mruby/test/t/nil.rb +5 -0
  257. data/modules/mruby/test/t/nomethoderror.rb +11 -2
  258. data/modules/mruby/test/t/numeric.rb +18 -4
  259. data/modules/mruby/test/t/proc.rb +59 -6
  260. data/modules/mruby/test/t/range.rb +15 -5
  261. data/modules/mruby/test/t/rangeerror.rb +0 -4
  262. data/modules/mruby/test/t/standarderror.rb +0 -4
  263. data/modules/mruby/test/t/string.rb +56 -12
  264. data/modules/mruby/test/t/superclass.rb +46 -0
  265. data/modules/mruby/test/t/symbol.rb +0 -4
  266. data/modules/mruby/test/t/syntax.rb +134 -1
  267. data/modules/mruby/test/t/true.rb +2 -4
  268. data/modules/mruby/test/t/typeerror.rb +0 -5
  269. data/modules/mruby/test/t/unicode.rb +35 -0
  270. data/modules/mruby/tools/mrbc/mrbc.c +9 -12
  271. data/modules/mruby/travis_config.rb +22 -2
  272. metadata +98 -1299
  273. data/modules/emscripten/AUTHORS +0 -117
  274. data/modules/emscripten/CONTRIBUTING.markdown +0 -5
  275. data/modules/emscripten/ChangeLog +0 -468
  276. data/modules/emscripten/LICENSE +0 -94
  277. data/modules/emscripten/README.markdown +0 -14
  278. data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +0 -26
  279. data/modules/emscripten/cmake/Platform/Emscripten.cmake +0 -228
  280. data/modules/emscripten/em++ +0 -12
  281. data/modules/emscripten/em++.bat +0 -2
  282. data/modules/emscripten/em-config +0 -24
  283. data/modules/emscripten/em-config.bat +0 -2
  284. data/modules/emscripten/emar +0 -24
  285. data/modules/emscripten/emar.bat +0 -2
  286. data/modules/emscripten/emcc +0 -2069
  287. data/modules/emscripten/emcc.bat +0 -2
  288. data/modules/emscripten/emcc.py +0 -5
  289. data/modules/emscripten/emconfigure +0 -27
  290. data/modules/emscripten/emconfigure.bat +0 -2
  291. data/modules/emscripten/emlink.py +0 -33
  292. data/modules/emscripten/emmake +0 -29
  293. data/modules/emscripten/emmake.bat +0 -2
  294. data/modules/emscripten/emranlib +0 -9
  295. data/modules/emscripten/emranlib.bat +0 -2
  296. data/modules/emscripten/emrun +0 -1087
  297. data/modules/emscripten/emrun.bat +0 -2
  298. data/modules/emscripten/emscons +0 -20
  299. data/modules/emscripten/emscripten.py +0 -1347
  300. data/modules/emscripten/package.json +0 -7
  301. data/modules/emscripten/patches/README +0 -4
  302. data/modules/emscripten/patches/series +0 -2
  303. data/modules/emscripten/scons-tools/closure.py +0 -28
  304. data/modules/emscripten/scons-tools/emscripten.py +0 -364
  305. data/modules/emscripten/scons-tools/llvm.py +0 -34
  306. data/modules/emscripten/src/analyzer.js +0 -1781
  307. data/modules/emscripten/src/closure-externs.js +0 -110
  308. data/modules/emscripten/src/compiler.html +0 -48
  309. data/modules/emscripten/src/compiler.js +0 -331
  310. data/modules/emscripten/src/compiler_phase.html +0 -33
  311. data/modules/emscripten/src/corruptionCheck.js +0 -98
  312. data/modules/emscripten/src/determinstic.js +0 -20
  313. data/modules/emscripten/src/embind/embind.js +0 -1677
  314. data/modules/emscripten/src/embind/emval.js +0 -284
  315. data/modules/emscripten/src/emrun_postjs.js +0 -20
  316. data/modules/emscripten/src/emrun_prejs.js +0 -5
  317. data/modules/emscripten/src/emscripten-source-map.min.js +0 -31
  318. data/modules/emscripten/src/experimental/allow_loopvars_from_memsetcpy_inasm.diff +0 -97
  319. data/modules/emscripten/src/experimental/batching.diff +0 -44
  320. data/modules/emscripten/src/experimental/functypeopt.diff +0 -113
  321. data/modules/emscripten/src/experimental/multiple_heaps.diff +0 -175
  322. data/modules/emscripten/src/experimental/noncallgraphprofiling.diff +0 -197
  323. data/modules/emscripten/src/experimental/optimize_memcpy_for_ta1.diff +0 -124
  324. data/modules/emscripten/src/experimental/remove__label__s.diff +0 -140
  325. data/modules/emscripten/src/experimental/renderer_cache_hash.diff +0 -99
  326. data/modules/emscripten/src/experimental/sdl_key_forwarding.diff +0 -57
  327. data/modules/emscripten/src/experimental/simplifyGeneratedFunctionsDetection.diff +0 -336
  328. data/modules/emscripten/src/experimental/stringCache.diff +0 -147
  329. data/modules/emscripten/src/fastLong.js +0 -299
  330. data/modules/emscripten/src/gl-matrix.js +0 -1952
  331. data/modules/emscripten/src/headless.js +0 -295
  332. data/modules/emscripten/src/headlessCanvas.js +0 -618
  333. data/modules/emscripten/src/hello_world.js +0 -92
  334. data/modules/emscripten/src/intertyper.js +0 -1228
  335. data/modules/emscripten/src/jsifier.js +0 -1969
  336. data/modules/emscripten/src/library.js +0 -9196
  337. data/modules/emscripten/src/library_browser.js +0 -988
  338. data/modules/emscripten/src/library_egl.js +0 -564
  339. data/modules/emscripten/src/library_fs.js +0 -1619
  340. data/modules/emscripten/src/library_gc.js +0 -236
  341. data/modules/emscripten/src/library_gl.js +0 -5194
  342. data/modules/emscripten/src/library_glfw.js +0 -585
  343. data/modules/emscripten/src/library_glut.js +0 -504
  344. data/modules/emscripten/src/library_idbfs.js +0 -216
  345. data/modules/emscripten/src/library_jansson.js +0 -320
  346. data/modules/emscripten/src/library_memfs.js +0 -303
  347. data/modules/emscripten/src/library_nodefs.js +0 -286
  348. data/modules/emscripten/src/library_openal.js +0 -915
  349. data/modules/emscripten/src/library_path.js +0 -133
  350. data/modules/emscripten/src/library_sdl.js +0 -2728
  351. data/modules/emscripten/src/library_sockfs.js +0 -578
  352. data/modules/emscripten/src/library_strtok_r.c +0 -97
  353. data/modules/emscripten/src/library_tty.js +0 -146
  354. data/modules/emscripten/src/library_uuid.js +0 -140
  355. data/modules/emscripten/src/library_xlib.js +0 -23
  356. data/modules/emscripten/src/long.js +0 -1609
  357. data/modules/emscripten/src/modules.js +0 -543
  358. data/modules/emscripten/src/parseTools.js +0 -2723
  359. data/modules/emscripten/src/postamble.js +0 -239
  360. data/modules/emscripten/src/postamble_sharedlib.js +0 -16
  361. data/modules/emscripten/src/preamble.js +0 -1233
  362. data/modules/emscripten/src/preamble_sharedlib.js +0 -25
  363. data/modules/emscripten/src/proxyClient.js +0 -82
  364. data/modules/emscripten/src/proxyWorker.js +0 -143
  365. data/modules/emscripten/src/relooper/README.markdown +0 -14
  366. data/modules/emscripten/src/relooper/Relooper.cpp +0 -1301
  367. data/modules/emscripten/src/relooper/Relooper.h +0 -257
  368. data/modules/emscripten/src/relooper/doit.sh +0 -70
  369. data/modules/emscripten/src/relooper/emscripten/glue.js +0 -67
  370. data/modules/emscripten/src/relooper/emscripten/test.js +0 -44
  371. data/modules/emscripten/src/relooper/fuzzer.py +0 -131
  372. data/modules/emscripten/src/relooper/ministring.h +0 -35
  373. data/modules/emscripten/src/relooper/paper.pdf +0 -0
  374. data/modules/emscripten/src/relooper/test.cpp +0 -290
  375. data/modules/emscripten/src/relooper/test.txt +0 -317
  376. data/modules/emscripten/src/relooper/test2.c +0 -44
  377. data/modules/emscripten/src/relooper/test2.txt +0 -26
  378. data/modules/emscripten/src/relooper/test3.c +0 -42
  379. data/modules/emscripten/src/relooper/test3.txt +0 -56
  380. data/modules/emscripten/src/relooper/test4.cpp +0 -40
  381. data/modules/emscripten/src/relooper/test4.txt +0 -44
  382. data/modules/emscripten/src/relooper/test5.cpp +0 -40
  383. data/modules/emscripten/src/relooper/test5.txt +0 -56
  384. data/modules/emscripten/src/relooper/test6.cpp +0 -31
  385. data/modules/emscripten/src/relooper/test6.txt +0 -26
  386. data/modules/emscripten/src/relooper/test_dead.cpp +0 -28
  387. data/modules/emscripten/src/relooper/test_dead.txt +0 -9
  388. data/modules/emscripten/src/relooper/test_debug.cpp +0 -30
  389. data/modules/emscripten/src/relooper/test_debug.txt +0 -142
  390. data/modules/emscripten/src/relooper/test_fuzz1.cpp +0 -52
  391. data/modules/emscripten/src/relooper/test_fuzz1.txt +0 -72
  392. data/modules/emscripten/src/relooper/test_fuzz2.cpp +0 -34
  393. data/modules/emscripten/src/relooper/test_fuzz2.txt +0 -30
  394. data/modules/emscripten/src/relooper/test_fuzz3.cpp +0 -36
  395. data/modules/emscripten/src/relooper/test_fuzz3.txt +0 -25
  396. data/modules/emscripten/src/relooper/test_fuzz4.cpp +0 -38
  397. data/modules/emscripten/src/relooper/test_fuzz4.txt +0 -41
  398. data/modules/emscripten/src/relooper/test_fuzz5.cpp +0 -57
  399. data/modules/emscripten/src/relooper/test_fuzz5.txt +0 -86
  400. data/modules/emscripten/src/relooper/test_fuzz6.cpp +0 -322
  401. data/modules/emscripten/src/relooper/test_fuzz6.txt +0 -291
  402. data/modules/emscripten/src/relooper/test_inf.cpp +0 -813
  403. data/modules/emscripten/src/relooper/test_inf.txt +0 -1131
  404. data/modules/emscripten/src/relooper/testit.sh +0 -62
  405. data/modules/emscripten/src/relooper/updateit.sh +0 -17
  406. data/modules/emscripten/src/runtime.js +0 -604
  407. data/modules/emscripten/src/settings.js +0 -476
  408. data/modules/emscripten/src/shell.html +0 -95
  409. data/modules/emscripten/src/shell.js +0 -173
  410. data/modules/emscripten/src/shell_sharedlib.js +0 -29
  411. data/modules/emscripten/src/simd.js +0 -1128
  412. data/modules/emscripten/src/socket.io.js +0 -3870
  413. data/modules/emscripten/src/struct_info.json +0 -1077
  414. data/modules/emscripten/src/utility.js +0 -411
  415. data/modules/emscripten/src/wrtcp.js +0 -821
  416. data/modules/emscripten/system/bin/sdl-config +0 -13
  417. data/modules/emscripten/system/include/AL/al.h +0 -172
  418. data/modules/emscripten/system/include/AL/alc.h +0 -84
  419. data/modules/emscripten/system/include/EGL/egl.h +0 -329
  420. data/modules/emscripten/system/include/EGL/eglext.h +0 -398
  421. data/modules/emscripten/system/include/EGL/eglplatform.h +0 -141
  422. data/modules/emscripten/system/include/GL/freeglut_std.h +0 -628
  423. data/modules/emscripten/system/include/GL/gl.h +0 -2241
  424. data/modules/emscripten/system/include/GL/glew.h +0 -6
  425. data/modules/emscripten/system/include/GL/glext.h +0 -11127
  426. data/modules/emscripten/system/include/GL/glfw.h +0 -518
  427. data/modules/emscripten/system/include/GL/glu.h +0 -353
  428. data/modules/emscripten/system/include/GL/glut.h +0 -21
  429. data/modules/emscripten/system/include/GLES/gl.h +0 -770
  430. data/modules/emscripten/system/include/GLES/glext.h +0 -1278
  431. data/modules/emscripten/system/include/GLES/glplatform.h +0 -30
  432. data/modules/emscripten/system/include/GLES2/gl2.h +0 -621
  433. data/modules/emscripten/system/include/GLES2/gl2ext.h +0 -803
  434. data/modules/emscripten/system/include/GLES2/gl2platform.h +0 -30
  435. data/modules/emscripten/system/include/KHR/khrplatform.h +0 -277
  436. data/modules/emscripten/system/include/SDL/COPYING +0 -19
  437. data/modules/emscripten/system/include/SDL/SDL.h +0 -162
  438. data/modules/emscripten/system/include/SDL/SDL_assert.h +0 -241
  439. data/modules/emscripten/system/include/SDL/SDL_atomic.h +0 -318
  440. data/modules/emscripten/system/include/SDL/SDL_audio.h +0 -509
  441. data/modules/emscripten/system/include/SDL/SDL_blendmode.h +0 -60
  442. data/modules/emscripten/system/include/SDL/SDL_clipboard.h +0 -75
  443. data/modules/emscripten/system/include/SDL/SDL_compat.h +0 -365
  444. data/modules/emscripten/system/include/SDL/SDL_config.h +0 -48
  445. data/modules/emscripten/system/include/SDL/SDL_config.h.in +0 -297
  446. data/modules/emscripten/system/include/SDL/SDL_config_android.h +0 -133
  447. data/modules/emscripten/system/include/SDL/SDL_config_iphoneos.h +0 -148
  448. data/modules/emscripten/system/include/SDL/SDL_config_macosx.h +0 -172
  449. data/modules/emscripten/system/include/SDL/SDL_config_minimal.h +0 -74
  450. data/modules/emscripten/system/include/SDL/SDL_config_nintendods.h +0 -129
  451. data/modules/emscripten/system/include/SDL/SDL_config_pandora.h +0 -125
  452. data/modules/emscripten/system/include/SDL/SDL_config_windows.h +0 -207
  453. data/modules/emscripten/system/include/SDL/SDL_config_wiz.h +0 -119
  454. data/modules/emscripten/system/include/SDL/SDL_copying.h +0 -20
  455. data/modules/emscripten/system/include/SDL/SDL_cpuinfo.h +0 -150
  456. data/modules/emscripten/system/include/SDL/SDL_endian.h +0 -248
  457. data/modules/emscripten/system/include/SDL/SDL_error.h +0 -77
  458. data/modules/emscripten/system/include/SDL/SDL_events.h +0 -640
  459. data/modules/emscripten/system/include/SDL/SDL_gesture.h +0 -91
  460. data/modules/emscripten/system/include/SDL/SDL_gfxPrimitives.h +0 -246
  461. data/modules/emscripten/system/include/SDL/SDL_haptic.h +0 -1200
  462. data/modules/emscripten/system/include/SDL/SDL_hints.h +0 -206
  463. data/modules/emscripten/system/include/SDL/SDL_image.h +0 -138
  464. data/modules/emscripten/system/include/SDL/SDL_input.h +0 -87
  465. data/modules/emscripten/system/include/SDL/SDL_joystick.h +0 -208
  466. data/modules/emscripten/system/include/SDL/SDL_keyboard.h +0 -169
  467. data/modules/emscripten/system/include/SDL/SDL_keycode.h +0 -344
  468. data/modules/emscripten/system/include/SDL/SDL_loadso.h +0 -85
  469. data/modules/emscripten/system/include/SDL/SDL_log.h +0 -211
  470. data/modules/emscripten/system/include/SDL/SDL_main.h +0 -98
  471. data/modules/emscripten/system/include/SDL/SDL_mixer.h +0 -634
  472. data/modules/emscripten/system/include/SDL/SDL_mouse.h +0 -213
  473. data/modules/emscripten/system/include/SDL/SDL_mutex.h +0 -248
  474. data/modules/emscripten/system/include/SDL/SDL_name.h +0 -11
  475. data/modules/emscripten/system/include/SDL/SDL_opengl.h +0 -11116
  476. data/modules/emscripten/system/include/SDL/SDL_opengles.h +0 -38
  477. data/modules/emscripten/system/include/SDL/SDL_opengles2.h +0 -38
  478. data/modules/emscripten/system/include/SDL/SDL_pixels.h +0 -423
  479. data/modules/emscripten/system/include/SDL/SDL_platform.h +0 -160
  480. data/modules/emscripten/system/include/SDL/SDL_power.h +0 -79
  481. data/modules/emscripten/system/include/SDL/SDL_quit.h +0 -58
  482. data/modules/emscripten/system/include/SDL/SDL_rect.h +0 -136
  483. data/modules/emscripten/system/include/SDL/SDL_render.h +0 -615
  484. data/modules/emscripten/system/include/SDL/SDL_revision.h +0 -2
  485. data/modules/emscripten/system/include/SDL/SDL_revision.h.orig +0 -2
  486. data/modules/emscripten/system/include/SDL/SDL_rotozoom.h +0 -123
  487. data/modules/emscripten/system/include/SDL/SDL_rwops.h +0 -220
  488. data/modules/emscripten/system/include/SDL/SDL_scancode.h +0 -398
  489. data/modules/emscripten/system/include/SDL/SDL_shape.h +0 -147
  490. data/modules/emscripten/system/include/SDL/SDL_stdinc.h +0 -764
  491. data/modules/emscripten/system/include/SDL/SDL_surface.h +0 -499
  492. data/modules/emscripten/system/include/SDL/SDL_syswm.h +0 -241
  493. data/modules/emscripten/system/include/SDL/SDL_thread.h +0 -182
  494. data/modules/emscripten/system/include/SDL/SDL_timer.h +0 -108
  495. data/modules/emscripten/system/include/SDL/SDL_touch.h +0 -124
  496. data/modules/emscripten/system/include/SDL/SDL_ttf.h +0 -249
  497. data/modules/emscripten/system/include/SDL/SDL_types.h +0 -29
  498. data/modules/emscripten/system/include/SDL/SDL_version.h +0 -166
  499. data/modules/emscripten/system/include/SDL/SDL_video.h +0 -820
  500. data/modules/emscripten/system/include/SDL/begin_code.h +0 -135
  501. data/modules/emscripten/system/include/SDL/close_code.h +0 -37
  502. data/modules/emscripten/system/include/X11/X.h +0 -717
  503. data/modules/emscripten/system/include/X11/Xatom.h +0 -79
  504. data/modules/emscripten/system/include/X11/Xfuncproto.h +0 -127
  505. data/modules/emscripten/system/include/X11/Xlib.h +0 -4023
  506. data/modules/emscripten/system/include/X11/Xosdefs.h +0 -116
  507. data/modules/emscripten/system/include/X11/Xutil.h +0 -826
  508. data/modules/emscripten/system/include/X11/keysym.h +0 -73
  509. data/modules/emscripten/system/include/X11/keysymdef.h +0 -2389
  510. data/modules/emscripten/system/include/compat/ctype.h +0 -34
  511. data/modules/emscripten/system/include/compat/malloc.h +0 -48
  512. data/modules/emscripten/system/include/compat/math.h +0 -14
  513. data/modules/emscripten/system/include/compat/netdb.h +0 -22
  514. data/modules/emscripten/system/include/compat/stdarg.h +0 -16
  515. data/modules/emscripten/system/include/compat/stdlib.h +0 -16
  516. data/modules/emscripten/system/include/compat/string.h +0 -17
  517. data/modules/emscripten/system/include/compat/sys/socketvar.h +0 -14
  518. data/modules/emscripten/system/include/compat/sys/stat.h +0 -20
  519. data/modules/emscripten/system/include/compat/sys/timeb.h +0 -35
  520. data/modules/emscripten/system/include/compat/time.h +0 -18
  521. data/modules/emscripten/system/include/compat/unistd.h +0 -16
  522. data/modules/emscripten/system/include/compat/wchar.h +0 -23
  523. data/modules/emscripten/system/include/compat/wctype.h +0 -23
  524. data/modules/emscripten/system/include/compat/xlocale.h +0 -19
  525. data/modules/emscripten/system/include/emscripten/bind.h +0 -1210
  526. data/modules/emscripten/system/include/emscripten/emmintrin.h +0 -87
  527. data/modules/emscripten/system/include/emscripten/emscripten.h +0 -519
  528. data/modules/emscripten/system/include/emscripten/val.h +0 -311
  529. data/modules/emscripten/system/include/emscripten/vector.h +0 -34
  530. data/modules/emscripten/system/include/emscripten/wire.h +0 -393
  531. data/modules/emscripten/system/include/emscripten/xmmintrin.h +0 -131
  532. data/modules/emscripten/system/include/execinfo.h +0 -44
  533. data/modules/emscripten/system/include/gc.h +0 -70
  534. data/modules/emscripten/system/include/gfx/png.h +0 -3798
  535. data/modules/emscripten/system/include/gfx/pngconf.h +0 -1665
  536. data/modules/emscripten/system/include/gfx/tiff.h +0 -654
  537. data/modules/emscripten/system/include/gfx/tiffconf.h +0 -104
  538. data/modules/emscripten/system/include/gfx/tiffio.h +0 -526
  539. data/modules/emscripten/system/include/gfx/tiffvers.h +0 -9
  540. data/modules/emscripten/system/include/jansson.h +0 -323
  541. data/modules/emscripten/system/include/jansson_config.h +0 -54
  542. data/modules/emscripten/system/include/libc/aio.h +0 -69
  543. data/modules/emscripten/system/include/libc/alloca.h +0 -21
  544. data/modules/emscripten/system/include/libc/ar.h +0 -25
  545. data/modules/emscripten/system/include/libc/arpa/ftp.h +0 -35
  546. data/modules/emscripten/system/include/libc/arpa/inet.h +0 -36
  547. data/modules/emscripten/system/include/libc/arpa/nameser.h +0 -467
  548. data/modules/emscripten/system/include/libc/arpa/nameser_compat.h +0 -2
  549. data/modules/emscripten/system/include/libc/arpa/telnet.h +0 -251
  550. data/modules/emscripten/system/include/libc/arpa/tftp.h +0 -31
  551. data/modules/emscripten/system/include/libc/assert.h +0 -19
  552. data/modules/emscripten/system/include/libc/bits/alltypes.h +0 -397
  553. data/modules/emscripten/system/include/libc/bits/endian.h +0 -1
  554. data/modules/emscripten/system/include/libc/bits/errno.h +0 -134
  555. data/modules/emscripten/system/include/libc/bits/fcntl.h +0 -38
  556. data/modules/emscripten/system/include/libc/bits/fenv.h +0 -34
  557. data/modules/emscripten/system/include/libc/bits/float.h +0 -17
  558. data/modules/emscripten/system/include/libc/bits/io.h +0 -0
  559. data/modules/emscripten/system/include/libc/bits/ioctl.h +0 -197
  560. data/modules/emscripten/system/include/libc/bits/ipc.h +0 -14
  561. data/modules/emscripten/system/include/libc/bits/limits.h +0 -8
  562. data/modules/emscripten/system/include/libc/bits/mman.h +0 -62
  563. data/modules/emscripten/system/include/libc/bits/msg.h +0 -16
  564. data/modules/emscripten/system/include/libc/bits/posix.h +0 -2
  565. data/modules/emscripten/system/include/libc/bits/reg.h +0 -19
  566. data/modules/emscripten/system/include/libc/bits/setjmp.h +0 -1
  567. data/modules/emscripten/system/include/libc/bits/shm.h +0 -18
  568. data/modules/emscripten/system/include/libc/bits/signal.h +0 -112
  569. data/modules/emscripten/system/include/libc/bits/socket.h +0 -17
  570. data/modules/emscripten/system/include/libc/bits/stat.h +0 -22
  571. data/modules/emscripten/system/include/libc/bits/statfs.h +0 -7
  572. data/modules/emscripten/system/include/libc/bits/stdarg.h +0 -4
  573. data/modules/emscripten/system/include/libc/bits/stdint.h +0 -20
  574. data/modules/emscripten/system/include/libc/bits/syscall.h +0 -696
  575. data/modules/emscripten/system/include/libc/bits/termios.h +0 -160
  576. data/modules/emscripten/system/include/libc/bits/user.h +0 -48
  577. data/modules/emscripten/system/include/libc/byteswap.h +0 -26
  578. data/modules/emscripten/system/include/libc/complex.h +0 -125
  579. data/modules/emscripten/system/include/libc/cpio.h +0 -29
  580. data/modules/emscripten/system/include/libc/crypt.h +0 -20
  581. data/modules/emscripten/system/include/libc/ctype.h +0 -67
  582. data/modules/emscripten/system/include/libc/dirent.h +0 -79
  583. data/modules/emscripten/system/include/libc/dlfcn.h +0 -42
  584. data/modules/emscripten/system/include/libc/elf.h +0 -2555
  585. data/modules/emscripten/system/include/libc/endian.h +0 -82
  586. data/modules/emscripten/system/include/libc/err.h +0 -25
  587. data/modules/emscripten/system/include/libc/errno.h +0 -27
  588. data/modules/emscripten/system/include/libc/fcntl.h +0 -175
  589. data/modules/emscripten/system/include/libc/features.h +0 -32
  590. data/modules/emscripten/system/include/libc/fenv.h +0 -28
  591. data/modules/emscripten/system/include/libc/float.h +0 -34
  592. data/modules/emscripten/system/include/libc/fnmatch.h +0 -29
  593. data/modules/emscripten/system/include/libc/ftw.h +0 -42
  594. data/modules/emscripten/system/include/libc/getopt.h +0 -31
  595. data/modules/emscripten/system/include/libc/glob.h +0 -48
  596. data/modules/emscripten/system/include/libc/grp.h +0 -52
  597. data/modules/emscripten/system/include/libc/iconv.h +0 -24
  598. data/modules/emscripten/system/include/libc/ifaddrs.h +0 -35
  599. data/modules/emscripten/system/include/libc/inttypes.h +0 -227
  600. data/modules/emscripten/system/include/libc/iso646.h +0 -20
  601. data/modules/emscripten/system/include/libc/langinfo.h +0 -88
  602. data/modules/emscripten/system/include/libc/lastlog.h +0 -1
  603. data/modules/emscripten/system/include/libc/libgen.h +0 -15
  604. data/modules/emscripten/system/include/libc/libintl.h +0 -25
  605. data/modules/emscripten/system/include/libc/limits.h +0 -146
  606. data/modules/emscripten/system/include/libc/link.h +0 -54
  607. data/modules/emscripten/system/include/libc/locale.h +0 -82
  608. data/modules/emscripten/system/include/libc/malloc.h +0 -0
  609. data/modules/emscripten/system/include/libc/math.h +0 -422
  610. data/modules/emscripten/system/include/libc/memory.h +0 -1
  611. data/modules/emscripten/system/include/libc/mntent.h +0 -44
  612. data/modules/emscripten/system/include/libc/monetary.h +0 -23
  613. data/modules/emscripten/system/include/libc/mqueue.h +0 -36
  614. data/modules/emscripten/system/include/libc/net/ethernet.h +0 -55
  615. data/modules/emscripten/system/include/libc/net/if.h +0 -135
  616. data/modules/emscripten/system/include/libc/net/if_arp.h +0 -133
  617. data/modules/emscripten/system/include/libc/net/route.h +0 -124
  618. data/modules/emscripten/system/include/libc/netdb.h +0 -161
  619. data/modules/emscripten/system/include/libc/netinet/ether.h +0 -14
  620. data/modules/emscripten/system/include/libc/netinet/icmp6.h +0 -305
  621. data/modules/emscripten/system/include/libc/netinet/if_ether.h +0 -126
  622. data/modules/emscripten/system/include/libc/netinet/in.h +0 -336
  623. data/modules/emscripten/system/include/libc/netinet/in_systm.h +0 -9
  624. data/modules/emscripten/system/include/libc/netinet/ip.h +0 -186
  625. data/modules/emscripten/system/include/libc/netinet/ip6.h +0 -142
  626. data/modules/emscripten/system/include/libc/netinet/ip_icmp.h +0 -192
  627. data/modules/emscripten/system/include/libc/netinet/tcp.h +0 -71
  628. data/modules/emscripten/system/include/libc/netinet/udp.h +0 -35
  629. data/modules/emscripten/system/include/libc/netpacket/packet.h +0 -44
  630. data/modules/emscripten/system/include/libc/nl_types.h +0 -22
  631. data/modules/emscripten/system/include/libc/paths.h +0 -32
  632. data/modules/emscripten/system/include/libc/poll.h +0 -46
  633. data/modules/emscripten/system/include/libc/pthread.h +0 -222
  634. data/modules/emscripten/system/include/libc/pty.h +0 -18
  635. data/modules/emscripten/system/include/libc/pwd.h +0 -49
  636. data/modules/emscripten/system/include/libc/readme.txt +0 -3
  637. data/modules/emscripten/system/include/libc/regex.h +0 -62
  638. data/modules/emscripten/system/include/libc/resolv.h +0 -144
  639. data/modules/emscripten/system/include/libc/sched.h +0 -132
  640. data/modules/emscripten/system/include/libc/search.h +0 -51
  641. data/modules/emscripten/system/include/libc/semaphore.h +0 -35
  642. data/modules/emscripten/system/include/libc/setjmp.h +0 -42
  643. data/modules/emscripten/system/include/libc/shadow.h +0 -44
  644. data/modules/emscripten/system/include/libc/signal.h +0 -255
  645. data/modules/emscripten/system/include/libc/spawn.h +0 -74
  646. data/modules/emscripten/system/include/libc/stdalign.h +0 -15
  647. data/modules/emscripten/system/include/libc/stdarg.h +0 -25
  648. data/modules/emscripten/system/include/libc/stdbool.h +0 -14
  649. data/modules/emscripten/system/include/libc/stddef.h +0 -18
  650. data/modules/emscripten/system/include/libc/stdint.h +0 -117
  651. data/modules/emscripten/system/include/libc/stdio.h +0 -199
  652. data/modules/emscripten/system/include/libc/stdio_ext.h +0 -34
  653. data/modules/emscripten/system/include/libc/stdlib.h +0 -171
  654. data/modules/emscripten/system/include/libc/stdnoreturn.h +0 -5
  655. data/modules/emscripten/system/include/libc/string.h +0 -102
  656. data/modules/emscripten/system/include/libc/strings.h +0 -35
  657. data/modules/emscripten/system/include/libc/stropts.h +0 -139
  658. data/modules/emscripten/system/include/libc/sys/acct.h +0 -75
  659. data/modules/emscripten/system/include/libc/sys/cachectl.h +0 -22
  660. data/modules/emscripten/system/include/libc/sys/dir.h +0 -2
  661. data/modules/emscripten/system/include/libc/sys/epoll.h +0 -67
  662. data/modules/emscripten/system/include/libc/sys/errno.h +0 -2
  663. data/modules/emscripten/system/include/libc/sys/eventfd.h +0 -26
  664. data/modules/emscripten/system/include/libc/sys/fcntl.h +0 -2
  665. data/modules/emscripten/system/include/libc/sys/file.h +0 -21
  666. data/modules/emscripten/system/include/libc/sys/fsuid.h +0 -20
  667. data/modules/emscripten/system/include/libc/sys/inotify.h +0 -57
  668. data/modules/emscripten/system/include/libc/sys/io.h +0 -17
  669. data/modules/emscripten/system/include/libc/sys/ioctl.h +0 -14
  670. data/modules/emscripten/system/include/libc/sys/ipc.h +0 -42
  671. data/modules/emscripten/system/include/libc/sys/klog.h +0 -14
  672. data/modules/emscripten/system/include/libc/sys/mman.h +0 -55
  673. data/modules/emscripten/system/include/libc/sys/mount.h +0 -72
  674. data/modules/emscripten/system/include/libc/sys/msg.h +0 -52
  675. data/modules/emscripten/system/include/libc/sys/mtio.h +0 -188
  676. data/modules/emscripten/system/include/libc/sys/param.h +0 -35
  677. data/modules/emscripten/system/include/libc/sys/personality.h +0 -46
  678. data/modules/emscripten/system/include/libc/sys/poll.h +0 -2
  679. data/modules/emscripten/system/include/libc/sys/prctl.h +0 -101
  680. data/modules/emscripten/system/include/libc/sys/procfs.h +0 -65
  681. data/modules/emscripten/system/include/libc/sys/ptrace.h +0 -96
  682. data/modules/emscripten/system/include/libc/sys/reboot.h +0 -20
  683. data/modules/emscripten/system/include/libc/sys/reg.h +0 -9
  684. data/modules/emscripten/system/include/libc/sys/resource.h +0 -103
  685. data/modules/emscripten/system/include/libc/sys/select.h +0 -42
  686. data/modules/emscripten/system/include/libc/sys/sem.h +0 -82
  687. data/modules/emscripten/system/include/libc/sys/sendfile.h +0 -22
  688. data/modules/emscripten/system/include/libc/sys/shm.h +0 -61
  689. data/modules/emscripten/system/include/libc/sys/signal.h +0 -2
  690. data/modules/emscripten/system/include/libc/sys/signalfd.h +0 -44
  691. data/modules/emscripten/system/include/libc/sys/socket.h +0 -299
  692. data/modules/emscripten/system/include/libc/sys/stat.h +0 -114
  693. data/modules/emscripten/system/include/libc/sys/statfs.h +0 -32
  694. data/modules/emscripten/system/include/libc/sys/statvfs.h +0 -57
  695. data/modules/emscripten/system/include/libc/sys/stropts.h +0 -1
  696. data/modules/emscripten/system/include/libc/sys/swap.h +0 -21
  697. data/modules/emscripten/system/include/libc/sys/syscall.h +0 -6
  698. data/modules/emscripten/system/include/libc/sys/sysctl.h +0 -17
  699. data/modules/emscripten/system/include/libc/sys/sysinfo.h +0 -36
  700. data/modules/emscripten/system/include/libc/sys/syslog.h +0 -1
  701. data/modules/emscripten/system/include/libc/sys/sysmacros.h +0 -15
  702. data/modules/emscripten/system/include/libc/sys/termios.h +0 -2
  703. data/modules/emscripten/system/include/libc/sys/time.h +0 -57
  704. data/modules/emscripten/system/include/libc/sys/timerfd.h +0 -24
  705. data/modules/emscripten/system/include/libc/sys/times.h +0 -26
  706. data/modules/emscripten/system/include/libc/sys/timex.h +0 -98
  707. data/modules/emscripten/system/include/libc/sys/ttydefaults.h +0 -39
  708. data/modules/emscripten/system/include/libc/sys/types.h +0 -91
  709. data/modules/emscripten/system/include/libc/sys/ucontext.h +0 -1
  710. data/modules/emscripten/system/include/libc/sys/uio.h +0 -48
  711. data/modules/emscripten/system/include/libc/sys/un.h +0 -32
  712. data/modules/emscripten/system/include/libc/sys/user.h +0 -16
  713. data/modules/emscripten/system/include/libc/sys/utsname.h +0 -30
  714. data/modules/emscripten/system/include/libc/sys/vfs.h +0 -1
  715. data/modules/emscripten/system/include/libc/sys/wait.h +0 -55
  716. data/modules/emscripten/system/include/libc/sys/xattr.h +0 -30
  717. data/modules/emscripten/system/include/libc/syscall.h +0 -1
  718. data/modules/emscripten/system/include/libc/sysexits.h +0 -21
  719. data/modules/emscripten/system/include/libc/syslog.h +0 -104
  720. data/modules/emscripten/system/include/libc/tar.h +0 -33
  721. data/modules/emscripten/system/include/libc/termios.h +0 -46
  722. data/modules/emscripten/system/include/libc/tgmath.h +0 -270
  723. data/modules/emscripten/system/include/libc/time.h +0 -132
  724. data/modules/emscripten/system/include/libc/ucontext.h +0 -25
  725. data/modules/emscripten/system/include/libc/ulimit.h +0 -17
  726. data/modules/emscripten/system/include/libc/unistd.h +0 -519
  727. data/modules/emscripten/system/include/libc/utime.h +0 -24
  728. data/modules/emscripten/system/include/libc/utmp.h +0 -47
  729. data/modules/emscripten/system/include/libc/utmpx.h +0 -58
  730. data/modules/emscripten/system/include/libc/values.h +0 -39
  731. data/modules/emscripten/system/include/libc/wchar.h +0 -183
  732. data/modules/emscripten/system/include/libc/wctype.h +0 -77
  733. data/modules/emscripten/system/include/libc/wordexp.h +0 -42
  734. data/modules/emscripten/system/include/libcxx/CREDITS.TXT +0 -123
  735. data/modules/emscripten/system/include/libcxx/LICENSE.txt +0 -76
  736. data/modules/emscripten/system/include/libcxx/__bit_reference +0 -1287
  737. data/modules/emscripten/system/include/libcxx/__config +0 -610
  738. data/modules/emscripten/system/include/libcxx/__debug +0 -218
  739. data/modules/emscripten/system/include/libcxx/__functional_03 +0 -2130
  740. data/modules/emscripten/system/include/libcxx/__functional_base +0 -615
  741. data/modules/emscripten/system/include/libcxx/__functional_base_03 +0 -1087
  742. data/modules/emscripten/system/include/libcxx/__hash_table +0 -2457
  743. data/modules/emscripten/system/include/libcxx/__locale +0 -1445
  744. data/modules/emscripten/system/include/libcxx/__mutex_base +0 -407
  745. data/modules/emscripten/system/include/libcxx/__split_buffer +0 -654
  746. data/modules/emscripten/system/include/libcxx/__sso_allocator +0 -77
  747. data/modules/emscripten/system/include/libcxx/__std_stream +0 -359
  748. data/modules/emscripten/system/include/libcxx/__tree +0 -2309
  749. data/modules/emscripten/system/include/libcxx/__tuple +0 -305
  750. data/modules/emscripten/system/include/libcxx/__tuple_03 +0 -27
  751. data/modules/emscripten/system/include/libcxx/__undef_min_max +0 -27
  752. data/modules/emscripten/system/include/libcxx/algorithm +0 -5679
  753. data/modules/emscripten/system/include/libcxx/array +0 -342
  754. data/modules/emscripten/system/include/libcxx/atomic +0 -1531
  755. data/modules/emscripten/system/include/libcxx/bitset +0 -1081
  756. data/modules/emscripten/system/include/libcxx/cassert +0 -25
  757. data/modules/emscripten/system/include/libcxx/ccomplex +0 -29
  758. data/modules/emscripten/system/include/libcxx/cctype +0 -164
  759. data/modules/emscripten/system/include/libcxx/cerrno +0 -393
  760. data/modules/emscripten/system/include/libcxx/cfenv +0 -82
  761. data/modules/emscripten/system/include/libcxx/cfloat +0 -78
  762. data/modules/emscripten/system/include/libcxx/chrono +0 -1027
  763. data/modules/emscripten/system/include/libcxx/cinttypes +0 -259
  764. data/modules/emscripten/system/include/libcxx/ciso646 +0 -25
  765. data/modules/emscripten/system/include/libcxx/climits +0 -48
  766. data/modules/emscripten/system/include/libcxx/clocale +0 -53
  767. data/modules/emscripten/system/include/libcxx/cmath +0 -1690
  768. data/modules/emscripten/system/include/libcxx/codecvt +0 -550
  769. data/modules/emscripten/system/include/libcxx/complex +0 -1567
  770. data/modules/emscripten/system/include/libcxx/complex.h +0 -35
  771. data/modules/emscripten/system/include/libcxx/condition_variable +0 -256
  772. data/modules/emscripten/system/include/libcxx/csetjmp +0 -52
  773. data/modules/emscripten/system/include/libcxx/csignal +0 -58
  774. data/modules/emscripten/system/include/libcxx/cstdarg +0 -48
  775. data/modules/emscripten/system/include/libcxx/cstdbool +0 -32
  776. data/modules/emscripten/system/include/libcxx/cstddef +0 -103
  777. data/modules/emscripten/system/include/libcxx/cstdint +0 -191
  778. data/modules/emscripten/system/include/libcxx/cstdio +0 -182
  779. data/modules/emscripten/system/include/libcxx/cstdlib +0 -172
  780. data/modules/emscripten/system/include/libcxx/cstring +0 -112
  781. data/modules/emscripten/system/include/libcxx/ctgmath +0 -29
  782. data/modules/emscripten/system/include/libcxx/ctime +0 -72
  783. data/modules/emscripten/system/include/libcxx/cwchar +0 -217
  784. data/modules/emscripten/system/include/libcxx/cwctype +0 -213
  785. data/modules/emscripten/system/include/libcxx/deque +0 -2873
  786. data/modules/emscripten/system/include/libcxx/dynarray +0 -311
  787. data/modules/emscripten/system/include/libcxx/exception +0 -250
  788. data/modules/emscripten/system/include/libcxx/ext/__hash +0 -46
  789. data/modules/emscripten/system/include/libcxx/ext/hash_map +0 -1007
  790. data/modules/emscripten/system/include/libcxx/ext/hash_set +0 -661
  791. data/modules/emscripten/system/include/libcxx/forward_list +0 -1663
  792. data/modules/emscripten/system/include/libcxx/fstream +0 -1431
  793. data/modules/emscripten/system/include/libcxx/functional +0 -2418
  794. data/modules/emscripten/system/include/libcxx/future +0 -2615
  795. data/modules/emscripten/system/include/libcxx/initializer_list +0 -118
  796. data/modules/emscripten/system/include/libcxx/iomanip +0 -651
  797. data/modules/emscripten/system/include/libcxx/ios +0 -1023
  798. data/modules/emscripten/system/include/libcxx/iosfwd +0 -194
  799. data/modules/emscripten/system/include/libcxx/iostream +0 -60
  800. data/modules/emscripten/system/include/libcxx/istream +0 -1716
  801. data/modules/emscripten/system/include/libcxx/iterator +0 -1568
  802. data/modules/emscripten/system/include/libcxx/limits +0 -813
  803. data/modules/emscripten/system/include/libcxx/list +0 -2355
  804. data/modules/emscripten/system/include/libcxx/locale +0 -4465
  805. data/modules/emscripten/system/include/libcxx/map +0 -2045
  806. data/modules/emscripten/system/include/libcxx/memory +0 -5448
  807. data/modules/emscripten/system/include/libcxx/mutex +0 -566
  808. data/modules/emscripten/system/include/libcxx/new +0 -146
  809. data/modules/emscripten/system/include/libcxx/numeric +0 -197
  810. data/modules/emscripten/system/include/libcxx/optional +0 -697
  811. data/modules/emscripten/system/include/libcxx/ostream +0 -1295
  812. data/modules/emscripten/system/include/libcxx/queue +0 -717
  813. data/modules/emscripten/system/include/libcxx/random +0 -6725
  814. data/modules/emscripten/system/include/libcxx/ratio +0 -487
  815. data/modules/emscripten/system/include/libcxx/readme.txt +0 -1
  816. data/modules/emscripten/system/include/libcxx/regex +0 -6487
  817. data/modules/emscripten/system/include/libcxx/scoped_allocator +0 -578
  818. data/modules/emscripten/system/include/libcxx/set +0 -1189
  819. data/modules/emscripten/system/include/libcxx/shared_mutex +0 -419
  820. data/modules/emscripten/system/include/libcxx/sstream +0 -972
  821. data/modules/emscripten/system/include/libcxx/stack +0 -292
  822. data/modules/emscripten/system/include/libcxx/stdexcept +0 -162
  823. data/modules/emscripten/system/include/libcxx/streambuf +0 -564
  824. data/modules/emscripten/system/include/libcxx/string +0 -4198
  825. data/modules/emscripten/system/include/libcxx/strstream +0 -400
  826. data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +0 -99
  827. data/modules/emscripten/system/include/libcxx/support/ibm/support.h +0 -54
  828. data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +0 -326
  829. data/modules/emscripten/system/include/libcxx/support/solaris/floatingpoint.h +0 -5
  830. data/modules/emscripten/system/include/libcxx/support/solaris/wchar.h +0 -38
  831. data/modules/emscripten/system/include/libcxx/support/solaris/xlocale.h +0 -146
  832. data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +0 -79
  833. data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +0 -129
  834. data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +0 -115
  835. data/modules/emscripten/system/include/libcxx/support/win32/support.h +0 -119
  836. data/modules/emscripten/system/include/libcxx/system_error +0 -642
  837. data/modules/emscripten/system/include/libcxx/tgmath.h +0 -29
  838. data/modules/emscripten/system/include/libcxx/thread +0 -458
  839. data/modules/emscripten/system/include/libcxx/tuple +0 -1102
  840. data/modules/emscripten/system/include/libcxx/type_traits +0 -3292
  841. data/modules/emscripten/system/include/libcxx/typeindex +0 -103
  842. data/modules/emscripten/system/include/libcxx/typeinfo +0 -124
  843. data/modules/emscripten/system/include/libcxx/unordered_map +0 -2078
  844. data/modules/emscripten/system/include/libcxx/unordered_set +0 -1379
  845. data/modules/emscripten/system/include/libcxx/utility +0 -768
  846. data/modules/emscripten/system/include/libcxx/valarray +0 -4779
  847. data/modules/emscripten/system/include/libcxx/vector +0 -3246
  848. data/modules/emscripten/system/include/unwind.h +0 -154
  849. data/modules/emscripten/system/include/uuid/uuid.h +0 -35
  850. data/modules/emscripten/system/include/zconf.h +0 -428
  851. data/modules/emscripten/system/include/zlib.h +0 -1613
  852. data/modules/emscripten/system/lib/compiler-rt/LICENSE.TXT +0 -97
  853. data/modules/emscripten/system/lib/compiler-rt/divdi3.c +0 -47
  854. data/modules/emscripten/system/lib/compiler-rt/int_endianness.h +0 -116
  855. data/modules/emscripten/system/lib/compiler-rt/int_lib.h +0 -46
  856. data/modules/emscripten/system/lib/compiler-rt/int_math.h +0 -67
  857. data/modules/emscripten/system/lib/compiler-rt/int_types.h +0 -140
  858. data/modules/emscripten/system/lib/compiler-rt/int_util.h +0 -29
  859. data/modules/emscripten/system/lib/compiler-rt/muldi3.c +0 -56
  860. data/modules/emscripten/system/lib/compiler-rt/readme.txt +0 -20
  861. data/modules/emscripten/system/lib/compiler-rt/udivdi3.c +0 -36
  862. data/modules/emscripten/system/lib/compiler-rt/udivmoddi4.c +0 -251
  863. data/modules/emscripten/system/lib/debugging.cpp +0 -24
  864. data/modules/emscripten/system/lib/dlmalloc.c +0 -6297
  865. data/modules/emscripten/system/lib/embind/bind.cpp +0 -63
  866. data/modules/emscripten/system/lib/libc/gen/err.c +0 -49
  867. data/modules/emscripten/system/lib/libc/gen/errx.c +0 -49
  868. data/modules/emscripten/system/lib/libc/gen/verr.c +0 -58
  869. data/modules/emscripten/system/lib/libc/gen/verrx.c +0 -51
  870. data/modules/emscripten/system/lib/libc/gen/vwarn.c +0 -55
  871. data/modules/emscripten/system/lib/libc/gen/vwarnx.c +0 -48
  872. data/modules/emscripten/system/lib/libc/gen/warn.c +0 -49
  873. data/modules/emscripten/system/lib/libc/gen/warnx.c +0 -49
  874. data/modules/emscripten/system/lib/libc/musl/COPYRIGHT +0 -92
  875. data/modules/emscripten/system/lib/libc/musl/readme.txt +0 -9
  876. data/modules/emscripten/system/lib/libc/musl/src/ctype/alpha.h +0 -125
  877. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswalnum.c +0 -7
  878. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswalpha.c +0 -14
  879. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswblank.c +0 -8
  880. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswcntrl.c +0 -10
  881. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswctype.c +0 -63
  882. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswdigit.c +0 -9
  883. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswgraph.c +0 -7
  884. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswlower.c +0 -6
  885. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswprint.c +0 -19
  886. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswpunct.c +0 -12
  887. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswspace.c +0 -19
  888. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswupper.c +0 -6
  889. data/modules/emscripten/system/lib/libc/musl/src/ctype/iswxdigit.c +0 -7
  890. data/modules/emscripten/system/lib/libc/musl/src/ctype/nonspacing.h +0 -62
  891. data/modules/emscripten/system/lib/libc/musl/src/ctype/punct.h +0 -109
  892. data/modules/emscripten/system/lib/libc/musl/src/ctype/towctrans.c +0 -268
  893. data/modules/emscripten/system/lib/libc/musl/src/ctype/wcswidth.c +0 -8
  894. data/modules/emscripten/system/lib/libc/musl/src/ctype/wctrans.c +0 -16
  895. data/modules/emscripten/system/lib/libc/musl/src/ctype/wcwidth.c +0 -29
  896. data/modules/emscripten/system/lib/libc/musl/src/ctype/wide.h +0 -42
  897. data/modules/emscripten/system/lib/libc/musl/src/internal/libc.c +0 -22
  898. data/modules/emscripten/system/lib/libc/musl/src/internal/libc.h +0 -71
  899. data/modules/emscripten/system/lib/libc/musl/src/internal/locale_impl.h +0 -5
  900. data/modules/emscripten/system/lib/libc/musl/src/internal/stdio_impl.h +0 -92
  901. data/modules/emscripten/system/lib/libc/musl/src/locale/big5.h +0 -1085
  902. data/modules/emscripten/system/lib/libc/musl/src/locale/codepages.h +0 -238
  903. data/modules/emscripten/system/lib/libc/musl/src/locale/gb18030.h +0 -1836
  904. data/modules/emscripten/system/lib/libc/musl/src/locale/hkscs.h +0 -390
  905. data/modules/emscripten/system/lib/libc/musl/src/locale/iconv.c +0 -454
  906. data/modules/emscripten/system/lib/libc/musl/src/locale/iswalnum_l.c +0 -6
  907. data/modules/emscripten/system/lib/libc/musl/src/locale/iswalpha_l.c +0 -6
  908. data/modules/emscripten/system/lib/libc/musl/src/locale/iswblank_l.c +0 -6
  909. data/modules/emscripten/system/lib/libc/musl/src/locale/iswcntrl_l.c +0 -6
  910. data/modules/emscripten/system/lib/libc/musl/src/locale/iswctype_l.c +0 -9
  911. data/modules/emscripten/system/lib/libc/musl/src/locale/iswdigit_l.c +0 -6
  912. data/modules/emscripten/system/lib/libc/musl/src/locale/iswgraph_l.c +0 -6
  913. data/modules/emscripten/system/lib/libc/musl/src/locale/iswlower_l.c +0 -6
  914. data/modules/emscripten/system/lib/libc/musl/src/locale/iswprint_l.c +0 -6
  915. data/modules/emscripten/system/lib/libc/musl/src/locale/iswpunct_l.c +0 -6
  916. data/modules/emscripten/system/lib/libc/musl/src/locale/iswspace_l.c +0 -6
  917. data/modules/emscripten/system/lib/libc/musl/src/locale/iswupper_l.c +0 -6
  918. data/modules/emscripten/system/lib/libc/musl/src/locale/iswxdigit_l.c +0 -6
  919. data/modules/emscripten/system/lib/libc/musl/src/locale/jis0208.h +0 -550
  920. data/modules/emscripten/system/lib/libc/musl/src/locale/ksc.h +0 -640
  921. data/modules/emscripten/system/lib/libc/musl/src/locale/legacychars.h +0 -39
  922. data/modules/emscripten/system/lib/libc/musl/src/locale/strfmon.c +0 -101
  923. data/modules/emscripten/system/lib/libc/musl/src/locale/strxfrm.c +0 -18
  924. data/modules/emscripten/system/lib/libc/musl/src/locale/towctrans_l.c +0 -6
  925. data/modules/emscripten/system/lib/libc/musl/src/locale/towlower_l.c +0 -9
  926. data/modules/emscripten/system/lib/libc/musl/src/locale/towupper_l.c +0 -9
  927. data/modules/emscripten/system/lib/libc/musl/src/locale/wcscoll.c +0 -16
  928. data/modules/emscripten/system/lib/libc/musl/src/locale/wcscoll_l.c +0 -6
  929. data/modules/emscripten/system/lib/libc/musl/src/locale/wcsxfrm.c +0 -21
  930. data/modules/emscripten/system/lib/libc/musl/src/locale/wcsxfrm_l.c +0 -6
  931. data/modules/emscripten/system/lib/libc/musl/src/locale/wctrans_l.c +0 -6
  932. data/modules/emscripten/system/lib/libc/musl/src/locale/wctype_l.c +0 -9
  933. data/modules/emscripten/system/lib/libc/musl/src/multibyte/btowc.c +0 -7
  934. data/modules/emscripten/system/lib/libc/musl/src/multibyte/internal.c +0 -38
  935. data/modules/emscripten/system/lib/libc/musl/src/multibyte/internal.h +0 -22
  936. data/modules/emscripten/system/lib/libc/musl/src/multibyte/mblen.c +0 -17
  937. data/modules/emscripten/system/lib/libc/musl/src/multibyte/mbrlen.c +0 -18
  938. data/modules/emscripten/system/lib/libc/musl/src/multibyte/mbrtowc.c +0 -57
  939. data/modules/emscripten/system/lib/libc/musl/src/multibyte/mbsinit.c +0 -17
  940. data/modules/emscripten/system/lib/libc/musl/src/multibyte/mbsnrtowcs.c +0 -65
  941. data/modules/emscripten/system/lib/libc/musl/src/multibyte/mbsrtowcs.c +0 -100
  942. data/modules/emscripten/system/lib/libc/musl/src/multibyte/mbstowcs.c +0 -7
  943. data/modules/emscripten/system/lib/libc/musl/src/multibyte/mbtowc.c +0 -53
  944. data/modules/emscripten/system/lib/libc/musl/src/multibyte/wcrtomb.c +0 -38
  945. data/modules/emscripten/system/lib/libc/musl/src/multibyte/wcsnrtombs.c +0 -52
  946. data/modules/emscripten/system/lib/libc/musl/src/multibyte/wcsrtombs.c +0 -58
  947. data/modules/emscripten/system/lib/libc/musl/src/multibyte/wcstombs.c +0 -7
  948. data/modules/emscripten/system/lib/libc/musl/src/multibyte/wctob.c +0 -8
  949. data/modules/emscripten/system/lib/libc/musl/src/multibyte/wctomb.c +0 -18
  950. data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +0 -3352
  951. data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +0 -35
  952. data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +0 -1011
  953. data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +0 -158
  954. data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +0 -231
  955. data/modules/emscripten/system/lib/libc/musl/src/stdio/fwprintf.c +0 -13
  956. data/modules/emscripten/system/lib/libc/musl/src/stdio/swprintf.c +0 -14
  957. data/modules/emscripten/system/lib/libc/musl/src/stdio/vfwprintf.c +0 -361
  958. data/modules/emscripten/system/lib/libc/musl/src/stdio/vswprintf.c +0 -53
  959. data/modules/emscripten/system/lib/libc/musl/src/stdio/vwprintf.c +0 -7
  960. data/modules/emscripten/system/lib/libc/musl/src/stdio/wprintf.c +0 -13
  961. data/modules/emscripten/system/lib/libc/musl/src/stdlib/ecvt.c +0 -19
  962. data/modules/emscripten/system/lib/libc/musl/src/stdlib/fcvt.c +0 -25
  963. data/modules/emscripten/system/lib/libc/musl/src/stdlib/gcvt.c +0 -8
  964. data/modules/emscripten/system/lib/libc/musl/src/string/wcpcpy.c +0 -6
  965. data/modules/emscripten/system/lib/libc/musl/src/string/wcpncpy.c +0 -6
  966. data/modules/emscripten/system/lib/libc/musl/src/string/wcscasecmp.c +0 -7
  967. data/modules/emscripten/system/lib/libc/musl/src/string/wcscasecmp_l.c +0 -6
  968. data/modules/emscripten/system/lib/libc/musl/src/string/wcscat.c +0 -7
  969. data/modules/emscripten/system/lib/libc/musl/src/string/wcschr.c +0 -8
  970. data/modules/emscripten/system/lib/libc/musl/src/string/wcscmp.c +0 -7
  971. data/modules/emscripten/system/lib/libc/musl/src/string/wcscpy.c +0 -8
  972. data/modules/emscripten/system/lib/libc/musl/src/string/wcscspn.c +0 -10
  973. data/modules/emscripten/system/lib/libc/musl/src/string/wcsdup.c +0 -11
  974. data/modules/emscripten/system/lib/libc/musl/src/string/wcslen.c +0 -8
  975. data/modules/emscripten/system/lib/libc/musl/src/string/wcsncasecmp.c +0 -9
  976. data/modules/emscripten/system/lib/libc/musl/src/string/wcsncasecmp_l.c +0 -6
  977. data/modules/emscripten/system/lib/libc/musl/src/string/wcsncat.c +0 -10
  978. data/modules/emscripten/system/lib/libc/musl/src/string/wcsncmp.c +0 -7
  979. data/modules/emscripten/system/lib/libc/musl/src/string/wcsncpy.c +0 -9
  980. data/modules/emscripten/system/lib/libc/musl/src/string/wcsnlen.c +0 -8
  981. data/modules/emscripten/system/lib/libc/musl/src/string/wcspbrk.c +0 -7
  982. data/modules/emscripten/system/lib/libc/musl/src/string/wcsrchr.c +0 -8
  983. data/modules/emscripten/system/lib/libc/musl/src/string/wcsspn.c +0 -8
  984. data/modules/emscripten/system/lib/libc/musl/src/string/wcsstr.c +0 -108
  985. data/modules/emscripten/system/lib/libc/musl/src/string/wcstok.c +0 -12
  986. data/modules/emscripten/system/lib/libc/musl/src/string/wcswcs.c +0 -6
  987. data/modules/emscripten/system/lib/libc/musl/src/string/wmemchr.c +0 -8
  988. data/modules/emscripten/system/lib/libc/musl/src/string/wmemcmp.c +0 -8
  989. data/modules/emscripten/system/lib/libc/musl/src/string/wmemcpy.c +0 -9
  990. data/modules/emscripten/system/lib/libc/musl/src/string/wmemmove.c +0 -12
  991. data/modules/emscripten/system/lib/libc/musl/src/string/wmemset.c +0 -9
  992. data/modules/emscripten/system/lib/libc/stdlib/getopt_long.c +0 -511
  993. data/modules/emscripten/system/lib/libc/stdlib/strtod.c +0 -305
  994. data/modules/emscripten/system/lib/libc.symbols +0 -81
  995. data/modules/emscripten/system/lib/libcextra.symbols +0 -115
  996. data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +0 -123
  997. data/modules/emscripten/system/lib/libcxx/LICENSE.txt +0 -76
  998. data/modules/emscripten/system/lib/libcxx/algorithm.cpp +0 -84
  999. data/modules/emscripten/system/lib/libcxx/bind.cpp +0 -30
  1000. data/modules/emscripten/system/lib/libcxx/chrono.cpp +0 -132
  1001. data/modules/emscripten/system/lib/libcxx/condition_variable.cpp +0 -81
  1002. data/modules/emscripten/system/lib/libcxx/debug.cpp +0 -530
  1003. data/modules/emscripten/system/lib/libcxx/exception.cpp +0 -307
  1004. data/modules/emscripten/system/lib/libcxx/future.cpp +0 -291
  1005. data/modules/emscripten/system/lib/libcxx/hash.cpp +0 -570
  1006. data/modules/emscripten/system/lib/libcxx/ios.cpp +0 -460
  1007. data/modules/emscripten/system/lib/libcxx/iostream.cpp +0 -68
  1008. data/modules/emscripten/system/lib/libcxx/locale.cpp +0 -6169
  1009. data/modules/emscripten/system/lib/libcxx/memory.cpp +0 -223
  1010. data/modules/emscripten/system/lib/libcxx/mutex.cpp +0 -253
  1011. data/modules/emscripten/system/lib/libcxx/new.cpp +0 -239
  1012. data/modules/emscripten/system/lib/libcxx/optional.cpp +0 -25
  1013. data/modules/emscripten/system/lib/libcxx/random.cpp +0 -74
  1014. data/modules/emscripten/system/lib/libcxx/readme.txt +0 -1
  1015. data/modules/emscripten/system/lib/libcxx/regex.cpp +0 -325
  1016. data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +0 -101
  1017. data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +0 -200
  1018. data/modules/emscripten/system/lib/libcxx/string.cpp +0 -530
  1019. data/modules/emscripten/system/lib/libcxx/strstream.cpp +0 -329
  1020. data/modules/emscripten/system/lib/libcxx/support/solaris/README +0 -4
  1021. data/modules/emscripten/system/lib/libcxx/support/solaris/mbsnrtowcs.inc +0 -76
  1022. data/modules/emscripten/system/lib/libcxx/support/solaris/wcsnrtombs.inc +0 -93
  1023. data/modules/emscripten/system/lib/libcxx/support/solaris/xlocale.c +0 -245
  1024. data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +0 -95
  1025. data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +0 -166
  1026. data/modules/emscripten/system/lib/libcxx/symbols +0 -2699
  1027. data/modules/emscripten/system/lib/libcxx/system_error.cpp +0 -205
  1028. data/modules/emscripten/system/lib/libcxx/thread.cpp +0 -225
  1029. data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +0 -73
  1030. data/modules/emscripten/system/lib/libcxx/utility.cpp +0 -17
  1031. data/modules/emscripten/system/lib/libcxx/valarray.cpp +0 -56
  1032. data/modules/emscripten/system/lib/libcxxabi/CREDITS.TXT +0 -38
  1033. data/modules/emscripten/system/lib/libcxxabi/LICENSE.TXT +0 -76
  1034. data/modules/emscripten/system/lib/libcxxabi/include/cxa_demangle.h +0 -167
  1035. data/modules/emscripten/system/lib/libcxxabi/include/cxxabi.h +0 -175
  1036. data/modules/emscripten/system/lib/libcxxabi/lib/buildit +0 -99
  1037. data/modules/emscripten/system/lib/libcxxabi/readme.txt +0 -1
  1038. data/modules/emscripten/system/lib/libcxxabi/src/abort_message.cpp +0 -50
  1039. data/modules/emscripten/system/lib/libcxxabi/src/abort_message.h +0 -33
  1040. data/modules/emscripten/system/lib/libcxxabi/src/cxa_aux_runtime.cpp +0 -34
  1041. data/modules/emscripten/system/lib/libcxxabi/src/cxa_demangle.cpp +0 -11036
  1042. data/modules/emscripten/system/lib/libcxxabi/src/cxa_exception.cpp +0 -622
  1043. data/modules/emscripten/system/lib/libcxxabi/src/cxa_exception.hpp +0 -123
  1044. data/modules/emscripten/system/lib/libcxxabi/src/cxa_exception_storage.cpp +0 -91
  1045. data/modules/emscripten/system/lib/libcxxabi/src/cxa_guard.cpp +0 -231
  1046. data/modules/emscripten/system/lib/libcxxabi/src/cxa_handlers.cpp +0 -125
  1047. data/modules/emscripten/system/lib/libcxxabi/src/cxa_handlers.hpp +0 -54
  1048. data/modules/emscripten/system/lib/libcxxabi/src/cxa_new_delete.cpp +0 -242
  1049. data/modules/emscripten/system/lib/libcxxabi/src/cxa_personality.cpp +0 -1055
  1050. data/modules/emscripten/system/lib/libcxxabi/src/cxa_unexpected.cpp +0 -27
  1051. data/modules/emscripten/system/lib/libcxxabi/src/cxa_vector.cpp +0 -367
  1052. data/modules/emscripten/system/lib/libcxxabi/src/cxa_virtual.cpp +0 -31
  1053. data/modules/emscripten/system/lib/libcxxabi/src/exception.cpp +0 -41
  1054. data/modules/emscripten/system/lib/libcxxabi/src/fallback_malloc.ipp +0 -174
  1055. data/modules/emscripten/system/lib/libcxxabi/src/private_typeinfo.cpp +0 -1146
  1056. data/modules/emscripten/system/lib/libcxxabi/src/private_typeinfo.h +0 -248
  1057. data/modules/emscripten/system/lib/libcxxabi/src/stdexcept.cpp +0 -169
  1058. data/modules/emscripten/system/lib/libcxxabi/src/typeinfo.cpp +0 -53
  1059. data/modules/emscripten/system/lib/libcxxabi/symbols +0 -236
  1060. data/modules/emscripten/system/lib/sdl.cpp +0 -13
  1061. data/modules/emscripten/system/lib/sdl.symbols +0 -1
  1062. data/modules/emscripten/third_party/CppHeaderParser/CppHeaderParser/CppHeaderParser.py +0 -2347
  1063. data/modules/emscripten/third_party/CppHeaderParser/CppHeaderParser/__init__.py +0 -4
  1064. data/modules/emscripten/third_party/CppHeaderParser/CppHeaderParser/doc/CppHeaderParser.html +0 -657
  1065. data/modules/emscripten/third_party/CppHeaderParser/CppHeaderParser/examples/SampleClass.h +0 -147
  1066. data/modules/emscripten/third_party/CppHeaderParser/CppHeaderParser/examples/readSampleClass.py +0 -74
  1067. data/modules/emscripten/third_party/CppHeaderParser/PKG-INFO +0 -249
  1068. data/modules/emscripten/third_party/CppHeaderParser/README.html +0 -544
  1069. data/modules/emscripten/third_party/CppHeaderParser/README.txt +0 -226
  1070. data/modules/emscripten/third_party/CppHeaderParser/setup.py +0 -43
  1071. data/modules/emscripten/third_party/ansidecl.h +0 -371
  1072. data/modules/emscripten/third_party/closure-compiler/COPYING +0 -202
  1073. data/modules/emscripten/third_party/closure-compiler/README +0 -292
  1074. data/modules/emscripten/third_party/closure-compiler/compiler.jar +0 -0
  1075. data/modules/emscripten/third_party/closure-compiler/readme.txt +0 -3
  1076. data/modules/emscripten/third_party/cp-demangle.h +0 -161
  1077. data/modules/emscripten/third_party/demangle.h +0 -549
  1078. data/modules/emscripten/third_party/demangler.py +0 -49
  1079. data/modules/emscripten/third_party/gcc_demangler.c +0 -4226
  1080. data/modules/emscripten/third_party/gcc_demangler.js +0 -21282
  1081. data/modules/emscripten/third_party/jni/emjvm.cpp +0 -133
  1082. data/modules/emscripten/third_party/jni/emjvm.h +0 -8
  1083. data/modules/emscripten/third_party/jni/emjvm.js +0 -185
  1084. data/modules/emscripten/third_party/jni/jni.h +0 -1154
  1085. data/modules/emscripten/third_party/libiberty.h +0 -634
  1086. data/modules/emscripten/third_party/lzma.js/README.markdown +0 -37
  1087. data/modules/emscripten/third_party/lzma.js/doit.bat +0 -4
  1088. data/modules/emscripten/third_party/lzma.js/doit.sh +0 -44
  1089. data/modules/emscripten/third_party/lzma.js/lzip/AUTHORS +0 -7
  1090. data/modules/emscripten/third_party/lzma.js/lzip/COPYING +0 -676
  1091. data/modules/emscripten/third_party/lzma.js/lzip/ChangeLog +0 -201
  1092. data/modules/emscripten/third_party/lzma.js/lzip/INSTALL +0 -56
  1093. data/modules/emscripten/third_party/lzma.js/lzip/Makefile +0 -160
  1094. data/modules/emscripten/third_party/lzma.js/lzip/Makefile.in +0 -138
  1095. data/modules/emscripten/third_party/lzma.js/lzip/NEWS +0 -22
  1096. data/modules/emscripten/third_party/lzma.js/lzip/README +0 -77
  1097. data/modules/emscripten/third_party/lzma.js/lzip/arg_parser.cc +0 -204
  1098. data/modules/emscripten/third_party/lzma.js/lzip/arg_parser.h +0 -106
  1099. data/modules/emscripten/third_party/lzma.js/lzip/configure +0 -192
  1100. data/modules/emscripten/third_party/lzma.js/lzip/decoder.cc +0 -252
  1101. data/modules/emscripten/third_party/lzma.js/lzip/decoder.h +0 -268
  1102. data/modules/emscripten/third_party/lzma.js/lzip/encoder.cc +0 -643
  1103. data/modules/emscripten/third_party/lzma.js/lzip/encoder.h +0 -582
  1104. data/modules/emscripten/third_party/lzma.js/lzip/fast_encoder.cc +0 -378
  1105. data/modules/emscripten/third_party/lzma.js/lzip/fast_encoder.h +0 -171
  1106. data/modules/emscripten/third_party/lzma.js/lzip/lzip.h +0 -264
  1107. data/modules/emscripten/third_party/lzma.js/lzip/main.cc +0 -545
  1108. data/modules/emscripten/third_party/lzma.js/lzma-decoder.js +0 -27
  1109. data/modules/emscripten/third_party/lzma.js/lzma-full.js +0 -27
  1110. data/modules/emscripten/third_party/lzma.js/native_test.sh +0 -5
  1111. data/modules/emscripten/third_party/lzma.js/post.js +0 -13
  1112. data/modules/emscripten/third_party/lzma.js/pre.js +0 -13
  1113. data/modules/emscripten/third_party/lzma.js/test-decoder.js +0 -39
  1114. data/modules/emscripten/third_party/lzma.js/test-full.html +0 -9
  1115. data/modules/emscripten/third_party/lzma.js/test-full.js +0 -78
  1116. data/modules/emscripten/third_party/ply/ANNOUNCE +0 -40
  1117. data/modules/emscripten/third_party/ply/CHANGES +0 -1093
  1118. data/modules/emscripten/third_party/ply/PKG-INFO +0 -22
  1119. data/modules/emscripten/third_party/ply/README +0 -271
  1120. data/modules/emscripten/third_party/ply/TODO +0 -16
  1121. data/modules/emscripten/third_party/ply/doc/internal.html +0 -874
  1122. data/modules/emscripten/third_party/ply/doc/makedoc.py +0 -194
  1123. data/modules/emscripten/third_party/ply/doc/ply.html +0 -3262
  1124. data/modules/emscripten/third_party/ply/example/BASIC/README +0 -79
  1125. data/modules/emscripten/third_party/ply/example/BASIC/basic.py +0 -71
  1126. data/modules/emscripten/third_party/ply/example/BASIC/basiclex.py +0 -74
  1127. data/modules/emscripten/third_party/ply/example/BASIC/basiclog.py +0 -79
  1128. data/modules/emscripten/third_party/ply/example/BASIC/basinterp.py +0 -441
  1129. data/modules/emscripten/third_party/ply/example/BASIC/basparse.py +0 -424
  1130. data/modules/emscripten/third_party/ply/example/BASIC/dim.bas +0 -14
  1131. data/modules/emscripten/third_party/ply/example/BASIC/func.bas +0 -5
  1132. data/modules/emscripten/third_party/ply/example/BASIC/gcd.bas +0 -22
  1133. data/modules/emscripten/third_party/ply/example/BASIC/gosub.bas +0 -13
  1134. data/modules/emscripten/third_party/ply/example/BASIC/hello.bas +0 -4
  1135. data/modules/emscripten/third_party/ply/example/BASIC/linear.bas +0 -17
  1136. data/modules/emscripten/third_party/ply/example/BASIC/maxsin.bas +0 -12
  1137. data/modules/emscripten/third_party/ply/example/BASIC/powers.bas +0 -13
  1138. data/modules/emscripten/third_party/ply/example/BASIC/rand.bas +0 -4
  1139. data/modules/emscripten/third_party/ply/example/BASIC/sales.bas +0 -20
  1140. data/modules/emscripten/third_party/ply/example/BASIC/sears.bas +0 -18
  1141. data/modules/emscripten/third_party/ply/example/BASIC/sqrt1.bas +0 -5
  1142. data/modules/emscripten/third_party/ply/example/BASIC/sqrt2.bas +0 -4
  1143. data/modules/emscripten/third_party/ply/example/GardenSnake/GardenSnake.py +0 -709
  1144. data/modules/emscripten/third_party/ply/example/GardenSnake/README +0 -5
  1145. data/modules/emscripten/third_party/ply/example/README +0 -10
  1146. data/modules/emscripten/third_party/ply/example/ansic/README +0 -2
  1147. data/modules/emscripten/third_party/ply/example/ansic/clex.py +0 -164
  1148. data/modules/emscripten/third_party/ply/example/ansic/cparse.py +0 -863
  1149. data/modules/emscripten/third_party/ply/example/calc/calc.py +0 -107
  1150. data/modules/emscripten/third_party/ply/example/calcdebug/calc.py +0 -113
  1151. data/modules/emscripten/third_party/ply/example/classcalc/calc.py +0 -157
  1152. data/modules/emscripten/third_party/ply/example/cleanup.sh +0 -2
  1153. data/modules/emscripten/third_party/ply/example/closurecalc/calc.py +0 -130
  1154. data/modules/emscripten/third_party/ply/example/hedit/hedit.py +0 -48
  1155. data/modules/emscripten/third_party/ply/example/newclasscalc/calc.py +0 -160
  1156. data/modules/emscripten/third_party/ply/example/optcalc/README +0 -9
  1157. data/modules/emscripten/third_party/ply/example/optcalc/calc.py +0 -119
  1158. data/modules/emscripten/third_party/ply/example/unicalc/calc.py +0 -117
  1159. data/modules/emscripten/third_party/ply/example/yply/README +0 -41
  1160. data/modules/emscripten/third_party/ply/example/yply/ylex.py +0 -112
  1161. data/modules/emscripten/third_party/ply/example/yply/yparse.py +0 -217
  1162. data/modules/emscripten/third_party/ply/example/yply/yply.py +0 -53
  1163. data/modules/emscripten/third_party/ply/ply/__init__.py +0 -4
  1164. data/modules/emscripten/third_party/ply/ply/cpp.py +0 -898
  1165. data/modules/emscripten/third_party/ply/ply/ctokens.py +0 -133
  1166. data/modules/emscripten/third_party/ply/ply/lex.py +0 -1058
  1167. data/modules/emscripten/third_party/ply/ply/yacc.py +0 -3276
  1168. data/modules/emscripten/third_party/ply/setup.py +0 -31
  1169. data/modules/emscripten/third_party/ply/test/README +0 -7
  1170. data/modules/emscripten/third_party/ply/test/calclex.py +0 -49
  1171. data/modules/emscripten/third_party/ply/test/cleanup.sh +0 -4
  1172. data/modules/emscripten/third_party/ply/test/lex_closure.py +0 -54
  1173. data/modules/emscripten/third_party/ply/test/lex_doc1.py +0 -26
  1174. data/modules/emscripten/third_party/ply/test/lex_dup1.py +0 -29
  1175. data/modules/emscripten/third_party/ply/test/lex_dup2.py +0 -33
  1176. data/modules/emscripten/third_party/ply/test/lex_dup3.py +0 -31
  1177. data/modules/emscripten/third_party/ply/test/lex_empty.py +0 -20
  1178. data/modules/emscripten/third_party/ply/test/lex_error1.py +0 -24
  1179. data/modules/emscripten/third_party/ply/test/lex_error2.py +0 -26
  1180. data/modules/emscripten/third_party/ply/test/lex_error3.py +0 -27
  1181. data/modules/emscripten/third_party/ply/test/lex_error4.py +0 -27
  1182. data/modules/emscripten/third_party/ply/test/lex_hedit.py +0 -47
  1183. data/modules/emscripten/third_party/ply/test/lex_ignore.py +0 -31
  1184. data/modules/emscripten/third_party/ply/test/lex_ignore2.py +0 -29
  1185. data/modules/emscripten/third_party/ply/test/lex_literal1.py +0 -25
  1186. data/modules/emscripten/third_party/ply/test/lex_literal2.py +0 -25
  1187. data/modules/emscripten/third_party/ply/test/lex_many_tokens.py +0 -27
  1188. data/modules/emscripten/third_party/ply/test/lex_module.py +0 -10
  1189. data/modules/emscripten/third_party/ply/test/lex_module_import.py +0 -42
  1190. data/modules/emscripten/third_party/ply/test/lex_object.py +0 -55
  1191. data/modules/emscripten/third_party/ply/test/lex_opt_alias.py +0 -54
  1192. data/modules/emscripten/third_party/ply/test/lex_optimize.py +0 -50
  1193. data/modules/emscripten/third_party/ply/test/lex_optimize2.py +0 -50
  1194. data/modules/emscripten/third_party/ply/test/lex_optimize3.py +0 -52
  1195. data/modules/emscripten/third_party/ply/test/lex_re1.py +0 -27
  1196. data/modules/emscripten/third_party/ply/test/lex_re2.py +0 -27
  1197. data/modules/emscripten/third_party/ply/test/lex_re3.py +0 -29
  1198. data/modules/emscripten/third_party/ply/test/lex_rule1.py +0 -27
  1199. data/modules/emscripten/third_party/ply/test/lex_rule2.py +0 -29
  1200. data/modules/emscripten/third_party/ply/test/lex_rule3.py +0 -27
  1201. data/modules/emscripten/third_party/ply/test/lex_state1.py +0 -40
  1202. data/modules/emscripten/third_party/ply/test/lex_state2.py +0 -40
  1203. data/modules/emscripten/third_party/ply/test/lex_state3.py +0 -42
  1204. data/modules/emscripten/third_party/ply/test/lex_state4.py +0 -41
  1205. data/modules/emscripten/third_party/ply/test/lex_state5.py +0 -40
  1206. data/modules/emscripten/third_party/ply/test/lex_state_noerror.py +0 -39
  1207. data/modules/emscripten/third_party/ply/test/lex_state_norule.py +0 -40
  1208. data/modules/emscripten/third_party/ply/test/lex_state_try.py +0 -45
  1209. data/modules/emscripten/third_party/ply/test/lex_token1.py +0 -19
  1210. data/modules/emscripten/third_party/ply/test/lex_token2.py +0 -22
  1211. data/modules/emscripten/third_party/ply/test/lex_token3.py +0 -24
  1212. data/modules/emscripten/third_party/ply/test/lex_token4.py +0 -26
  1213. data/modules/emscripten/third_party/ply/test/lex_token5.py +0 -31
  1214. data/modules/emscripten/third_party/ply/test/lex_token_dup.py +0 -29
  1215. data/modules/emscripten/third_party/ply/test/testlex.py +0 -606
  1216. data/modules/emscripten/third_party/ply/test/testyacc.py +0 -347
  1217. data/modules/emscripten/third_party/ply/test/yacc_badargs.py +0 -68
  1218. data/modules/emscripten/third_party/ply/test/yacc_badid.py +0 -77
  1219. data/modules/emscripten/third_party/ply/test/yacc_badprec.py +0 -64
  1220. data/modules/emscripten/third_party/ply/test/yacc_badprec2.py +0 -68
  1221. data/modules/emscripten/third_party/ply/test/yacc_badprec3.py +0 -68
  1222. data/modules/emscripten/third_party/ply/test/yacc_badrule.py +0 -68
  1223. data/modules/emscripten/third_party/ply/test/yacc_badtok.py +0 -68
  1224. data/modules/emscripten/third_party/ply/test/yacc_dup.py +0 -68
  1225. data/modules/emscripten/third_party/ply/test/yacc_error1.py +0 -68
  1226. data/modules/emscripten/third_party/ply/test/yacc_error2.py +0 -68
  1227. data/modules/emscripten/third_party/ply/test/yacc_error3.py +0 -67
  1228. data/modules/emscripten/third_party/ply/test/yacc_error4.py +0 -72
  1229. data/modules/emscripten/third_party/ply/test/yacc_inf.py +0 -56
  1230. data/modules/emscripten/third_party/ply/test/yacc_literal.py +0 -69
  1231. data/modules/emscripten/third_party/ply/test/yacc_misplaced.py +0 -68
  1232. data/modules/emscripten/third_party/ply/test/yacc_missing1.py +0 -68
  1233. data/modules/emscripten/third_party/ply/test/yacc_nested.py +0 -33
  1234. data/modules/emscripten/third_party/ply/test/yacc_nodoc.py +0 -67
  1235. data/modules/emscripten/third_party/ply/test/yacc_noerror.py +0 -66
  1236. data/modules/emscripten/third_party/ply/test/yacc_nop.py +0 -68
  1237. data/modules/emscripten/third_party/ply/test/yacc_notfunc.py +0 -66
  1238. data/modules/emscripten/third_party/ply/test/yacc_notok.py +0 -67
  1239. data/modules/emscripten/third_party/ply/test/yacc_prec1.py +0 -68
  1240. data/modules/emscripten/third_party/ply/test/yacc_rr.py +0 -72
  1241. data/modules/emscripten/third_party/ply/test/yacc_rr_unused.py +0 -30
  1242. data/modules/emscripten/third_party/ply/test/yacc_simple.py +0 -68
  1243. data/modules/emscripten/third_party/ply/test/yacc_sr.py +0 -63
  1244. data/modules/emscripten/third_party/ply/test/yacc_term1.py +0 -68
  1245. data/modules/emscripten/third_party/ply/test/yacc_unused.py +0 -77
  1246. data/modules/emscripten/third_party/ply/test/yacc_unused_rule.py +0 -72
  1247. data/modules/emscripten/third_party/ply/test/yacc_uprec.py +0 -63
  1248. data/modules/emscripten/third_party/ply/test/yacc_uprec2.py +0 -63
  1249. data/modules/emscripten/third_party/readme.txt +0 -7
  1250. data/modules/emscripten/third_party/stb_image.c +0 -4673
  1251. data/modules/emscripten/third_party/websockify/CHANGES.txt +0 -23
  1252. data/modules/emscripten/third_party/websockify/LICENSE.txt +0 -16
  1253. data/modules/emscripten/third_party/websockify/MANIFEST.in +0 -1
  1254. data/modules/emscripten/third_party/websockify/Makefile +0 -11
  1255. data/modules/emscripten/third_party/websockify/README.md +0 -168
  1256. data/modules/emscripten/third_party/websockify/Windows/Windows Service Readme.txt +0 -39
  1257. data/modules/emscripten/third_party/websockify/Windows/noVNC Websocket Service Project/Program.cs +0 -24
  1258. data/modules/emscripten/third_party/websockify/Windows/noVNC Websocket Service Project/ProjectInstaller.Designer.cs +0 -61
  1259. data/modules/emscripten/third_party/websockify/Windows/noVNC Websocket Service Project/ProjectInstaller.cs +0 -19
  1260. data/modules/emscripten/third_party/websockify/Windows/noVNC Websocket Service Project/ProjectInstaller.resx +0 -129
  1261. data/modules/emscripten/third_party/websockify/Windows/noVNC Websocket Service Project/Properties/AssemblyInfo.cs +0 -36
  1262. data/modules/emscripten/third_party/websockify/Windows/noVNC Websocket Service Project/Service1.Designer.cs +0 -37
  1263. data/modules/emscripten/third_party/websockify/Windows/noVNC Websocket Service Project/Service1.cs +0 -41
  1264. data/modules/emscripten/third_party/websockify/Windows/noVNC Websocket Service Project/noVNC Websocket.csproj +0 -75
  1265. data/modules/emscripten/third_party/websockify/Windows/noVNC Websocket Service Project/noVNC Websocket.sln +0 -20
  1266. data/modules/emscripten/third_party/websockify/docs/LICENSE.GPL-3 +0 -621
  1267. data/modules/emscripten/third_party/websockify/docs/LICENSE.LGPL-3 +0 -165
  1268. data/modules/emscripten/third_party/websockify/docs/LICENSE.MPL-2.0 +0 -373
  1269. data/modules/emscripten/third_party/websockify/docs/TODO +0 -9
  1270. data/modules/emscripten/third_party/websockify/docs/flash_policy.txt +0 -4
  1271. data/modules/emscripten/third_party/websockify/docs/latency_results.txt +0 -114
  1272. data/modules/emscripten/third_party/websockify/docs/notes +0 -17
  1273. data/modules/emscripten/third_party/websockify/docs/release.txt +0 -9
  1274. data/modules/emscripten/third_party/websockify/docs/websockify.1 +0 -110
  1275. data/modules/emscripten/third_party/websockify/include/VT100.js +0 -919
  1276. data/modules/emscripten/third_party/websockify/include/base64.js +0 -114
  1277. data/modules/emscripten/third_party/websockify/include/keysym.js +0 -99
  1278. data/modules/emscripten/third_party/websockify/include/util.js +0 -359
  1279. data/modules/emscripten/third_party/websockify/include/web-socket-js/README.txt +0 -109
  1280. data/modules/emscripten/third_party/websockify/include/web-socket-js/WebSocketMain.swf +0 -0
  1281. data/modules/emscripten/third_party/websockify/include/web-socket-js/swfobject.js +0 -4
  1282. data/modules/emscripten/third_party/websockify/include/web-socket-js/web_socket.js +0 -391
  1283. data/modules/emscripten/third_party/websockify/include/websock.js +0 -422
  1284. data/modules/emscripten/third_party/websockify/include/webutil.js +0 -216
  1285. data/modules/emscripten/third_party/websockify/include/wsirc.js +0 -235
  1286. data/modules/emscripten/third_party/websockify/include/wstelnet.js +0 -335
  1287. data/modules/emscripten/third_party/websockify/other/Makefile +0 -14
  1288. data/modules/emscripten/third_party/websockify/other/README.md +0 -51
  1289. data/modules/emscripten/third_party/websockify/other/launch.sh +0 -108
  1290. data/modules/emscripten/third_party/websockify/other/project.clj +0 -13
  1291. data/modules/emscripten/third_party/websockify/other/websocket.c +0 -802
  1292. data/modules/emscripten/third_party/websockify/other/websocket.h +0 -84
  1293. data/modules/emscripten/third_party/websockify/other/websocket.rb +0 -456
  1294. data/modules/emscripten/third_party/websockify/other/websockify.c +0 -385
  1295. data/modules/emscripten/third_party/websockify/other/websockify.clj +0 -233
  1296. data/modules/emscripten/third_party/websockify/other/websockify.js +0 -196
  1297. data/modules/emscripten/third_party/websockify/other/websockify.rb +0 -171
  1298. data/modules/emscripten/third_party/websockify/other/wswrap +0 -22
  1299. data/modules/emscripten/third_party/websockify/rebind +0 -18
  1300. data/modules/emscripten/third_party/websockify/rebind.c +0 -94
  1301. data/modules/emscripten/third_party/websockify/run +0 -5
  1302. data/modules/emscripten/third_party/websockify/setup.py +0 -30
  1303. data/modules/emscripten/third_party/websockify/tests/b64_vs_utf8.py +0 -29
  1304. data/modules/emscripten/third_party/websockify/tests/base64.html +0 -91
  1305. data/modules/emscripten/third_party/websockify/tests/base64.js +0 -12
  1306. data/modules/emscripten/third_party/websockify/tests/echo.html +0 -148
  1307. data/modules/emscripten/third_party/websockify/tests/echo.py +0 -75
  1308. data/modules/emscripten/third_party/websockify/tests/echo.rb +0 -62
  1309. data/modules/emscripten/third_party/websockify/tests/latency.html +0 -290
  1310. data/modules/emscripten/third_party/websockify/tests/latency.py +0 -75
  1311. data/modules/emscripten/third_party/websockify/tests/load.html +0 -250
  1312. data/modules/emscripten/third_party/websockify/tests/load.py +0 -167
  1313. data/modules/emscripten/third_party/websockify/tests/plain_echo.html +0 -168
  1314. data/modules/emscripten/third_party/websockify/tests/simple.html +0 -68
  1315. data/modules/emscripten/third_party/websockify/tests/utf8-list.py +0 -22
  1316. data/modules/emscripten/third_party/websockify/websockify/__init__.py +0 -2
  1317. data/modules/emscripten/third_party/websockify/websockify/websocket.py +0 -982
  1318. data/modules/emscripten/third_party/websockify/websockify/websocketproxy.py +0 -393
  1319. data/modules/emscripten/third_party/websockify/websockify.py +0 -5
  1320. data/modules/emscripten/third_party/websockify/wsirc.html +0 -99
  1321. data/modules/emscripten/third_party/websockify/wstelnet.html +0 -74
  1322. data/modules/emscripten/tools/__init__.py +0 -0
  1323. data/modules/emscripten/tools/asm_module.py +0 -275
  1324. data/modules/emscripten/tools/autodebugger.py +0 -291
  1325. data/modules/emscripten/tools/autodebugger_c.py +0 -37
  1326. data/modules/emscripten/tools/autodebugger_indenter.py +0 -18
  1327. data/modules/emscripten/tools/autodebugger_js.py +0 -47
  1328. data/modules/emscripten/tools/autodediffer.py +0 -60
  1329. data/modules/emscripten/tools/bindings_generator.py +0 -832
  1330. data/modules/emscripten/tools/bisect_pair.py +0 -88
  1331. data/modules/emscripten/tools/cache.py +0 -196
  1332. data/modules/emscripten/tools/clean_webconsole.py +0 -34
  1333. data/modules/emscripten/tools/crunch-worker.js +0 -124
  1334. data/modules/emscripten/tools/diff_autodebugger.py +0 -15
  1335. data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +0 -307
  1336. data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +0 -382
  1337. data/modules/emscripten/tools/eliminator/eliminator-test-output.js +0 -6136
  1338. data/modules/emscripten/tools/eliminator/eliminator-test.js +0 -8879
  1339. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/README.html +0 -888
  1340. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/README.org +0 -463
  1341. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/bin/uglifyjs +0 -317
  1342. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/docstyle.css +0 -75
  1343. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/lib/object-ast.js +0 -75
  1344. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/lib/parse-js.js +0 -1363
  1345. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/lib/process.js +0 -2005
  1346. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/lib/squeeze-more.js +0 -51
  1347. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/package.json +0 -22
  1348. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/beautify.js +0 -28
  1349. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/testparser.js +0 -402
  1350. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/array1.js +0 -1
  1351. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/array2.js +0 -1
  1352. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/array3.js +0 -1
  1353. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/array4.js +0 -1
  1354. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/assignment.js +0 -1
  1355. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/concatstring.js +0 -1
  1356. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/const.js +0 -1
  1357. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/empty-blocks.js +0 -1
  1358. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/forstatement.js +0 -1
  1359. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/if.js +0 -1
  1360. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/ifreturn.js +0 -1
  1361. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/ifreturn2.js +0 -1
  1362. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue10.js +0 -1
  1363. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue11.js +0 -1
  1364. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue13.js +0 -1
  1365. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue14.js +0 -1
  1366. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue16.js +0 -1
  1367. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue17.js +0 -1
  1368. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue20.js +0 -1
  1369. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue21.js +0 -1
  1370. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue25.js +0 -1
  1371. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue27.js +0 -1
  1372. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue28.js +0 -1
  1373. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue29.js +0 -1
  1374. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue30.js +0 -1
  1375. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue34.js +0 -1
  1376. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue4.js +0 -1
  1377. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue48.js +0 -1
  1378. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue50.js +0 -1
  1379. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue53.js +0 -1
  1380. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue54.1.js +0 -1
  1381. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue68.js +0 -1
  1382. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue69.js +0 -1
  1383. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/issue9.js +0 -1
  1384. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/mangle.js +0 -1
  1385. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/strict-equals.js +0 -1
  1386. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/var.js +0 -1
  1387. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/expected/with.js +0 -1
  1388. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/array1.js +0 -3
  1389. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/array2.js +0 -4
  1390. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/array3.js +0 -4
  1391. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/array4.js +0 -6
  1392. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/assignment.js +0 -20
  1393. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/concatstring.js +0 -3
  1394. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/const.js +0 -5
  1395. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/empty-blocks.js +0 -4
  1396. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/forstatement.js +0 -10
  1397. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/if.js +0 -6
  1398. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/ifreturn.js +0 -9
  1399. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/ifreturn2.js +0 -16
  1400. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue10.js +0 -1
  1401. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue11.js +0 -3
  1402. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue13.js +0 -1
  1403. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue14.js +0 -1
  1404. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue16.js +0 -1
  1405. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue17.js +0 -4
  1406. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue20.js +0 -1
  1407. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue21.js +0 -6
  1408. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue25.js +0 -7
  1409. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue27.js +0 -1
  1410. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue28.js +0 -3
  1411. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue29.js +0 -1
  1412. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue30.js +0 -3
  1413. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue34.js +0 -3
  1414. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue4.js +0 -3
  1415. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue48.js +0 -1
  1416. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue50.js +0 -9
  1417. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue53.js +0 -1
  1418. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue54.1.js +0 -3
  1419. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue68.js +0 -5
  1420. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue69.js +0 -1
  1421. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/issue9.js +0 -4
  1422. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/mangle.js +0 -5
  1423. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/strict-equals.js +0 -3
  1424. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/var.js +0 -3
  1425. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/compress/test/with.js +0 -2
  1426. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/test/unit/scripts.js +0 -55
  1427. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/tmp/hoist.js +0 -33
  1428. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/tmp/instrument.js +0 -97
  1429. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/tmp/instrument2.js +0 -138
  1430. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/tmp/test.js +0 -16
  1431. data/modules/emscripten/tools/eliminator/node_modules/uglify-js/uglify-js.js +0 -17
  1432. data/modules/emscripten/tools/eliminator/safe-eliminator-test-output.js +0 -85
  1433. data/modules/emscripten/tools/eliminator/safe-eliminator-test.js +0 -103
  1434. data/modules/emscripten/tools/emconfiguren.py +0 -19
  1435. data/modules/emscripten/tools/emmaken.py +0 -230
  1436. data/modules/emscripten/tools/emmakenxx.py +0 -18
  1437. data/modules/emscripten/tools/exec_llvm.py +0 -50
  1438. data/modules/emscripten/tools/file2json.py +0 -49
  1439. data/modules/emscripten/tools/file_packager.py +0 -719
  1440. data/modules/emscripten/tools/find_bigfuncs.py +0 -23
  1441. data/modules/emscripten/tools/find_bigis.py +0 -18
  1442. data/modules/emscripten/tools/find_bigvars.py +0 -24
  1443. data/modules/emscripten/tools/fix_closure.py +0 -88
  1444. data/modules/emscripten/tools/gen_struct_info.py +0 -509
  1445. data/modules/emscripten/tools/ie7_fix.py +0 -14
  1446. data/modules/emscripten/tools/js-optimizer.js +0 -4023
  1447. data/modules/emscripten/tools/js_optimizer.py +0 -357
  1448. data/modules/emscripten/tools/jsrun.py +0 -37
  1449. data/modules/emscripten/tools/ll-strip.py +0 -56
  1450. data/modules/emscripten/tools/make_file.py +0 -19
  1451. data/modules/emscripten/tools/make_minigzip.py +0 -13
  1452. data/modules/emscripten/tools/merge_asm.py +0 -26
  1453. data/modules/emscripten/tools/namespacer.py +0 -95
  1454. data/modules/emscripten/tools/nativize_llvm.py +0 -34
  1455. data/modules/emscripten/tools/node_modules/source-map/CHANGELOG.md +0 -58
  1456. data/modules/emscripten/tools/node_modules/source-map/LICENSE +0 -28
  1457. data/modules/emscripten/tools/node_modules/source-map/Makefile.dryice.js +0 -166
  1458. data/modules/emscripten/tools/node_modules/source-map/README.md +0 -347
  1459. data/modules/emscripten/tools/node_modules/source-map/build/assert-shim.js +0 -56
  1460. data/modules/emscripten/tools/node_modules/source-map/build/mini-require.js +0 -152
  1461. data/modules/emscripten/tools/node_modules/source-map/build/prefix-source-map.jsm +0 -20
  1462. data/modules/emscripten/tools/node_modules/source-map/build/prefix-utils.jsm +0 -18
  1463. data/modules/emscripten/tools/node_modules/source-map/build/suffix-browser.js +0 -8
  1464. data/modules/emscripten/tools/node_modules/source-map/build/suffix-source-map.jsm +0 -6
  1465. data/modules/emscripten/tools/node_modules/source-map/build/suffix-utils.jsm +0 -21
  1466. data/modules/emscripten/tools/node_modules/source-map/build/test-prefix.js +0 -8
  1467. data/modules/emscripten/tools/node_modules/source-map/build/test-suffix.js +0 -3
  1468. data/modules/emscripten/tools/node_modules/source-map/lib/source-map/array-set.js +0 -96
  1469. data/modules/emscripten/tools/node_modules/source-map/lib/source-map/base64-vlq.js +0 -144
  1470. data/modules/emscripten/tools/node_modules/source-map/lib/source-map/base64.js +0 -42
  1471. data/modules/emscripten/tools/node_modules/source-map/lib/source-map/binary-search.js +0 -81
  1472. data/modules/emscripten/tools/node_modules/source-map/lib/source-map/source-map-consumer.js +0 -430
  1473. data/modules/emscripten/tools/node_modules/source-map/lib/source-map/source-map-generator.js +0 -381
  1474. data/modules/emscripten/tools/node_modules/source-map/lib/source-map/source-node.js +0 -353
  1475. data/modules/emscripten/tools/node_modules/source-map/lib/source-map/util.js +0 -117
  1476. data/modules/emscripten/tools/node_modules/source-map/lib/source-map.js +0 -8
  1477. data/modules/emscripten/tools/node_modules/source-map/node_modules/amdefine/LICENSE +0 -58
  1478. data/modules/emscripten/tools/node_modules/source-map/node_modules/amdefine/README.md +0 -119
  1479. data/modules/emscripten/tools/node_modules/source-map/node_modules/amdefine/amdefine.js +0 -299
  1480. data/modules/emscripten/tools/node_modules/source-map/node_modules/amdefine/package.json +0 -33
  1481. data/modules/emscripten/tools/node_modules/source-map/package.json +0 -74
  1482. data/modules/emscripten/tools/node_modules/source-map/test/run-tests.js +0 -73
  1483. data/modules/emscripten/tools/node_modules/source-map/test/source-map/test-api.js +0 -26
  1484. data/modules/emscripten/tools/node_modules/source-map/test/source-map/test-array-set.js +0 -71
  1485. data/modules/emscripten/tools/node_modules/source-map/test/source-map/test-base64-vlq.js +0 -24
  1486. data/modules/emscripten/tools/node_modules/source-map/test/source-map/test-base64.js +0 -35
  1487. data/modules/emscripten/tools/node_modules/source-map/test/source-map/test-binary-search.js +0 -54
  1488. data/modules/emscripten/tools/node_modules/source-map/test/source-map/test-dog-fooding.js +0 -72
  1489. data/modules/emscripten/tools/node_modules/source-map/test/source-map/test-source-map-consumer.js +0 -306
  1490. data/modules/emscripten/tools/node_modules/source-map/test/source-map/test-source-map-generator.js +0 -391
  1491. data/modules/emscripten/tools/node_modules/source-map/test/source-map/test-source-node.js +0 -282
  1492. data/modules/emscripten/tools/node_modules/source-map/test/source-map/util.js +0 -152
  1493. data/modules/emscripten/tools/reproduceriter.js +0 -216
  1494. data/modules/emscripten/tools/reproduceriter.py +0 -160
  1495. data/modules/emscripten/tools/response_file.py +0 -34
  1496. data/modules/emscripten/tools/scan_js.py +0 -20
  1497. data/modules/emscripten/tools/scan_ll.py +0 -18
  1498. data/modules/emscripten/tools/scons/site_scons/site_tools/emscripten/__init__.py +0 -3
  1499. data/modules/emscripten/tools/scons/site_scons/site_tools/emscripten/emscripten.py +0 -46
  1500. data/modules/emscripten/tools/settings_template_readonly.py +0 -49
  1501. data/modules/emscripten/tools/shared.py +0 -1705
  1502. data/modules/emscripten/tools/source-maps/sourcemap2json.js +0 -15
  1503. data/modules/emscripten/tools/source-maps/sourcemapper.js +0 -208
  1504. data/modules/emscripten/tools/split.py +0 -105
  1505. data/modules/emscripten/tools/split_asm.py +0 -30
  1506. data/modules/emscripten/tools/tempfiles.py +0 -41
  1507. data/modules/emscripten/tools/test-js-optimizer-asm-last-output.js +0 -75
  1508. data/modules/emscripten/tools/test-js-optimizer-asm-last.js +0 -91
  1509. data/modules/emscripten/tools/test-js-optimizer-asm-minlast-output.js +0 -2
  1510. data/modules/emscripten/tools/test-js-optimizer-asm-minlast.js +0 -8
  1511. data/modules/emscripten/tools/test-js-optimizer-asm-outline1-output.js +0 -929
  1512. data/modules/emscripten/tools/test-js-optimizer-asm-outline1.js +0 -351
  1513. data/modules/emscripten/tools/test-js-optimizer-asm-outline2-output.js +0 -793
  1514. data/modules/emscripten/tools/test-js-optimizer-asm-outline2.js +0 -606
  1515. data/modules/emscripten/tools/test-js-optimizer-asm-outline3-output.js +0 -28
  1516. data/modules/emscripten/tools/test-js-optimizer-asm-outline3.js +0 -30
  1517. data/modules/emscripten/tools/test-js-optimizer-asm-pre-output.js +0 -522
  1518. data/modules/emscripten/tools/test-js-optimizer-asm-pre.js +0 -533
  1519. data/modules/emscripten/tools/test-js-optimizer-asm-regs-min-output.js +0 -36
  1520. data/modules/emscripten/tools/test-js-optimizer-asm-regs-min.js +0 -37
  1521. data/modules/emscripten/tools/test-js-optimizer-asm-regs-output.js +0 -106
  1522. data/modules/emscripten/tools/test-js-optimizer-asm-regs.js +0 -110
  1523. data/modules/emscripten/tools/test-js-optimizer-asm-relocate-output.js +0 -9
  1524. data/modules/emscripten/tools/test-js-optimizer-asm-relocate.js +0 -12
  1525. data/modules/emscripten/tools/test-js-optimizer-output.js +0 -291
  1526. data/modules/emscripten/tools/test-js-optimizer-regs-output.js +0 -232
  1527. data/modules/emscripten/tools/test-js-optimizer-regs.js +0 -237
  1528. data/modules/emscripten/tools/test-js-optimizer-t2-output.js +0 -91
  1529. data/modules/emscripten/tools/test-js-optimizer-t2.js +0 -92
  1530. data/modules/emscripten/tools/test-js-optimizer-t2c-output.js +0 -17
  1531. data/modules/emscripten/tools/test-js-optimizer-t2c.js +0 -18
  1532. data/modules/emscripten/tools/test-js-optimizer-t3-output.js +0 -49
  1533. data/modules/emscripten/tools/test-js-optimizer-t3.js +0 -50
  1534. data/modules/emscripten/tools/test-js-optimizer.js +0 -401
  1535. data/modules/emscripten/tools/validate_asmjs.py +0 -82
  1536. data/modules/mruby/mrblib/print.rb +0 -18
  1537. data/modules/mruby/src/re.h +0 -12
@@ -1,4673 +0,0 @@
1
- /* stbi-1.33 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c
2
- when you control the images you're loading
3
- no warranty implied; use at your own risk
4
-
5
- QUICK NOTES:
6
- Primarily of interest to game developers and other people who can
7
- avoid problematic images and only need the trivial interface
8
-
9
- JPEG baseline (no JPEG progressive)
10
- PNG 8-bit-per-channel only
11
-
12
- TGA (not sure what subset, if a subset)
13
- BMP non-1bpp, non-RLE
14
- PSD (composited view only, no extra channels)
15
-
16
- GIF (*comp always reports as 4-channel)
17
- HDR (radiance rgbE format)
18
- PIC (Softimage PIC)
19
-
20
- - decode from memory or through FILE (define STBI_NO_STDIO to remove code)
21
- - decode from arbitrary I/O callbacks
22
- - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD)
23
-
24
- Latest revisions:
25
- 1.33 (2011-07-14) minor fixes suggested by Dave Moore
26
- 1.32 (2011-07-13) info support for all filetypes (SpartanJ)
27
- 1.31 (2011-06-19) a few more leak fixes, bug in PNG handling (SpartanJ)
28
- 1.30 (2011-06-11) added ability to load files via io callbacks (Ben Wenger)
29
- 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville
30
- 1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ)
31
- 1.27 (2010-08-01) cast-to-uint8 to fix warnings (Laurent Gomila)
32
- allow trailing 0s at end of image data (Laurent Gomila)
33
- 1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ
34
-
35
- See end of file for full revision history.
36
-
37
- TODO:
38
- stbi_info support for BMP,PSD,HDR,PIC
39
-
40
-
41
- ============================ Contributors =========================
42
-
43
- Image formats Optimizations & bugfixes
44
- Sean Barrett (jpeg, png, bmp) Fabian "ryg" Giesen
45
- Nicolas Schulz (hdr, psd)
46
- Jonathan Dummer (tga) Bug fixes & warning fixes
47
- Jean-Marc Lienher (gif) Marc LeBlanc
48
- Tom Seddon (pic) Christpher Lloyd
49
- Thatcher Ulrich (psd) Dave Moore
50
- Won Chun
51
- the Horde3D community
52
- Extensions, features Janez Zemva
53
- Jetro Lauha (stbi_info) Jonathan Blow
54
- James "moose2000" Brown (iPhone PNG) Laurent Gomila
55
- Ben "Disch" Wenger (io callbacks) Aruelien Pocheville
56
- Martin "SpartanJ" Golini Ryamond Barbiero
57
- David Woo
58
-
59
-
60
- If your name should be here but isn't, let Sean know.
61
-
62
- */
63
-
64
- #ifndef STBI_INCLUDE_STB_IMAGE_H
65
- #define STBI_INCLUDE_STB_IMAGE_H
66
-
67
- // To get a header file for this, either cut and paste the header,
68
- // or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and
69
- // then include stb_image.c from it.
70
-
71
- //// begin header file ////////////////////////////////////////////////////
72
- //
73
- // Limitations:
74
- // - no jpeg progressive support
75
- // - non-HDR formats support 8-bit samples only (jpeg, png)
76
- // - no delayed line count (jpeg) -- IJG doesn't support either
77
- // - no 1-bit BMP
78
- // - GIF always returns *comp=4
79
- //
80
- // Basic usage (see HDR discussion below):
81
- // int x,y,n;
82
- // unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
83
- // // ... process data if not NULL ...
84
- // // ... x = width, y = height, n = # 8-bit components per pixel ...
85
- // // ... replace '0' with '1'..'4' to force that many components per pixel
86
- // // ... but 'n' will always be the number that it would have been if you said 0
87
- // stbi_image_free(data)
88
- //
89
- // Standard parameters:
90
- // int *x -- outputs image width in pixels
91
- // int *y -- outputs image height in pixels
92
- // int *comp -- outputs # of image components in image file
93
- // int req_comp -- if non-zero, # of image components requested in result
94
- //
95
- // The return value from an image loader is an 'unsigned char *' which points
96
- // to the pixel data. The pixel data consists of *y scanlines of *x pixels,
97
- // with each pixel consisting of N interleaved 8-bit components; the first
98
- // pixel pointed to is top-left-most in the image. There is no padding between
99
- // image scanlines or between pixels, regardless of format. The number of
100
- // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.
101
- // If req_comp is non-zero, *comp has the number of components that _would_
102
- // have been output otherwise. E.g. if you set req_comp to 4, you will always
103
- // get RGBA output, but you can check *comp to easily see if it's opaque.
104
- //
105
- // An output image with N components has the following components interleaved
106
- // in this order in each pixel:
107
- //
108
- // N=#comp components
109
- // 1 grey
110
- // 2 grey, alpha
111
- // 3 red, green, blue
112
- // 4 red, green, blue, alpha
113
- //
114
- // If image loading fails for any reason, the return value will be NULL,
115
- // and *x, *y, *comp will be unchanged. The function stbi_failure_reason()
116
- // can be queried for an extremely brief, end-user unfriendly explanation
117
- // of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid
118
- // compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
119
- // more user-friendly ones.
120
- //
121
- // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
122
- //
123
- // ===========================================================================
124
- //
125
- // iPhone PNG support:
126
- //
127
- // By default we convert iphone-formatted PNGs back to RGB; nominally they
128
- // would silently load as BGR, except the existing code should have just
129
- // failed on such iPhone PNGs. But you can disable this conversion by
130
- // by calling stbi_convert_iphone_png_to_rgb(0), in which case
131
- // you will always just get the native iphone "format" through.
132
- //
133
- // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
134
- // pixel to remove any premultiplied alpha *only* if the image file explicitly
135
- // says there's premultiplied data (currently only happens in iPhone images,
136
- // and only if iPhone convert-to-rgb processing is on).
137
- //
138
- // ===========================================================================
139
- //
140
- // HDR image support (disable by defining STBI_NO_HDR)
141
- //
142
- // stb_image now supports loading HDR images in general, and currently
143
- // the Radiance .HDR file format, although the support is provided
144
- // generically. You can still load any file through the existing interface;
145
- // if you attempt to load an HDR file, it will be automatically remapped to
146
- // LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
147
- // both of these constants can be reconfigured through this interface:
148
- //
149
- // stbi_hdr_to_ldr_gamma(2.2f);
150
- // stbi_hdr_to_ldr_scale(1.0f);
151
- //
152
- // (note, do not use _inverse_ constants; stbi_image will invert them
153
- // appropriately).
154
- //
155
- // Additionally, there is a new, parallel interface for loading files as
156
- // (linear) floats to preserve the full dynamic range:
157
- //
158
- // float *data = stbi_loadf(filename, &x, &y, &n, 0);
159
- //
160
- // If you load LDR images through this interface, those images will
161
- // be promoted to floating point values, run through the inverse of
162
- // constants corresponding to the above:
163
- //
164
- // stbi_ldr_to_hdr_scale(1.0f);
165
- // stbi_ldr_to_hdr_gamma(2.2f);
166
- //
167
- // Finally, given a filename (or an open file or memory block--see header
168
- // file for details) containing image data, you can query for the "most
169
- // appropriate" interface to use (that is, whether the image is HDR or
170
- // not), using:
171
- //
172
- // stbi_is_hdr(char *filename);
173
- //
174
- // ===========================================================================
175
- //
176
- // I/O callbacks
177
- //
178
- // I/O callbacks allow you to read from arbitrary sources, like packaged
179
- // files or some other source. Data read from callbacks are processed
180
- // through a small internal buffer (currently 128 bytes) to try to reduce
181
- // overhead.
182
- //
183
- // The three functions you must define are "read" (reads some bytes of data),
184
- // "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
185
-
186
-
187
- #ifndef STBI_NO_STDIO
188
-
189
- #if defined(_MSC_VER) && _MSC_VER >= 0x1400
190
- #define _CRT_SECURE_NO_WARNINGS // suppress bogus warnings about fopen()
191
- #endif
192
-
193
- #include <stdio.h>
194
- #endif
195
-
196
- #define STBI_VERSION 1
197
-
198
- enum
199
- {
200
- STBI_default = 0, // only used for req_comp
201
-
202
- STBI_grey = 1,
203
- STBI_grey_alpha = 2,
204
- STBI_rgb = 3,
205
- STBI_rgb_alpha = 4
206
- };
207
-
208
- typedef unsigned char stbi_uc;
209
-
210
- #ifdef __cplusplus
211
- extern "C" {
212
- #endif
213
-
214
- //////////////////////////////////////////////////////////////////////////////
215
- //
216
- // PRIMARY API - works on images of any type
217
- //
218
-
219
- //
220
- // load image by filename, open file, or memory buffer
221
- //
222
-
223
- extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
224
-
225
- #ifndef STBI_NO_STDIO
226
- extern stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp);
227
- extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
228
- // for stbi_load_from_file, file pointer is left pointing immediately after image
229
- #endif
230
-
231
- typedef struct
232
- {
233
- int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read
234
- void (*skip) (void *user,unsigned n); // skip the next 'n' bytes
235
- int (*eof) (void *user); // returns nonzero if we are at end of file/data
236
- } stbi_io_callbacks;
237
-
238
- extern stbi_uc *stbi_load_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);
239
-
240
- #ifndef STBI_NO_HDR
241
- extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
242
-
243
- #ifndef STBI_NO_STDIO
244
- extern float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp);
245
- extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
246
- #endif
247
-
248
- extern float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);
249
-
250
- extern void stbi_hdr_to_ldr_gamma(float gamma);
251
- extern void stbi_hdr_to_ldr_scale(float scale);
252
-
253
- extern void stbi_ldr_to_hdr_gamma(float gamma);
254
- extern void stbi_ldr_to_hdr_scale(float scale);
255
- #endif // STBI_NO_HDR
256
-
257
- // stbi_is_hdr is always defined
258
- extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
259
- extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
260
- #ifndef STBI_NO_STDIO
261
- extern int stbi_is_hdr (char const *filename);
262
- extern int stbi_is_hdr_from_file(FILE *f);
263
- #endif // STBI_NO_STDIO
264
-
265
-
266
- // get a VERY brief reason for failure
267
- // NOT THREADSAFE
268
- extern const char *stbi_failure_reason (void);
269
-
270
- // free the loaded image -- this is just free()
271
- extern void stbi_image_free (void *retval_from_stbi_load);
272
-
273
- // get image dimensions & components without fully decoding
274
- extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
275
- extern int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
276
-
277
- #ifndef STBI_NO_STDIO
278
- extern int stbi_info (char const *filename, int *x, int *y, int *comp);
279
- extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
280
-
281
- #endif
282
-
283
-
284
-
285
- // for image formats that explicitly notate that they have premultiplied alpha,
286
- // we just return the colors as stored in the file. set this flag to force
287
- // unpremultiplication. results are undefined if the unpremultiply overflow.
288
- extern void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
289
-
290
- // indicate whether we should process iphone images back to canonical format,
291
- // or just pass them through "as-is"
292
- extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
293
-
294
-
295
- // ZLIB client - used by PNG, available for other purposes
296
-
297
- extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
298
- extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
299
- extern int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
300
-
301
- extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
302
- extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
303
-
304
-
305
- // define faster low-level operations (typically SIMD support)
306
- #ifdef STBI_SIMD
307
- typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize);
308
- // compute an integer IDCT on "input"
309
- // input[x] = data[x] * dequantize[x]
310
- // write results to 'out': 64 samples, each run of 8 spaced by 'out_stride'
311
- // CLAMP results to 0..255
312
- typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step);
313
- // compute a conversion from YCbCr to RGB
314
- // 'count' pixels
315
- // write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B
316
- // y: Y input channel
317
- // cb: Cb input channel; scale/biased to be 0..255
318
- // cr: Cr input channel; scale/biased to be 0..255
319
-
320
- extern void stbi_install_idct(stbi_idct_8x8 func);
321
- extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func);
322
- #endif // STBI_SIMD
323
-
324
-
325
- #ifdef __cplusplus
326
- }
327
- #endif
328
-
329
- //
330
- //
331
- //// end header file /////////////////////////////////////////////////////
332
- #endif // STBI_INCLUDE_STB_IMAGE_H
333
-
334
- #ifndef STBI_HEADER_FILE_ONLY
335
-
336
- #ifndef STBI_NO_HDR
337
- #include <math.h> // ldexp
338
- #include <string.h> // strcmp, strtok
339
- #endif
340
-
341
- #ifndef STBI_NO_STDIO
342
- #include <stdio.h>
343
- #endif
344
- #include <stdlib.h>
345
- #include <memory.h>
346
- #include <assert.h>
347
- #include <stdarg.h>
348
-
349
- #ifndef _MSC_VER
350
- #ifdef __cplusplus
351
- #define stbi_inline inline
352
- #else
353
- #define stbi_inline
354
- #endif
355
- #else
356
- #define stbi_inline __forceinline
357
- #endif
358
-
359
-
360
- // implementation:
361
- typedef unsigned char uint8;
362
- typedef unsigned short uint16;
363
- typedef signed short int16;
364
- typedef unsigned int uint32;
365
- typedef signed int int32;
366
- typedef unsigned int uint;
367
-
368
- // should produce compiler error if size is wrong
369
- typedef unsigned char validate_uint32[sizeof(uint32)==4 ? 1 : -1];
370
-
371
- #if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE)
372
- #define STBI_NO_WRITE
373
- #endif
374
-
375
- #define STBI_NOTUSED(v) (void)sizeof(v)
376
-
377
- #ifdef _MSC_VER
378
- #define STBI_HAS_LROTL
379
- #endif
380
-
381
- #ifdef STBI_HAS_LROTL
382
- #define stbi_lrot(x,y) _lrotl(x,y)
383
- #else
384
- #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
385
- #endif
386
-
387
- ///////////////////////////////////////////////
388
- //
389
- // stbi struct and start_xxx functions
390
-
391
- // stbi structure is our basic context used by all images, so it
392
- // contains all the IO context, plus some basic image information
393
- typedef struct
394
- {
395
- uint32 img_x, img_y;
396
- int img_n, img_out_n;
397
-
398
- stbi_io_callbacks io;
399
- void *io_user_data;
400
-
401
- int read_from_callbacks;
402
- int buflen;
403
- uint8 buffer_start[128];
404
-
405
- uint8 *img_buffer, *img_buffer_end;
406
- uint8 *img_buffer_original;
407
- } stbi;
408
-
409
-
410
- static void refill_buffer(stbi *s);
411
-
412
- // initialize a memory-decode context
413
- static void start_mem(stbi *s, uint8 const *buffer, int len)
414
- {
415
- s->io.read = NULL;
416
- s->read_from_callbacks = 0;
417
- s->img_buffer = s->img_buffer_original = (uint8 *) buffer;
418
- s->img_buffer_end = (uint8 *) buffer+len;
419
- }
420
-
421
- // initialize a callback-based context
422
- static void start_callbacks(stbi *s, stbi_io_callbacks *c, void *user)
423
- {
424
- s->io = *c;
425
- s->io_user_data = user;
426
- s->buflen = sizeof(s->buffer_start);
427
- s->read_from_callbacks = 1;
428
- s->img_buffer_original = s->buffer_start;
429
- refill_buffer(s);
430
- }
431
-
432
- #ifndef STBI_NO_STDIO
433
-
434
- static int stdio_read(void *user, char *data, int size)
435
- {
436
- return (int) fread(data,1,size,(FILE*) user);
437
- }
438
-
439
- static void stdio_skip(void *user, unsigned n)
440
- {
441
- fseek((FILE*) user, n, SEEK_CUR);
442
- }
443
-
444
- static int stdio_eof(void *user)
445
- {
446
- return feof((FILE*) user);
447
- }
448
-
449
- static stbi_io_callbacks stbi_stdio_callbacks =
450
- {
451
- stdio_read,
452
- stdio_skip,
453
- stdio_eof,
454
- };
455
-
456
- static void start_file(stbi *s, FILE *f)
457
- {
458
- start_callbacks(s, &stbi_stdio_callbacks, (void *) f);
459
- }
460
-
461
- //static void stop_file(stbi *s) { }
462
-
463
- #endif // !STBI_NO_STDIO
464
-
465
- static void stbi_rewind(stbi *s)
466
- {
467
- // conceptually rewind SHOULD rewind to the beginning of the stream,
468
- // but we just rewind to the beginning of the initial buffer, because
469
- // we only use it after doing 'test', which only ever looks at at most 92 bytes
470
- s->img_buffer = s->img_buffer_original;
471
- }
472
-
473
- static int stbi_jpeg_test(stbi *s);
474
- static stbi_uc *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp);
475
- static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp);
476
- static int stbi_png_test(stbi *s);
477
- static stbi_uc *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp);
478
- static int stbi_png_info(stbi *s, int *x, int *y, int *comp);
479
- static int stbi_bmp_test(stbi *s);
480
- static stbi_uc *stbi_bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp);
481
- static int stbi_tga_test(stbi *s);
482
- static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp);
483
- static int stbi_tga_info(stbi *s, int *x, int *y, int *comp);
484
- static int stbi_psd_test(stbi *s);
485
- static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp);
486
- static int stbi_hdr_test(stbi *s);
487
- static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp);
488
- static int stbi_pic_test(stbi *s);
489
- static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp);
490
- static int stbi_gif_test(stbi *s);
491
- static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp);
492
- static int stbi_gif_info(stbi *s, int *x, int *y, int *comp);
493
-
494
-
495
- // this is not threadsafe
496
- static const char *failure_reason;
497
-
498
- const char *stbi_failure_reason(void)
499
- {
500
- return failure_reason;
501
- }
502
-
503
- static int e(const char *str)
504
- {
505
- failure_reason = str;
506
- return 0;
507
- }
508
-
509
- // e - error
510
- // epf - error returning pointer to float
511
- // epuc - error returning pointer to unsigned char
512
-
513
- #ifdef STBI_NO_FAILURE_STRINGS
514
- #define e(x,y) 0
515
- #elif defined(STBI_FAILURE_USERMSG)
516
- #define e(x,y) e(y)
517
- #else
518
- #define e(x,y) e(x)
519
- #endif
520
-
521
- #define epf(x,y) ((float *) (e(x,y)?NULL:NULL))
522
- #define epuc(x,y) ((unsigned char *) (e(x,y)?NULL:NULL))
523
-
524
- void stbi_image_free(void *retval_from_stbi_load)
525
- {
526
- free(retval_from_stbi_load);
527
- }
528
-
529
- #ifndef STBI_NO_HDR
530
- static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
531
- static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp);
532
- #endif
533
-
534
- static unsigned char *stbi_load_main(stbi *s, int *x, int *y, int *comp, int req_comp)
535
- {
536
- if (stbi_jpeg_test(s)) return stbi_jpeg_load(s,x,y,comp,req_comp);
537
- if (stbi_png_test(s)) return stbi_png_load(s,x,y,comp,req_comp);
538
- if (stbi_bmp_test(s)) return stbi_bmp_load(s,x,y,comp,req_comp);
539
- if (stbi_gif_test(s)) return stbi_gif_load(s,x,y,comp,req_comp);
540
- if (stbi_psd_test(s)) return stbi_psd_load(s,x,y,comp,req_comp);
541
- if (stbi_pic_test(s)) return stbi_pic_load(s,x,y,comp,req_comp);
542
-
543
- #ifndef STBI_NO_HDR
544
- if (stbi_hdr_test(s)) {
545
- float *hdr = stbi_hdr_load(s, x,y,comp,req_comp);
546
- return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
547
- }
548
- #endif
549
-
550
- // test tga last because it's a crappy test!
551
- if (stbi_tga_test(s))
552
- return stbi_tga_load(s,x,y,comp,req_comp);
553
- return epuc("unknown image type", "Image not of any known type, or corrupt");
554
- }
555
-
556
- #ifndef STBI_NO_STDIO
557
- unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
558
- {
559
- FILE *f = fopen(filename, "rb");
560
- unsigned char *result;
561
- if (!f) return epuc("can't fopen", "Unable to open file");
562
- result = stbi_load_from_file(f,x,y,comp,req_comp);
563
- fclose(f);
564
- return result;
565
- }
566
-
567
- unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
568
- {
569
- stbi s;
570
- start_file(&s,f);
571
- return stbi_load_main(&s,x,y,comp,req_comp);
572
- }
573
- #endif //!STBI_NO_STDIO
574
-
575
- unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
576
- {
577
- stbi s;
578
- start_mem(&s,buffer,len);
579
- return stbi_load_main(&s,x,y,comp,req_comp);
580
- }
581
-
582
- unsigned char *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
583
- {
584
- stbi s;
585
- start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
586
- return stbi_load_main(&s,x,y,comp,req_comp);
587
- }
588
-
589
- #ifndef STBI_NO_HDR
590
-
591
- float *stbi_loadf_main(stbi *s, int *x, int *y, int *comp, int req_comp)
592
- {
593
- unsigned char *data;
594
- #ifndef STBI_NO_HDR
595
- if (stbi_hdr_test(s))
596
- return stbi_hdr_load(s,x,y,comp,req_comp);
597
- #endif
598
- data = stbi_load_main(s, x, y, comp, req_comp);
599
- if (data)
600
- return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
601
- return epf("unknown image type", "Image not of any known type, or corrupt");
602
- }
603
-
604
- float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
605
- {
606
- stbi s;
607
- start_mem(&s,buffer,len);
608
- return stbi_loadf_main(&s,x,y,comp,req_comp);
609
- }
610
-
611
- float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
612
- {
613
- stbi s;
614
- start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
615
- return stbi_loadf_main(&s,x,y,comp,req_comp);
616
- }
617
-
618
- #ifndef STBI_NO_STDIO
619
- float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
620
- {
621
- FILE *f = fopen(filename, "rb");
622
- float *result;
623
- if (!f) return epf("can't fopen", "Unable to open file");
624
- result = stbi_loadf_from_file(f,x,y,comp,req_comp);
625
- fclose(f);
626
- return result;
627
- }
628
-
629
- float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
630
- {
631
- stbi s;
632
- start_file(&s,f);
633
- return stbi_loadf_main(&s,x,y,comp,req_comp);
634
- }
635
- #endif // !STBI_NO_STDIO
636
-
637
- #endif // !STBI_NO_HDR
638
-
639
- // these is-hdr-or-not is defined independent of whether STBI_NO_HDR is
640
- // defined, for API simplicity; if STBI_NO_HDR is defined, it always
641
- // reports false!
642
-
643
- int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
644
- {
645
- #ifndef STBI_NO_HDR
646
- stbi s;
647
- start_mem(&s,buffer,len);
648
- return stbi_hdr_test(&s);
649
- #else
650
- STBI_NOTUSED(buffer);
651
- STBI_NOTUSED(len);
652
- return 0;
653
- #endif
654
- }
655
-
656
- #ifndef STBI_NO_STDIO
657
- extern int stbi_is_hdr (char const *filename)
658
- {
659
- FILE *f = fopen(filename, "rb");
660
- int result=0;
661
- if (f) {
662
- result = stbi_is_hdr_from_file(f);
663
- fclose(f);
664
- }
665
- return result;
666
- }
667
-
668
- extern int stbi_is_hdr_from_file(FILE *f)
669
- {
670
- #ifndef STBI_NO_HDR
671
- stbi s;
672
- start_file(&s,f);
673
- return stbi_hdr_test(&s);
674
- #else
675
- return 0;
676
- #endif
677
- }
678
- #endif // !STBI_NO_STDIO
679
-
680
- extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
681
- {
682
- #ifndef STBI_NO_HDR
683
- stbi s;
684
- start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
685
- return stbi_hdr_test(&s);
686
- #else
687
- return 0;
688
- #endif
689
- }
690
-
691
- #ifndef STBI_NO_HDR
692
- static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f;
693
- static float l2h_gamma=2.2f, l2h_scale=1.0f;
694
-
695
- void stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; }
696
- void stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; }
697
-
698
- void stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; }
699
- void stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; }
700
- #endif
701
-
702
-
703
- //////////////////////////////////////////////////////////////////////////////
704
- //
705
- // Common code used by all image loaders
706
- //
707
-
708
- enum
709
- {
710
- SCAN_load=0,
711
- SCAN_type,
712
- SCAN_header
713
- };
714
-
715
- static void refill_buffer(stbi *s)
716
- {
717
- int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);
718
- if (n == 0) {
719
- // at end of file, treat same as if from memory
720
- s->read_from_callbacks = 0;
721
- s->img_buffer = s->img_buffer_end-1;
722
- *s->img_buffer = 0;
723
- } else {
724
- s->img_buffer = s->buffer_start;
725
- s->img_buffer_end = s->buffer_start + n;
726
- }
727
- }
728
-
729
- stbi_inline static int get8(stbi *s)
730
- {
731
- if (s->img_buffer < s->img_buffer_end)
732
- return *s->img_buffer++;
733
- if (s->read_from_callbacks) {
734
- refill_buffer(s);
735
- return *s->img_buffer++;
736
- }
737
- return 0;
738
- }
739
-
740
- stbi_inline static int at_eof(stbi *s)
741
- {
742
- if (s->io.read) {
743
- if (!(s->io.eof)(s->io_user_data)) return 0;
744
- // if feof() is true, check if buffer = end
745
- // special case: we've only got the special 0 character at the end
746
- if (s->read_from_callbacks == 0) return 1;
747
- }
748
-
749
- return s->img_buffer >= s->img_buffer_end;
750
- }
751
-
752
- stbi_inline static uint8 get8u(stbi *s)
753
- {
754
- return (uint8) get8(s);
755
- }
756
-
757
- static void skip(stbi *s, int n)
758
- {
759
- if (s->io.read) {
760
- int blen = s->img_buffer_end - s->img_buffer;
761
- if (blen < n) {
762
- s->img_buffer = s->img_buffer_end;
763
- (s->io.skip)(s->io_user_data, n - blen);
764
- return;
765
- }
766
- }
767
- s->img_buffer += n;
768
- }
769
-
770
- static int getn(stbi *s, stbi_uc *buffer, int n)
771
- {
772
- if (s->io.read) {
773
- int blen = s->img_buffer_end - s->img_buffer;
774
- if (blen < n) {
775
- int res, count;
776
-
777
- memcpy(buffer, s->img_buffer, blen);
778
-
779
- count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);
780
- res = (count == (n-blen));
781
- s->img_buffer = s->img_buffer_end;
782
- return res;
783
- }
784
- }
785
-
786
- if (s->img_buffer+n <= s->img_buffer_end) {
787
- memcpy(buffer, s->img_buffer, n);
788
- s->img_buffer += n;
789
- return 1;
790
- } else
791
- return 0;
792
- }
793
-
794
- static int get16(stbi *s)
795
- {
796
- int z = get8(s);
797
- return (z << 8) + get8(s);
798
- }
799
-
800
- static uint32 get32(stbi *s)
801
- {
802
- uint32 z = get16(s);
803
- return (z << 16) + get16(s);
804
- }
805
-
806
- static int get16le(stbi *s)
807
- {
808
- int z = get8(s);
809
- return z + (get8(s) << 8);
810
- }
811
-
812
- static uint32 get32le(stbi *s)
813
- {
814
- uint32 z = get16le(s);
815
- return z + (get16le(s) << 16);
816
- }
817
-
818
- //////////////////////////////////////////////////////////////////////////////
819
- //
820
- // generic converter from built-in img_n to req_comp
821
- // individual types do this automatically as much as possible (e.g. jpeg
822
- // does all cases internally since it needs to colorspace convert anyway,
823
- // and it never has alpha, so very few cases ). png can automatically
824
- // interleave an alpha=255 channel, but falls back to this for other cases
825
- //
826
- // assume data buffer is malloced, so malloc a new one and free that one
827
- // only failure mode is malloc failing
828
-
829
- static uint8 compute_y(int r, int g, int b)
830
- {
831
- return (uint8) (((r*77) + (g*150) + (29*b)) >> 8);
832
- }
833
-
834
- static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y)
835
- {
836
- int i,j;
837
- unsigned char *good;
838
-
839
- if (req_comp == img_n) return data;
840
- assert(req_comp >= 1 && req_comp <= 4);
841
-
842
- good = (unsigned char *) malloc(req_comp * x * y);
843
- if (good == NULL) {
844
- free(data);
845
- return epuc("outofmem", "Out of memory");
846
- }
847
-
848
- for (j=0; j < (int) y; ++j) {
849
- unsigned char *src = data + j * x * img_n ;
850
- unsigned char *dest = good + j * x * req_comp;
851
-
852
- #define COMBO(a,b) ((a)*8+(b))
853
- #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
854
- // convert source image with img_n components to one with req_comp components;
855
- // avoid switch per pixel, so use switch per scanline and massive macros
856
- switch (COMBO(img_n, req_comp)) {
857
- CASE(1,2) dest[0]=src[0], dest[1]=255; break;
858
- CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
859
- CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
860
- CASE(2,1) dest[0]=src[0]; break;
861
- CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
862
- CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
863
- CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
864
- CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]); break;
865
- CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
866
- CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]); break;
867
- CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
868
- CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
869
- default: assert(0);
870
- }
871
- #undef CASE
872
- }
873
-
874
- free(data);
875
- return good;
876
- }
877
-
878
- #ifndef STBI_NO_HDR
879
- static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
880
- {
881
- int i,k,n;
882
- float *output = (float *) malloc(x * y * comp * sizeof(float));
883
- if (output == NULL) { free(data); return epf("outofmem", "Out of memory"); }
884
- // compute number of non-alpha components
885
- if (comp & 1) n = comp; else n = comp-1;
886
- for (i=0; i < x*y; ++i) {
887
- for (k=0; k < n; ++k) {
888
- output[i*comp + k] = (float) pow(data[i*comp+k]/255.0f, l2h_gamma) * l2h_scale;
889
- }
890
- if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
891
- }
892
- free(data);
893
- return output;
894
- }
895
-
896
- #define float2int(x) ((int) (x))
897
- static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp)
898
- {
899
- int i,k,n;
900
- stbi_uc *output = (stbi_uc *) malloc(x * y * comp);
901
- if (output == NULL) { free(data); return epuc("outofmem", "Out of memory"); }
902
- // compute number of non-alpha components
903
- if (comp & 1) n = comp; else n = comp-1;
904
- for (i=0; i < x*y; ++i) {
905
- for (k=0; k < n; ++k) {
906
- float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f;
907
- if (z < 0) z = 0;
908
- if (z > 255) z = 255;
909
- output[i*comp + k] = (uint8) float2int(z);
910
- }
911
- if (k < comp) {
912
- float z = data[i*comp+k] * 255 + 0.5f;
913
- if (z < 0) z = 0;
914
- if (z > 255) z = 255;
915
- output[i*comp + k] = (uint8) float2int(z);
916
- }
917
- }
918
- free(data);
919
- return output;
920
- }
921
- #endif
922
-
923
- //////////////////////////////////////////////////////////////////////////////
924
- //
925
- // "baseline" JPEG/JFIF decoder (not actually fully baseline implementation)
926
- //
927
- // simple implementation
928
- // - channel subsampling of at most 2 in each dimension
929
- // - doesn't support delayed output of y-dimension
930
- // - simple interface (only one output format: 8-bit interleaved RGB)
931
- // - doesn't try to recover corrupt jpegs
932
- // - doesn't allow partial loading, loading multiple at once
933
- // - still fast on x86 (copying globals into locals doesn't help x86)
934
- // - allocates lots of intermediate memory (full size of all components)
935
- // - non-interleaved case requires this anyway
936
- // - allows good upsampling (see next)
937
- // high-quality
938
- // - upsampled channels are bilinearly interpolated, even across blocks
939
- // - quality integer IDCT derived from IJG's 'slow'
940
- // performance
941
- // - fast huffman; reasonable integer IDCT
942
- // - uses a lot of intermediate memory, could cache poorly
943
- // - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4
944
- // stb_jpeg: 1.34 seconds (MSVC6, default release build)
945
- // stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro)
946
- // IJL11.dll: 1.08 seconds (compiled by intel)
947
- // IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG)
948
- // IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro)
949
-
950
- // huffman decoding acceleration
951
- #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
952
-
953
- typedef struct
954
- {
955
- uint8 fast[1 << FAST_BITS];
956
- // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
957
- uint16 code[256];
958
- uint8 values[256];
959
- uint8 size[257];
960
- unsigned int maxcode[18];
961
- int delta[17]; // old 'firstsymbol' - old 'firstcode'
962
- } huffman;
963
-
964
- typedef struct
965
- {
966
- #ifdef STBI_SIMD
967
- unsigned short dequant2[4][64];
968
- #endif
969
- stbi *s;
970
- huffman huff_dc[4];
971
- huffman huff_ac[4];
972
- uint8 dequant[4][64];
973
-
974
- // sizes for components, interleaved MCUs
975
- int img_h_max, img_v_max;
976
- int img_mcu_x, img_mcu_y;
977
- int img_mcu_w, img_mcu_h;
978
-
979
- // definition of jpeg image component
980
- struct
981
- {
982
- int id;
983
- int h,v;
984
- int tq;
985
- int hd,ha;
986
- int dc_pred;
987
-
988
- int x,y,w2,h2;
989
- uint8 *data;
990
- void *raw_data;
991
- uint8 *linebuf;
992
- } img_comp[4];
993
-
994
- uint32 code_buffer; // jpeg entropy-coded buffer
995
- int code_bits; // number of valid bits
996
- unsigned char marker; // marker seen while filling entropy buffer
997
- int nomore; // flag if we saw a marker so must stop
998
-
999
- int scan_n, order[4];
1000
- int restart_interval, todo;
1001
- } jpeg;
1002
-
1003
- static int build_huffman(huffman *h, int *count)
1004
- {
1005
- int i,j,k=0,code;
1006
- // build size list for each symbol (from JPEG spec)
1007
- for (i=0; i < 16; ++i)
1008
- for (j=0; j < count[i]; ++j)
1009
- h->size[k++] = (uint8) (i+1);
1010
- h->size[k] = 0;
1011
-
1012
- // compute actual symbols (from jpeg spec)
1013
- code = 0;
1014
- k = 0;
1015
- for(j=1; j <= 16; ++j) {
1016
- // compute delta to add to code to compute symbol id
1017
- h->delta[j] = k - code;
1018
- if (h->size[k] == j) {
1019
- while (h->size[k] == j)
1020
- h->code[k++] = (uint16) (code++);
1021
- if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG");
1022
- }
1023
- // compute largest code + 1 for this size, preshifted as needed later
1024
- h->maxcode[j] = code << (16-j);
1025
- code <<= 1;
1026
- }
1027
- h->maxcode[j] = 0xffffffff;
1028
-
1029
- // build non-spec acceleration table; 255 is flag for not-accelerated
1030
- memset(h->fast, 255, 1 << FAST_BITS);
1031
- for (i=0; i < k; ++i) {
1032
- int s = h->size[i];
1033
- if (s <= FAST_BITS) {
1034
- int c = h->code[i] << (FAST_BITS-s);
1035
- int m = 1 << (FAST_BITS-s);
1036
- for (j=0; j < m; ++j) {
1037
- h->fast[c+j] = (uint8) i;
1038
- }
1039
- }
1040
- }
1041
- return 1;
1042
- }
1043
-
1044
- static void grow_buffer_unsafe(jpeg *j)
1045
- {
1046
- do {
1047
- int b = j->nomore ? 0 : get8(j->s);
1048
- if (b == 0xff) {
1049
- int c = get8(j->s);
1050
- if (c != 0) {
1051
- j->marker = (unsigned char) c;
1052
- j->nomore = 1;
1053
- return;
1054
- }
1055
- }
1056
- j->code_buffer |= b << (24 - j->code_bits);
1057
- j->code_bits += 8;
1058
- } while (j->code_bits <= 24);
1059
- }
1060
-
1061
- // (1 << n) - 1
1062
- static uint32 bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1063
-
1064
- // decode a jpeg huffman value from the bitstream
1065
- stbi_inline static int decode(jpeg *j, huffman *h)
1066
- {
1067
- unsigned int temp;
1068
- int c,k;
1069
-
1070
- if (j->code_bits < 16) grow_buffer_unsafe(j);
1071
-
1072
- // look at the top FAST_BITS and determine what symbol ID it is,
1073
- // if the code is <= FAST_BITS
1074
- c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1075
- k = h->fast[c];
1076
- if (k < 255) {
1077
- int s = h->size[k];
1078
- if (s > j->code_bits)
1079
- return -1;
1080
- j->code_buffer <<= s;
1081
- j->code_bits -= s;
1082
- return h->values[k];
1083
- }
1084
-
1085
- // naive test is to shift the code_buffer down so k bits are
1086
- // valid, then test against maxcode. To speed this up, we've
1087
- // preshifted maxcode left so that it has (16-k) 0s at the
1088
- // end; in other words, regardless of the number of bits, it
1089
- // wants to be compared against something shifted to have 16;
1090
- // that way we don't need to shift inside the loop.
1091
- temp = j->code_buffer >> 16;
1092
- for (k=FAST_BITS+1 ; ; ++k)
1093
- if (temp < h->maxcode[k])
1094
- break;
1095
- if (k == 17) {
1096
- // error! code not found
1097
- j->code_bits -= 16;
1098
- return -1;
1099
- }
1100
-
1101
- if (k > j->code_bits)
1102
- return -1;
1103
-
1104
- // convert the huffman code to the symbol id
1105
- c = ((j->code_buffer >> (32 - k)) & bmask[k]) + h->delta[k];
1106
- assert((((j->code_buffer) >> (32 - h->size[c])) & bmask[h->size[c]]) == h->code[c]);
1107
-
1108
- // convert the id to a symbol
1109
- j->code_bits -= k;
1110
- j->code_buffer <<= k;
1111
- return h->values[c];
1112
- }
1113
-
1114
- // combined JPEG 'receive' and JPEG 'extend', since baseline
1115
- // always extends everything it receives.
1116
- stbi_inline static int extend_receive(jpeg *j, int n)
1117
- {
1118
- unsigned int m = 1 << (n-1);
1119
- unsigned int k;
1120
- if (j->code_bits < n) grow_buffer_unsafe(j);
1121
-
1122
- #if 1
1123
- k = stbi_lrot(j->code_buffer, n);
1124
- j->code_buffer = k & ~bmask[n];
1125
- k &= bmask[n];
1126
- j->code_bits -= n;
1127
- #else
1128
- k = (j->code_buffer >> (32 - n)) & bmask[n];
1129
- j->code_bits -= n;
1130
- j->code_buffer <<= n;
1131
- #endif
1132
- // the following test is probably a random branch that won't
1133
- // predict well. I tried to table accelerate it but failed.
1134
- // maybe it's compiling as a conditional move?
1135
- if (k < m)
1136
- return (-1 << n) + k + 1;
1137
- else
1138
- return k;
1139
- }
1140
-
1141
- // given a value that's at position X in the zigzag stream,
1142
- // where does it appear in the 8x8 matrix coded as row-major?
1143
- static uint8 dezigzag[64+15] =
1144
- {
1145
- 0, 1, 8, 16, 9, 2, 3, 10,
1146
- 17, 24, 32, 25, 18, 11, 4, 5,
1147
- 12, 19, 26, 33, 40, 48, 41, 34,
1148
- 27, 20, 13, 6, 7, 14, 21, 28,
1149
- 35, 42, 49, 56, 57, 50, 43, 36,
1150
- 29, 22, 15, 23, 30, 37, 44, 51,
1151
- 58, 59, 52, 45, 38, 31, 39, 46,
1152
- 53, 60, 61, 54, 47, 55, 62, 63,
1153
- // let corrupt input sample past end
1154
- 63, 63, 63, 63, 63, 63, 63, 63,
1155
- 63, 63, 63, 63, 63, 63, 63
1156
- };
1157
-
1158
- // decode one 64-entry block--
1159
- static int decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b)
1160
- {
1161
- int diff,dc,k;
1162
- int t = decode(j, hdc);
1163
- if (t < 0) return e("bad huffman code","Corrupt JPEG");
1164
-
1165
- // 0 all the ac values now so we can do it 32-bits at a time
1166
- memset(data,0,64*sizeof(data[0]));
1167
-
1168
- diff = t ? extend_receive(j, t) : 0;
1169
- dc = j->img_comp[b].dc_pred + diff;
1170
- j->img_comp[b].dc_pred = dc;
1171
- data[0] = (short) dc;
1172
-
1173
- // decode AC components, see JPEG spec
1174
- k = 1;
1175
- do {
1176
- int r,s;
1177
- int rs = decode(j, hac);
1178
- if (rs < 0) return e("bad huffman code","Corrupt JPEG");
1179
- s = rs & 15;
1180
- r = rs >> 4;
1181
- if (s == 0) {
1182
- if (rs != 0xf0) break; // end block
1183
- k += 16;
1184
- } else {
1185
- k += r;
1186
- // decode into unzigzag'd location
1187
- data[dezigzag[k++]] = (short) extend_receive(j,s);
1188
- }
1189
- } while (k < 64);
1190
- return 1;
1191
- }
1192
-
1193
- // take a -128..127 value and clamp it and convert to 0..255
1194
- stbi_inline static uint8 clamp(int x)
1195
- {
1196
- // trick to use a single test to catch both cases
1197
- if ((unsigned int) x > 255) {
1198
- if (x < 0) return 0;
1199
- if (x > 255) return 255;
1200
- }
1201
- return (uint8) x;
1202
- }
1203
-
1204
- #define f2f(x) (int) (((x) * 4096 + 0.5))
1205
- #define fsh(x) ((x) << 12)
1206
-
1207
- // derived from jidctint -- DCT_ISLOW
1208
- #define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
1209
- int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
1210
- p2 = s2; \
1211
- p3 = s6; \
1212
- p1 = (p2+p3) * f2f(0.5411961f); \
1213
- t2 = p1 + p3*f2f(-1.847759065f); \
1214
- t3 = p1 + p2*f2f( 0.765366865f); \
1215
- p2 = s0; \
1216
- p3 = s4; \
1217
- t0 = fsh(p2+p3); \
1218
- t1 = fsh(p2-p3); \
1219
- x0 = t0+t3; \
1220
- x3 = t0-t3; \
1221
- x1 = t1+t2; \
1222
- x2 = t1-t2; \
1223
- t0 = s7; \
1224
- t1 = s5; \
1225
- t2 = s3; \
1226
- t3 = s1; \
1227
- p3 = t0+t2; \
1228
- p4 = t1+t3; \
1229
- p1 = t0+t3; \
1230
- p2 = t1+t2; \
1231
- p5 = (p3+p4)*f2f( 1.175875602f); \
1232
- t0 = t0*f2f( 0.298631336f); \
1233
- t1 = t1*f2f( 2.053119869f); \
1234
- t2 = t2*f2f( 3.072711026f); \
1235
- t3 = t3*f2f( 1.501321110f); \
1236
- p1 = p5 + p1*f2f(-0.899976223f); \
1237
- p2 = p5 + p2*f2f(-2.562915447f); \
1238
- p3 = p3*f2f(-1.961570560f); \
1239
- p4 = p4*f2f(-0.390180644f); \
1240
- t3 += p1+p4; \
1241
- t2 += p2+p3; \
1242
- t1 += p2+p4; \
1243
- t0 += p1+p3;
1244
-
1245
- #ifdef STBI_SIMD
1246
- typedef unsigned short stbi_dequantize_t;
1247
- #else
1248
- typedef uint8 stbi_dequantize_t;
1249
- #endif
1250
-
1251
- // .344 seconds on 3*anemones.jpg
1252
- static void idct_block(uint8 *out, int out_stride, short data[64], stbi_dequantize_t *dequantize)
1253
- {
1254
- int i,val[64],*v=val;
1255
- stbi_dequantize_t *dq = dequantize;
1256
- uint8 *o;
1257
- short *d = data;
1258
-
1259
- // columns
1260
- for (i=0; i < 8; ++i,++d,++dq, ++v) {
1261
- // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
1262
- if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
1263
- && d[40]==0 && d[48]==0 && d[56]==0) {
1264
- // no shortcut 0 seconds
1265
- // (1|2|3|4|5|6|7)==0 0 seconds
1266
- // all separate -0.047 seconds
1267
- // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds
1268
- int dcterm = d[0] * dq[0] << 2;
1269
- v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1270
- } else {
1271
- IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24],
1272
- d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56])
1273
- // constants scaled things up by 1<<12; let's bring them back
1274
- // down, but keep 2 extra bits of precision
1275
- x0 += 512; x1 += 512; x2 += 512; x3 += 512;
1276
- v[ 0] = (x0+t3) >> 10;
1277
- v[56] = (x0-t3) >> 10;
1278
- v[ 8] = (x1+t2) >> 10;
1279
- v[48] = (x1-t2) >> 10;
1280
- v[16] = (x2+t1) >> 10;
1281
- v[40] = (x2-t1) >> 10;
1282
- v[24] = (x3+t0) >> 10;
1283
- v[32] = (x3-t0) >> 10;
1284
- }
1285
- }
1286
-
1287
- for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
1288
- // no fast case since the first 1D IDCT spread components out
1289
- IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
1290
- // constants scaled things up by 1<<12, plus we had 1<<2 from first
1291
- // loop, plus horizontal and vertical each scale by sqrt(8) so together
1292
- // we've got an extra 1<<3, so 1<<17 total we need to remove.
1293
- // so we want to round that, which means adding 0.5 * 1<<17,
1294
- // aka 65536. Also, we'll end up with -128 to 127 that we want
1295
- // to encode as 0..255 by adding 128, so we'll add that before the shift
1296
- x0 += 65536 + (128<<17);
1297
- x1 += 65536 + (128<<17);
1298
- x2 += 65536 + (128<<17);
1299
- x3 += 65536 + (128<<17);
1300
- // tried computing the shifts into temps, or'ing the temps to see
1301
- // if any were out of range, but that was slower
1302
- o[0] = clamp((x0+t3) >> 17);
1303
- o[7] = clamp((x0-t3) >> 17);
1304
- o[1] = clamp((x1+t2) >> 17);
1305
- o[6] = clamp((x1-t2) >> 17);
1306
- o[2] = clamp((x2+t1) >> 17);
1307
- o[5] = clamp((x2-t1) >> 17);
1308
- o[3] = clamp((x3+t0) >> 17);
1309
- o[4] = clamp((x3-t0) >> 17);
1310
- }
1311
- }
1312
-
1313
- #ifdef STBI_SIMD
1314
- static stbi_idct_8x8 stbi_idct_installed = idct_block;
1315
-
1316
- void stbi_install_idct(stbi_idct_8x8 func)
1317
- {
1318
- stbi_idct_installed = func;
1319
- }
1320
- #endif
1321
-
1322
- #define MARKER_none 0xff
1323
- // if there's a pending marker from the entropy stream, return that
1324
- // otherwise, fetch from the stream and get a marker. if there's no
1325
- // marker, return 0xff, which is never a valid marker value
1326
- static uint8 get_marker(jpeg *j)
1327
- {
1328
- uint8 x;
1329
- if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; }
1330
- x = get8u(j->s);
1331
- if (x != 0xff) return MARKER_none;
1332
- while (x == 0xff)
1333
- x = get8u(j->s);
1334
- return x;
1335
- }
1336
-
1337
- // in each scan, we'll have scan_n components, and the order
1338
- // of the components is specified by order[]
1339
- #define RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
1340
-
1341
- // after a restart interval, reset the entropy decoder and
1342
- // the dc prediction
1343
- static void reset(jpeg *j)
1344
- {
1345
- j->code_bits = 0;
1346
- j->code_buffer = 0;
1347
- j->nomore = 0;
1348
- j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
1349
- j->marker = MARKER_none;
1350
- j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
1351
- // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
1352
- // since we don't even allow 1<<30 pixels
1353
- }
1354
-
1355
- static int parse_entropy_coded_data(jpeg *z)
1356
- {
1357
- reset(z);
1358
- if (z->scan_n == 1) {
1359
- int i,j;
1360
- #ifdef STBI_SIMD
1361
- __declspec(align(16))
1362
- #endif
1363
- short data[64];
1364
- int n = z->order[0];
1365
- // non-interleaved data, we just need to process one block at a time,
1366
- // in trivial scanline order
1367
- // number of blocks to do just depends on how many actual "pixels" this
1368
- // component has, independent of interleaved MCU blocking and such
1369
- int w = (z->img_comp[n].x+7) >> 3;
1370
- int h = (z->img_comp[n].y+7) >> 3;
1371
- for (j=0; j < h; ++j) {
1372
- for (i=0; i < w; ++i) {
1373
- if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0;
1374
- #ifdef STBI_SIMD
1375
- stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1376
- #else
1377
- idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1378
- #endif
1379
- // every data block is an MCU, so countdown the restart interval
1380
- if (--z->todo <= 0) {
1381
- if (z->code_bits < 24) grow_buffer_unsafe(z);
1382
- // if it's NOT a restart, then just bail, so we get corrupt data
1383
- // rather than no data
1384
- if (!RESTART(z->marker)) return 1;
1385
- reset(z);
1386
- }
1387
- }
1388
- }
1389
- } else { // interleaved!
1390
- int i,j,k,x,y;
1391
- short data[64];
1392
- for (j=0; j < z->img_mcu_y; ++j) {
1393
- for (i=0; i < z->img_mcu_x; ++i) {
1394
- // scan an interleaved mcu... process scan_n components in order
1395
- for (k=0; k < z->scan_n; ++k) {
1396
- int n = z->order[k];
1397
- // scan out an mcu's worth of this component; that's just determined
1398
- // by the basic H and V specified for the component
1399
- for (y=0; y < z->img_comp[n].v; ++y) {
1400
- for (x=0; x < z->img_comp[n].h; ++x) {
1401
- int x2 = (i*z->img_comp[n].h + x)*8;
1402
- int y2 = (j*z->img_comp[n].v + y)*8;
1403
- if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0;
1404
- #ifdef STBI_SIMD
1405
- stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1406
- #else
1407
- idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1408
- #endif
1409
- }
1410
- }
1411
- }
1412
- // after all interleaved components, that's an interleaved MCU,
1413
- // so now count down the restart interval
1414
- if (--z->todo <= 0) {
1415
- if (z->code_bits < 24) grow_buffer_unsafe(z);
1416
- // if it's NOT a restart, then just bail, so we get corrupt data
1417
- // rather than no data
1418
- if (!RESTART(z->marker)) return 1;
1419
- reset(z);
1420
- }
1421
- }
1422
- }
1423
- }
1424
- return 1;
1425
- }
1426
-
1427
- static int process_marker(jpeg *z, int m)
1428
- {
1429
- int L;
1430
- switch (m) {
1431
- case MARKER_none: // no marker found
1432
- return e("expected marker","Corrupt JPEG");
1433
-
1434
- case 0xC2: // SOF - progressive
1435
- return e("progressive jpeg","JPEG format not supported (progressive)");
1436
-
1437
- case 0xDD: // DRI - specify restart interval
1438
- if (get16(z->s) != 4) return e("bad DRI len","Corrupt JPEG");
1439
- z->restart_interval = get16(z->s);
1440
- return 1;
1441
-
1442
- case 0xDB: // DQT - define quantization table
1443
- L = get16(z->s)-2;
1444
- while (L > 0) {
1445
- int q = get8(z->s);
1446
- int p = q >> 4;
1447
- int t = q & 15,i;
1448
- if (p != 0) return e("bad DQT type","Corrupt JPEG");
1449
- if (t > 3) return e("bad DQT table","Corrupt JPEG");
1450
- for (i=0; i < 64; ++i)
1451
- z->dequant[t][dezigzag[i]] = get8u(z->s);
1452
- #ifdef STBI_SIMD
1453
- for (i=0; i < 64; ++i)
1454
- z->dequant2[t][i] = z->dequant[t][i];
1455
- #endif
1456
- L -= 65;
1457
- }
1458
- return L==0;
1459
-
1460
- case 0xC4: // DHT - define huffman table
1461
- L = get16(z->s)-2;
1462
- while (L > 0) {
1463
- uint8 *v;
1464
- int sizes[16],i,m=0;
1465
- int q = get8(z->s);
1466
- int tc = q >> 4;
1467
- int th = q & 15;
1468
- if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG");
1469
- for (i=0; i < 16; ++i) {
1470
- sizes[i] = get8(z->s);
1471
- m += sizes[i];
1472
- }
1473
- L -= 17;
1474
- if (tc == 0) {
1475
- if (!build_huffman(z->huff_dc+th, sizes)) return 0;
1476
- v = z->huff_dc[th].values;
1477
- } else {
1478
- if (!build_huffman(z->huff_ac+th, sizes)) return 0;
1479
- v = z->huff_ac[th].values;
1480
- }
1481
- for (i=0; i < m; ++i)
1482
- v[i] = get8u(z->s);
1483
- L -= m;
1484
- }
1485
- return L==0;
1486
- }
1487
- // check for comment block or APP blocks
1488
- if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
1489
- skip(z->s, get16(z->s)-2);
1490
- return 1;
1491
- }
1492
- return 0;
1493
- }
1494
-
1495
- // after we see SOS
1496
- static int process_scan_header(jpeg *z)
1497
- {
1498
- int i;
1499
- int Ls = get16(z->s);
1500
- z->scan_n = get8(z->s);
1501
- if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return e("bad SOS component count","Corrupt JPEG");
1502
- if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG");
1503
- for (i=0; i < z->scan_n; ++i) {
1504
- int id = get8(z->s), which;
1505
- int q = get8(z->s);
1506
- for (which = 0; which < z->s->img_n; ++which)
1507
- if (z->img_comp[which].id == id)
1508
- break;
1509
- if (which == z->s->img_n) return 0;
1510
- z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG");
1511
- z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG");
1512
- z->order[i] = which;
1513
- }
1514
- if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG");
1515
- get8(z->s); // should be 63, but might be 0
1516
- if (get8(z->s) != 0) return e("bad SOS","Corrupt JPEG");
1517
-
1518
- return 1;
1519
- }
1520
-
1521
- static int process_frame_header(jpeg *z, int scan)
1522
- {
1523
- stbi *s = z->s;
1524
- int Lf,p,i,q, h_max=1,v_max=1,c;
1525
- Lf = get16(s); if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG
1526
- p = get8(s); if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
1527
- s->img_y = get16(s); if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
1528
- s->img_x = get16(s); if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires
1529
- c = get8(s);
1530
- if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG"); // JFIF requires
1531
- s->img_n = c;
1532
- for (i=0; i < c; ++i) {
1533
- z->img_comp[i].data = NULL;
1534
- z->img_comp[i].linebuf = NULL;
1535
- }
1536
-
1537
- if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG");
1538
-
1539
- for (i=0; i < s->img_n; ++i) {
1540
- z->img_comp[i].id = get8(s);
1541
- if (z->img_comp[i].id != i+1) // JFIF requires
1542
- if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files!
1543
- return e("bad component ID","Corrupt JPEG");
1544
- q = get8(s);
1545
- z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG");
1546
- z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG");
1547
- z->img_comp[i].tq = get8(s); if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG");
1548
- }
1549
-
1550
- if (scan != SCAN_load) return 1;
1551
-
1552
- if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode");
1553
-
1554
- for (i=0; i < s->img_n; ++i) {
1555
- if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
1556
- if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
1557
- }
1558
-
1559
- // compute interleaved mcu info
1560
- z->img_h_max = h_max;
1561
- z->img_v_max = v_max;
1562
- z->img_mcu_w = h_max * 8;
1563
- z->img_mcu_h = v_max * 8;
1564
- z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
1565
- z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
1566
-
1567
- for (i=0; i < s->img_n; ++i) {
1568
- // number of effective pixels (e.g. for non-interleaved MCU)
1569
- z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
1570
- z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
1571
- // to simplify generation, we'll allocate enough memory to decode
1572
- // the bogus oversized data from using interleaved MCUs and their
1573
- // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
1574
- // discard the extra data until colorspace conversion
1575
- z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
1576
- z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
1577
- z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
1578
- if (z->img_comp[i].raw_data == NULL) {
1579
- for(--i; i >= 0; --i) {
1580
- free(z->img_comp[i].raw_data);
1581
- z->img_comp[i].data = NULL;
1582
- }
1583
- return e("outofmem", "Out of memory");
1584
- }
1585
- // align blocks for installable-idct using mmx/sse
1586
- z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
1587
- z->img_comp[i].linebuf = NULL;
1588
- }
1589
-
1590
- return 1;
1591
- }
1592
-
1593
- // use comparisons since in some cases we handle more than one case (e.g. SOF)
1594
- #define DNL(x) ((x) == 0xdc)
1595
- #define SOI(x) ((x) == 0xd8)
1596
- #define EOI(x) ((x) == 0xd9)
1597
- #define SOF(x) ((x) == 0xc0 || (x) == 0xc1)
1598
- #define SOS(x) ((x) == 0xda)
1599
-
1600
- static int decode_jpeg_header(jpeg *z, int scan)
1601
- {
1602
- int m;
1603
- z->marker = MARKER_none; // initialize cached marker to empty
1604
- m = get_marker(z);
1605
- if (!SOI(m)) return e("no SOI","Corrupt JPEG");
1606
- if (scan == SCAN_type) return 1;
1607
- m = get_marker(z);
1608
- while (!SOF(m)) {
1609
- if (!process_marker(z,m)) return 0;
1610
- m = get_marker(z);
1611
- while (m == MARKER_none) {
1612
- // some files have extra padding after their blocks, so ok, we'll scan
1613
- if (at_eof(z->s)) return e("no SOF", "Corrupt JPEG");
1614
- m = get_marker(z);
1615
- }
1616
- }
1617
- if (!process_frame_header(z, scan)) return 0;
1618
- return 1;
1619
- }
1620
-
1621
- static int decode_jpeg_image(jpeg *j)
1622
- {
1623
- int m;
1624
- j->restart_interval = 0;
1625
- if (!decode_jpeg_header(j, SCAN_load)) return 0;
1626
- m = get_marker(j);
1627
- while (!EOI(m)) {
1628
- if (SOS(m)) {
1629
- if (!process_scan_header(j)) return 0;
1630
- if (!parse_entropy_coded_data(j)) return 0;
1631
- if (j->marker == MARKER_none ) {
1632
- // handle 0s at the end of image data from IP Kamera 9060
1633
- while (!at_eof(j->s)) {
1634
- int x = get8(j->s);
1635
- if (x == 255) {
1636
- j->marker = get8u(j->s);
1637
- break;
1638
- } else if (x != 0) {
1639
- return 0;
1640
- }
1641
- }
1642
- // if we reach eof without hitting a marker, get_marker() below will fail and we'll eventually return 0
1643
- }
1644
- } else {
1645
- if (!process_marker(j, m)) return 0;
1646
- }
1647
- m = get_marker(j);
1648
- }
1649
- return 1;
1650
- }
1651
-
1652
- // static jfif-centered resampling (across block boundaries)
1653
-
1654
- typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1,
1655
- int w, int hs);
1656
-
1657
- #define div4(x) ((uint8) ((x) >> 2))
1658
-
1659
- static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1660
- {
1661
- STBI_NOTUSED(out);
1662
- STBI_NOTUSED(in_far);
1663
- STBI_NOTUSED(w);
1664
- STBI_NOTUSED(hs);
1665
- return in_near;
1666
- }
1667
-
1668
- static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1669
- {
1670
- // need to generate two samples vertically for every one in input
1671
- int i;
1672
- STBI_NOTUSED(hs);
1673
- for (i=0; i < w; ++i)
1674
- out[i] = div4(3*in_near[i] + in_far[i] + 2);
1675
- return out;
1676
- }
1677
-
1678
- static uint8* resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1679
- {
1680
- // need to generate two samples horizontally for every one in input
1681
- int i;
1682
- uint8 *input = in_near;
1683
-
1684
- if (w == 1) {
1685
- // if only one sample, can't do any interpolation
1686
- out[0] = out[1] = input[0];
1687
- return out;
1688
- }
1689
-
1690
- out[0] = input[0];
1691
- out[1] = div4(input[0]*3 + input[1] + 2);
1692
- for (i=1; i < w-1; ++i) {
1693
- int n = 3*input[i]+2;
1694
- out[i*2+0] = div4(n+input[i-1]);
1695
- out[i*2+1] = div4(n+input[i+1]);
1696
- }
1697
- out[i*2+0] = div4(input[w-2]*3 + input[w-1] + 2);
1698
- out[i*2+1] = input[w-1];
1699
-
1700
- STBI_NOTUSED(in_far);
1701
- STBI_NOTUSED(hs);
1702
-
1703
- return out;
1704
- }
1705
-
1706
- #define div16(x) ((uint8) ((x) >> 4))
1707
-
1708
- static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1709
- {
1710
- // need to generate 2x2 samples for every one in input
1711
- int i,t0,t1;
1712
- if (w == 1) {
1713
- out[0] = out[1] = div4(3*in_near[0] + in_far[0] + 2);
1714
- return out;
1715
- }
1716
-
1717
- t1 = 3*in_near[0] + in_far[0];
1718
- out[0] = div4(t1+2);
1719
- for (i=1; i < w; ++i) {
1720
- t0 = t1;
1721
- t1 = 3*in_near[i]+in_far[i];
1722
- out[i*2-1] = div16(3*t0 + t1 + 8);
1723
- out[i*2 ] = div16(3*t1 + t0 + 8);
1724
- }
1725
- out[w*2-1] = div4(t1+2);
1726
-
1727
- STBI_NOTUSED(hs);
1728
-
1729
- return out;
1730
- }
1731
-
1732
- static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1733
- {
1734
- // resample with nearest-neighbor
1735
- int i,j;
1736
- in_far = in_far;
1737
- for (i=0; i < w; ++i)
1738
- for (j=0; j < hs; ++j)
1739
- out[i*hs+j] = in_near[i];
1740
- return out;
1741
- }
1742
-
1743
- #define float2fixed(x) ((int) ((x) * 65536 + 0.5))
1744
-
1745
- // 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro)
1746
- // VC6 without processor=Pro is generating multiple LEAs per multiply!
1747
- static void YCbCr_to_RGB_row(uint8 *out, const uint8 *y, const uint8 *pcb, const uint8 *pcr, int count, int step)
1748
- {
1749
- int i;
1750
- for (i=0; i < count; ++i) {
1751
- int y_fixed = (y[i] << 16) + 32768; // rounding
1752
- int r,g,b;
1753
- int cr = pcr[i] - 128;
1754
- int cb = pcb[i] - 128;
1755
- r = y_fixed + cr*float2fixed(1.40200f);
1756
- g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
1757
- b = y_fixed + cb*float2fixed(1.77200f);
1758
- r >>= 16;
1759
- g >>= 16;
1760
- b >>= 16;
1761
- if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
1762
- if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
1763
- if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
1764
- out[0] = (uint8)r;
1765
- out[1] = (uint8)g;
1766
- out[2] = (uint8)b;
1767
- out[3] = 255;
1768
- out += step;
1769
- }
1770
- }
1771
-
1772
- #ifdef STBI_SIMD
1773
- static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row;
1774
-
1775
- void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func)
1776
- {
1777
- stbi_YCbCr_installed = func;
1778
- }
1779
- #endif
1780
-
1781
-
1782
- // clean up the temporary component buffers
1783
- static void cleanup_jpeg(jpeg *j)
1784
- {
1785
- int i;
1786
- for (i=0; i < j->s->img_n; ++i) {
1787
- if (j->img_comp[i].data) {
1788
- free(j->img_comp[i].raw_data);
1789
- j->img_comp[i].data = NULL;
1790
- }
1791
- if (j->img_comp[i].linebuf) {
1792
- free(j->img_comp[i].linebuf);
1793
- j->img_comp[i].linebuf = NULL;
1794
- }
1795
- }
1796
- }
1797
-
1798
- typedef struct
1799
- {
1800
- resample_row_func resample;
1801
- uint8 *line0,*line1;
1802
- int hs,vs; // expansion factor in each axis
1803
- int w_lores; // horizontal pixels pre-expansion
1804
- int ystep; // how far through vertical expansion we are
1805
- int ypos; // which pre-expansion row we're on
1806
- } stbi_resample;
1807
-
1808
- static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
1809
- {
1810
- int n, decode_n;
1811
- // validate req_comp
1812
- if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error");
1813
- z->s->img_n = 0;
1814
-
1815
- // load a jpeg image from whichever source
1816
- if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; }
1817
-
1818
- // determine actual number of components to generate
1819
- n = req_comp ? req_comp : z->s->img_n;
1820
-
1821
- if (z->s->img_n == 3 && n < 3)
1822
- decode_n = 1;
1823
- else
1824
- decode_n = z->s->img_n;
1825
-
1826
- // resample and color-convert
1827
- {
1828
- int k;
1829
- uint i,j;
1830
- uint8 *output;
1831
- uint8 *coutput[4];
1832
-
1833
- stbi_resample res_comp[4];
1834
-
1835
- for (k=0; k < decode_n; ++k) {
1836
- stbi_resample *r = &res_comp[k];
1837
-
1838
- // allocate line buffer big enough for upsampling off the edges
1839
- // with upsample factor of 4
1840
- z->img_comp[k].linebuf = (uint8 *) malloc(z->s->img_x + 3);
1841
- if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); }
1842
-
1843
- r->hs = z->img_h_max / z->img_comp[k].h;
1844
- r->vs = z->img_v_max / z->img_comp[k].v;
1845
- r->ystep = r->vs >> 1;
1846
- r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
1847
- r->ypos = 0;
1848
- r->line0 = r->line1 = z->img_comp[k].data;
1849
-
1850
- if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
1851
- else if (r->hs == 1 && r->vs == 2) r->resample = resample_row_v_2;
1852
- else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2;
1853
- else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2;
1854
- else r->resample = resample_row_generic;
1855
- }
1856
-
1857
- // can't error after this so, this is safe
1858
- output = (uint8 *) malloc(n * z->s->img_x * z->s->img_y + 1);
1859
- if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); }
1860
-
1861
- // now go ahead and resample
1862
- for (j=0; j < z->s->img_y; ++j) {
1863
- uint8 *out = output + n * z->s->img_x * j;
1864
- for (k=0; k < decode_n; ++k) {
1865
- stbi_resample *r = &res_comp[k];
1866
- int y_bot = r->ystep >= (r->vs >> 1);
1867
- coutput[k] = r->resample(z->img_comp[k].linebuf,
1868
- y_bot ? r->line1 : r->line0,
1869
- y_bot ? r->line0 : r->line1,
1870
- r->w_lores, r->hs);
1871
- if (++r->ystep >= r->vs) {
1872
- r->ystep = 0;
1873
- r->line0 = r->line1;
1874
- if (++r->ypos < z->img_comp[k].y)
1875
- r->line1 += z->img_comp[k].w2;
1876
- }
1877
- }
1878
- if (n >= 3) {
1879
- uint8 *y = coutput[0];
1880
- if (z->s->img_n == 3) {
1881
- #ifdef STBI_SIMD
1882
- stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n);
1883
- #else
1884
- YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n);
1885
- #endif
1886
- } else
1887
- for (i=0; i < z->s->img_x; ++i) {
1888
- out[0] = out[1] = out[2] = y[i];
1889
- out[3] = 255; // not used if n==3
1890
- out += n;
1891
- }
1892
- } else {
1893
- uint8 *y = coutput[0];
1894
- if (n == 1)
1895
- for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
1896
- else
1897
- for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
1898
- }
1899
- }
1900
- cleanup_jpeg(z);
1901
- *out_x = z->s->img_x;
1902
- *out_y = z->s->img_y;
1903
- if (comp) *comp = z->s->img_n; // report original components, not output
1904
- return output;
1905
- }
1906
- }
1907
-
1908
- static unsigned char *stbi_jpeg_load(stbi *s, int *x, int *y, int *comp, int req_comp)
1909
- {
1910
- jpeg j;
1911
- j.s = s;
1912
- return load_jpeg_image(&j, x,y,comp,req_comp);
1913
- }
1914
-
1915
- static int stbi_jpeg_test(stbi *s)
1916
- {
1917
- int r;
1918
- jpeg j;
1919
- j.s = s;
1920
- r = decode_jpeg_header(&j, SCAN_type);
1921
- stbi_rewind(s);
1922
- return r;
1923
- }
1924
-
1925
- static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp)
1926
- {
1927
- if (!decode_jpeg_header(j, SCAN_header)) {
1928
- stbi_rewind( j->s );
1929
- return 0;
1930
- }
1931
- if (x) *x = j->s->img_x;
1932
- if (y) *y = j->s->img_y;
1933
- if (comp) *comp = j->s->img_n;
1934
- return 1;
1935
- }
1936
-
1937
- static int stbi_jpeg_info(stbi *s, int *x, int *y, int *comp)
1938
- {
1939
- jpeg j;
1940
- j.s = s;
1941
- return stbi_jpeg_info_raw(&j, x, y, comp);
1942
- }
1943
-
1944
- // public domain zlib decode v0.2 Sean Barrett 2006-11-18
1945
- // simple implementation
1946
- // - all input must be provided in an upfront buffer
1947
- // - all output is written to a single output buffer (can malloc/realloc)
1948
- // performance
1949
- // - fast huffman
1950
-
1951
- // fast-way is faster to check than jpeg huffman, but slow way is slower
1952
- #define ZFAST_BITS 9 // accelerate all cases in default tables
1953
- #define ZFAST_MASK ((1 << ZFAST_BITS) - 1)
1954
-
1955
- // zlib-style huffman encoding
1956
- // (jpegs packs from left, zlib from right, so can't share code)
1957
- typedef struct
1958
- {
1959
- uint16 fast[1 << ZFAST_BITS];
1960
- uint16 firstcode[16];
1961
- int maxcode[17];
1962
- uint16 firstsymbol[16];
1963
- uint8 size[288];
1964
- uint16 value[288];
1965
- } zhuffman;
1966
-
1967
- stbi_inline static int bitreverse16(int n)
1968
- {
1969
- n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
1970
- n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
1971
- n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
1972
- n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
1973
- return n;
1974
- }
1975
-
1976
- stbi_inline static int bit_reverse(int v, int bits)
1977
- {
1978
- assert(bits <= 16);
1979
- // to bit reverse n bits, reverse 16 and shift
1980
- // e.g. 11 bits, bit reverse and shift away 5
1981
- return bitreverse16(v) >> (16-bits);
1982
- }
1983
-
1984
- static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num)
1985
- {
1986
- int i,k=0;
1987
- int code, next_code[16], sizes[17];
1988
-
1989
- // DEFLATE spec for generating codes
1990
- memset(sizes, 0, sizeof(sizes));
1991
- memset(z->fast, 255, sizeof(z->fast));
1992
- for (i=0; i < num; ++i)
1993
- ++sizes[sizelist[i]];
1994
- sizes[0] = 0;
1995
- for (i=1; i < 16; ++i)
1996
- assert(sizes[i] <= (1 << i));
1997
- code = 0;
1998
- for (i=1; i < 16; ++i) {
1999
- next_code[i] = code;
2000
- z->firstcode[i] = (uint16) code;
2001
- z->firstsymbol[i] = (uint16) k;
2002
- code = (code + sizes[i]);
2003
- if (sizes[i])
2004
- if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG");
2005
- z->maxcode[i] = code << (16-i); // preshift for inner loop
2006
- code <<= 1;
2007
- k += sizes[i];
2008
- }
2009
- z->maxcode[16] = 0x10000; // sentinel
2010
- for (i=0; i < num; ++i) {
2011
- int s = sizelist[i];
2012
- if (s) {
2013
- int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
2014
- z->size[c] = (uint8)s;
2015
- z->value[c] = (uint16)i;
2016
- if (s <= ZFAST_BITS) {
2017
- int k = bit_reverse(next_code[s],s);
2018
- while (k < (1 << ZFAST_BITS)) {
2019
- z->fast[k] = (uint16) c;
2020
- k += (1 << s);
2021
- }
2022
- }
2023
- ++next_code[s];
2024
- }
2025
- }
2026
- return 1;
2027
- }
2028
-
2029
- // zlib-from-memory implementation for PNG reading
2030
- // because PNG allows splitting the zlib stream arbitrarily,
2031
- // and it's annoying structurally to have PNG call ZLIB call PNG,
2032
- // we require PNG read all the IDATs and combine them into a single
2033
- // memory buffer
2034
-
2035
- typedef struct
2036
- {
2037
- uint8 *zbuffer, *zbuffer_end;
2038
- int num_bits;
2039
- uint32 code_buffer;
2040
-
2041
- char *zout;
2042
- char *zout_start;
2043
- char *zout_end;
2044
- int z_expandable;
2045
-
2046
- zhuffman z_length, z_distance;
2047
- } zbuf;
2048
-
2049
- stbi_inline static int zget8(zbuf *z)
2050
- {
2051
- if (z->zbuffer >= z->zbuffer_end) return 0;
2052
- return *z->zbuffer++;
2053
- }
2054
-
2055
- static void fill_bits(zbuf *z)
2056
- {
2057
- do {
2058
- assert(z->code_buffer < (1U << z->num_bits));
2059
- z->code_buffer |= zget8(z) << z->num_bits;
2060
- z->num_bits += 8;
2061
- } while (z->num_bits <= 24);
2062
- }
2063
-
2064
- stbi_inline static unsigned int zreceive(zbuf *z, int n)
2065
- {
2066
- unsigned int k;
2067
- if (z->num_bits < n) fill_bits(z);
2068
- k = z->code_buffer & ((1 << n) - 1);
2069
- z->code_buffer >>= n;
2070
- z->num_bits -= n;
2071
- return k;
2072
- }
2073
-
2074
- stbi_inline static int zhuffman_decode(zbuf *a, zhuffman *z)
2075
- {
2076
- int b,s,k;
2077
- if (a->num_bits < 16) fill_bits(a);
2078
- b = z->fast[a->code_buffer & ZFAST_MASK];
2079
- if (b < 0xffff) {
2080
- s = z->size[b];
2081
- a->code_buffer >>= s;
2082
- a->num_bits -= s;
2083
- return z->value[b];
2084
- }
2085
-
2086
- // not resolved by fast table, so compute it the slow way
2087
- // use jpeg approach, which requires MSbits at top
2088
- k = bit_reverse(a->code_buffer, 16);
2089
- for (s=ZFAST_BITS+1; ; ++s)
2090
- if (k < z->maxcode[s])
2091
- break;
2092
- if (s == 16) return -1; // invalid code!
2093
- // code size is s, so:
2094
- b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
2095
- assert(z->size[b] == s);
2096
- a->code_buffer >>= s;
2097
- a->num_bits -= s;
2098
- return z->value[b];
2099
- }
2100
-
2101
- static int expand(zbuf *z, int n) // need to make room for n bytes
2102
- {
2103
- char *q;
2104
- int cur, limit;
2105
- if (!z->z_expandable) return e("output buffer limit","Corrupt PNG");
2106
- cur = (int) (z->zout - z->zout_start);
2107
- limit = (int) (z->zout_end - z->zout_start);
2108
- while (cur + n > limit)
2109
- limit *= 2;
2110
- q = (char *) realloc(z->zout_start, limit);
2111
- if (q == NULL) return e("outofmem", "Out of memory");
2112
- z->zout_start = q;
2113
- z->zout = q + cur;
2114
- z->zout_end = q + limit;
2115
- return 1;
2116
- }
2117
-
2118
- static int length_base[31] = {
2119
- 3,4,5,6,7,8,9,10,11,13,
2120
- 15,17,19,23,27,31,35,43,51,59,
2121
- 67,83,99,115,131,163,195,227,258,0,0 };
2122
-
2123
- static int length_extra[31]=
2124
- { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
2125
-
2126
- static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
2127
- 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
2128
-
2129
- static int dist_extra[32] =
2130
- { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
2131
-
2132
- static int parse_huffman_block(zbuf *a)
2133
- {
2134
- for(;;) {
2135
- int z = zhuffman_decode(a, &a->z_length);
2136
- if (z < 256) {
2137
- if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes
2138
- if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0;
2139
- *a->zout++ = (char) z;
2140
- } else {
2141
- uint8 *p;
2142
- int len,dist;
2143
- if (z == 256) return 1;
2144
- z -= 257;
2145
- len = length_base[z];
2146
- if (length_extra[z]) len += zreceive(a, length_extra[z]);
2147
- z = zhuffman_decode(a, &a->z_distance);
2148
- if (z < 0) return e("bad huffman code","Corrupt PNG");
2149
- dist = dist_base[z];
2150
- if (dist_extra[z]) dist += zreceive(a, dist_extra[z]);
2151
- if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG");
2152
- if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0;
2153
- p = (uint8 *) (a->zout - dist);
2154
- while (len--)
2155
- *a->zout++ = *p++;
2156
- }
2157
- }
2158
- }
2159
-
2160
- static int compute_huffman_codes(zbuf *a)
2161
- {
2162
- static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
2163
- zhuffman z_codelength;
2164
- uint8 lencodes[286+32+137];//padding for maximum single op
2165
- uint8 codelength_sizes[19];
2166
- int i,n;
2167
-
2168
- int hlit = zreceive(a,5) + 257;
2169
- int hdist = zreceive(a,5) + 1;
2170
- int hclen = zreceive(a,4) + 4;
2171
-
2172
- memset(codelength_sizes, 0, sizeof(codelength_sizes));
2173
- for (i=0; i < hclen; ++i) {
2174
- int s = zreceive(a,3);
2175
- codelength_sizes[length_dezigzag[i]] = (uint8) s;
2176
- }
2177
- if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
2178
-
2179
- n = 0;
2180
- while (n < hlit + hdist) {
2181
- int c = zhuffman_decode(a, &z_codelength);
2182
- assert(c >= 0 && c < 19);
2183
- if (c < 16)
2184
- lencodes[n++] = (uint8) c;
2185
- else if (c == 16) {
2186
- c = zreceive(a,2)+3;
2187
- memset(lencodes+n, lencodes[n-1], c);
2188
- n += c;
2189
- } else if (c == 17) {
2190
- c = zreceive(a,3)+3;
2191
- memset(lencodes+n, 0, c);
2192
- n += c;
2193
- } else {
2194
- assert(c == 18);
2195
- c = zreceive(a,7)+11;
2196
- memset(lencodes+n, 0, c);
2197
- n += c;
2198
- }
2199
- }
2200
- if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG");
2201
- if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
2202
- if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
2203
- return 1;
2204
- }
2205
-
2206
- static int parse_uncompressed_block(zbuf *a)
2207
- {
2208
- uint8 header[4];
2209
- int len,nlen,k;
2210
- if (a->num_bits & 7)
2211
- zreceive(a, a->num_bits & 7); // discard
2212
- // drain the bit-packed data into header
2213
- k = 0;
2214
- while (a->num_bits > 0) {
2215
- header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns?
2216
- a->code_buffer >>= 8;
2217
- a->num_bits -= 8;
2218
- }
2219
- assert(a->num_bits == 0);
2220
- // now fill header the normal way
2221
- while (k < 4)
2222
- header[k++] = (uint8) zget8(a);
2223
- len = header[1] * 256 + header[0];
2224
- nlen = header[3] * 256 + header[2];
2225
- if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG");
2226
- if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG");
2227
- if (a->zout + len > a->zout_end)
2228
- if (!expand(a, len)) return 0;
2229
- memcpy(a->zout, a->zbuffer, len);
2230
- a->zbuffer += len;
2231
- a->zout += len;
2232
- return 1;
2233
- }
2234
-
2235
- static int parse_zlib_header(zbuf *a)
2236
- {
2237
- int cmf = zget8(a);
2238
- int cm = cmf & 15;
2239
- /* int cinfo = cmf >> 4; */
2240
- int flg = zget8(a);
2241
- if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec
2242
- if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
2243
- if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png
2244
- // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
2245
- return 1;
2246
- }
2247
-
2248
- // @TODO: should statically initialize these for optimal thread safety
2249
- static uint8 default_length[288], default_distance[32];
2250
- static void init_defaults(void)
2251
- {
2252
- int i; // use <= to match clearly with spec
2253
- for (i=0; i <= 143; ++i) default_length[i] = 8;
2254
- for ( ; i <= 255; ++i) default_length[i] = 9;
2255
- for ( ; i <= 279; ++i) default_length[i] = 7;
2256
- for ( ; i <= 287; ++i) default_length[i] = 8;
2257
-
2258
- for (i=0; i <= 31; ++i) default_distance[i] = 5;
2259
- }
2260
-
2261
- int stbi_png_partial; // a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead
2262
- static int parse_zlib(zbuf *a, int parse_header)
2263
- {
2264
- int final, type;
2265
- if (parse_header)
2266
- if (!parse_zlib_header(a)) return 0;
2267
- a->num_bits = 0;
2268
- a->code_buffer = 0;
2269
- do {
2270
- final = zreceive(a,1);
2271
- type = zreceive(a,2);
2272
- if (type == 0) {
2273
- if (!parse_uncompressed_block(a)) return 0;
2274
- } else if (type == 3) {
2275
- return 0;
2276
- } else {
2277
- if (type == 1) {
2278
- // use fixed code lengths
2279
- if (!default_distance[31]) init_defaults();
2280
- if (!zbuild_huffman(&a->z_length , default_length , 288)) return 0;
2281
- if (!zbuild_huffman(&a->z_distance, default_distance, 32)) return 0;
2282
- } else {
2283
- if (!compute_huffman_codes(a)) return 0;
2284
- }
2285
- if (!parse_huffman_block(a)) return 0;
2286
- }
2287
- if (stbi_png_partial && a->zout - a->zout_start > 65536)
2288
- break;
2289
- } while (!final);
2290
- return 1;
2291
- }
2292
-
2293
- static int do_zlib(zbuf *a, char *obuf, int olen, int exp, int parse_header)
2294
- {
2295
- a->zout_start = obuf;
2296
- a->zout = obuf;
2297
- a->zout_end = obuf + olen;
2298
- a->z_expandable = exp;
2299
-
2300
- return parse_zlib(a, parse_header);
2301
- }
2302
-
2303
- char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
2304
- {
2305
- zbuf a;
2306
- char *p = (char *) malloc(initial_size);
2307
- if (p == NULL) return NULL;
2308
- a.zbuffer = (uint8 *) buffer;
2309
- a.zbuffer_end = (uint8 *) buffer + len;
2310
- if (do_zlib(&a, p, initial_size, 1, 1)) {
2311
- if (outlen) *outlen = (int) (a.zout - a.zout_start);
2312
- return a.zout_start;
2313
- } else {
2314
- free(a.zout_start);
2315
- return NULL;
2316
- }
2317
- }
2318
-
2319
- char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
2320
- {
2321
- return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
2322
- }
2323
-
2324
- char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
2325
- {
2326
- zbuf a;
2327
- char *p = (char *) malloc(initial_size);
2328
- if (p == NULL) return NULL;
2329
- a.zbuffer = (uint8 *) buffer;
2330
- a.zbuffer_end = (uint8 *) buffer + len;
2331
- if (do_zlib(&a, p, initial_size, 1, parse_header)) {
2332
- if (outlen) *outlen = (int) (a.zout - a.zout_start);
2333
- return a.zout_start;
2334
- } else {
2335
- free(a.zout_start);
2336
- return NULL;
2337
- }
2338
- }
2339
-
2340
- int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
2341
- {
2342
- zbuf a;
2343
- a.zbuffer = (uint8 *) ibuffer;
2344
- a.zbuffer_end = (uint8 *) ibuffer + ilen;
2345
- if (do_zlib(&a, obuffer, olen, 0, 1))
2346
- return (int) (a.zout - a.zout_start);
2347
- else
2348
- return -1;
2349
- }
2350
-
2351
- char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
2352
- {
2353
- zbuf a;
2354
- char *p = (char *) malloc(16384);
2355
- if (p == NULL) return NULL;
2356
- a.zbuffer = (uint8 *) buffer;
2357
- a.zbuffer_end = (uint8 *) buffer+len;
2358
- if (do_zlib(&a, p, 16384, 1, 0)) {
2359
- if (outlen) *outlen = (int) (a.zout - a.zout_start);
2360
- return a.zout_start;
2361
- } else {
2362
- free(a.zout_start);
2363
- return NULL;
2364
- }
2365
- }
2366
-
2367
- int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
2368
- {
2369
- zbuf a;
2370
- a.zbuffer = (uint8 *) ibuffer;
2371
- a.zbuffer_end = (uint8 *) ibuffer + ilen;
2372
- if (do_zlib(&a, obuffer, olen, 0, 0))
2373
- return (int) (a.zout - a.zout_start);
2374
- else
2375
- return -1;
2376
- }
2377
-
2378
- // public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18
2379
- // simple implementation
2380
- // - only 8-bit samples
2381
- // - no CRC checking
2382
- // - allocates lots of intermediate memory
2383
- // - avoids problem of streaming data between subsystems
2384
- // - avoids explicit window management
2385
- // performance
2386
- // - uses stb_zlib, a PD zlib implementation with fast huffman decoding
2387
-
2388
-
2389
- typedef struct
2390
- {
2391
- uint32 length;
2392
- uint32 type;
2393
- } chunk;
2394
-
2395
- #define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
2396
-
2397
- static chunk get_chunk_header(stbi *s)
2398
- {
2399
- chunk c;
2400
- c.length = get32(s);
2401
- c.type = get32(s);
2402
- return c;
2403
- }
2404
-
2405
- static int check_png_header(stbi *s)
2406
- {
2407
- static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 };
2408
- int i;
2409
- for (i=0; i < 8; ++i)
2410
- if (get8u(s) != png_sig[i]) return e("bad png sig","Not a PNG");
2411
- return 1;
2412
- }
2413
-
2414
- typedef struct
2415
- {
2416
- stbi *s;
2417
- uint8 *idata, *expanded, *out;
2418
- } png;
2419
-
2420
-
2421
- enum {
2422
- F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4,
2423
- F_avg_first, F_paeth_first
2424
- };
2425
-
2426
- static uint8 first_row_filter[5] =
2427
- {
2428
- F_none, F_sub, F_none, F_avg_first, F_paeth_first
2429
- };
2430
-
2431
- static int paeth(int a, int b, int c)
2432
- {
2433
- int p = a + b - c;
2434
- int pa = abs(p-a);
2435
- int pb = abs(p-b);
2436
- int pc = abs(p-c);
2437
- if (pa <= pb && pa <= pc) return a;
2438
- if (pb <= pc) return b;
2439
- return c;
2440
- }
2441
-
2442
- // create the png data from post-deflated data
2443
- static int create_png_image_raw(png *a, uint8 *raw, uint32 raw_len, int out_n, uint32 x, uint32 y)
2444
- {
2445
- stbi *s = a->s;
2446
- uint32 i,j,stride = x*out_n;
2447
- int k;
2448
- int img_n = s->img_n; // copy it into a local for later
2449
- assert(out_n == s->img_n || out_n == s->img_n+1);
2450
- if (stbi_png_partial) y = 1;
2451
- a->out = (uint8 *) malloc(x * y * out_n);
2452
- if (!a->out) return e("outofmem", "Out of memory");
2453
- if (!stbi_png_partial) {
2454
- if (s->img_x == x && s->img_y == y) {
2455
- if (raw_len != (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG");
2456
- } else { // interlaced:
2457
- if (raw_len < (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG");
2458
- }
2459
- }
2460
- for (j=0; j < y; ++j) {
2461
- uint8 *cur = a->out + stride*j;
2462
- uint8 *prior = cur - stride;
2463
- int filter = *raw++;
2464
- if (filter > 4) return e("invalid filter","Corrupt PNG");
2465
- // if first row, use special filter that doesn't sample previous row
2466
- if (j == 0) filter = first_row_filter[filter];
2467
- // handle first pixel explicitly
2468
- for (k=0; k < img_n; ++k) {
2469
- switch (filter) {
2470
- case F_none : cur[k] = raw[k]; break;
2471
- case F_sub : cur[k] = raw[k]; break;
2472
- case F_up : cur[k] = raw[k] + prior[k]; break;
2473
- case F_avg : cur[k] = raw[k] + (prior[k]>>1); break;
2474
- case F_paeth : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break;
2475
- case F_avg_first : cur[k] = raw[k]; break;
2476
- case F_paeth_first: cur[k] = raw[k]; break;
2477
- }
2478
- }
2479
- if (img_n != out_n) cur[img_n] = 255;
2480
- raw += img_n;
2481
- cur += out_n;
2482
- prior += out_n;
2483
- // this is a little gross, so that we don't switch per-pixel or per-component
2484
- if (img_n == out_n) {
2485
- #define CASE(f) \
2486
- case f: \
2487
- for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \
2488
- for (k=0; k < img_n; ++k)
2489
- switch (filter) {
2490
- CASE(F_none) cur[k] = raw[k]; break;
2491
- CASE(F_sub) cur[k] = raw[k] + cur[k-img_n]; break;
2492
- CASE(F_up) cur[k] = raw[k] + prior[k]; break;
2493
- CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1); break;
2494
- CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n])); break;
2495
- CASE(F_avg_first) cur[k] = raw[k] + (cur[k-img_n] >> 1); break;
2496
- CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0)); break;
2497
- }
2498
- #undef CASE
2499
- } else {
2500
- assert(img_n+1 == out_n);
2501
- #define CASE(f) \
2502
- case f: \
2503
- for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
2504
- for (k=0; k < img_n; ++k)
2505
- switch (filter) {
2506
- CASE(F_none) cur[k] = raw[k]; break;
2507
- CASE(F_sub) cur[k] = raw[k] + cur[k-out_n]; break;
2508
- CASE(F_up) cur[k] = raw[k] + prior[k]; break;
2509
- CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1); break;
2510
- CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;
2511
- CASE(F_avg_first) cur[k] = raw[k] + (cur[k-out_n] >> 1); break;
2512
- CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0)); break;
2513
- }
2514
- #undef CASE
2515
- }
2516
- }
2517
- return 1;
2518
- }
2519
-
2520
- static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n, int interlaced)
2521
- {
2522
- uint8 *final;
2523
- int p;
2524
- int save;
2525
- if (!interlaced)
2526
- return create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y);
2527
- save = stbi_png_partial;
2528
- stbi_png_partial = 0;
2529
-
2530
- // de-interlacing
2531
- final = (uint8 *) malloc(a->s->img_x * a->s->img_y * out_n);
2532
- for (p=0; p < 7; ++p) {
2533
- int xorig[] = { 0,4,0,2,0,1,0 };
2534
- int yorig[] = { 0,0,4,0,2,0,1 };
2535
- int xspc[] = { 8,8,4,4,2,2,1 };
2536
- int yspc[] = { 8,8,8,4,4,2,2 };
2537
- int i,j,x,y;
2538
- // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
2539
- x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
2540
- y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
2541
- if (x && y) {
2542
- if (!create_png_image_raw(a, raw, raw_len, out_n, x, y)) {
2543
- free(final);
2544
- return 0;
2545
- }
2546
- for (j=0; j < y; ++j)
2547
- for (i=0; i < x; ++i)
2548
- memcpy(final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n,
2549
- a->out + (j*x+i)*out_n, out_n);
2550
- free(a->out);
2551
- raw += (x*out_n+1)*y;
2552
- raw_len -= (x*out_n+1)*y;
2553
- }
2554
- }
2555
- a->out = final;
2556
-
2557
- stbi_png_partial = save;
2558
- return 1;
2559
- }
2560
-
2561
- static int compute_transparency(png *z, uint8 tc[3], int out_n)
2562
- {
2563
- stbi *s = z->s;
2564
- uint32 i, pixel_count = s->img_x * s->img_y;
2565
- uint8 *p = z->out;
2566
-
2567
- // compute color-based transparency, assuming we've
2568
- // already got 255 as the alpha value in the output
2569
- assert(out_n == 2 || out_n == 4);
2570
-
2571
- if (out_n == 2) {
2572
- for (i=0; i < pixel_count; ++i) {
2573
- p[1] = (p[0] == tc[0] ? 0 : 255);
2574
- p += 2;
2575
- }
2576
- } else {
2577
- for (i=0; i < pixel_count; ++i) {
2578
- if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
2579
- p[3] = 0;
2580
- p += 4;
2581
- }
2582
- }
2583
- return 1;
2584
- }
2585
-
2586
- static int expand_palette(png *a, uint8 *palette, int len, int pal_img_n)
2587
- {
2588
- uint32 i, pixel_count = a->s->img_x * a->s->img_y;
2589
- uint8 *p, *temp_out, *orig = a->out;
2590
-
2591
- p = (uint8 *) malloc(pixel_count * pal_img_n);
2592
- if (p == NULL) return e("outofmem", "Out of memory");
2593
-
2594
- // between here and free(out) below, exitting would leak
2595
- temp_out = p;
2596
-
2597
- if (pal_img_n == 3) {
2598
- for (i=0; i < pixel_count; ++i) {
2599
- int n = orig[i]*4;
2600
- p[0] = palette[n ];
2601
- p[1] = palette[n+1];
2602
- p[2] = palette[n+2];
2603
- p += 3;
2604
- }
2605
- } else {
2606
- for (i=0; i < pixel_count; ++i) {
2607
- int n = orig[i]*4;
2608
- p[0] = palette[n ];
2609
- p[1] = palette[n+1];
2610
- p[2] = palette[n+2];
2611
- p[3] = palette[n+3];
2612
- p += 4;
2613
- }
2614
- }
2615
- free(a->out);
2616
- a->out = temp_out;
2617
-
2618
- STBI_NOTUSED(len);
2619
-
2620
- return 1;
2621
- }
2622
-
2623
- static int stbi_unpremultiply_on_load = 0;
2624
- static int stbi_de_iphone_flag = 0;
2625
-
2626
- void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
2627
- {
2628
- stbi_unpremultiply_on_load = flag_true_if_should_unpremultiply;
2629
- }
2630
- void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
2631
- {
2632
- stbi_de_iphone_flag = flag_true_if_should_convert;
2633
- }
2634
-
2635
- static void stbi_de_iphone(png *z)
2636
- {
2637
- stbi *s = z->s;
2638
- uint32 i, pixel_count = s->img_x * s->img_y;
2639
- uint8 *p = z->out;
2640
-
2641
- if (s->img_out_n == 3) { // convert bgr to rgb
2642
- for (i=0; i < pixel_count; ++i) {
2643
- uint8 t = p[0];
2644
- p[0] = p[2];
2645
- p[2] = t;
2646
- p += 3;
2647
- }
2648
- } else {
2649
- assert(s->img_out_n == 4);
2650
- if (stbi_unpremultiply_on_load) {
2651
- // convert bgr to rgb and unpremultiply
2652
- for (i=0; i < pixel_count; ++i) {
2653
- uint8 a = p[3];
2654
- uint8 t = p[0];
2655
- if (a) {
2656
- p[0] = p[2] * 255 / a;
2657
- p[1] = p[1] * 255 / a;
2658
- p[2] = t * 255 / a;
2659
- } else {
2660
- p[0] = p[2];
2661
- p[2] = t;
2662
- }
2663
- p += 4;
2664
- }
2665
- } else {
2666
- // convert bgr to rgb
2667
- for (i=0; i < pixel_count; ++i) {
2668
- uint8 t = p[0];
2669
- p[0] = p[2];
2670
- p[2] = t;
2671
- p += 4;
2672
- }
2673
- }
2674
- }
2675
- }
2676
-
2677
- static int parse_png_file(png *z, int scan, int req_comp)
2678
- {
2679
- uint8 palette[1024], pal_img_n=0;
2680
- uint8 has_trans=0, tc[3];
2681
- uint32 ioff=0, idata_limit=0, i, pal_len=0;
2682
- int first=1,k,interlace=0, iphone=0;
2683
- stbi *s = z->s;
2684
-
2685
- z->expanded = NULL;
2686
- z->idata = NULL;
2687
- z->out = NULL;
2688
-
2689
- if (!check_png_header(s)) return 0;
2690
-
2691
- if (scan == SCAN_type) return 1;
2692
-
2693
- for (;;) {
2694
- chunk c = get_chunk_header(s);
2695
- switch (c.type) {
2696
- case PNG_TYPE('C','g','B','I'):
2697
- iphone = stbi_de_iphone_flag;
2698
- skip(s, c.length);
2699
- break;
2700
- case PNG_TYPE('I','H','D','R'): {
2701
- int depth,color,comp,filter;
2702
- if (!first) return e("multiple IHDR","Corrupt PNG");
2703
- first = 0;
2704
- if (c.length != 13) return e("bad IHDR len","Corrupt PNG");
2705
- s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)");
2706
- s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)");
2707
- depth = get8(s); if (depth != 8) return e("8bit only","PNG not supported: 8-bit only");
2708
- color = get8(s); if (color > 6) return e("bad ctype","Corrupt PNG");
2709
- if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG");
2710
- comp = get8(s); if (comp) return e("bad comp method","Corrupt PNG");
2711
- filter= get8(s); if (filter) return e("bad filter method","Corrupt PNG");
2712
- interlace = get8(s); if (interlace>1) return e("bad interlace method","Corrupt PNG");
2713
- if (!s->img_x || !s->img_y) return e("0-pixel image","Corrupt PNG");
2714
- if (!pal_img_n) {
2715
- s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
2716
- if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode");
2717
- if (scan == SCAN_header) return 1;
2718
- } else {
2719
- // if paletted, then pal_n is our final components, and
2720
- // img_n is # components to decompress/filter.
2721
- s->img_n = 1;
2722
- if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG");
2723
- // if SCAN_header, have to scan to see if we have a tRNS
2724
- }
2725
- break;
2726
- }
2727
-
2728
- case PNG_TYPE('P','L','T','E'): {
2729
- if (first) return e("first not IHDR", "Corrupt PNG");
2730
- if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG");
2731
- pal_len = c.length / 3;
2732
- if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG");
2733
- for (i=0; i < pal_len; ++i) {
2734
- palette[i*4+0] = get8u(s);
2735
- palette[i*4+1] = get8u(s);
2736
- palette[i*4+2] = get8u(s);
2737
- palette[i*4+3] = 255;
2738
- }
2739
- break;
2740
- }
2741
-
2742
- case PNG_TYPE('t','R','N','S'): {
2743
- if (first) return e("first not IHDR", "Corrupt PNG");
2744
- if (z->idata) return e("tRNS after IDAT","Corrupt PNG");
2745
- if (pal_img_n) {
2746
- if (scan == SCAN_header) { s->img_n = 4; return 1; }
2747
- if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG");
2748
- if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG");
2749
- pal_img_n = 4;
2750
- for (i=0; i < c.length; ++i)
2751
- palette[i*4+3] = get8u(s);
2752
- } else {
2753
- if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG");
2754
- if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG");
2755
- has_trans = 1;
2756
- for (k=0; k < s->img_n; ++k)
2757
- tc[k] = (uint8) get16(s); // non 8-bit images will be larger
2758
- }
2759
- break;
2760
- }
2761
-
2762
- case PNG_TYPE('I','D','A','T'): {
2763
- if (first) return e("first not IHDR", "Corrupt PNG");
2764
- if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG");
2765
- if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; }
2766
- if (ioff + c.length > idata_limit) {
2767
- uint8 *p;
2768
- if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
2769
- while (ioff + c.length > idata_limit)
2770
- idata_limit *= 2;
2771
- p = (uint8 *) realloc(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory");
2772
- z->idata = p;
2773
- }
2774
- if (!getn(s, z->idata+ioff,c.length)) return e("outofdata","Corrupt PNG");
2775
- ioff += c.length;
2776
- break;
2777
- }
2778
-
2779
- case PNG_TYPE('I','E','N','D'): {
2780
- uint32 raw_len;
2781
- if (first) return e("first not IHDR", "Corrupt PNG");
2782
- if (scan != SCAN_load) return 1;
2783
- if (z->idata == NULL) return e("no IDAT","Corrupt PNG");
2784
- z->expanded = (uint8 *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !iphone);
2785
- if (z->expanded == NULL) return 0; // zlib should set error
2786
- free(z->idata); z->idata = NULL;
2787
- if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
2788
- s->img_out_n = s->img_n+1;
2789
- else
2790
- s->img_out_n = s->img_n;
2791
- if (!create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0;
2792
- if (has_trans)
2793
- if (!compute_transparency(z, tc, s->img_out_n)) return 0;
2794
- if (iphone && s->img_out_n > 2)
2795
- stbi_de_iphone(z);
2796
- if (pal_img_n) {
2797
- // pal_img_n == 3 or 4
2798
- s->img_n = pal_img_n; // record the actual colors we had
2799
- s->img_out_n = pal_img_n;
2800
- if (req_comp >= 3) s->img_out_n = req_comp;
2801
- if (!expand_palette(z, palette, pal_len, s->img_out_n))
2802
- return 0;
2803
- }
2804
- free(z->expanded); z->expanded = NULL;
2805
- return 1;
2806
- }
2807
-
2808
- default:
2809
- // if critical, fail
2810
- if (first) return e("first not IHDR", "Corrupt PNG");
2811
- if ((c.type & (1 << 29)) == 0) {
2812
- #ifndef STBI_NO_FAILURE_STRINGS
2813
- // not threadsafe
2814
- static char invalid_chunk[] = "XXXX chunk not known";
2815
- invalid_chunk[0] = (uint8) (c.type >> 24);
2816
- invalid_chunk[1] = (uint8) (c.type >> 16);
2817
- invalid_chunk[2] = (uint8) (c.type >> 8);
2818
- invalid_chunk[3] = (uint8) (c.type >> 0);
2819
- #endif
2820
- return e(invalid_chunk, "PNG not supported: unknown chunk type");
2821
- }
2822
- skip(s, c.length);
2823
- break;
2824
- }
2825
- // end of chunk, read and skip CRC
2826
- get32(s);
2827
- }
2828
- }
2829
-
2830
- static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp)
2831
- {
2832
- unsigned char *result=NULL;
2833
- if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error");
2834
- if (parse_png_file(p, SCAN_load, req_comp)) {
2835
- result = p->out;
2836
- p->out = NULL;
2837
- if (req_comp && req_comp != p->s->img_out_n) {
2838
- result = convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
2839
- p->s->img_out_n = req_comp;
2840
- if (result == NULL) return result;
2841
- }
2842
- *x = p->s->img_x;
2843
- *y = p->s->img_y;
2844
- if (n) *n = p->s->img_n;
2845
- }
2846
- free(p->out); p->out = NULL;
2847
- free(p->expanded); p->expanded = NULL;
2848
- free(p->idata); p->idata = NULL;
2849
-
2850
- return result;
2851
- }
2852
-
2853
- static unsigned char *stbi_png_load(stbi *s, int *x, int *y, int *comp, int req_comp)
2854
- {
2855
- png p;
2856
- p.s = s;
2857
- return do_png(&p, x,y,comp,req_comp);
2858
- }
2859
-
2860
- static int stbi_png_test(stbi *s)
2861
- {
2862
- int r;
2863
- r = check_png_header(s);
2864
- stbi_rewind(s);
2865
- return r;
2866
- }
2867
-
2868
- static int stbi_png_info_raw(png *p, int *x, int *y, int *comp)
2869
- {
2870
- if (!parse_png_file(p, SCAN_header, 0)) {
2871
- stbi_rewind( p->s );
2872
- return 0;
2873
- }
2874
- if (x) *x = p->s->img_x;
2875
- if (y) *y = p->s->img_y;
2876
- if (comp) *comp = p->s->img_n;
2877
- return 1;
2878
- }
2879
-
2880
- static int stbi_png_info(stbi *s, int *x, int *y, int *comp)
2881
- {
2882
- png p;
2883
- p.s = s;
2884
- return stbi_png_info_raw(&p, x, y, comp);
2885
- }
2886
-
2887
- // Microsoft/Windows BMP image
2888
-
2889
- static int bmp_test(stbi *s)
2890
- {
2891
- int sz;
2892
- if (get8(s) != 'B') return 0;
2893
- if (get8(s) != 'M') return 0;
2894
- get32le(s); // discard filesize
2895
- get16le(s); // discard reserved
2896
- get16le(s); // discard reserved
2897
- get32le(s); // discard data offset
2898
- sz = get32le(s);
2899
- if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1;
2900
- return 0;
2901
- }
2902
-
2903
- static int stbi_bmp_test(stbi *s)
2904
- {
2905
- int r = bmp_test(s);
2906
- stbi_rewind(s);
2907
- return r;
2908
- }
2909
-
2910
-
2911
- // returns 0..31 for the highest set bit
2912
- static int high_bit(unsigned int z)
2913
- {
2914
- int n=0;
2915
- if (z == 0) return -1;
2916
- if (z >= 0x10000) n += 16, z >>= 16;
2917
- if (z >= 0x00100) n += 8, z >>= 8;
2918
- if (z >= 0x00010) n += 4, z >>= 4;
2919
- if (z >= 0x00004) n += 2, z >>= 2;
2920
- if (z >= 0x00002) n += 1, z >>= 1;
2921
- return n;
2922
- }
2923
-
2924
- static int bitcount(unsigned int a)
2925
- {
2926
- a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
2927
- a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
2928
- a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
2929
- a = (a + (a >> 8)); // max 16 per 8 bits
2930
- a = (a + (a >> 16)); // max 32 per 8 bits
2931
- return a & 0xff;
2932
- }
2933
-
2934
- static int shiftsigned(int v, int shift, int bits)
2935
- {
2936
- int result;
2937
- int z=0;
2938
-
2939
- if (shift < 0) v <<= -shift;
2940
- else v >>= shift;
2941
- result = v;
2942
-
2943
- z = bits;
2944
- while (z < 8) {
2945
- result += v >> z;
2946
- z += bits;
2947
- }
2948
- return result;
2949
- }
2950
-
2951
- static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp)
2952
- {
2953
- uint8 *out;
2954
- unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0;
2955
- stbi_uc pal[256][4];
2956
- int psize=0,i,j,compress=0,width;
2957
- int bpp, flip_vertically, pad, target, offset, hsz;
2958
- if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP");
2959
- get32le(s); // discard filesize
2960
- get16le(s); // discard reserved
2961
- get16le(s); // discard reserved
2962
- offset = get32le(s);
2963
- hsz = get32le(s);
2964
- if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown");
2965
- if (hsz == 12) {
2966
- s->img_x = get16le(s);
2967
- s->img_y = get16le(s);
2968
- } else {
2969
- s->img_x = get32le(s);
2970
- s->img_y = get32le(s);
2971
- }
2972
- if (get16le(s) != 1) return epuc("bad BMP", "bad BMP");
2973
- bpp = get16le(s);
2974
- if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit");
2975
- flip_vertically = ((int) s->img_y) > 0;
2976
- s->img_y = abs((int) s->img_y);
2977
- if (hsz == 12) {
2978
- if (bpp < 24)
2979
- psize = (offset - 14 - 24) / 3;
2980
- } else {
2981
- compress = get32le(s);
2982
- if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE");
2983
- get32le(s); // discard sizeof
2984
- get32le(s); // discard hres
2985
- get32le(s); // discard vres
2986
- get32le(s); // discard colorsused
2987
- get32le(s); // discard max important
2988
- if (hsz == 40 || hsz == 56) {
2989
- if (hsz == 56) {
2990
- get32le(s);
2991
- get32le(s);
2992
- get32le(s);
2993
- get32le(s);
2994
- }
2995
- if (bpp == 16 || bpp == 32) {
2996
- mr = mg = mb = 0;
2997
- if (compress == 0) {
2998
- if (bpp == 32) {
2999
- mr = 0xffu << 16;
3000
- mg = 0xffu << 8;
3001
- mb = 0xffu << 0;
3002
- ma = 0xffu << 24;
3003
- fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255
3004
- } else {
3005
- mr = 31u << 10;
3006
- mg = 31u << 5;
3007
- mb = 31u << 0;
3008
- }
3009
- } else if (compress == 3) {
3010
- mr = get32le(s);
3011
- mg = get32le(s);
3012
- mb = get32le(s);
3013
- // not documented, but generated by photoshop and handled by mspaint
3014
- if (mr == mg && mg == mb) {
3015
- // ?!?!?
3016
- return epuc("bad BMP", "bad BMP");
3017
- }
3018
- } else
3019
- return epuc("bad BMP", "bad BMP");
3020
- }
3021
- } else {
3022
- assert(hsz == 108);
3023
- mr = get32le(s);
3024
- mg = get32le(s);
3025
- mb = get32le(s);
3026
- ma = get32le(s);
3027
- get32le(s); // discard color space
3028
- for (i=0; i < 12; ++i)
3029
- get32le(s); // discard color space parameters
3030
- }
3031
- if (bpp < 16)
3032
- psize = (offset - 14 - hsz) >> 2;
3033
- }
3034
- s->img_n = ma ? 4 : 3;
3035
- if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
3036
- target = req_comp;
3037
- else
3038
- target = s->img_n; // if they want monochrome, we'll post-convert
3039
- out = (stbi_uc *) malloc(target * s->img_x * s->img_y);
3040
- if (!out) return epuc("outofmem", "Out of memory");
3041
- if (bpp < 16) {
3042
- int z=0;
3043
- if (psize == 0 || psize > 256) { free(out); return epuc("invalid", "Corrupt BMP"); }
3044
- for (i=0; i < psize; ++i) {
3045
- pal[i][2] = get8u(s);
3046
- pal[i][1] = get8u(s);
3047
- pal[i][0] = get8u(s);
3048
- if (hsz != 12) get8(s);
3049
- pal[i][3] = 255;
3050
- }
3051
- skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
3052
- if (bpp == 4) width = (s->img_x + 1) >> 1;
3053
- else if (bpp == 8) width = s->img_x;
3054
- else { free(out); return epuc("bad bpp", "Corrupt BMP"); }
3055
- pad = (-width)&3;
3056
- for (j=0; j < (int) s->img_y; ++j) {
3057
- for (i=0; i < (int) s->img_x; i += 2) {
3058
- int v=get8(s),v2=0;
3059
- if (bpp == 4) {
3060
- v2 = v & 15;
3061
- v >>= 4;
3062
- }
3063
- out[z++] = pal[v][0];
3064
- out[z++] = pal[v][1];
3065
- out[z++] = pal[v][2];
3066
- if (target == 4) out[z++] = 255;
3067
- if (i+1 == (int) s->img_x) break;
3068
- v = (bpp == 8) ? get8(s) : v2;
3069
- out[z++] = pal[v][0];
3070
- out[z++] = pal[v][1];
3071
- out[z++] = pal[v][2];
3072
- if (target == 4) out[z++] = 255;
3073
- }
3074
- skip(s, pad);
3075
- }
3076
- } else {
3077
- int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
3078
- int z = 0;
3079
- int easy=0;
3080
- skip(s, offset - 14 - hsz);
3081
- if (bpp == 24) width = 3 * s->img_x;
3082
- else if (bpp == 16) width = 2*s->img_x;
3083
- else /* bpp = 32 and pad = 0 */ width=0;
3084
- pad = (-width) & 3;
3085
- if (bpp == 24) {
3086
- easy = 1;
3087
- } else if (bpp == 32) {
3088
- if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
3089
- easy = 2;
3090
- }
3091
- if (!easy) {
3092
- if (!mr || !mg || !mb) { free(out); return epuc("bad masks", "Corrupt BMP"); }
3093
- // right shift amt to put high bit in position #7
3094
- rshift = high_bit(mr)-7; rcount = bitcount(mr);
3095
- gshift = high_bit(mg)-7; gcount = bitcount(mr);
3096
- bshift = high_bit(mb)-7; bcount = bitcount(mr);
3097
- ashift = high_bit(ma)-7; acount = bitcount(mr);
3098
- }
3099
- for (j=0; j < (int) s->img_y; ++j) {
3100
- if (easy) {
3101
- for (i=0; i < (int) s->img_x; ++i) {
3102
- int a;
3103
- out[z+2] = get8u(s);
3104
- out[z+1] = get8u(s);
3105
- out[z+0] = get8u(s);
3106
- z += 3;
3107
- a = (easy == 2 ? get8(s) : 255);
3108
- if (target == 4) out[z++] = (uint8) a;
3109
- }
3110
- } else {
3111
- for (i=0; i < (int) s->img_x; ++i) {
3112
- uint32 v = (bpp == 16 ? get16le(s) : get32le(s));
3113
- int a;
3114
- out[z++] = (uint8) shiftsigned(v & mr, rshift, rcount);
3115
- out[z++] = (uint8) shiftsigned(v & mg, gshift, gcount);
3116
- out[z++] = (uint8) shiftsigned(v & mb, bshift, bcount);
3117
- a = (ma ? shiftsigned(v & ma, ashift, acount) : 255);
3118
- if (target == 4) out[z++] = (uint8) a;
3119
- }
3120
- }
3121
- skip(s, pad);
3122
- }
3123
- }
3124
- if (flip_vertically) {
3125
- stbi_uc t;
3126
- for (j=0; j < (int) s->img_y>>1; ++j) {
3127
- stbi_uc *p1 = out + j *s->img_x*target;
3128
- stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
3129
- for (i=0; i < (int) s->img_x*target; ++i) {
3130
- t = p1[i], p1[i] = p2[i], p2[i] = t;
3131
- }
3132
- }
3133
- }
3134
-
3135
- if (req_comp && req_comp != target) {
3136
- out = convert_format(out, target, req_comp, s->img_x, s->img_y);
3137
- if (out == NULL) return out; // convert_format frees input on failure
3138
- }
3139
-
3140
- *x = s->img_x;
3141
- *y = s->img_y;
3142
- if (comp) *comp = s->img_n;
3143
- return out;
3144
- }
3145
-
3146
- static stbi_uc *stbi_bmp_load(stbi *s,int *x, int *y, int *comp, int req_comp)
3147
- {
3148
- return bmp_load(s, x,y,comp,req_comp);
3149
- }
3150
-
3151
-
3152
- // Targa Truevision - TGA
3153
- // by Jonathan Dummer
3154
-
3155
- static int tga_info(stbi *s, int *x, int *y, int *comp)
3156
- {
3157
- int tga_w, tga_h, tga_comp;
3158
- int sz;
3159
- get8u(s); // discard Offset
3160
- sz = get8u(s); // color type
3161
- if( sz > 1 ) {
3162
- stbi_rewind(s);
3163
- return 0; // only RGB or indexed allowed
3164
- }
3165
- sz = get8u(s); // image type
3166
- // only RGB or grey allowed, +/- RLE
3167
- if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;
3168
- skip(s,9);
3169
- tga_w = get16le(s);
3170
- if( tga_w < 1 ) {
3171
- stbi_rewind(s);
3172
- return 0; // test width
3173
- }
3174
- tga_h = get16le(s);
3175
- if( tga_h < 1 ) {
3176
- stbi_rewind(s);
3177
- return 0; // test height
3178
- }
3179
- sz = get8(s); // bits per pixel
3180
- // only RGB or RGBA or grey allowed
3181
- if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
3182
- stbi_rewind(s);
3183
- return 0;
3184
- }
3185
- tga_comp = sz;
3186
- if (x) *x = tga_w;
3187
- if (y) *y = tga_h;
3188
- if (comp) *comp = tga_comp / 8;
3189
- return 1; // seems to have passed everything
3190
- }
3191
-
3192
- int stbi_tga_info(stbi *s, int *x, int *y, int *comp)
3193
- {
3194
- return tga_info(s, x, y, comp);
3195
- }
3196
-
3197
- static int tga_test(stbi *s)
3198
- {
3199
- int sz;
3200
- get8u(s); // discard Offset
3201
- sz = get8u(s); // color type
3202
- if ( sz > 1 ) return 0; // only RGB or indexed allowed
3203
- sz = get8u(s); // image type
3204
- if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE
3205
- get16(s); // discard palette start
3206
- get16(s); // discard palette length
3207
- get8(s); // discard bits per palette color entry
3208
- get16(s); // discard x origin
3209
- get16(s); // discard y origin
3210
- if ( get16(s) < 1 ) return 0; // test width
3211
- if ( get16(s) < 1 ) return 0; // test height
3212
- sz = get8(s); // bits per pixel
3213
- if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0; // only RGB or RGBA or grey allowed
3214
- return 1; // seems to have passed everything
3215
- }
3216
-
3217
- static int stbi_tga_test(stbi *s)
3218
- {
3219
- int res = tga_test(s);
3220
- stbi_rewind(s);
3221
- return res;
3222
- }
3223
-
3224
- static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3225
- {
3226
- // read in the TGA header stuff
3227
- int tga_offset = get8u(s);
3228
- int tga_indexed = get8u(s);
3229
- int tga_image_type = get8u(s);
3230
- int tga_is_RLE = 0;
3231
- int tga_palette_start = get16le(s);
3232
- int tga_palette_len = get16le(s);
3233
- int tga_palette_bits = get8u(s);
3234
- int tga_x_origin = get16le(s);
3235
- int tga_y_origin = get16le(s);
3236
- int tga_width = get16le(s);
3237
- int tga_height = get16le(s);
3238
- int tga_bits_per_pixel = get8u(s);
3239
- int tga_inverted = get8u(s);
3240
- // image data
3241
- unsigned char *tga_data;
3242
- unsigned char *tga_palette = NULL;
3243
- int i, j;
3244
- unsigned char raw_data[4];
3245
- unsigned char trans_data[4];
3246
- int RLE_count = 0;
3247
- int RLE_repeating = 0;
3248
- int read_next_pixel = 1;
3249
-
3250
- // do a tiny bit of precessing
3251
- if ( tga_image_type >= 8 )
3252
- {
3253
- tga_image_type -= 8;
3254
- tga_is_RLE = 1;
3255
- }
3256
- /* int tga_alpha_bits = tga_inverted & 15; */
3257
- tga_inverted = 1 - ((tga_inverted >> 5) & 1);
3258
-
3259
- // error check
3260
- if ( //(tga_indexed) ||
3261
- (tga_width < 1) || (tga_height < 1) ||
3262
- (tga_image_type < 1) || (tga_image_type > 3) ||
3263
- ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
3264
- (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
3265
- )
3266
- {
3267
- return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA
3268
- }
3269
-
3270
- // If I'm paletted, then I'll use the number of bits from the palette
3271
- if ( tga_indexed )
3272
- {
3273
- tga_bits_per_pixel = tga_palette_bits;
3274
- }
3275
-
3276
- // tga info
3277
- *x = tga_width;
3278
- *y = tga_height;
3279
- if ( (req_comp < 1) || (req_comp > 4) )
3280
- {
3281
- // just use whatever the file was
3282
- req_comp = tga_bits_per_pixel / 8;
3283
- *comp = req_comp;
3284
- } else
3285
- {
3286
- // force a new number of components
3287
- *comp = tga_bits_per_pixel/8;
3288
- }
3289
- tga_data = (unsigned char*)malloc( tga_width * tga_height * req_comp );
3290
- if (!tga_data) return epuc("outofmem", "Out of memory");
3291
-
3292
- // skip to the data's starting position (offset usually = 0)
3293
- skip(s, tga_offset );
3294
- // do I need to load a palette?
3295
- if ( tga_indexed )
3296
- {
3297
- // any data to skip? (offset usually = 0)
3298
- skip(s, tga_palette_start );
3299
- // load the palette
3300
- tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 );
3301
- if (!tga_palette) return epuc("outofmem", "Out of memory");
3302
- if (!getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
3303
- free(tga_data);
3304
- free(tga_palette);
3305
- return epuc("bad palette", "Corrupt TGA");
3306
- }
3307
- }
3308
- // load the data
3309
- trans_data[0] = trans_data[1] = trans_data[2] = trans_data[3] = 0;
3310
- for (i=0; i < tga_width * tga_height; ++i)
3311
- {
3312
- // if I'm in RLE mode, do I need to get a RLE chunk?
3313
- if ( tga_is_RLE )
3314
- {
3315
- if ( RLE_count == 0 )
3316
- {
3317
- // yep, get the next byte as a RLE command
3318
- int RLE_cmd = get8u(s);
3319
- RLE_count = 1 + (RLE_cmd & 127);
3320
- RLE_repeating = RLE_cmd >> 7;
3321
- read_next_pixel = 1;
3322
- } else if ( !RLE_repeating )
3323
- {
3324
- read_next_pixel = 1;
3325
- }
3326
- } else
3327
- {
3328
- read_next_pixel = 1;
3329
- }
3330
- // OK, if I need to read a pixel, do it now
3331
- if ( read_next_pixel )
3332
- {
3333
- // load however much data we did have
3334
- if ( tga_indexed )
3335
- {
3336
- // read in 1 byte, then perform the lookup
3337
- int pal_idx = get8u(s);
3338
- if ( pal_idx >= tga_palette_len )
3339
- {
3340
- // invalid index
3341
- pal_idx = 0;
3342
- }
3343
- pal_idx *= tga_bits_per_pixel / 8;
3344
- for (j = 0; j*8 < tga_bits_per_pixel; ++j)
3345
- {
3346
- raw_data[j] = tga_palette[pal_idx+j];
3347
- }
3348
- } else
3349
- {
3350
- // read in the data raw
3351
- for (j = 0; j*8 < tga_bits_per_pixel; ++j)
3352
- {
3353
- raw_data[j] = get8u(s);
3354
- }
3355
- }
3356
- // convert raw to the intermediate format
3357
- switch (tga_bits_per_pixel)
3358
- {
3359
- case 8:
3360
- // Luminous => RGBA
3361
- trans_data[0] = raw_data[0];
3362
- trans_data[1] = raw_data[0];
3363
- trans_data[2] = raw_data[0];
3364
- trans_data[3] = 255;
3365
- break;
3366
- case 16:
3367
- // Luminous,Alpha => RGBA
3368
- trans_data[0] = raw_data[0];
3369
- trans_data[1] = raw_data[0];
3370
- trans_data[2] = raw_data[0];
3371
- trans_data[3] = raw_data[1];
3372
- break;
3373
- case 24:
3374
- // BGR => RGBA
3375
- trans_data[0] = raw_data[2];
3376
- trans_data[1] = raw_data[1];
3377
- trans_data[2] = raw_data[0];
3378
- trans_data[3] = 255;
3379
- break;
3380
- case 32:
3381
- // BGRA => RGBA
3382
- trans_data[0] = raw_data[2];
3383
- trans_data[1] = raw_data[1];
3384
- trans_data[2] = raw_data[0];
3385
- trans_data[3] = raw_data[3];
3386
- break;
3387
- }
3388
- // clear the reading flag for the next pixel
3389
- read_next_pixel = 0;
3390
- } // end of reading a pixel
3391
- // convert to final format
3392
- switch (req_comp)
3393
- {
3394
- case 1:
3395
- // RGBA => Luminance
3396
- tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]);
3397
- break;
3398
- case 2:
3399
- // RGBA => Luminance,Alpha
3400
- tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]);
3401
- tga_data[i*req_comp+1] = trans_data[3];
3402
- break;
3403
- case 3:
3404
- // RGBA => RGB
3405
- tga_data[i*req_comp+0] = trans_data[0];
3406
- tga_data[i*req_comp+1] = trans_data[1];
3407
- tga_data[i*req_comp+2] = trans_data[2];
3408
- break;
3409
- case 4:
3410
- // RGBA => RGBA
3411
- tga_data[i*req_comp+0] = trans_data[0];
3412
- tga_data[i*req_comp+1] = trans_data[1];
3413
- tga_data[i*req_comp+2] = trans_data[2];
3414
- tga_data[i*req_comp+3] = trans_data[3];
3415
- break;
3416
- }
3417
- // in case we're in RLE mode, keep counting down
3418
- --RLE_count;
3419
- }
3420
- // do I need to invert the image?
3421
- if ( tga_inverted )
3422
- {
3423
- for (j = 0; j*2 < tga_height; ++j)
3424
- {
3425
- int index1 = j * tga_width * req_comp;
3426
- int index2 = (tga_height - 1 - j) * tga_width * req_comp;
3427
- for (i = tga_width * req_comp; i > 0; --i)
3428
- {
3429
- unsigned char temp = tga_data[index1];
3430
- tga_data[index1] = tga_data[index2];
3431
- tga_data[index2] = temp;
3432
- ++index1;
3433
- ++index2;
3434
- }
3435
- }
3436
- }
3437
- // clear my palette, if I had one
3438
- if ( tga_palette != NULL )
3439
- {
3440
- free( tga_palette );
3441
- }
3442
- // the things I do to get rid of an error message, and yet keep
3443
- // Microsoft's C compilers happy... [8^(
3444
- tga_palette_start = tga_palette_len = tga_palette_bits =
3445
- tga_x_origin = tga_y_origin = 0;
3446
- // OK, done
3447
- return tga_data;
3448
- }
3449
-
3450
- static stbi_uc *stbi_tga_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3451
- {
3452
- return tga_load(s,x,y,comp,req_comp);
3453
- }
3454
-
3455
-
3456
- // *************************************************************************************************
3457
- // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
3458
-
3459
- static int psd_test(stbi *s)
3460
- {
3461
- if (get32(s) != 0x38425053) return 0; // "8BPS"
3462
- else return 1;
3463
- }
3464
-
3465
- static int stbi_psd_test(stbi *s)
3466
- {
3467
- int r = psd_test(s);
3468
- stbi_rewind(s);
3469
- return r;
3470
- }
3471
-
3472
- static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3473
- {
3474
- int pixelCount;
3475
- int channelCount, compression;
3476
- int channel, i, count, len;
3477
- int w,h;
3478
- uint8 *out;
3479
-
3480
- // Check identifier
3481
- if (get32(s) != 0x38425053) // "8BPS"
3482
- return epuc("not PSD", "Corrupt PSD image");
3483
-
3484
- // Check file type version.
3485
- if (get16(s) != 1)
3486
- return epuc("wrong version", "Unsupported version of PSD image");
3487
-
3488
- // Skip 6 reserved bytes.
3489
- skip(s, 6 );
3490
-
3491
- // Read the number of channels (R, G, B, A, etc).
3492
- channelCount = get16(s);
3493
- if (channelCount < 0 || channelCount > 16)
3494
- return epuc("wrong channel count", "Unsupported number of channels in PSD image");
3495
-
3496
- // Read the rows and columns of the image.
3497
- h = get32(s);
3498
- w = get32(s);
3499
-
3500
- // Make sure the depth is 8 bits.
3501
- if (get16(s) != 8)
3502
- return epuc("unsupported bit depth", "PSD bit depth is not 8 bit");
3503
-
3504
- // Make sure the color mode is RGB.
3505
- // Valid options are:
3506
- // 0: Bitmap
3507
- // 1: Grayscale
3508
- // 2: Indexed color
3509
- // 3: RGB color
3510
- // 4: CMYK color
3511
- // 7: Multichannel
3512
- // 8: Duotone
3513
- // 9: Lab color
3514
- if (get16(s) != 3)
3515
- return epuc("wrong color format", "PSD is not in RGB color format");
3516
-
3517
- // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.)
3518
- skip(s,get32(s) );
3519
-
3520
- // Skip the image resources. (resolution, pen tool paths, etc)
3521
- skip(s, get32(s) );
3522
-
3523
- // Skip the reserved data.
3524
- skip(s, get32(s) );
3525
-
3526
- // Find out if the data is compressed.
3527
- // Known values:
3528
- // 0: no compression
3529
- // 1: RLE compressed
3530
- compression = get16(s);
3531
- if (compression > 1)
3532
- return epuc("bad compression", "PSD has an unknown compression format");
3533
-
3534
- // Create the destination image.
3535
- out = (stbi_uc *) malloc(4 * w*h);
3536
- if (!out) return epuc("outofmem", "Out of memory");
3537
- pixelCount = w*h;
3538
-
3539
- // Initialize the data to zero.
3540
- //memset( out, 0, pixelCount * 4 );
3541
-
3542
- // Finally, the image data.
3543
- if (compression) {
3544
- // RLE as used by .PSD and .TIFF
3545
- // Loop until you get the number of unpacked bytes you are expecting:
3546
- // Read the next source byte into n.
3547
- // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
3548
- // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
3549
- // Else if n is 128, noop.
3550
- // Endloop
3551
-
3552
- // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,
3553
- // which we're going to just skip.
3554
- skip(s, h * channelCount * 2 );
3555
-
3556
- // Read the RLE data by channel.
3557
- for (channel = 0; channel < 4; channel++) {
3558
- uint8 *p;
3559
-
3560
- p = out+channel;
3561
- if (channel >= channelCount) {
3562
- // Fill this channel with default data.
3563
- for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;
3564
- } else {
3565
- // Read the RLE data.
3566
- count = 0;
3567
- while (count < pixelCount) {
3568
- len = get8(s);
3569
- if (len == 128) {
3570
- // No-op.
3571
- } else if (len < 128) {
3572
- // Copy next len+1 bytes literally.
3573
- len++;
3574
- count += len;
3575
- while (len) {
3576
- *p = get8u(s);
3577
- p += 4;
3578
- len--;
3579
- }
3580
- } else if (len > 128) {
3581
- uint8 val;
3582
- // Next -len+1 bytes in the dest are replicated from next source byte.
3583
- // (Interpret len as a negative 8-bit int.)
3584
- len ^= 0x0FF;
3585
- len += 2;
3586
- val = get8u(s);
3587
- count += len;
3588
- while (len) {
3589
- *p = val;
3590
- p += 4;
3591
- len--;
3592
- }
3593
- }
3594
- }
3595
- }
3596
- }
3597
-
3598
- } else {
3599
- // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...)
3600
- // where each channel consists of an 8-bit value for each pixel in the image.
3601
-
3602
- // Read the data by channel.
3603
- for (channel = 0; channel < 4; channel++) {
3604
- uint8 *p;
3605
-
3606
- p = out + channel;
3607
- if (channel > channelCount) {
3608
- // Fill this channel with default data.
3609
- for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;
3610
- } else {
3611
- // Read the data.
3612
- for (i = 0; i < pixelCount; i++)
3613
- *p = get8u(s), p += 4;
3614
- }
3615
- }
3616
- }
3617
-
3618
- if (req_comp && req_comp != 4) {
3619
- out = convert_format(out, 4, req_comp, w, h);
3620
- if (out == NULL) return out; // convert_format frees input on failure
3621
- }
3622
-
3623
- if (comp) *comp = channelCount;
3624
- *y = h;
3625
- *x = w;
3626
-
3627
- return out;
3628
- }
3629
-
3630
- static stbi_uc *stbi_psd_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3631
- {
3632
- return psd_load(s,x,y,comp,req_comp);
3633
- }
3634
-
3635
- // *************************************************************************************************
3636
- // Softimage PIC loader
3637
- // by Tom Seddon
3638
- //
3639
- // See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
3640
- // See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
3641
-
3642
- static int pic_is4(stbi *s,const char *str)
3643
- {
3644
- int i;
3645
- for (i=0; i<4; ++i)
3646
- if (get8(s) != (stbi_uc)str[i])
3647
- return 0;
3648
-
3649
- return 1;
3650
- }
3651
-
3652
- static int pic_test(stbi *s)
3653
- {
3654
- int i;
3655
-
3656
- if (!pic_is4(s,"\x53\x80\xF6\x34"))
3657
- return 0;
3658
-
3659
- for(i=0;i<84;++i)
3660
- get8(s);
3661
-
3662
- if (!pic_is4(s,"PICT"))
3663
- return 0;
3664
-
3665
- return 1;
3666
- }
3667
-
3668
- typedef struct
3669
- {
3670
- stbi_uc size,type,channel;
3671
- } pic_packet_t;
3672
-
3673
- static stbi_uc *pic_readval(stbi *s, int channel, stbi_uc *dest)
3674
- {
3675
- int mask=0x80, i;
3676
-
3677
- for (i=0; i<4; ++i, mask>>=1) {
3678
- if (channel & mask) {
3679
- if (at_eof(s)) return epuc("bad file","PIC file too short");
3680
- dest[i]=get8u(s);
3681
- }
3682
- }
3683
-
3684
- return dest;
3685
- }
3686
-
3687
- static void pic_copyval(int channel,stbi_uc *dest,const stbi_uc *src)
3688
- {
3689
- int mask=0x80,i;
3690
-
3691
- for (i=0;i<4; ++i, mask>>=1)
3692
- if (channel&mask)
3693
- dest[i]=src[i];
3694
- }
3695
-
3696
- static stbi_uc *pic_load2(stbi *s,int width,int height,int *comp, stbi_uc *result)
3697
- {
3698
- int act_comp=0,num_packets=0,y,chained;
3699
- pic_packet_t packets[10];
3700
-
3701
- // this will (should...) cater for even some bizarre stuff like having data
3702
- // for the same channel in multiple packets.
3703
- do {
3704
- pic_packet_t *packet;
3705
-
3706
- if (num_packets==sizeof(packets)/sizeof(packets[0]))
3707
- return epuc("bad format","too many packets");
3708
-
3709
- packet = &packets[num_packets++];
3710
-
3711
- chained = get8(s);
3712
- packet->size = get8u(s);
3713
- packet->type = get8u(s);
3714
- packet->channel = get8u(s);
3715
-
3716
- act_comp |= packet->channel;
3717
-
3718
- if (at_eof(s)) return epuc("bad file","file too short (reading packets)");
3719
- if (packet->size != 8) return epuc("bad format","packet isn't 8bpp");
3720
- } while (chained);
3721
-
3722
- *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
3723
-
3724
- for(y=0; y<height; ++y) {
3725
- int packet_idx;
3726
-
3727
- for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
3728
- pic_packet_t *packet = &packets[packet_idx];
3729
- stbi_uc *dest = result+y*width*4;
3730
-
3731
- switch (packet->type) {
3732
- default:
3733
- return epuc("bad format","packet has bad compression type");
3734
-
3735
- case 0: {//uncompressed
3736
- int x;
3737
-
3738
- for(x=0;x<width;++x, dest+=4)
3739
- if (!pic_readval(s,packet->channel,dest))
3740
- return 0;
3741
- break;
3742
- }
3743
-
3744
- case 1://Pure RLE
3745
- {
3746
- int left=width, i;
3747
-
3748
- while (left>0) {
3749
- stbi_uc count,value[4];
3750
-
3751
- count=get8u(s);
3752
- if (at_eof(s)) return epuc("bad file","file too short (pure read count)");
3753
-
3754
- if (count > left)
3755
- count = (uint8) left;
3756
-
3757
- if (!pic_readval(s,packet->channel,value)) return 0;
3758
-
3759
- for(i=0; i<count; ++i,dest+=4)
3760
- pic_copyval(packet->channel,dest,value);
3761
- left -= count;
3762
- }
3763
- }
3764
- break;
3765
-
3766
- case 2: {//Mixed RLE
3767
- int left=width;
3768
- while (left>0) {
3769
- int count = get8(s), i;
3770
- if (at_eof(s)) return epuc("bad file","file too short (mixed read count)");
3771
-
3772
- if (count >= 128) { // Repeated
3773
- stbi_uc value[4];
3774
- int i;
3775
-
3776
- if (count==128)
3777
- count = get16(s);
3778
- else
3779
- count -= 127;
3780
- if (count > left)
3781
- return epuc("bad file","scanline overrun");
3782
-
3783
- if (!pic_readval(s,packet->channel,value))
3784
- return 0;
3785
-
3786
- for(i=0;i<count;++i, dest += 4)
3787
- pic_copyval(packet->channel,dest,value);
3788
- } else { // Raw
3789
- ++count;
3790
- if (count>left) return epuc("bad file","scanline overrun");
3791
-
3792
- for(i=0;i<count;++i, dest+=4)
3793
- if (!pic_readval(s,packet->channel,dest))
3794
- return 0;
3795
- }
3796
- left-=count;
3797
- }
3798
- break;
3799
- }
3800
- }
3801
- }
3802
- }
3803
-
3804
- return result;
3805
- }
3806
-
3807
- static stbi_uc *pic_load(stbi *s,int *px,int *py,int *comp,int req_comp)
3808
- {
3809
- stbi_uc *result;
3810
- int i, x,y;
3811
-
3812
- for (i=0; i<92; ++i)
3813
- get8(s);
3814
-
3815
- x = get16(s);
3816
- y = get16(s);
3817
- if (at_eof(s)) return epuc("bad file","file too short (pic header)");
3818
- if ((1 << 28) / x < y) return epuc("too large", "Image too large to decode");
3819
-
3820
- get32(s); //skip `ratio'
3821
- get16(s); //skip `fields'
3822
- get16(s); //skip `pad'
3823
-
3824
- // intermediate buffer is RGBA
3825
- result = (stbi_uc *) malloc(x*y*4);
3826
- memset(result, 0xff, x*y*4);
3827
-
3828
- if (!pic_load2(s,x,y,comp, result)) {
3829
- free(result);
3830
- result=0;
3831
- }
3832
- *px = x;
3833
- *py = y;
3834
- if (req_comp == 0) req_comp = *comp;
3835
- result=convert_format(result,4,req_comp,x,y);
3836
-
3837
- return result;
3838
- }
3839
-
3840
- static int stbi_pic_test(stbi *s)
3841
- {
3842
- int r = pic_test(s);
3843
- stbi_rewind(s);
3844
- return r;
3845
- }
3846
-
3847
- static stbi_uc *stbi_pic_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3848
- {
3849
- return pic_load(s,x,y,comp,req_comp);
3850
- }
3851
-
3852
- // *************************************************************************************************
3853
- // GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
3854
- typedef struct stbi_gif_lzw_struct {
3855
- int16 prefix;
3856
- uint8 first;
3857
- uint8 suffix;
3858
- } stbi_gif_lzw;
3859
-
3860
- typedef struct stbi_gif_struct
3861
- {
3862
- int w,h;
3863
- stbi_uc *out; // output buffer (always 4 components)
3864
- int flags, bgindex, ratio, transparent, eflags;
3865
- uint8 pal[256][4];
3866
- uint8 lpal[256][4];
3867
- stbi_gif_lzw codes[4096];
3868
- uint8 *color_table;
3869
- int parse, step;
3870
- int lflags;
3871
- int start_x, start_y;
3872
- int max_x, max_y;
3873
- int cur_x, cur_y;
3874
- int line_size;
3875
- } stbi_gif;
3876
-
3877
- static int gif_test(stbi *s)
3878
- {
3879
- int sz;
3880
- if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') return 0;
3881
- sz = get8(s);
3882
- if (sz != '9' && sz != '7') return 0;
3883
- if (get8(s) != 'a') return 0;
3884
- return 1;
3885
- }
3886
-
3887
- static int stbi_gif_test(stbi *s)
3888
- {
3889
- int r = gif_test(s);
3890
- stbi_rewind(s);
3891
- return r;
3892
- }
3893
-
3894
- static void stbi_gif_parse_colortable(stbi *s, uint8 pal[256][4], int num_entries, int transp)
3895
- {
3896
- int i;
3897
- for (i=0; i < num_entries; ++i) {
3898
- pal[i][2] = get8u(s);
3899
- pal[i][1] = get8u(s);
3900
- pal[i][0] = get8u(s);
3901
- pal[i][3] = transp ? 0 : 255;
3902
- }
3903
- }
3904
-
3905
- static int stbi_gif_header(stbi *s, stbi_gif *g, int *comp, int is_info)
3906
- {
3907
- uint8 version;
3908
- if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8')
3909
- return e("not GIF", "Corrupt GIF");
3910
-
3911
- version = get8u(s);
3912
- if (version != '7' && version != '9') return e("not GIF", "Corrupt GIF");
3913
- if (get8(s) != 'a') return e("not GIF", "Corrupt GIF");
3914
-
3915
- failure_reason = "";
3916
- g->w = get16le(s);
3917
- g->h = get16le(s);
3918
- g->flags = get8(s);
3919
- g->bgindex = get8(s);
3920
- g->ratio = get8(s);
3921
- g->transparent = -1;
3922
-
3923
- if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments
3924
-
3925
- if (is_info) return 1;
3926
-
3927
- if (g->flags & 0x80)
3928
- stbi_gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
3929
-
3930
- return 1;
3931
- }
3932
-
3933
- static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp)
3934
- {
3935
- stbi_gif g;
3936
- if (!stbi_gif_header(s, &g, comp, 1)) {
3937
- stbi_rewind( s );
3938
- return 0;
3939
- }
3940
- if (x) *x = g.w;
3941
- if (y) *y = g.h;
3942
- return 1;
3943
- }
3944
-
3945
- static void stbi_out_gif_code(stbi_gif *g, uint16 code)
3946
- {
3947
- uint8 *p, *c;
3948
-
3949
- // recurse to decode the prefixes, since the linked-list is backwards,
3950
- // and working backwards through an interleaved image would be nasty
3951
- if (g->codes[code].prefix >= 0)
3952
- stbi_out_gif_code(g, g->codes[code].prefix);
3953
-
3954
- if (g->cur_y >= g->max_y) return;
3955
-
3956
- p = &g->out[g->cur_x + g->cur_y];
3957
- c = &g->color_table[g->codes[code].suffix * 4];
3958
-
3959
- if (c[3] >= 128) {
3960
- p[0] = c[2];
3961
- p[1] = c[1];
3962
- p[2] = c[0];
3963
- p[3] = c[3];
3964
- }
3965
- g->cur_x += 4;
3966
-
3967
- if (g->cur_x >= g->max_x) {
3968
- g->cur_x = g->start_x;
3969
- g->cur_y += g->step;
3970
-
3971
- while (g->cur_y >= g->max_y && g->parse > 0) {
3972
- g->step = (1 << g->parse) * g->line_size;
3973
- g->cur_y = g->start_y + (g->step >> 1);
3974
- --g->parse;
3975
- }
3976
- }
3977
- }
3978
-
3979
- static uint8 *stbi_process_gif_raster(stbi *s, stbi_gif *g)
3980
- {
3981
- uint8 lzw_cs;
3982
- int32 len, code;
3983
- uint32 first;
3984
- int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
3985
- stbi_gif_lzw *p;
3986
-
3987
- lzw_cs = get8u(s);
3988
- clear = 1 << lzw_cs;
3989
- first = 1;
3990
- codesize = lzw_cs + 1;
3991
- codemask = (1 << codesize) - 1;
3992
- bits = 0;
3993
- valid_bits = 0;
3994
- for (code = 0; code < clear; code++) {
3995
- g->codes[code].prefix = -1;
3996
- g->codes[code].first = (uint8) code;
3997
- g->codes[code].suffix = (uint8) code;
3998
- }
3999
-
4000
- // support no starting clear code
4001
- avail = clear+2;
4002
- oldcode = -1;
4003
-
4004
- len = 0;
4005
- for(;;) {
4006
- if (valid_bits < codesize) {
4007
- if (len == 0) {
4008
- len = get8(s); // start new block
4009
- if (len == 0)
4010
- return g->out;
4011
- }
4012
- --len;
4013
- bits |= (int32) get8(s) << valid_bits;
4014
- valid_bits += 8;
4015
- } else {
4016
- int32 code = bits & codemask;
4017
- bits >>= codesize;
4018
- valid_bits -= codesize;
4019
- // @OPTIMIZE: is there some way we can accelerate the non-clear path?
4020
- if (code == clear) { // clear code
4021
- codesize = lzw_cs + 1;
4022
- codemask = (1 << codesize) - 1;
4023
- avail = clear + 2;
4024
- oldcode = -1;
4025
- first = 0;
4026
- } else if (code == clear + 1) { // end of stream code
4027
- skip(s, len);
4028
- while ((len = get8(s)) > 0)
4029
- skip(s,len);
4030
- return g->out;
4031
- } else if (code <= avail) {
4032
- if (first) return epuc("no clear code", "Corrupt GIF");
4033
-
4034
- if (oldcode >= 0) {
4035
- p = &g->codes[avail++];
4036
- if (avail > 4096) return epuc("too many codes", "Corrupt GIF");
4037
- p->prefix = (int16) oldcode;
4038
- p->first = g->codes[oldcode].first;
4039
- p->suffix = (code == avail) ? p->first : g->codes[code].first;
4040
- } else if (code == avail)
4041
- return epuc("illegal code in raster", "Corrupt GIF");
4042
-
4043
- stbi_out_gif_code(g, (uint16) code);
4044
-
4045
- if ((avail & codemask) == 0 && avail <= 0x0FFF) {
4046
- codesize++;
4047
- codemask = (1 << codesize) - 1;
4048
- }
4049
-
4050
- oldcode = code;
4051
- } else {
4052
- return epuc("illegal code in raster", "Corrupt GIF");
4053
- }
4054
- }
4055
- }
4056
- }
4057
-
4058
- static void stbi_fill_gif_background(stbi_gif *g)
4059
- {
4060
- int i;
4061
- uint8 *c = g->pal[g->bgindex];
4062
- // @OPTIMIZE: write a dword at a time
4063
- for (i = 0; i < g->w * g->h * 4; i += 4) {
4064
- uint8 *p = &g->out[i];
4065
- p[0] = c[2];
4066
- p[1] = c[1];
4067
- p[2] = c[0];
4068
- p[3] = c[3];
4069
- }
4070
- }
4071
-
4072
- // this function is designed to support animated gifs, although stb_image doesn't support it
4073
- static uint8 *stbi_gif_load_next(stbi *s, stbi_gif *g, int *comp, int req_comp)
4074
- {
4075
- int i;
4076
- uint8 *old_out = 0;
4077
-
4078
- if (g->out == 0) {
4079
- if (!stbi_gif_header(s, g, comp,0)) return 0; // failure_reason set by stbi_gif_header
4080
- g->out = (uint8 *) malloc(4 * g->w * g->h);
4081
- if (g->out == 0) return epuc("outofmem", "Out of memory");
4082
- stbi_fill_gif_background(g);
4083
- } else {
4084
- // animated-gif-only path
4085
- if (((g->eflags & 0x1C) >> 2) == 3) {
4086
- old_out = g->out;
4087
- g->out = (uint8 *) malloc(4 * g->w * g->h);
4088
- if (g->out == 0) return epuc("outofmem", "Out of memory");
4089
- memcpy(g->out, old_out, g->w*g->h*4);
4090
- }
4091
- }
4092
-
4093
- for (;;) {
4094
- switch (get8(s)) {
4095
- case 0x2C: /* Image Descriptor */
4096
- {
4097
- int32 x, y, w, h;
4098
- uint8 *o;
4099
-
4100
- x = get16le(s);
4101
- y = get16le(s);
4102
- w = get16le(s);
4103
- h = get16le(s);
4104
- if (((x + w) > (g->w)) || ((y + h) > (g->h)))
4105
- return epuc("bad Image Descriptor", "Corrupt GIF");
4106
-
4107
- g->line_size = g->w * 4;
4108
- g->start_x = x * 4;
4109
- g->start_y = y * g->line_size;
4110
- g->max_x = g->start_x + w * 4;
4111
- g->max_y = g->start_y + h * g->line_size;
4112
- g->cur_x = g->start_x;
4113
- g->cur_y = g->start_y;
4114
-
4115
- g->lflags = get8(s);
4116
-
4117
- if (g->lflags & 0x40) {
4118
- g->step = 8 * g->line_size; // first interlaced spacing
4119
- g->parse = 3;
4120
- } else {
4121
- g->step = g->line_size;
4122
- g->parse = 0;
4123
- }
4124
-
4125
- if (g->lflags & 0x80) {
4126
- stbi_gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
4127
- g->color_table = (uint8 *) g->lpal;
4128
- } else if (g->flags & 0x80) {
4129
- for (i=0; i < 256; ++i) // @OPTIMIZE: reset only the previous transparent
4130
- g->pal[i][3] = 255;
4131
- if (g->transparent >= 0 && (g->eflags & 0x01))
4132
- g->pal[g->transparent][3] = 0;
4133
- g->color_table = (uint8 *) g->pal;
4134
- } else
4135
- return epuc("missing color table", "Corrupt GIF");
4136
-
4137
- o = stbi_process_gif_raster(s, g);
4138
- if (o == NULL) return NULL;
4139
-
4140
- if (req_comp && req_comp != 4)
4141
- o = convert_format(o, 4, req_comp, g->w, g->h);
4142
- return o;
4143
- }
4144
-
4145
- case 0x21: // Comment Extension.
4146
- {
4147
- int len;
4148
- if (get8(s) == 0xF9) { // Graphic Control Extension.
4149
- len = get8(s);
4150
- if (len == 4) {
4151
- g->eflags = get8(s);
4152
- get16le(s); // delay
4153
- g->transparent = get8(s);
4154
- } else {
4155
- skip(s, len);
4156
- break;
4157
- }
4158
- }
4159
- while ((len = get8(s)) != 0)
4160
- skip(s, len);
4161
- break;
4162
- }
4163
-
4164
- case 0x3B: // gif stream termination code
4165
- return (uint8 *) 1;
4166
-
4167
- default:
4168
- return epuc("unknown code", "Corrupt GIF");
4169
- }
4170
- }
4171
- }
4172
-
4173
- static stbi_uc *stbi_gif_load(stbi *s, int *x, int *y, int *comp, int req_comp)
4174
- {
4175
- uint8 *u = 0;
4176
- stbi_gif g={0};
4177
-
4178
- u = stbi_gif_load_next(s, &g, comp, req_comp);
4179
- if (u == (void *) 1) u = 0; // end of animated gif marker
4180
- if (u) {
4181
- *x = g.w;
4182
- *y = g.h;
4183
- }
4184
-
4185
- return u;
4186
- }
4187
-
4188
- static int stbi_gif_info(stbi *s, int *x, int *y, int *comp)
4189
- {
4190
- return stbi_gif_info_raw(s,x,y,comp);
4191
- }
4192
-
4193
-
4194
- // *************************************************************************************************
4195
- // Radiance RGBE HDR loader
4196
- // originally by Nicolas Schulz
4197
- #ifndef STBI_NO_HDR
4198
- static int hdr_test(stbi *s)
4199
- {
4200
- const char *signature = "#?RADIANCE\n";
4201
- int i;
4202
- for (i=0; signature[i]; ++i)
4203
- if (get8(s) != signature[i])
4204
- return 0;
4205
- return 1;
4206
- }
4207
-
4208
- static int stbi_hdr_test(stbi* s)
4209
- {
4210
- int r = hdr_test(s);
4211
- stbi_rewind(s);
4212
- return r;
4213
- }
4214
-
4215
- #define HDR_BUFLEN 1024
4216
- static char *hdr_gettoken(stbi *z, char *buffer)
4217
- {
4218
- int len=0;
4219
- char c = '\0';
4220
-
4221
- c = (char) get8(z);
4222
-
4223
- while (!at_eof(z) && c != '\n') {
4224
- buffer[len++] = c;
4225
- if (len == HDR_BUFLEN-1) {
4226
- // flush to end of line
4227
- while (!at_eof(z) && get8(z) != '\n')
4228
- ;
4229
- break;
4230
- }
4231
- c = (char) get8(z);
4232
- }
4233
-
4234
- buffer[len] = 0;
4235
- return buffer;
4236
- }
4237
-
4238
- static void hdr_convert(float *output, stbi_uc *input, int req_comp)
4239
- {
4240
- if ( input[3] != 0 ) {
4241
- float f1;
4242
- // Exponent
4243
- f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
4244
- if (req_comp <= 2)
4245
- output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
4246
- else {
4247
- output[0] = input[0] * f1;
4248
- output[1] = input[1] * f1;
4249
- output[2] = input[2] * f1;
4250
- }
4251
- if (req_comp == 2) output[1] = 1;
4252
- if (req_comp == 4) output[3] = 1;
4253
- } else {
4254
- switch (req_comp) {
4255
- case 4: output[3] = 1; /* fallthrough */
4256
- case 3: output[0] = output[1] = output[2] = 0;
4257
- break;
4258
- case 2: output[1] = 1; /* fallthrough */
4259
- case 1: output[0] = 0;
4260
- break;
4261
- }
4262
- }
4263
- }
4264
-
4265
- static float *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp)
4266
- {
4267
- char buffer[HDR_BUFLEN];
4268
- char *token;
4269
- int valid = 0;
4270
- int width, height;
4271
- stbi_uc *scanline;
4272
- float *hdr_data;
4273
- int len;
4274
- unsigned char count, value;
4275
- int i, j, k, c1,c2, z;
4276
-
4277
-
4278
- // Check identifier
4279
- if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0)
4280
- return epf("not HDR", "Corrupt HDR image");
4281
-
4282
- // Parse header
4283
- for(;;) {
4284
- token = hdr_gettoken(s,buffer);
4285
- if (token[0] == 0) break;
4286
- if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
4287
- }
4288
-
4289
- if (!valid) return epf("unsupported format", "Unsupported HDR format");
4290
-
4291
- // Parse width and height
4292
- // can't use sscanf() if we're not using stdio!
4293
- token = hdr_gettoken(s,buffer);
4294
- if (strncmp(token, "-Y ", 3)) return epf("unsupported data layout", "Unsupported HDR format");
4295
- token += 3;
4296
- height = strtol(token, &token, 10);
4297
- while (*token == ' ') ++token;
4298
- if (strncmp(token, "+X ", 3)) return epf("unsupported data layout", "Unsupported HDR format");
4299
- token += 3;
4300
- width = strtol(token, NULL, 10);
4301
-
4302
- *x = width;
4303
- *y = height;
4304
-
4305
- *comp = 3;
4306
- if (req_comp == 0) req_comp = 3;
4307
-
4308
- // Read data
4309
- hdr_data = (float *) malloc(height * width * req_comp * sizeof(float));
4310
-
4311
- // Load image data
4312
- // image data is stored as some number of sca
4313
- if ( width < 8 || width >= 32768) {
4314
- // Read flat data
4315
- for (j=0; j < height; ++j) {
4316
- for (i=0; i < width; ++i) {
4317
- stbi_uc rgbe[4];
4318
- main_decode_loop:
4319
- getn(s, rgbe, 4);
4320
- hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
4321
- }
4322
- }
4323
- } else {
4324
- // Read RLE-encoded data
4325
- scanline = NULL;
4326
-
4327
- for (j = 0; j < height; ++j) {
4328
- c1 = get8(s);
4329
- c2 = get8(s);
4330
- len = get8(s);
4331
- if (c1 != 2 || c2 != 2 || (len & 0x80)) {
4332
- // not run-length encoded, so we have to actually use THIS data as a decoded
4333
- // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
4334
- uint8 rgbe[4];
4335
- rgbe[0] = (uint8) c1;
4336
- rgbe[1] = (uint8) c2;
4337
- rgbe[2] = (uint8) len;
4338
- rgbe[3] = (uint8) get8u(s);
4339
- hdr_convert(hdr_data, rgbe, req_comp);
4340
- i = 1;
4341
- j = 0;
4342
- free(scanline);
4343
- goto main_decode_loop; // yes, this makes no sense
4344
- }
4345
- len <<= 8;
4346
- len |= get8(s);
4347
- if (len != width) { free(hdr_data); free(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); }
4348
- if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4);
4349
-
4350
- for (k = 0; k < 4; ++k) {
4351
- i = 0;
4352
- while (i < width) {
4353
- count = get8u(s);
4354
- if (count > 128) {
4355
- // Run
4356
- value = get8u(s);
4357
- count -= 128;
4358
- for (z = 0; z < count; ++z)
4359
- scanline[i++ * 4 + k] = value;
4360
- } else {
4361
- // Dump
4362
- for (z = 0; z < count; ++z)
4363
- scanline[i++ * 4 + k] = get8u(s);
4364
- }
4365
- }
4366
- }
4367
- for (i=0; i < width; ++i)
4368
- hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
4369
- }
4370
- free(scanline);
4371
- }
4372
-
4373
- return hdr_data;
4374
- }
4375
-
4376
- static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp)
4377
- {
4378
- return hdr_load(s,x,y,comp,req_comp);
4379
- }
4380
-
4381
- static int stbi_hdr_info(stbi *s, int *x, int *y, int *comp)
4382
- {
4383
- char buffer[HDR_BUFLEN];
4384
- char *token;
4385
- int valid = 0;
4386
-
4387
- if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) {
4388
- stbi_rewind( s );
4389
- return 0;
4390
- }
4391
-
4392
- for(;;) {
4393
- token = hdr_gettoken(s,buffer);
4394
- if (token[0] == 0) break;
4395
- if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
4396
- }
4397
-
4398
- if (!valid) {
4399
- stbi_rewind( s );
4400
- return 0;
4401
- }
4402
- token = hdr_gettoken(s,buffer);
4403
- if (strncmp(token, "-Y ", 3)) {
4404
- stbi_rewind( s );
4405
- return 0;
4406
- }
4407
- token += 3;
4408
- *y = strtol(token, &token, 10);
4409
- while (*token == ' ') ++token;
4410
- if (strncmp(token, "+X ", 3)) {
4411
- stbi_rewind( s );
4412
- return 0;
4413
- }
4414
- token += 3;
4415
- *x = strtol(token, NULL, 10);
4416
- *comp = 3;
4417
- return 1;
4418
- }
4419
- #endif // STBI_NO_HDR
4420
-
4421
- static int stbi_bmp_info(stbi *s, int *x, int *y, int *comp)
4422
- {
4423
- int hsz;
4424
- if (get8(s) != 'B' || get8(s) != 'M') {
4425
- stbi_rewind( s );
4426
- return 0;
4427
- }
4428
- skip(s,12);
4429
- hsz = get32le(s);
4430
- if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) {
4431
- stbi_rewind( s );
4432
- return 0;
4433
- }
4434
- if (hsz == 12) {
4435
- *x = get16le(s);
4436
- *y = get16le(s);
4437
- } else {
4438
- *x = get32le(s);
4439
- *y = get32le(s);
4440
- }
4441
- if (get16le(s) != 1) {
4442
- stbi_rewind( s );
4443
- return 0;
4444
- }
4445
- *comp = get16le(s) / 8;
4446
- return 1;
4447
- }
4448
-
4449
- static int stbi_psd_info(stbi *s, int *x, int *y, int *comp)
4450
- {
4451
- int channelCount;
4452
- if (get32(s) != 0x38425053) {
4453
- stbi_rewind( s );
4454
- return 0;
4455
- }
4456
- if (get16(s) != 1) {
4457
- stbi_rewind( s );
4458
- return 0;
4459
- }
4460
- skip(s, 6);
4461
- channelCount = get16(s);
4462
- if (channelCount < 0 || channelCount > 16) {
4463
- stbi_rewind( s );
4464
- return 0;
4465
- }
4466
- *y = get32(s);
4467
- *x = get32(s);
4468
- if (get16(s) != 8) {
4469
- stbi_rewind( s );
4470
- return 0;
4471
- }
4472
- if (get16(s) != 3) {
4473
- stbi_rewind( s );
4474
- return 0;
4475
- }
4476
- *comp = 4;
4477
- return 1;
4478
- }
4479
-
4480
- static int stbi_pic_info(stbi *s, int *x, int *y, int *comp)
4481
- {
4482
- int act_comp=0,num_packets=0,chained;
4483
- pic_packet_t packets[10];
4484
-
4485
- skip(s, 92);
4486
-
4487
- *x = get16(s);
4488
- *y = get16(s);
4489
- if (at_eof(s)) return 0;
4490
- if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
4491
- stbi_rewind( s );
4492
- return 0;
4493
- }
4494
-
4495
- skip(s, 8);
4496
-
4497
- do {
4498
- pic_packet_t *packet;
4499
-
4500
- if (num_packets==sizeof(packets)/sizeof(packets[0]))
4501
- return 0;
4502
-
4503
- packet = &packets[num_packets++];
4504
- chained = get8(s);
4505
- packet->size = get8u(s);
4506
- packet->type = get8u(s);
4507
- packet->channel = get8u(s);
4508
- act_comp |= packet->channel;
4509
-
4510
- if (at_eof(s)) {
4511
- stbi_rewind( s );
4512
- return 0;
4513
- }
4514
- if (packet->size != 8) {
4515
- stbi_rewind( s );
4516
- return 0;
4517
- }
4518
- } while (chained);
4519
-
4520
- *comp = (act_comp & 0x10 ? 4 : 3);
4521
-
4522
- return 1;
4523
- }
4524
-
4525
- static int stbi_info_main(stbi *s, int *x, int *y, int *comp)
4526
- {
4527
- if (stbi_jpeg_info(s, x, y, comp))
4528
- return 1;
4529
- if (stbi_png_info(s, x, y, comp))
4530
- return 1;
4531
- if (stbi_gif_info(s, x, y, comp))
4532
- return 1;
4533
- if (stbi_bmp_info(s, x, y, comp))
4534
- return 1;
4535
- if (stbi_psd_info(s, x, y, comp))
4536
- return 1;
4537
- if (stbi_pic_info(s, x, y, comp))
4538
- return 1;
4539
- #ifndef STBI_NO_HDR
4540
- if (stbi_hdr_info(s, x, y, comp))
4541
- return 1;
4542
- #endif
4543
- // test tga last because it's a crappy test!
4544
- if (stbi_tga_info(s, x, y, comp))
4545
- return 1;
4546
- return e("unknown image type", "Image not of any known type, or corrupt");
4547
- }
4548
-
4549
- #ifndef STBI_NO_STDIO
4550
- int stbi_info(char const *filename, int *x, int *y, int *comp)
4551
- {
4552
- FILE *f = fopen(filename, "rb");
4553
- int result;
4554
- if (!f) return e("can't fopen", "Unable to open file");
4555
- result = stbi_info_from_file(f, x, y, comp);
4556
- fclose(f);
4557
- return result;
4558
- }
4559
-
4560
- int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
4561
- {
4562
- int r;
4563
- stbi s;
4564
- long pos = ftell(f);
4565
- start_file(&s, f);
4566
- r = stbi_info_main(&s,x,y,comp);
4567
- fseek(f,pos,SEEK_SET);
4568
- return r;
4569
- }
4570
- #endif // !STBI_NO_STDIO
4571
-
4572
- int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
4573
- {
4574
- stbi s;
4575
- start_mem(&s,buffer,len);
4576
- return stbi_info_main(&s,x,y,comp);
4577
- }
4578
-
4579
- int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)
4580
- {
4581
- stbi s;
4582
- start_callbacks(&s, (stbi_io_callbacks *) c, user);
4583
- return stbi_info_main(&s,x,y,comp);
4584
- }
4585
-
4586
- #endif // STBI_HEADER_FILE_ONLY
4587
-
4588
- /*
4589
- revision history:
4590
- 1.33 (2011-07-14)
4591
- make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements
4592
- 1.32 (2011-07-13)
4593
- support for "info" function for all supported filetypes (SpartanJ)
4594
- 1.31 (2011-06-20)
4595
- a few more leak fixes, bug in PNG handling (SpartanJ)
4596
- 1.30 (2011-06-11)
4597
- added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)
4598
- removed deprecated format-specific test/load functions
4599
- removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway
4600
- error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)
4601
- fix inefficiency in decoding 32-bit BMP (David Woo)
4602
- 1.29 (2010-08-16)
4603
- various warning fixes from Aurelien Pocheville
4604
- 1.28 (2010-08-01)
4605
- fix bug in GIF palette transparency (SpartanJ)
4606
- 1.27 (2010-08-01)
4607
- cast-to-uint8 to fix warnings
4608
- 1.26 (2010-07-24)
4609
- fix bug in file buffering for PNG reported by SpartanJ
4610
- 1.25 (2010-07-17)
4611
- refix trans_data warning (Won Chun)
4612
- 1.24 (2010-07-12)
4613
- perf improvements reading from files on platforms with lock-heavy fgetc()
4614
- minor perf improvements for jpeg
4615
- deprecated type-specific functions so we'll get feedback if they're needed
4616
- attempt to fix trans_data warning (Won Chun)
4617
- 1.23 fixed bug in iPhone support
4618
- 1.22 (2010-07-10)
4619
- removed image *writing* support
4620
- stbi_info support from Jetro Lauha
4621
- GIF support from Jean-Marc Lienher
4622
- iPhone PNG-extensions from James Brown
4623
- warning-fixes from Nicolas Schulz and Janez Zemva (i.e. Janez (U+017D)emva)
4624
- 1.21 fix use of 'uint8' in header (reported by jon blow)
4625
- 1.20 added support for Softimage PIC, by Tom Seddon
4626
- 1.19 bug in interlaced PNG corruption check (found by ryg)
4627
- 1.18 2008-08-02
4628
- fix a threading bug (local mutable static)
4629
- 1.17 support interlaced PNG
4630
- 1.16 major bugfix - convert_format converted one too many pixels
4631
- 1.15 initialize some fields for thread safety
4632
- 1.14 fix threadsafe conversion bug
4633
- header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
4634
- 1.13 threadsafe
4635
- 1.12 const qualifiers in the API
4636
- 1.11 Support installable IDCT, colorspace conversion routines
4637
- 1.10 Fixes for 64-bit (don't use "unsigned long")
4638
- optimized upsampling by Fabian "ryg" Giesen
4639
- 1.09 Fix format-conversion for PSD code (bad global variables!)
4640
- 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz
4641
- 1.07 attempt to fix C++ warning/errors again
4642
- 1.06 attempt to fix C++ warning/errors again
4643
- 1.05 fix TGA loading to return correct *comp and use good luminance calc
4644
- 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free
4645
- 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR
4646
- 1.02 support for (subset of) HDR files, float interface for preferred access to them
4647
- 1.01 fix bug: possible bug in handling right-side up bmps... not sure
4648
- fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all
4649
- 1.00 interface to zlib that skips zlib header
4650
- 0.99 correct handling of alpha in palette
4651
- 0.98 TGA loader by lonesock; dynamically add loaders (untested)
4652
- 0.97 jpeg errors on too large a file; also catch another malloc failure
4653
- 0.96 fix detection of invalid v value - particleman@mollyrocket forum
4654
- 0.95 during header scan, seek to markers in case of padding
4655
- 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same
4656
- 0.93 handle jpegtran output; verbose errors
4657
- 0.92 read 4,8,16,24,32-bit BMP files of several formats
4658
- 0.91 output 24-bit Windows 3.0 BMP files
4659
- 0.90 fix a few more warnings; bump version number to approach 1.0
4660
- 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd
4661
- 0.60 fix compiling as c++
4662
- 0.59 fix warnings: merge Dave Moore's -Wall fixes
4663
- 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian
4664
- 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available
4665
- 0.56 fix bug: zlib uncompressed mode len vs. nlen
4666
- 0.55 fix bug: restart_interval not initialized to 0
4667
- 0.54 allow NULL for 'int *comp'
4668
- 0.53 fix bug in png 3->4; speedup png decoding
4669
- 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments
4670
- 0.51 obey req_comp requests, 1-component jpegs return as 1-component,
4671
- on 'test' only check type, not whether we support this variant
4672
- 0.50 first released version
4673
- */