webruby 0.2.7 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
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
- */