tiny_gltf 0.1.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/Gemfile.lock +3 -3
  4. data/bin/setup +2 -0
  5. data/ext/tiny_gltf/rb_tiny_gltf.h +18 -7
  6. data/ext/tiny_gltf/rb_tiny_gltf_accessor.cpp +4 -12
  7. data/ext/tiny_gltf/rb_tiny_gltf_animation.cpp +6 -5
  8. data/ext/tiny_gltf/rb_tiny_gltf_animation_channel.cpp +6 -5
  9. data/ext/tiny_gltf/rb_tiny_gltf_animation_sampler.cpp +6 -5
  10. data/ext/tiny_gltf/rb_tiny_gltf_asset.cpp +4 -3
  11. data/ext/tiny_gltf/rb_tiny_gltf_buffer.cpp +37 -8
  12. data/ext/tiny_gltf/rb_tiny_gltf_buffer_view.cpp +4 -3
  13. data/ext/tiny_gltf/rb_tiny_gltf_camera.cpp +4 -3
  14. data/ext/tiny_gltf/rb_tiny_gltf_extension_map.cpp +2 -2
  15. data/ext/tiny_gltf/rb_tiny_gltf_image.cpp +72 -12
  16. data/ext/tiny_gltf/rb_tiny_gltf_init.c +66 -1
  17. data/ext/tiny_gltf/rb_tiny_gltf_light.cpp +2 -1
  18. data/ext/tiny_gltf/rb_tiny_gltf_material.cpp +6 -5
  19. data/ext/tiny_gltf/rb_tiny_gltf_mesh.cpp +5 -17
  20. data/ext/tiny_gltf/rb_tiny_gltf_model.cpp +10 -10
  21. data/ext/tiny_gltf/rb_tiny_gltf_node.cpp +8 -7
  22. data/ext/tiny_gltf/rb_tiny_gltf_parameter_map.cpp +2 -2
  23. data/ext/tiny_gltf/rb_tiny_gltf_primitive.cpp +8 -7
  24. data/ext/tiny_gltf/rb_tiny_gltf_sampler.cpp +3 -2
  25. data/ext/tiny_gltf/rb_tiny_gltf_scene.cpp +7 -6
  26. data/ext/tiny_gltf/rb_tiny_gltf_skin.cpp +6 -5
  27. data/ext/tiny_gltf/rb_tiny_gltf_texture.cpp +7 -6
  28. data/ext/tiny_gltf/rb_tiny_gltf_types.cpp +7 -7
  29. data/ext/tiny_gltf/rb_tiny_gltf_value.cpp +5 -4
  30. data/ext/tiny_gltf/stb_image.h +1890 -869
  31. data/ext/tiny_gltf/stb_image_write.h +1241 -1451
  32. data/ext/tiny_gltf/tiny_gltf.h +3671 -1082
  33. data/lib/tiny_gltf.rb +385 -126
  34. data/lib/tiny_gltf/version.rb +1 -1
  35. metadata +4 -4
@@ -1,6 +1,6 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rLight_new(const Light *light) {
3
+ VALUE rLight_new(const Light *light, VALUE rmodel) {
4
4
  VALUE rlight = rb_funcall(rb_cLight, rb_intern("new"), 0);
5
5
  // *Light_unwrap(rlight) = *light;
6
6
 
@@ -8,6 +8,7 @@ VALUE rLight_new(const Light *light) {
8
8
  for (size_t i = 0; i < light->color.size(); i++)
9
9
  rb_ary_push(rcolor, DBL2NUM(light->color[i]));
10
10
 
11
+ rb_ivar_set(rlight, rb_intern("@model"), rmodel);
11
12
  rb_ivar_set(rlight, rb_intern("@name"), rb_str_new2(light->name.c_str()));
12
13
  rb_ivar_set(rlight, rb_intern("@type"), rb_intern(light->type.c_str()));
13
14
  rb_ivar_set(rlight, rb_intern("@color"), rcolor);
@@ -1,14 +1,15 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rMaterial_new(const Material *matr) {
3
+ VALUE rMaterial_new(const Material *matr, VALUE rmodel) {
4
4
  VALUE rmatr = rb_funcall(rb_cMaterial, rb_intern("new"), 0);
5
5
  // *Material_unwrap(rmatr) = *matr;
6
6
 
7
+ rb_ivar_set(rmatr, rb_intern("@model"), rmodel);
7
8
  rb_ivar_set(rmatr, rb_intern("@name"), rb_str_new2(matr->name.c_str()));
8
- rb_ivar_set(rmatr, rb_intern("@values"), rParameterMap_new(&matr->values));
9
- rb_ivar_set(rmatr, rb_intern("@additional_values"), rParameterMap_new(&matr->additionalValues));
10
- rb_ivar_set(rmatr, rb_intern("@extensions"), rExtensionMap_new(&matr->extensions));
11
- rb_ivar_set(rmatr, rb_intern("@extras"), rValue_new(&matr->extras));
9
+ rb_ivar_set(rmatr, rb_intern("@values"), rParameterMap_new(&matr->values, rmodel));
10
+ rb_ivar_set(rmatr, rb_intern("@additional_values"), rParameterMap_new(&matr->additionalValues, rmodel));
11
+ rb_ivar_set(rmatr, rb_intern("@extensions"), rExtensionMap_new(&matr->extensions, rmodel));
12
+ rb_ivar_set(rmatr, rb_intern("@extras"), rValue_new(&matr->extras, rmodel));
12
13
 
13
14
  return rmatr;
14
15
  }
@@ -1,24 +1,12 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rMesh_new(const Mesh *mesh) {
3
+ VALUE rMesh_new(const Mesh *mesh, VALUE rmodel) {
4
4
  VALUE rmesh = rb_funcall(rb_cMesh, rb_intern("new"), 0);
5
5
  // *Mesh_unwrap(rmesh) = *mesh;
6
6
 
7
- VALUE rtargets = rb_ary_new();
8
- for (size_t i = 0; i < mesh->targets.size(); i++) {
9
- VALUE rtarget = rb_hash_new();
10
- rb_ary_push(rtargets, rtarget);
11
- for (std::map<std::string, int>::const_iterator it = mesh->targets[i].begin();
12
- it != mesh->targets[i].end(); ++it) {
13
- std::string key = it->first;
14
- std::transform(key.begin(), key.end(), key.begin(), ::tolower);
15
- rb_hash_aset(rtarget, ID2SYM(rb_intern(key.c_str())), INT2NUM(it->second));
16
- }
17
- }
18
-
19
7
  VALUE rprimitives = rb_ary_new();
20
8
  for (size_t i = 0; i < mesh->primitives.size(); i++) {
21
- rb_ary_push(rprimitives, rPrimitive_new(&mesh->primitives[i]));
9
+ rb_ary_push(rprimitives, rPrimitive_new(&mesh->primitives[i], rmodel));
22
10
  }
23
11
 
24
12
  VALUE rweights = rb_ary_new();
@@ -26,12 +14,12 @@ VALUE rMesh_new(const Mesh *mesh) {
26
14
  rb_ary_push(rprimitives, DBL2NUM(mesh->weights[i]));
27
15
  }
28
16
 
17
+ rb_ivar_set(rmesh, rb_intern("@model"), rmodel);
29
18
  rb_ivar_set(rmesh, rb_intern("@name"), rb_str_new2(mesh->name.c_str()));
30
19
  rb_ivar_set(rmesh, rb_intern("@primitives"), rprimitives);
31
20
  rb_ivar_set(rmesh, rb_intern("@weights"), rweights);
32
- rb_ivar_set(rmesh, rb_intern("@extensions"), rExtensionMap_new(&mesh->extensions));
33
- rb_ivar_set(rmesh, rb_intern("@morph_targets"), rtargets);
34
- rb_ivar_set(rmesh, rb_intern("@extras"), rValue_new(&mesh->extras));
21
+ rb_ivar_set(rmesh, rb_intern("@extensions"), rExtensionMap_new(&mesh->extensions, rmodel));
22
+ rb_ivar_set(rmesh, rb_intern("@extras"), rValue_new(&mesh->extras, rmodel));
35
23
 
36
24
  return rmesh;
37
25
  }
@@ -12,24 +12,24 @@ VALUE rModel_new(const Model *model) {
12
12
  for (size_t i = 0; i < model->extensionsRequired.size(); i++)
13
13
  rb_ary_push(rext_required, rb_str_new2(model->extensionsRequired[i].c_str()));
14
14
 
15
- rb_ivar_set(rmodel, rb_intern("@asset"), rAsset_new(&model->asset));
16
- rb_ivar_set(rmodel, rb_intern("@default_scene_index"), INT2NUM(model->defaultScene));
17
- rb_ivar_set(rmodel, rb_intern("@extensions"), rExtensionMap_new(&model->extensions));
18
- rb_ivar_set(rmodel, rb_intern("@extras"), rValue_new(&model->extras));
15
+ rb_ivar_set(rmodel, rb_intern("@asset"), rAsset_new(&model->asset, rmodel));
16
+ rb_ivar_set(rmodel, rb_intern("@default_scene_index"), RINDEX_OR_NIL(model->defaultScene));
17
+ rb_ivar_set(rmodel, rb_intern("@extensions"), rExtensionMap_new(&model->extensions, rmodel));
18
+ rb_ivar_set(rmodel, rb_intern("@extras"), rValue_new(&model->extras, rmodel));
19
19
  rb_ivar_set(rmodel, rb_intern("@extensions_used"), rext_used);
20
20
  rb_ivar_set(rmodel, rb_intern("@extensions_required"), rext_required);
21
21
 
22
22
  /*
23
23
  VALUE ary = rb_funcall(rmodel, rb_intern("accessors"), 0);
24
24
  for (size_t i = 0; i < model->accessors.size(); i++) {
25
- rb_ary_push(ary, rAccessor_new(&model->accessors[i]));
25
+ rb_ary_push(ary, rAccessor_new(&model->accessors[i], rmodel));
26
26
  }
27
27
  */
28
- #define CONCAT_VECTOR_TO_RARRAY3(klass, name, method) { \
29
- VALUE ary = rb_funcall(rmodel, rb_intern(method), 0); \
30
- for (size_t i = 0; i < model->name.size(); i++) { \
31
- rb_ary_push(ary, r ## klass ## _new(&model->name[i])); \
32
- } \
28
+ #define CONCAT_VECTOR_TO_RARRAY3(klass, name, method) { \
29
+ VALUE ary = rb_funcall(rmodel, rb_intern(method), 0); \
30
+ for (size_t i = 0; i < model->name.size(); i++) { \
31
+ rb_ary_push(ary, r ## klass ## _new(&model->name[i], rmodel)); \
32
+ } \
33
33
  }
34
34
  #define CONCAT_VECTOR_TO_RARRAY(klass, name) CONCAT_VECTOR_TO_RARRAY3(klass, name, #name)
35
35
 
@@ -1,6 +1,6 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rNode_new(const Node *node) {
3
+ VALUE rNode_new(const Node *node, VALUE rmodel) {
4
4
  VALUE rnode = rb_funcall(rb_cNode, rb_intern("new"), 0);
5
5
  // *Node_unwrap(rnode) = *node;
6
6
 
@@ -10,7 +10,7 @@ VALUE rNode_new(const Node *node) {
10
10
 
11
11
  VALUE rchildren = rb_ary_new();
12
12
  for (size_t i = 0; i < node->children.size(); i++)
13
- rb_ary_push(rchildren, INT2NUM(node->children[i]));
13
+ rb_ary_push(rchildren, RINDEX_OR_NIL(node->children[i]));
14
14
 
15
15
  VALUE rmatrix = Qnil, rrotation = Qnil, rtranslation = Qnil, rscale = Qnil;
16
16
  if (node->matrix.size() == 0) {
@@ -50,18 +50,19 @@ VALUE rNode_new(const Node *node) {
50
50
  rb_ary_push(rmatrix, INT2NUM(node->matrix[i]));
51
51
  }
52
52
 
53
+ rb_ivar_set(rnode, rb_intern("@model"), rmodel);
53
54
  rb_ivar_set(rnode, rb_intern("@name"), rb_str_new2(node->name.c_str()));
54
- rb_ivar_set(rnode, rb_intern("@camera_index"), INT2NUM(node->camera));
55
- rb_ivar_set(rnode, rb_intern("@skin_index"), INT2NUM(node->skin));
56
- rb_ivar_set(rnode, rb_intern("@mesh_index"), INT2NUM(node->mesh));
55
+ rb_ivar_set(rnode, rb_intern("@camera_index"), RINDEX_OR_NIL(node->camera));
56
+ rb_ivar_set(rnode, rb_intern("@skin_index"), RINDEX_OR_NIL(node->skin));
57
+ rb_ivar_set(rnode, rb_intern("@mesh_index"), RINDEX_OR_NIL(node->mesh));
57
58
  rb_ivar_set(rnode, rb_intern("@children_indices"), rchildren);
58
59
  rb_ivar_set(rnode, rb_intern("@rotation"), rrotation);
59
60
  rb_ivar_set(rnode, rb_intern("@translation"), rtranslation);
60
61
  rb_ivar_set(rnode, rb_intern("@scale"), rscale);
61
62
  rb_ivar_set(rnode, rb_intern("@matrix"), rmatrix);
62
63
  rb_ivar_set(rnode, rb_intern("@weights"), rweights);
63
- rb_ivar_set(rnode, rb_intern("@extensions"), rExtensionMap_new(&node->extensions));
64
- rb_ivar_set(rnode, rb_intern("@extras"), rValue_new(&node->extras));
64
+ rb_ivar_set(rnode, rb_intern("@extensions"), rExtensionMap_new(&node->extensions, rmodel));
65
+ rb_ivar_set(rnode, rb_intern("@extras"), rValue_new(&node->extras, rmodel));
65
66
 
66
67
  return rnode;
67
68
  }
@@ -1,6 +1,6 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rParameterMap_new(const ParameterMap *value) {
3
+ VALUE rParameterMap_new(const ParameterMap *value, VALUE rmodel) {
4
4
  VALUE res = Qnil;
5
5
 
6
6
  for (ParameterMap::const_iterator paramIt = value->begin(); paramIt != value->end();
@@ -19,7 +19,7 @@ VALUE rParameterMap_new(const ParameterMap *value) {
19
19
  paramIt->second.json_double_value.begin();
20
20
  it != paramIt->second.json_double_value.end(); ++it) {
21
21
  if (it->first == "index") {
22
- rb_hash_aset(val, ID2SYM(rb_intern("index")), INT2NUM(paramIt->second.TextureIndex()));
22
+ rb_hash_aset(val, ID2SYM(rb_intern("index")), RINDEX_OR_NIL(paramIt->second.TextureIndex()));
23
23
  } else {
24
24
  rb_hash_aset(val, ID2SYM(rb_intern(it->first.c_str())), DBL2NUM(it->second));
25
25
  }
@@ -1,6 +1,6 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rPrimitive_new(const Primitive *prim) {
3
+ VALUE rPrimitive_new(const Primitive *prim, VALUE rmodel) {
4
4
  VALUE rprim = rb_funcall(rb_cPrimitive, rb_intern("new"), 0);
5
5
  // *Primitive_unwrap(rprim) = *prim;
6
6
 
@@ -24,12 +24,13 @@ VALUE rPrimitive_new(const Primitive *prim) {
24
24
  }
25
25
  }
26
26
 
27
- rb_ivar_set(rprim, rb_intern("@attributes"), rattrs);
28
- rb_ivar_set(rprim, rb_intern("@material_index"), INT2NUM(prim->material));
29
- rb_ivar_set(rprim, rb_intern("@indices"), INT2NUM(prim->indices));
30
- rb_ivar_set(rprim, rb_intern("@mode"), mode_to_sym(prim->mode));
31
- rb_ivar_set(rprim, rb_intern("@morph_targets"), rtargets);
32
- rb_ivar_set(rprim, rb_intern("@extras"), rValue_new(&prim->extras));
27
+ rb_ivar_set(rprim, rb_intern("@model"), rmodel);
28
+ rb_ivar_set(rprim, rb_intern("@attributes"), rattrs);
29
+ rb_ivar_set(rprim, rb_intern("@material_index"), RINDEX_OR_NIL(prim->material));
30
+ rb_ivar_set(rprim, rb_intern("@indices_index"), RINDEX_OR_NIL(prim->indices));
31
+ rb_ivar_set(rprim, rb_intern("@mode"), mode_to_sym(prim->mode));
32
+ rb_ivar_set(rprim, rb_intern("@morph_targets_indices"), rtargets);
33
+ rb_ivar_set(rprim, rb_intern("@extras"), rValue_new(&prim->extras, rmodel));
33
34
 
34
35
  return rprim;
35
36
  }
@@ -1,16 +1,17 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rSampler_new(const Sampler *sampler) {
3
+ VALUE rSampler_new(const Sampler *sampler, VALUE rmodel) {
4
4
  VALUE rsampler = rb_funcall(rb_cSampler, rb_intern("new"), 0);
5
5
  // *Sampler_unwrap(rsampler) = *sampler;
6
6
 
7
+ rb_ivar_set(rsampler, rb_intern("@model"), rmodel);
7
8
  rb_ivar_set(rsampler, rb_intern("@name"), rb_str_new2(sampler->name.c_str()));
8
9
  rb_ivar_set(rsampler, rb_intern("@min_filter"), texture_filter_to_sym(sampler->minFilter));
9
10
  rb_ivar_set(rsampler, rb_intern("@mag_filter"), texture_filter_to_sym(sampler->magFilter));
10
11
  rb_ivar_set(rsampler, rb_intern("@wrap_s"), texture_wrap_to_sym(sampler->wrapS));
11
12
  rb_ivar_set(rsampler, rb_intern("@wrap_t"), texture_wrap_to_sym(sampler->wrapT));
12
13
  rb_ivar_set(rsampler, rb_intern("@wrap_r"), texture_wrap_to_sym(sampler->wrapR));
13
- rb_ivar_set(rsampler, rb_intern("@extras"), rValue_new(&sampler->extras));
14
+ rb_ivar_set(rsampler, rb_intern("@extras"), rValue_new(&sampler->extras, rmodel));
14
15
 
15
16
  return rsampler;
16
17
  }
@@ -1,17 +1,18 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rScene_new(const Scene *scene) {
3
+ VALUE rScene_new(const Scene *scene, VALUE rmodel) {
4
4
  VALUE rscene = rb_funcall(rb_cScene, rb_intern("new"), 0);
5
5
  // *Scene_unwrap(rscene) = *scene;
6
6
 
7
7
  VALUE rnodes = rb_ary_new();
8
8
  for (size_t i = 0; i < scene->nodes.size(); i++)
9
- rb_ary_push(rnodes, INT2NUM(scene->nodes[i]));
9
+ rb_ary_push(rnodes, RINDEX_OR_NIL(scene->nodes[i]));
10
10
 
11
- rb_ivar_set(rscene, rb_intern("@name"), rb_str_new2(scene->name.c_str()));
12
- rb_ivar_set(rscene, rb_intern("@nodes"), rnodes);
13
- rb_ivar_set(rscene, rb_intern("@extensions"), rExtensionMap_new(&scene->extensions));
14
- rb_ivar_set(rscene, rb_intern("@extras"), rValue_new(&scene->extras));
11
+ rb_ivar_set(rscene, rb_intern("@model"), rmodel);
12
+ rb_ivar_set(rscene, rb_intern("@name"), rb_str_new2(scene->name.c_str()));
13
+ rb_ivar_set(rscene, rb_intern("@nodes_indices"), rnodes);
14
+ rb_ivar_set(rscene, rb_intern("@extensions"), rExtensionMap_new(&scene->extensions, rmodel));
15
+ rb_ivar_set(rscene, rb_intern("@extras"), rValue_new(&scene->extras, rmodel));
15
16
 
16
17
  return rscene;
17
18
  }
@@ -1,17 +1,18 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rSkin_new(const Skin *skin) {
3
+ VALUE rSkin_new(const Skin *skin, VALUE rmodel) {
4
4
  VALUE rskin = rb_funcall(rb_cSkin, rb_intern("new"), 0);
5
5
  // *Skin_unwrap(rskin) = *skin;
6
6
 
7
7
  VALUE rjoints = rb_ary_new();
8
8
  for (size_t i = 0; i < skin->joints.size(); i++)
9
- rb_ary_push(rjoints, INT2NUM(skin->joints[i]));
9
+ rb_ary_push(rjoints, RINDEX_OR_NIL(skin->joints[i]));
10
10
 
11
+ rb_ivar_set(rskin, rb_intern("@model"), rmodel);
11
12
  rb_ivar_set(rskin, rb_intern("@name"), rb_str_new2(skin->name.c_str()));
12
- rb_ivar_set(rskin, rb_intern("@inverse_bind_matrices"), INT2NUM(skin->inverseBindMatrices));
13
- rb_ivar_set(rskin, rb_intern("@skeleton_root_node_index"), INT2NUM(skin->skeleton));
14
- rb_ivar_set(rskin, rb_intern("@joints"), rjoints);
13
+ rb_ivar_set(rskin, rb_intern("@inverse_bind_matrices"), RINDEX_OR_NIL(skin->inverseBindMatrices));
14
+ rb_ivar_set(rskin, rb_intern("@skeleton_root_node_index"), RINDEX_OR_NIL(skin->skeleton));
15
+ rb_ivar_set(rskin, rb_intern("@joint_nodes_indices"), rjoints);
15
16
 
16
17
  return rskin;
17
18
  }
@@ -1,14 +1,15 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rTexture_new(const Texture *texture) {
3
+ VALUE rTexture_new(const Texture *texture, VALUE rmodel) {
4
4
  VALUE rtexture = rb_funcall(rb_cTexture, rb_intern("new"), 0);
5
5
  // *Texture_unwrap(rtexture) = *texture;
6
6
 
7
- rb_ivar_set(rtexture, rb_intern("@name"), rb_str_new2(texture->name.c_str()));
8
- rb_ivar_set(rtexture, rb_intern("@sampler_index"), INT2NUM(texture->sampler));
9
- rb_ivar_set(rtexture, rb_intern("@source_index"), INT2NUM(texture->source));
10
- rb_ivar_set(rtexture, rb_intern("@extensions"), rExtensionMap_new(&texture->extensions));
11
- rb_ivar_set(rtexture, rb_intern("@extras"), rValue_new(&texture->extras));
7
+ rb_ivar_set(rtexture, rb_intern("@model"), rmodel);
8
+ rb_ivar_set(rtexture, rb_intern("@name"), rb_str_new2(texture->name.c_str()));
9
+ rb_ivar_set(rtexture, rb_intern("@sampler_index"), RINDEX_OR_NIL(texture->sampler));
10
+ rb_ivar_set(rtexture, rb_intern("@source_index"), RINDEX_OR_NIL(texture->source));
11
+ rb_ivar_set(rtexture, rb_intern("@extensions"), rExtensionMap_new(&texture->extensions, rmodel));
12
+ rb_ivar_set(rtexture, rb_intern("@extras"), rValue_new(&texture->extras, rmodel));
12
13
 
13
14
  return rtexture;
14
15
  }
@@ -1,12 +1,12 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
3
  /*
4
- void model_free(void* data) {
5
- Model *model = (Model *) data;
6
- delete model;
4
+ void Model_free(void* data) {
5
+ Model *obj = (Model *) data;
6
+ delete obj;
7
7
  }
8
8
 
9
- size_t model_size(const void* data) {
9
+ size_t Model_size(const void* data) {
10
10
  return sizeof(Model);
11
11
  }
12
12
 
@@ -14,8 +14,8 @@
14
14
  .wrap_struct_name = "TinyGLTFModel",
15
15
  .function = {
16
16
  .dmark = NULL,
17
- .dfree = model_free,
18
- .dsize = model_size,
17
+ .dfree = Model_free,
18
+ .dsize = Model_size,
19
19
  .reserved = { 0, 0 }
20
20
  },
21
21
  .parent = NULL,
@@ -23,7 +23,7 @@
23
23
  .flags = RUBY_TYPED_FREE_IMMEDIATELY
24
24
  };
25
25
 
26
- VALUE alloc_model(VALUE klass) {
26
+ VALUE Model_alloc(VALUE klass) {
27
27
  return TypedData_Wrap_Struct(klass, &T_Model, new Model());
28
28
  }
29
29
 
@@ -1,9 +1,9 @@
1
1
  #include "rb_tiny_gltf.h"
2
2
 
3
- VALUE rValue_new(const Value *value) {
3
+ VALUE rValue_new(const Value *value, VALUE rmodel) {
4
4
  switch(value->Type()) {
5
5
  case NULL_TYPE: return Qnil;
6
- case NUMBER_TYPE: return DBL2NUM(value->Get<double>());
6
+ case REAL_TYPE: return DBL2NUM(value->Get<double>());
7
7
  case INT_TYPE: return INT2NUM(value->Get<int>());
8
8
  case BOOL_TYPE: return value->Get<bool>() ? Qtrue : Qfalse;
9
9
  case STRING_TYPE: return rb_str_new2(value->Get<std::string>().c_str());
@@ -14,7 +14,7 @@ VALUE rValue_new(const Value *value) {
14
14
  case ARRAY_TYPE: {
15
15
  VALUE ary = rb_ary_new();
16
16
  for (size_t i = 0; i < value->ArrayLen(); i++) {
17
- rb_ary_push(ary, rValue_new(&value->Get((int) i)));
17
+ rb_ary_push(ary, rValue_new(&value->Get((int) i), rmodel));
18
18
  }
19
19
  return ary;
20
20
  }
@@ -22,11 +22,12 @@ VALUE rValue_new(const Value *value) {
22
22
  VALUE hash = rb_hash_new();
23
23
  std::vector<std::string> keys = value->Keys();
24
24
  for (std::string key : keys) {
25
- rb_hash_aset(hash, rb_str_new2(key.c_str()), rValue_new(&value->Get(key)));
25
+ rb_hash_aset(hash, rb_str_new2(key.c_str()), rValue_new(&value->Get(key), rmodel));
26
26
  }
27
27
  return hash;
28
28
  }
29
29
  default:
30
+ rb_raise(rb_eRuntimeError, "Don't know what to do with GLTF type %d", (int) value->Type());
30
31
  return Qnil;
31
32
  }
32
33
  }
@@ -1,5 +1,5 @@
1
- /* stb_image - v2.08 - public domain image loader - http://nothings.org/stb_image.h
2
- no warranty implied; use at your own risk
1
+ /* stb_image - v2.21 - public domain image loader - http://nothings.org/stb
2
+ no warranty implied; use at your own risk
3
3
 
4
4
  Do this:
5
5
  #define STB_IMAGE_IMPLEMENTATION
@@ -21,7 +21,7 @@
21
21
  avoid problematic images and only need the trivial interface
22
22
 
23
23
  JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)
24
- PNG 1/2/4/8-bit-per-channel (16 bpc not supported)
24
+ PNG 1/2/4/8/16-bit-per-channel
25
25
 
26
26
  TGA (not sure what subset, if a subset)
27
27
  BMP non-1bpp, non-RLE
@@ -42,184 +42,68 @@
42
42
  Full documentation under "DOCUMENTATION" below.
43
43
 
44
44
 
45
- Revision 2.00 release notes:
46
-
47
- - Progressive JPEG is now supported.
48
-
49
- - PPM and PGM binary formats are now supported, thanks to Ken Miller.
50
-
51
- - x86 platforms now make use of SSE2 SIMD instructions for
52
- JPEG decoding, and ARM platforms can use NEON SIMD if requested.
53
- This work was done by Fabian "ryg" Giesen. SSE2 is used by
54
- default, but NEON must be enabled explicitly; see docs.
55
-
56
- With other JPEG optimizations included in this version, we see
57
- 2x speedup on a JPEG on an x86 machine, and a 1.5x speedup
58
- on a JPEG on an ARM machine, relative to previous versions of this
59
- library. The same results will not obtain for all JPGs and for all
60
- x86/ARM machines. (Note that progressive JPEGs are significantly
61
- slower to decode than regular JPEGs.) This doesn't mean that this
62
- is the fastest JPEG decoder in the land; rather, it brings it
63
- closer to parity with standard libraries. If you want the fastest
64
- decode, look elsewhere. (See "Philosophy" section of docs below.)
65
-
66
- See final bullet items below for more info on SIMD.
67
-
68
- - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing
69
- the memory allocator. Unlike other STBI libraries, these macros don't
70
- support a context parameter, so if you need to pass a context in to
71
- the allocator, you'll have to store it in a global or a thread-local
72
- variable.
73
-
74
- - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and
75
- STBI_NO_LINEAR.
76
- STBI_NO_HDR: suppress implementation of .hdr reader format
77
- STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API
78
-
79
- - You can suppress implementation of any of the decoders to reduce
80
- your code footprint by #defining one or more of the following
81
- symbols before creating the implementation.
82
-
83
- STBI_NO_JPEG
84
- STBI_NO_PNG
85
- STBI_NO_BMP
86
- STBI_NO_PSD
87
- STBI_NO_TGA
88
- STBI_NO_GIF
89
- STBI_NO_HDR
90
- STBI_NO_PIC
91
- STBI_NO_PNM (.ppm and .pgm)
92
-
93
- - You can request *only* certain decoders and suppress all other ones
94
- (this will be more forward-compatible, as addition of new decoders
95
- doesn't require you to disable them explicitly):
96
-
97
- STBI_ONLY_JPEG
98
- STBI_ONLY_PNG
99
- STBI_ONLY_BMP
100
- STBI_ONLY_PSD
101
- STBI_ONLY_TGA
102
- STBI_ONLY_GIF
103
- STBI_ONLY_HDR
104
- STBI_ONLY_PIC
105
- STBI_ONLY_PNM (.ppm and .pgm)
106
-
107
- Note that you can define multiples of these, and you will get all
108
- of them ("only x" and "only y" is interpreted to mean "only x&y").
109
-
110
- - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
111
- want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
112
-
113
- - Compilation of all SIMD code can be suppressed with
114
- #define STBI_NO_SIMD
115
- It should not be necessary to disable SIMD unless you have issues
116
- compiling (e.g. using an x86 compiler which doesn't support SSE
117
- intrinsics or that doesn't support the method used to detect
118
- SSE2 support at run-time), and even those can be reported as
119
- bugs so I can refine the built-in compile-time checking to be
120
- smarter.
121
-
122
- - The old STBI_SIMD system which allowed installing a user-defined
123
- IDCT etc. has been removed. If you need this, don't upgrade. My
124
- assumption is that almost nobody was doing this, and those who
125
- were will find the built-in SIMD more satisfactory anyway.
126
-
127
- - RGB values computed for JPEG images are slightly different from
128
- previous versions of stb_image. (This is due to using less
129
- integer precision in SIMD.) The C code has been adjusted so
130
- that the same RGB values will be computed regardless of whether
131
- SIMD support is available, so your app should always produce
132
- consistent results. But these results are slightly different from
133
- previous versions. (Specifically, about 3% of available YCbCr values
134
- will compute different RGB results from pre-1.49 versions by +-1;
135
- most of the deviating values are one smaller in the G channel.)
136
-
137
- - If you must produce consistent results with previous versions of
138
- stb_image, #define STBI_JPEG_OLD and you will get the same results
139
- you used to; however, you will not get the SIMD speedups for
140
- the YCbCr-to-RGB conversion step (although you should still see
141
- significant JPEG speedup from the other changes).
142
-
143
- Please note that STBI_JPEG_OLD is a temporary feature; it will be
144
- removed in future versions of the library. It is only intended for
145
- near-term back-compatibility use.
146
-
147
-
148
- Latest revision history:
149
- 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
150
- 2.07 (2015-09-13) partial animated GIF support
151
- limited 16-bit PSD support
152
- minor bugs, code cleanup, and compiler warnings
153
- 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value
154
- 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning
155
- 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit
156
- 2.03 (2015-04-12) additional corruption checking
157
- stbi_set_flip_vertically_on_load
158
- fix NEON support; fix mingw support
159
- 2.02 (2015-01-19) fix incorrect assert, fix warning
160
- 2.01 (2015-01-17) fix various warnings
161
- 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
162
- 2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD
163
- progressive JPEG
164
- PGM/PPM support
165
- STBI_MALLOC,STBI_REALLOC,STBI_FREE
166
- STBI_NO_*, STBI_ONLY_*
167
- GIF bugfix
168
- 1.48 (2014-12-14) fix incorrectly-named assert()
169
- 1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted)
170
- optimize PNG
171
- fix bug in interlaced PNG with user-specified channel count
45
+ LICENSE
46
+
47
+ See end of file for license information.
48
+
49
+ RECENT REVISION HISTORY:
50
+
51
+ 2.21 (2019-02-25) fix typo in comment
52
+ 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
53
+ 2.19 (2018-02-11) fix warning
54
+ 2.18 (2018-01-30) fix warnings
55
+ 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
56
+ 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes
57
+ 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC
58
+ 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
59
+ 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes
60
+ 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
61
+ 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64
62
+ RGB-format JPEG; remove white matting in PSD;
63
+ allocate large structures on the stack;
64
+ correct channel count for PNG & BMP
65
+ 2.10 (2016-01-22) avoid warning introduced in 2.09
66
+ 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED
172
67
 
173
68
  See end of file for full revision history.
174
69
 
175
70
 
176
71
  ============================ Contributors =========================
177
72
 
178
- Image formats Bug fixes & warning fixes
179
- Sean Barrett (jpeg, png, bmp) Marc LeBlanc
180
- Nicolas Schulz (hdr, psd) Christpher Lloyd
181
- Jonathan Dummer (tga) Dave Moore
182
- Jean-Marc Lienher (gif) Won Chun
183
- Tom Seddon (pic) the Horde3D community
184
- Thatcher Ulrich (psd) Janez Zemva
185
- Ken Miller (pgm, ppm) Jonathan Blow
186
- urraka@github (animated gif) Laurent Gomila
187
- Aruelien Pocheville
188
- Ryamond Barbiero
189
- David Woo
190
- Extensions, features Martin Golini
191
- Jetro Lauha (stbi_info) Roy Eltham
192
- Martin "SpartanJ" Golini (stbi_info) Luke Graham
193
- James "moose2000" Brown (iPhone PNG) Thomas Ruf
194
- Ben "Disch" Wenger (io callbacks) John Bartholomew
195
- Omar Cornut (1/2/4-bit PNG) Ken Hamada
196
- Nicolas Guillemot (vertical flip) Cort Stratton
197
- Richard Mitton (16-bit PSD) Blazej Dariusz Roszkowski
198
- Thibault Reuille
199
- Paul Du Bois
200
- Guillaume George
201
- Jerry Jansson
202
- Hayaki Saito
203
- Johan Duparc
204
- Ronny Chevalier
205
- Optimizations & bugfixes Michal Cichon
206
- Fabian "ryg" Giesen Tero Hanninen
207
- Arseny Kapoulkine Sergio Gonzalez
208
- Cass Everitt
209
- Engin Manap
210
- If your name should be here but Martins Mozeiko
211
- isn't, let Sean know. Joseph Thomson
212
- Phil Jordan
213
- Nathan Reed
214
- Michaelangel007@github
215
- Nick Verigakis
216
-
217
- LICENSE
218
-
219
- This software is in the public domain. Where that dedication is not
220
- recognized, you are granted a perpetual, irrevocable license to copy,
221
- distribute, and modify this file as you see fit.
222
-
73
+ Image formats Extensions, features
74
+ Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info)
75
+ Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info)
76
+ Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG)
77
+ Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks)
78
+ Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG)
79
+ Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip)
80
+ Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD)
81
+ github:urraka (animated gif) Junggon Kim (PNM comments)
82
+ Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA)
83
+ socks-the-fox (16-bit PNG)
84
+ Jeremy Sawicki (handle all ImageNet JPGs)
85
+ Optimizations & bugfixes Mikhail Morozov (1-bit BMP)
86
+ Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query)
87
+ Arseny Kapoulkine
88
+ John-Mark Allen
89
+ Carmelo J Fdez-Aguera
90
+
91
+ Bug & warning fixes
92
+ Marc LeBlanc David Woo Guillaume George Martins Mozeiko
93
+ Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan
94
+ Dave Moore Roy Eltham Hayaki Saito Nathan Reed
95
+ Won Chun Luke Graham Johan Duparc Nick Verigakis
96
+ the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh
97
+ Janez Zemva John Bartholomew Michal Cichon github:romigrou
98
+ Jonathan Blow Ken Hamada Tero Hanninen github:svdijk
99
+ Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar
100
+ Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex
101
+ Ryamond Barbiero Paul Du Bois Engin Manap github:grim210
102
+ Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw
103
+ Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus
104
+ Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo
105
+ Christian Floisand Kevin Schmidt JR Smith github:darealshinji
106
+ Blazej Dariusz Roszkowski github:Michaelangel007
223
107
  */
224
108
 
225
109
  #ifndef STBI_INCLUDE_STB_IMAGE_H
@@ -228,10 +112,8 @@ distribute, and modify this file as you see fit.
228
112
  // DOCUMENTATION
229
113
  //
230
114
  // Limitations:
231
- // - no 16-bit-per-channel PNG
232
115
  // - no 12-bit-per-channel JPEG
233
116
  // - no JPEGs with arithmetic coding
234
- // - no 1-bit BMP
235
117
  // - GIF always returns *comp=4
236
118
  //
237
119
  // Basic usage (see HDR discussion below for HDR usage):
@@ -244,10 +126,10 @@ distribute, and modify this file as you see fit.
244
126
  // stbi_image_free(data)
245
127
  //
246
128
  // Standard parameters:
247
- // int *x -- outputs image width in pixels
248
- // int *y -- outputs image height in pixels
249
- // int *comp -- outputs # of image components in image file
250
- // int req_comp -- if non-zero, # of image components requested in result
129
+ // int *x -- outputs image width in pixels
130
+ // int *y -- outputs image height in pixels
131
+ // int *channels_in_file -- outputs # of image components in image file
132
+ // int desired_channels -- if non-zero, # of image components requested in result
251
133
  //
252
134
  // The return value from an image loader is an 'unsigned char *' which points
253
135
  // to the pixel data, or NULL on an allocation failure or if the image is
@@ -255,11 +137,12 @@ distribute, and modify this file as you see fit.
255
137
  // with each pixel consisting of N interleaved 8-bit components; the first
256
138
  // pixel pointed to is top-left-most in the image. There is no padding between
257
139
  // image scanlines or between pixels, regardless of format. The number of
258
- // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.
259
- // If req_comp is non-zero, *comp has the number of components that _would_
260
- // have been output otherwise. E.g. if you set req_comp to 4, you will always
261
- // get RGBA output, but you can check *comp to see if it's trivially opaque
262
- // because e.g. there were only 3 channels in the source image.
140
+ // components N is 'desired_channels' if desired_channels is non-zero, or
141
+ // *channels_in_file otherwise. If desired_channels is non-zero,
142
+ // *channels_in_file has the number of components that _would_ have been
143
+ // output otherwise. E.g. if you set desired_channels to 4, you will always
144
+ // get RGBA output, but you can check *channels_in_file to see if it's trivially
145
+ // opaque because e.g. there were only 3 channels in the source image.
263
146
  //
264
147
  // An output image with N components has the following components interleaved
265
148
  // in this order in each pixel:
@@ -271,16 +154,26 @@ distribute, and modify this file as you see fit.
271
154
  // 4 red, green, blue, alpha
272
155
  //
273
156
  // If image loading fails for any reason, the return value will be NULL,
274
- // and *x, *y, *comp will be unchanged. The function stbi_failure_reason()
275
- // can be queried for an extremely brief, end-user unfriendly explanation
276
- // of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid
277
- // compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
157
+ // and *x, *y, *channels_in_file will be unchanged. The function
158
+ // stbi_failure_reason() can be queried for an extremely brief, end-user
159
+ // unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS
160
+ // to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
278
161
  // more user-friendly ones.
279
162
  //
280
163
  // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
281
164
  //
282
165
  // ===========================================================================
283
166
  //
167
+ // UNICODE:
168
+ //
169
+ // If compiling for Windows and you wish to use Unicode filenames, compile
170
+ // with
171
+ // #define STBI_WINDOWS_UTF8
172
+ // and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert
173
+ // Windows wchar_t filenames to utf8.
174
+ //
175
+ // ===========================================================================
176
+ //
284
177
  // Philosophy
285
178
  //
286
179
  // stb libraries are designed with the following priorities:
@@ -291,15 +184,15 @@ distribute, and modify this file as you see fit.
291
184
  //
292
185
  // Sometimes I let "good performance" creep up in priority over "easy to maintain",
293
186
  // and for best performance I may provide less-easy-to-use APIs that give higher
294
- // performance, in addition to the easy to use ones. Nevertheless, it's important
187
+ // performance, in addition to the easy-to-use ones. Nevertheless, it's important
295
188
  // to keep in mind that from the standpoint of you, a client of this library,
296
- // all you care about is #1 and #3, and stb libraries do not emphasize #3 above all.
189
+ // all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
297
190
  //
298
191
  // Some secondary priorities arise directly from the first two, some of which
299
- // make more explicit reasons why performance can't be emphasized.
192
+ // provide more explicit reasons why performance can't be emphasized.
300
193
  //
301
194
  // - Portable ("ease of use")
302
- // - Small footprint ("easy to maintain")
195
+ // - Small source code footprint ("easy to maintain")
303
196
  // - No dependencies ("ease of use")
304
197
  //
305
198
  // ===========================================================================
@@ -331,13 +224,6 @@ distribute, and modify this file as you see fit.
331
224
  // (at least this is true for iOS and Android). Therefore, the NEON support is
332
225
  // toggled by a build flag: define STBI_NEON to get NEON loops.
333
226
  //
334
- // The output of the JPEG decoder is slightly different from versions where
335
- // SIMD support was introduced (that is, for versions before 1.49). The
336
- // difference is only +-1 in the 8-bit RGB channels, and only on a small
337
- // fraction of pixels. You can force the pre-1.49 behavior by defining
338
- // STBI_JPEG_OLD, but this will disable some of the SIMD decoding path
339
- // and hence cost some performance.
340
- //
341
227
  // If for some reason you do not want to use any of SIMD code, or if
342
228
  // you have issues compiling it, you can disable it entirely by
343
229
  // defining STBI_NO_SIMD.
@@ -346,11 +232,10 @@ distribute, and modify this file as you see fit.
346
232
  //
347
233
  // HDR image support (disable by defining STBI_NO_HDR)
348
234
  //
349
- // stb_image now supports loading HDR images in general, and currently
350
- // the Radiance .HDR file format, although the support is provided
351
- // generically. You can still load any file through the existing interface;
352
- // if you attempt to load an HDR file, it will be automatically remapped to
353
- // LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
235
+ // stb_image supports loading HDR images in general, and currently the Radiance
236
+ // .HDR file format specifically. You can still load any file through the existing
237
+ // interface; if you attempt to load an HDR file, it will be automatically remapped
238
+ // to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
354
239
  // both of these constants can be reconfigured through this interface:
355
240
  //
356
241
  // stbi_hdr_to_ldr_gamma(2.2f);
@@ -384,7 +269,7 @@ distribute, and modify this file as you see fit.
384
269
  //
385
270
  // By default we convert iphone-formatted PNGs back to RGB, even though
386
271
  // they are internally encoded differently. You can disable this conversion
387
- // by by calling stbi_convert_iphone_png_to_rgb(0), in which case
272
+ // by calling stbi_convert_iphone_png_to_rgb(0), in which case
388
273
  // you will always just get the native iphone "format" through (which
389
274
  // is BGR stored in RGB).
390
275
  //
@@ -393,6 +278,41 @@ distribute, and modify this file as you see fit.
393
278
  // says there's premultiplied data (currently only happens in iPhone images,
394
279
  // and only if iPhone convert-to-rgb processing is on).
395
280
  //
281
+ // ===========================================================================
282
+ //
283
+ // ADDITIONAL CONFIGURATION
284
+ //
285
+ // - You can suppress implementation of any of the decoders to reduce
286
+ // your code footprint by #defining one or more of the following
287
+ // symbols before creating the implementation.
288
+ //
289
+ // STBI_NO_JPEG
290
+ // STBI_NO_PNG
291
+ // STBI_NO_BMP
292
+ // STBI_NO_PSD
293
+ // STBI_NO_TGA
294
+ // STBI_NO_GIF
295
+ // STBI_NO_HDR
296
+ // STBI_NO_PIC
297
+ // STBI_NO_PNM (.ppm and .pgm)
298
+ //
299
+ // - You can request *only* certain decoders and suppress all other ones
300
+ // (this will be more forward-compatible, as addition of new decoders
301
+ // doesn't require you to disable them explicitly):
302
+ //
303
+ // STBI_ONLY_JPEG
304
+ // STBI_ONLY_PNG
305
+ // STBI_ONLY_BMP
306
+ // STBI_ONLY_PSD
307
+ // STBI_ONLY_TGA
308
+ // STBI_ONLY_GIF
309
+ // STBI_ONLY_HDR
310
+ // STBI_ONLY_PIC
311
+ // STBI_ONLY_PNM (.ppm and .pgm)
312
+ //
313
+ // - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
314
+ // want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
315
+ //
396
316
 
397
317
 
398
318
  #ifndef STBI_NO_STDIO
@@ -403,7 +323,7 @@ distribute, and modify this file as you see fit.
403
323
 
404
324
  enum
405
325
  {
406
- STBI_default = 0, // only used for req_comp
326
+ STBI_default = 0, // only used for desired_channels
407
327
 
408
328
  STBI_grey = 1,
409
329
  STBI_grey_alpha = 2,
@@ -411,7 +331,9 @@ enum
411
331
  STBI_rgb_alpha = 4
412
332
  };
413
333
 
334
+ #include <stdlib.h>
414
335
  typedef unsigned char stbi_uc;
336
+ typedef unsigned short stbi_us;
415
337
 
416
338
  #ifdef __cplusplus
417
339
  extern "C" {
@@ -439,34 +361,64 @@ typedef struct
439
361
  int (*eof) (void *user); // returns nonzero if we are at end of file/data
440
362
  } stbi_io_callbacks;
441
363
 
442
- STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp);
443
- STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp);
444
- STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp);
364
+ ////////////////////////////////////
365
+ //
366
+ // 8-bits-per-channel interface
367
+ //
368
+
369
+ STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);
370
+ STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels);
445
371
 
446
372
  #ifndef STBI_NO_STDIO
447
- STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
373
+ STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
374
+ STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
448
375
  // for stbi_load_from_file, file pointer is left pointing immediately after image
449
376
  #endif
450
377
 
378
+ #ifndef STBI_NO_GIF
379
+ STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
380
+ #endif
381
+
382
+ #ifdef STBI_WINDOWS_UTF8
383
+ STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
384
+ #endif
385
+
386
+ ////////////////////////////////////
387
+ //
388
+ // 16-bits-per-channel interface
389
+ //
390
+
391
+ STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
392
+ STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
393
+
394
+ #ifndef STBI_NO_STDIO
395
+ STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
396
+ STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
397
+ #endif
398
+
399
+ ////////////////////////////////////
400
+ //
401
+ // float-per-channel interface
402
+ //
451
403
  #ifndef STBI_NO_LINEAR
452
- STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp);
453
- STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
454
- STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);
404
+ STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
405
+ STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
455
406
 
456
407
  #ifndef STBI_NO_STDIO
457
- STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
408
+ STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
409
+ STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
458
410
  #endif
459
411
  #endif
460
412
 
461
413
  #ifndef STBI_NO_HDR
462
414
  STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);
463
415
  STBIDEF void stbi_hdr_to_ldr_scale(float scale);
464
- #endif
416
+ #endif // STBI_NO_HDR
465
417
 
466
418
  #ifndef STBI_NO_LINEAR
467
419
  STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);
468
420
  STBIDEF void stbi_ldr_to_hdr_scale(float scale);
469
- #endif // STBI_NO_HDR
421
+ #endif // STBI_NO_LINEAR
470
422
 
471
423
  // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
472
424
  STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
@@ -487,11 +439,14 @@ STBIDEF void stbi_image_free (void *retval_from_stbi_load);
487
439
  // get image dimensions & components without fully decoding
488
440
  STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
489
441
  STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
442
+ STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len);
443
+ STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user);
490
444
 
491
445
  #ifndef STBI_NO_STDIO
492
- STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp);
493
- STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
494
-
446
+ STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp);
447
+ STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
448
+ STBIDEF int stbi_is_16_bit (char const *filename);
449
+ STBIDEF int stbi_is_16_bit_from_file(FILE *f);
495
450
  #endif
496
451
 
497
452
 
@@ -572,9 +527,10 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch
572
527
  #include <stddef.h> // ptrdiff_t on osx
573
528
  #include <stdlib.h>
574
529
  #include <string.h>
530
+ #include <limits.h>
575
531
 
576
532
  #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
577
- #include <math.h> // ldexp
533
+ #include <math.h> // ldexp, pow
578
534
  #endif
579
535
 
580
536
  #ifndef STBI_NO_STDIO
@@ -586,6 +542,12 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch
586
542
  #define STBI_ASSERT(x) assert(x)
587
543
  #endif
588
544
 
545
+ #ifdef __cplusplus
546
+ #define STBI_EXTERN extern "C"
547
+ #else
548
+ #define STBI_EXTERN extern
549
+ #endif
550
+
589
551
 
590
552
  #ifndef _MSC_VER
591
553
  #ifdef __cplusplus
@@ -630,18 +592,22 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
630
592
  #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
631
593
  #endif
632
594
 
633
- #if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC)
595
+ #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
634
596
  // ok
635
- #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC)
597
+ #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
636
598
  // ok
637
599
  #else
638
- #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC."
600
+ #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
639
601
  #endif
640
602
 
641
603
  #ifndef STBI_MALLOC
642
- #define STBI_MALLOC(sz) malloc(sz)
643
- #define STBI_REALLOC(p,sz) realloc(p,sz)
644
- #define STBI_FREE(p) free(p)
604
+ #define STBI_MALLOC(sz) malloc(sz)
605
+ #define STBI_REALLOC(p,newsz) realloc(p,newsz)
606
+ #define STBI_FREE(p) free(p)
607
+ #endif
608
+
609
+ #ifndef STBI_REALLOC_SIZED
610
+ #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
645
611
  #endif
646
612
 
647
613
  // x86/x64 detection
@@ -651,12 +617,14 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
651
617
  #define STBI__X86_TARGET
652
618
  #endif
653
619
 
654
- #if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
655
- // NOTE: not clear do we actually need this for the 64-bit path?
620
+ #if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
656
621
  // gcc doesn't support sse2 intrinsics unless you compile with -msse2,
657
- // (but compiling with -msse2 allows the compiler to use SSE2 everywhere;
658
- // this is just broken and gcc are jerks for not fixing it properly
659
- // http://www.virtualdub.org/blog/pivot/entry.php?id=363 )
622
+ // which in turn means it gets to use SSE2 everywhere. This is unfortunate,
623
+ // but previous attempts to provide the SSE2 functions with runtime
624
+ // detection caused numerous issues. The way architecture extensions are
625
+ // exposed in GCC/Clang is, sadly, not really suited for one-file libs.
626
+ // New behavior: if compiled with -msse2, we use SSE2 without any
627
+ // detection; if not, we don't use it at all.
660
628
  #define STBI_NO_SIMD
661
629
  #endif
662
630
 
@@ -675,7 +643,7 @@ typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
675
643
  #define STBI_NO_SIMD
676
644
  #endif
677
645
 
678
- #if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET)
646
+ #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
679
647
  #define STBI_SSE2
680
648
  #include <emmintrin.h>
681
649
 
@@ -704,25 +672,27 @@ static int stbi__cpuid3(void)
704
672
 
705
673
  #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
706
674
 
707
- static int stbi__sse2_available()
675
+ #if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
676
+ static int stbi__sse2_available(void)
708
677
  {
709
678
  int info3 = stbi__cpuid3();
710
679
  return ((info3 >> 26) & 1) != 0;
711
680
  }
681
+ #endif
682
+
712
683
  #else // assume GCC-style if not VC++
713
684
  #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
714
685
 
715
- static int stbi__sse2_available()
686
+ #if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
687
+ static int stbi__sse2_available(void)
716
688
  {
717
- #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later
718
- // GCC 4.8+ has a nice way to do this
719
- return __builtin_cpu_supports("sse2");
720
- #else
721
- // portable way to do this, preferably without using GCC inline ASM?
722
- // just bail for now.
723
- return 0;
724
- #endif
689
+ // If we're even attempting to compile this on GCC/Clang, that means
690
+ // -msse2 is on, which means the compiler is allowed to use SSE2
691
+ // instructions at will, and so are we.
692
+ return 1;
725
693
  }
694
+ #endif
695
+
726
696
  #endif
727
697
  #endif
728
698
 
@@ -829,57 +799,73 @@ static void stbi__rewind(stbi__context *s)
829
799
  s->img_buffer_end = s->img_buffer_original_end;
830
800
  }
831
801
 
802
+ enum
803
+ {
804
+ STBI_ORDER_RGB,
805
+ STBI_ORDER_BGR
806
+ };
807
+
808
+ typedef struct
809
+ {
810
+ int bits_per_channel;
811
+ int num_channels;
812
+ int channel_order;
813
+ } stbi__result_info;
814
+
832
815
  #ifndef STBI_NO_JPEG
833
816
  static int stbi__jpeg_test(stbi__context *s);
834
- static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
817
+ static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
835
818
  static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
836
819
  #endif
837
820
 
838
821
  #ifndef STBI_NO_PNG
839
822
  static int stbi__png_test(stbi__context *s);
840
- static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
823
+ static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
841
824
  static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
825
+ static int stbi__png_is16(stbi__context *s);
842
826
  #endif
843
827
 
844
828
  #ifndef STBI_NO_BMP
845
829
  static int stbi__bmp_test(stbi__context *s);
846
- static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
830
+ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
847
831
  static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);
848
832
  #endif
849
833
 
850
834
  #ifndef STBI_NO_TGA
851
835
  static int stbi__tga_test(stbi__context *s);
852
- static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
836
+ static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
853
837
  static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
854
838
  #endif
855
839
 
856
840
  #ifndef STBI_NO_PSD
857
841
  static int stbi__psd_test(stbi__context *s);
858
- static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
842
+ static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);
859
843
  static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
844
+ static int stbi__psd_is16(stbi__context *s);
860
845
  #endif
861
846
 
862
847
  #ifndef STBI_NO_HDR
863
848
  static int stbi__hdr_test(stbi__context *s);
864
- static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
849
+ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
865
850
  static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);
866
851
  #endif
867
852
 
868
853
  #ifndef STBI_NO_PIC
869
854
  static int stbi__pic_test(stbi__context *s);
870
- static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
855
+ static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
871
856
  static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
872
857
  #endif
873
858
 
874
859
  #ifndef STBI_NO_GIF
875
860
  static int stbi__gif_test(stbi__context *s);
876
- static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
861
+ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
862
+ static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
877
863
  static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
878
864
  #endif
879
865
 
880
866
  #ifndef STBI_NO_PNM
881
867
  static int stbi__pnm_test(stbi__context *s);
882
- static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
868
+ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
883
869
  static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
884
870
  #endif
885
871
 
@@ -902,6 +888,81 @@ static void *stbi__malloc(size_t size)
902
888
  return STBI_MALLOC(size);
903
889
  }
904
890
 
891
+ // stb_image uses ints pervasively, including for offset calculations.
892
+ // therefore the largest decoded image size we can support with the
893
+ // current code, even on 64-bit targets, is INT_MAX. this is not a
894
+ // significant limitation for the intended use case.
895
+ //
896
+ // we do, however, need to make sure our size calculations don't
897
+ // overflow. hence a few helper functions for size calculations that
898
+ // multiply integers together, making sure that they're non-negative
899
+ // and no overflow occurs.
900
+
901
+ // return 1 if the sum is valid, 0 on overflow.
902
+ // negative terms are considered invalid.
903
+ static int stbi__addsizes_valid(int a, int b)
904
+ {
905
+ if (b < 0) return 0;
906
+ // now 0 <= b <= INT_MAX, hence also
907
+ // 0 <= INT_MAX - b <= INTMAX.
908
+ // And "a + b <= INT_MAX" (which might overflow) is the
909
+ // same as a <= INT_MAX - b (no overflow)
910
+ return a <= INT_MAX - b;
911
+ }
912
+
913
+ // returns 1 if the product is valid, 0 on overflow.
914
+ // negative factors are considered invalid.
915
+ static int stbi__mul2sizes_valid(int a, int b)
916
+ {
917
+ if (a < 0 || b < 0) return 0;
918
+ if (b == 0) return 1; // mul-by-0 is always safe
919
+ // portable way to check for no overflows in a*b
920
+ return a <= INT_MAX/b;
921
+ }
922
+
923
+ // returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow
924
+ static int stbi__mad2sizes_valid(int a, int b, int add)
925
+ {
926
+ return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
927
+ }
928
+
929
+ // returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow
930
+ static int stbi__mad3sizes_valid(int a, int b, int c, int add)
931
+ {
932
+ return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
933
+ stbi__addsizes_valid(a*b*c, add);
934
+ }
935
+
936
+ // returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow
937
+ #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
938
+ static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
939
+ {
940
+ return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
941
+ stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
942
+ }
943
+ #endif
944
+
945
+ // mallocs with size overflow checking
946
+ static void *stbi__malloc_mad2(int a, int b, int add)
947
+ {
948
+ if (!stbi__mad2sizes_valid(a, b, add)) return NULL;
949
+ return stbi__malloc(a*b + add);
950
+ }
951
+
952
+ static void *stbi__malloc_mad3(int a, int b, int c, int add)
953
+ {
954
+ if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;
955
+ return stbi__malloc(a*b*c + add);
956
+ }
957
+
958
+ #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
959
+ static void *stbi__malloc_mad4(int a, int b, int c, int d, int add)
960
+ {
961
+ if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;
962
+ return stbi__malloc(a*b*c*d + add);
963
+ }
964
+ #endif
965
+
905
966
  // stbi__err - error
906
967
  // stbi__errpf - error returning pointer to float
907
968
  // stbi__errpuc - error returning pointer to unsigned char
@@ -937,33 +998,38 @@ STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
937
998
  stbi__vertically_flip_on_load = flag_true_if_should_flip;
938
999
  }
939
1000
 
940
- static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1001
+ static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
941
1002
  {
1003
+ memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
1004
+ ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed
1005
+ ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order
1006
+ ri->num_channels = 0;
1007
+
942
1008
  #ifndef STBI_NO_JPEG
943
- if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp);
1009
+ if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
944
1010
  #endif
945
1011
  #ifndef STBI_NO_PNG
946
- if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp);
1012
+ if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri);
947
1013
  #endif
948
1014
  #ifndef STBI_NO_BMP
949
- if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp);
1015
+ if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri);
950
1016
  #endif
951
1017
  #ifndef STBI_NO_GIF
952
- if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp);
1018
+ if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri);
953
1019
  #endif
954
1020
  #ifndef STBI_NO_PSD
955
- if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp);
1021
+ if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
956
1022
  #endif
957
1023
  #ifndef STBI_NO_PIC
958
- if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp);
1024
+ if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri);
959
1025
  #endif
960
1026
  #ifndef STBI_NO_PNM
961
- if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp);
1027
+ if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri);
962
1028
  #endif
963
1029
 
964
1030
  #ifndef STBI_NO_HDR
965
1031
  if (stbi__hdr_test(s)) {
966
- float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);
1032
+ float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
967
1033
  return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
968
1034
  }
969
1035
  #endif
@@ -971,66 +1037,175 @@ static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *com
971
1037
  #ifndef STBI_NO_TGA
972
1038
  // test tga last because it's a crappy test!
973
1039
  if (stbi__tga_test(s))
974
- return stbi__tga_load(s,x,y,comp,req_comp);
1040
+ return stbi__tga_load(s,x,y,comp,req_comp, ri);
975
1041
  #endif
976
1042
 
977
1043
  return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
978
1044
  }
979
1045
 
980
- static unsigned char *stbi__load_flip(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1046
+ static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)
981
1047
  {
982
- unsigned char *result = stbi__load_main(s, x, y, comp, req_comp);
1048
+ int i;
1049
+ int img_len = w * h * channels;
1050
+ stbi_uc *reduced;
983
1051
 
984
- if (stbi__vertically_flip_on_load && result != NULL) {
985
- int w = *x, h = *y;
986
- int depth = req_comp ? req_comp : *comp;
987
- int row,col,z;
988
- stbi_uc temp;
989
-
990
- // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once
991
- for (row = 0; row < (h>>1); row++) {
992
- for (col = 0; col < w; col++) {
993
- for (z = 0; z < depth; z++) {
994
- temp = result[(row * w + col) * depth + z];
995
- result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
996
- result[((h - row - 1) * w + col) * depth + z] = temp;
997
- }
998
- }
1052
+ reduced = (stbi_uc *) stbi__malloc(img_len);
1053
+ if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory");
1054
+
1055
+ for (i = 0; i < img_len; ++i)
1056
+ reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling
1057
+
1058
+ STBI_FREE(orig);
1059
+ return reduced;
1060
+ }
1061
+
1062
+ static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)
1063
+ {
1064
+ int i;
1065
+ int img_len = w * h * channels;
1066
+ stbi__uint16 *enlarged;
1067
+
1068
+ enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
1069
+ if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
1070
+
1071
+ for (i = 0; i < img_len; ++i)
1072
+ enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff
1073
+
1074
+ STBI_FREE(orig);
1075
+ return enlarged;
1076
+ }
1077
+
1078
+ static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)
1079
+ {
1080
+ int row;
1081
+ size_t bytes_per_row = (size_t)w * bytes_per_pixel;
1082
+ stbi_uc temp[2048];
1083
+ stbi_uc *bytes = (stbi_uc *)image;
1084
+
1085
+ for (row = 0; row < (h>>1); row++) {
1086
+ stbi_uc *row0 = bytes + row*bytes_per_row;
1087
+ stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
1088
+ // swap row0 with row1
1089
+ size_t bytes_left = bytes_per_row;
1090
+ while (bytes_left) {
1091
+ size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);
1092
+ memcpy(temp, row0, bytes_copy);
1093
+ memcpy(row0, row1, bytes_copy);
1094
+ memcpy(row1, temp, bytes_copy);
1095
+ row0 += bytes_copy;
1096
+ row1 += bytes_copy;
1097
+ bytes_left -= bytes_copy;
999
1098
  }
1000
1099
  }
1100
+ }
1001
1101
 
1002
- return result;
1102
+ #ifndef STBI_NO_GIF
1103
+ static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)
1104
+ {
1105
+ int slice;
1106
+ int slice_size = w * h * bytes_per_pixel;
1107
+
1108
+ stbi_uc *bytes = (stbi_uc *)image;
1109
+ for (slice = 0; slice < z; ++slice) {
1110
+ stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
1111
+ bytes += slice_size;
1112
+ }
1003
1113
  }
1114
+ #endif
1004
1115
 
1005
- #ifndef STBI_NO_HDR
1116
+ static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1117
+ {
1118
+ stbi__result_info ri;
1119
+ void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1120
+
1121
+ if (result == NULL)
1122
+ return NULL;
1123
+
1124
+ if (ri.bits_per_channel != 8) {
1125
+ STBI_ASSERT(ri.bits_per_channel == 16);
1126
+ result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1127
+ ri.bits_per_channel = 8;
1128
+ }
1129
+
1130
+ // @TODO: move stbi__convert_format to here
1131
+
1132
+ if (stbi__vertically_flip_on_load) {
1133
+ int channels = req_comp ? req_comp : *comp;
1134
+ stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));
1135
+ }
1136
+
1137
+ return (unsigned char *) result;
1138
+ }
1139
+
1140
+ static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1141
+ {
1142
+ stbi__result_info ri;
1143
+ void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1144
+
1145
+ if (result == NULL)
1146
+ return NULL;
1147
+
1148
+ if (ri.bits_per_channel != 16) {
1149
+ STBI_ASSERT(ri.bits_per_channel == 8);
1150
+ result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1151
+ ri.bits_per_channel = 16;
1152
+ }
1153
+
1154
+ // @TODO: move stbi__convert_format16 to here
1155
+ // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision
1156
+
1157
+ if (stbi__vertically_flip_on_load) {
1158
+ int channels = req_comp ? req_comp : *comp;
1159
+ stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));
1160
+ }
1161
+
1162
+ return (stbi__uint16 *) result;
1163
+ }
1164
+
1165
+ #if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
1006
1166
  static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
1007
1167
  {
1008
1168
  if (stbi__vertically_flip_on_load && result != NULL) {
1009
- int w = *x, h = *y;
1010
- int depth = req_comp ? req_comp : *comp;
1011
- int row,col,z;
1012
- float temp;
1013
-
1014
- // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once
1015
- for (row = 0; row < (h>>1); row++) {
1016
- for (col = 0; col < w; col++) {
1017
- for (z = 0; z < depth; z++) {
1018
- temp = result[(row * w + col) * depth + z];
1019
- result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
1020
- result[((h - row - 1) * w + col) * depth + z] = temp;
1021
- }
1022
- }
1023
- }
1169
+ int channels = req_comp ? req_comp : *comp;
1170
+ stbi__vertical_flip(result, *x, *y, channels * sizeof(float));
1024
1171
  }
1025
1172
  }
1026
1173
  #endif
1027
1174
 
1028
1175
  #ifndef STBI_NO_STDIO
1029
1176
 
1177
+ #if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
1178
+ STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
1179
+ STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);
1180
+ #endif
1181
+
1182
+ #if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
1183
+ STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
1184
+ {
1185
+ return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, bufferlen, NULL, NULL);
1186
+ }
1187
+ #endif
1188
+
1030
1189
  static FILE *stbi__fopen(char const *filename, char const *mode)
1031
1190
  {
1032
1191
  FILE *f;
1033
- #if defined(_MSC_VER) && _MSC_VER >= 1400
1192
+ #if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)
1193
+ wchar_t wMode[64];
1194
+ wchar_t wFilename[1024];
1195
+ if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
1196
+ return 0;
1197
+
1198
+ if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
1199
+ return 0;
1200
+
1201
+ #if _MSC_VER >= 1400
1202
+ if (0 != _wfopen_s(&f, wFilename, wMode))
1203
+ f = 0;
1204
+ #else
1205
+ f = _wfopen(wFilename, wMode);
1206
+ #endif
1207
+
1208
+ #elif defined(_MSC_VER) && _MSC_VER >= 1400
1034
1209
  if (0 != fopen_s(&f, filename, mode))
1035
1210
  f=0;
1036
1211
  #else
@@ -1055,28 +1230,83 @@ STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req
1055
1230
  unsigned char *result;
1056
1231
  stbi__context s;
1057
1232
  stbi__start_file(&s,f);
1058
- result = stbi__load_flip(&s,x,y,comp,req_comp);
1233
+ result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1234
+ if (result) {
1235
+ // need to 'unget' all the characters in the IO buffer
1236
+ fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1237
+ }
1238
+ return result;
1239
+ }
1240
+
1241
+ STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)
1242
+ {
1243
+ stbi__uint16 *result;
1244
+ stbi__context s;
1245
+ stbi__start_file(&s,f);
1246
+ result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
1059
1247
  if (result) {
1060
1248
  // need to 'unget' all the characters in the IO buffer
1061
1249
  fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1062
1250
  }
1063
1251
  return result;
1064
1252
  }
1253
+
1254
+ STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)
1255
+ {
1256
+ FILE *f = stbi__fopen(filename, "rb");
1257
+ stbi__uint16 *result;
1258
+ if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file");
1259
+ result = stbi_load_from_file_16(f,x,y,comp,req_comp);
1260
+ fclose(f);
1261
+ return result;
1262
+ }
1263
+
1264
+
1065
1265
  #endif //!STBI_NO_STDIO
1066
1266
 
1267
+ STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
1268
+ {
1269
+ stbi__context s;
1270
+ stbi__start_mem(&s,buffer,len);
1271
+ return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1272
+ }
1273
+
1274
+ STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
1275
+ {
1276
+ stbi__context s;
1277
+ stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);
1278
+ return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1279
+ }
1280
+
1067
1281
  STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
1068
1282
  {
1069
1283
  stbi__context s;
1070
1284
  stbi__start_mem(&s,buffer,len);
1071
- return stbi__load_flip(&s,x,y,comp,req_comp);
1285
+ return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1072
1286
  }
1073
1287
 
1074
1288
  STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
1075
1289
  {
1076
1290
  stbi__context s;
1077
1291
  stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
1078
- return stbi__load_flip(&s,x,y,comp,req_comp);
1292
+ return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1293
+ }
1294
+
1295
+ #ifndef STBI_NO_GIF
1296
+ STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
1297
+ {
1298
+ unsigned char *result;
1299
+ stbi__context s;
1300
+ stbi__start_mem(&s,buffer,len);
1301
+
1302
+ result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
1303
+ if (stbi__vertically_flip_on_load) {
1304
+ stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
1305
+ }
1306
+
1307
+ return result;
1079
1308
  }
1309
+ #endif
1080
1310
 
1081
1311
  #ifndef STBI_NO_LINEAR
1082
1312
  static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
@@ -1084,13 +1314,14 @@ static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int
1084
1314
  unsigned char *data;
1085
1315
  #ifndef STBI_NO_HDR
1086
1316
  if (stbi__hdr_test(s)) {
1087
- float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp);
1317
+ stbi__result_info ri;
1318
+ float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
1088
1319
  if (hdr_data)
1089
1320
  stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1090
1321
  return hdr_data;
1091
1322
  }
1092
1323
  #endif
1093
- data = stbi__load_flip(s, x, y, comp, req_comp);
1324
+ data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
1094
1325
  if (data)
1095
1326
  return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1096
1327
  return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");
@@ -1160,12 +1391,16 @@ STBIDEF int stbi_is_hdr (char const *filename)
1160
1391
  return result;
1161
1392
  }
1162
1393
 
1163
- STBIDEF int stbi_is_hdr_from_file(FILE *f)
1394
+ STBIDEF int stbi_is_hdr_from_file(FILE *f)
1164
1395
  {
1165
1396
  #ifndef STBI_NO_HDR
1397
+ long pos = ftell(f);
1398
+ int res;
1166
1399
  stbi__context s;
1167
1400
  stbi__start_file(&s,f);
1168
- return stbi__hdr_test(&s);
1401
+ res = stbi__hdr_test(&s);
1402
+ fseek(f, pos, SEEK_SET);
1403
+ return res;
1169
1404
  #else
1170
1405
  STBI_NOTUSED(f);
1171
1406
  return 0;
@@ -1186,14 +1421,15 @@ STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void
1186
1421
  #endif
1187
1422
  }
1188
1423
 
1189
- static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1424
+ #ifndef STBI_NO_LINEAR
1190
1425
  static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1191
1426
 
1192
- #ifndef STBI_NO_LINEAR
1193
1427
  STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
1194
1428
  STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
1195
1429
  #endif
1196
1430
 
1431
+ static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1432
+
1197
1433
  STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
1198
1434
  STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
1199
1435
 
@@ -1347,7 +1583,7 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r
1347
1583
  if (req_comp == img_n) return data;
1348
1584
  STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1349
1585
 
1350
- good = (unsigned char *) stbi__malloc(req_comp * x * y);
1586
+ good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
1351
1587
  if (good == NULL) {
1352
1588
  STBI_FREE(data);
1353
1589
  return stbi__errpuc("outofmem", "Out of memory");
@@ -1357,26 +1593,75 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r
1357
1593
  unsigned char *src = data + j * x * img_n ;
1358
1594
  unsigned char *dest = good + j * x * req_comp;
1359
1595
 
1360
- #define COMBO(a,b) ((a)*8+(b))
1361
- #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1596
+ #define STBI__COMBO(a,b) ((a)*8+(b))
1597
+ #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1598
+ // convert source image with img_n components to one with req_comp components;
1599
+ // avoid switch per pixel, so use switch per scanline and massive macros
1600
+ switch (STBI__COMBO(img_n, req_comp)) {
1601
+ STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break;
1602
+ STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
1603
+ STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break;
1604
+ STBI__CASE(2,1) { dest[0]=src[0]; } break;
1605
+ STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
1606
+ STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;
1607
+ STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break;
1608
+ STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
1609
+ STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break;
1610
+ STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
1611
+ STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;
1612
+ STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
1613
+ default: STBI_ASSERT(0);
1614
+ }
1615
+ #undef STBI__CASE
1616
+ }
1617
+
1618
+ STBI_FREE(data);
1619
+ return good;
1620
+ }
1621
+
1622
+ static stbi__uint16 stbi__compute_y_16(int r, int g, int b)
1623
+ {
1624
+ return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
1625
+ }
1626
+
1627
+ static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)
1628
+ {
1629
+ int i,j;
1630
+ stbi__uint16 *good;
1631
+
1632
+ if (req_comp == img_n) return data;
1633
+ STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1634
+
1635
+ good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
1636
+ if (good == NULL) {
1637
+ STBI_FREE(data);
1638
+ return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
1639
+ }
1640
+
1641
+ for (j=0; j < (int) y; ++j) {
1642
+ stbi__uint16 *src = data + j * x * img_n ;
1643
+ stbi__uint16 *dest = good + j * x * req_comp;
1644
+
1645
+ #define STBI__COMBO(a,b) ((a)*8+(b))
1646
+ #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1362
1647
  // convert source image with img_n components to one with req_comp components;
1363
1648
  // avoid switch per pixel, so use switch per scanline and massive macros
1364
- switch (COMBO(img_n, req_comp)) {
1365
- CASE(1,2) dest[0]=src[0], dest[1]=255; break;
1366
- CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1367
- CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
1368
- CASE(2,1) dest[0]=src[0]; break;
1369
- CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1370
- CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
1371
- CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
1372
- CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1373
- CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
1374
- CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1375
- CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
1376
- CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
1649
+ switch (STBI__COMBO(img_n, req_comp)) {
1650
+ STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break;
1651
+ STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
1652
+ STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break;
1653
+ STBI__CASE(2,1) { dest[0]=src[0]; } break;
1654
+ STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
1655
+ STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;
1656
+ STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break;
1657
+ STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
1658
+ STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;
1659
+ STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
1660
+ STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;
1661
+ STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
1377
1662
  default: STBI_ASSERT(0);
1378
1663
  }
1379
- #undef CASE
1664
+ #undef STBI__CASE
1380
1665
  }
1381
1666
 
1382
1667
  STBI_FREE(data);
@@ -1387,7 +1672,9 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r
1387
1672
  static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
1388
1673
  {
1389
1674
  int i,k,n;
1390
- float *output = (float *) stbi__malloc(x * y * comp * sizeof(float));
1675
+ float *output;
1676
+ if (!data) return NULL;
1677
+ output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0);
1391
1678
  if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); }
1392
1679
  // compute number of non-alpha components
1393
1680
  if (comp & 1) n = comp; else n = comp-1;
@@ -1395,7 +1682,11 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
1395
1682
  for (k=0; k < n; ++k) {
1396
1683
  output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1397
1684
  }
1398
- if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
1685
+ }
1686
+ if (n < comp) {
1687
+ for (i=0; i < x*y; ++i) {
1688
+ output[i*comp + n] = data[i*comp + n]/255.0f;
1689
+ }
1399
1690
  }
1400
1691
  STBI_FREE(data);
1401
1692
  return output;
@@ -1407,7 +1698,9 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
1407
1698
  static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
1408
1699
  {
1409
1700
  int i,k,n;
1410
- stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp);
1701
+ stbi_uc *output;
1702
+ if (!data) return NULL;
1703
+ output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
1411
1704
  if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); }
1412
1705
  // compute number of non-alpha components
1413
1706
  if (comp & 1) n = comp; else n = comp-1;
@@ -1472,7 +1765,7 @@ typedef struct
1472
1765
  stbi__context *s;
1473
1766
  stbi__huffman huff_dc[4];
1474
1767
  stbi__huffman huff_ac[4];
1475
- stbi_uc dequant[4][64];
1768
+ stbi__uint16 dequant[4][64];
1476
1769
  stbi__int16 fast_ac[4][1 << FAST_BITS];
1477
1770
 
1478
1771
  // sizes for components, interleaved MCUs
@@ -1508,6 +1801,9 @@ typedef struct
1508
1801
  int succ_high;
1509
1802
  int succ_low;
1510
1803
  int eob_run;
1804
+ int jfif;
1805
+ int app14_color_transform; // Adobe APP14 tag
1806
+ int rgb;
1511
1807
 
1512
1808
  int scan_n, order[4];
1513
1809
  int restart_interval, todo;
@@ -1520,7 +1816,8 @@ typedef struct
1520
1816
 
1521
1817
  static int stbi__build_huffman(stbi__huffman *h, int *count)
1522
1818
  {
1523
- int i,j,k=0,code;
1819
+ int i,j,k=0;
1820
+ unsigned int code;
1524
1821
  // build size list for each symbol (from JPEG spec)
1525
1822
  for (i=0; i < 16; ++i)
1526
1823
  for (j=0; j < count[i]; ++j)
@@ -1536,7 +1833,7 @@ static int stbi__build_huffman(stbi__huffman *h, int *count)
1536
1833
  if (h->size[k] == j) {
1537
1834
  while (h->size[k] == j)
1538
1835
  h->code[k++] = (stbi__uint16) (code++);
1539
- if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG");
1836
+ if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG");
1540
1837
  }
1541
1838
  // compute largest code + 1 for this size, preshifted as needed later
1542
1839
  h->maxcode[j] = code << (16-j);
@@ -1577,10 +1874,10 @@ static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1577
1874
  // magnitude code followed by receive_extend code
1578
1875
  int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1579
1876
  int m = 1 << (magbits - 1);
1580
- if (k < m) k += (-1 << magbits) + 1;
1877
+ if (k < m) k += (~0U << magbits) + 1;
1581
1878
  // if the result is small enough, we can fit it in fast_ac table
1582
1879
  if (k >= -128 && k <= 127)
1583
- fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
1880
+ fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
1584
1881
  }
1585
1882
  }
1586
1883
  }
@@ -1589,9 +1886,10 @@ static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1589
1886
  static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1590
1887
  {
1591
1888
  do {
1592
- int b = j->nomore ? 0 : stbi__get8(j->s);
1889
+ unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
1593
1890
  if (b == 0xff) {
1594
1891
  int c = stbi__get8(j->s);
1892
+ while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes
1595
1893
  if (c != 0) {
1596
1894
  j->marker = (unsigned char) c;
1597
1895
  j->nomore = 1;
@@ -1604,7 +1902,7 @@ static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1604
1902
  }
1605
1903
 
1606
1904
  // (1 << n) - 1
1607
- static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1905
+ static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1608
1906
 
1609
1907
  // decode a jpeg huffman value from the bitstream
1610
1908
  stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
@@ -1657,7 +1955,7 @@ stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1657
1955
  }
1658
1956
 
1659
1957
  // bias[n] = (-1<<n) + 1
1660
- static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1958
+ static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1661
1959
 
1662
1960
  // combined JPEG 'receive' and JPEG 'extend', since baseline
1663
1961
  // always extends everything it receives.
@@ -1700,7 +1998,7 @@ stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
1700
1998
 
1701
1999
  // given a value that's at position X in the zigzag stream,
1702
2000
  // where does it appear in the 8x8 matrix coded as row-major?
1703
- static stbi_uc stbi__jpeg_dezigzag[64+15] =
2001
+ static const stbi_uc stbi__jpeg_dezigzag[64+15] =
1704
2002
  {
1705
2003
  0, 1, 8, 16, 9, 2, 3, 10,
1706
2004
  17, 24, 32, 25, 18, 11, 4, 5,
@@ -1716,7 +2014,7 @@ static stbi_uc stbi__jpeg_dezigzag[64+15] =
1716
2014
  };
1717
2015
 
1718
2016
  // decode one 64-entry block--
1719
- static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi_uc *dequant)
2017
+ static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant)
1720
2018
  {
1721
2019
  int diff,dc,k;
1722
2020
  int t;
@@ -1926,7 +2224,7 @@ stbi_inline static stbi_uc stbi__clamp(int x)
1926
2224
  }
1927
2225
 
1928
2226
  #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
1929
- #define stbi__fsh(x) ((x) << 12)
2227
+ #define stbi__fsh(x) ((x) * 4096)
1930
2228
 
1931
2229
  // derived from jidctint -- DCT_ISLOW
1932
2230
  #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
@@ -1981,7 +2279,7 @@ static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
1981
2279
  // (1|2|3|4|5|6|7)==0 0 seconds
1982
2280
  // all separate -0.047 seconds
1983
2281
  // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds
1984
- int dcterm = d[0] << 2;
2282
+ int dcterm = d[0]*4;
1985
2283
  v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1986
2284
  } else {
1987
2285
  STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
@@ -2425,7 +2723,7 @@ static stbi_uc stbi__get_marker(stbi__jpeg *j)
2425
2723
  x = stbi__get8(j->s);
2426
2724
  if (x != 0xff) return STBI__MARKER_none;
2427
2725
  while (x == 0xff)
2428
- x = stbi__get8(j->s);
2726
+ x = stbi__get8(j->s); // consume repeated 0xff fill bytes
2429
2727
  return x;
2430
2728
  }
2431
2729
 
@@ -2440,7 +2738,7 @@ static void stbi__jpeg_reset(stbi__jpeg *j)
2440
2738
  j->code_bits = 0;
2441
2739
  j->code_buffer = 0;
2442
2740
  j->nomore = 0;
2443
- j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
2741
+ j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
2444
2742
  j->marker = STBI__MARKER_none;
2445
2743
  j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2446
2744
  j->eob_run = 0;
@@ -2572,7 +2870,7 @@ static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2572
2870
  }
2573
2871
  }
2574
2872
 
2575
- static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant)
2873
+ static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)
2576
2874
  {
2577
2875
  int i;
2578
2876
  for (i=0; i < 64; ++i)
@@ -2614,13 +2912,14 @@ static int stbi__process_marker(stbi__jpeg *z, int m)
2614
2912
  L = stbi__get16be(z->s)-2;
2615
2913
  while (L > 0) {
2616
2914
  int q = stbi__get8(z->s);
2617
- int p = q >> 4;
2915
+ int p = q >> 4, sixteen = (p != 0);
2618
2916
  int t = q & 15,i;
2619
- if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG");
2917
+ if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG");
2620
2918
  if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
2919
+
2621
2920
  for (i=0; i < 64; ++i)
2622
- z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
2623
- L -= 65;
2921
+ z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
2922
+ L -= (sixteen ? 129 : 65);
2624
2923
  }
2625
2924
  return L==0;
2626
2925
 
@@ -2653,12 +2952,50 @@ static int stbi__process_marker(stbi__jpeg *z, int m)
2653
2952
  }
2654
2953
  return L==0;
2655
2954
  }
2955
+
2656
2956
  // check for comment block or APP blocks
2657
2957
  if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2658
- stbi__skip(z->s, stbi__get16be(z->s)-2);
2958
+ L = stbi__get16be(z->s);
2959
+ if (L < 2) {
2960
+ if (m == 0xFE)
2961
+ return stbi__err("bad COM len","Corrupt JPEG");
2962
+ else
2963
+ return stbi__err("bad APP len","Corrupt JPEG");
2964
+ }
2965
+ L -= 2;
2966
+
2967
+ if (m == 0xE0 && L >= 5) { // JFIF APP0 segment
2968
+ static const unsigned char tag[5] = {'J','F','I','F','\0'};
2969
+ int ok = 1;
2970
+ int i;
2971
+ for (i=0; i < 5; ++i)
2972
+ if (stbi__get8(z->s) != tag[i])
2973
+ ok = 0;
2974
+ L -= 5;
2975
+ if (ok)
2976
+ z->jfif = 1;
2977
+ } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment
2978
+ static const unsigned char tag[6] = {'A','d','o','b','e','\0'};
2979
+ int ok = 1;
2980
+ int i;
2981
+ for (i=0; i < 6; ++i)
2982
+ if (stbi__get8(z->s) != tag[i])
2983
+ ok = 0;
2984
+ L -= 6;
2985
+ if (ok) {
2986
+ stbi__get8(z->s); // version
2987
+ stbi__get16be(z->s); // flags0
2988
+ stbi__get16be(z->s); // flags1
2989
+ z->app14_color_transform = stbi__get8(z->s); // color transform
2990
+ L -= 6;
2991
+ }
2992
+ }
2993
+
2994
+ stbi__skip(z->s, L);
2659
2995
  return 1;
2660
2996
  }
2661
- return 0;
2997
+
2998
+ return stbi__err("unknown marker","Corrupt JPEG");
2662
2999
  }
2663
3000
 
2664
3001
  // after we see SOS
@@ -2701,6 +3038,28 @@ static int stbi__process_scan_header(stbi__jpeg *z)
2701
3038
  return 1;
2702
3039
  }
2703
3040
 
3041
+ static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)
3042
+ {
3043
+ int i;
3044
+ for (i=0; i < ncomp; ++i) {
3045
+ if (z->img_comp[i].raw_data) {
3046
+ STBI_FREE(z->img_comp[i].raw_data);
3047
+ z->img_comp[i].raw_data = NULL;
3048
+ z->img_comp[i].data = NULL;
3049
+ }
3050
+ if (z->img_comp[i].raw_coeff) {
3051
+ STBI_FREE(z->img_comp[i].raw_coeff);
3052
+ z->img_comp[i].raw_coeff = 0;
3053
+ z->img_comp[i].coeff = 0;
3054
+ }
3055
+ if (z->img_comp[i].linebuf) {
3056
+ STBI_FREE(z->img_comp[i].linebuf);
3057
+ z->img_comp[i].linebuf = NULL;
3058
+ }
3059
+ }
3060
+ return why;
3061
+ }
3062
+
2704
3063
  static int stbi__process_frame_header(stbi__jpeg *z, int scan)
2705
3064
  {
2706
3065
  stbi__context *s = z->s;
@@ -2710,7 +3069,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan)
2710
3069
  s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
2711
3070
  s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
2712
3071
  c = stbi__get8(s);
2713
- if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG"); // JFIF requires
3072
+ if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG");
2714
3073
  s->img_n = c;
2715
3074
  for (i=0; i < c; ++i) {
2716
3075
  z->img_comp[i].data = NULL;
@@ -2719,11 +3078,12 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan)
2719
3078
 
2720
3079
  if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
2721
3080
 
3081
+ z->rgb = 0;
2722
3082
  for (i=0; i < s->img_n; ++i) {
3083
+ static const unsigned char rgb[3] = { 'R', 'G', 'B' };
2723
3084
  z->img_comp[i].id = stbi__get8(s);
2724
- if (z->img_comp[i].id != i+1) // JFIF requires
2725
- if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files!
2726
- return stbi__err("bad component ID","Corrupt JPEG");
3085
+ if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3086
+ ++z->rgb;
2727
3087
  q = stbi__get8(s);
2728
3088
  z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG");
2729
3089
  z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG");
@@ -2732,7 +3092,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan)
2732
3092
 
2733
3093
  if (scan != STBI__SCAN_load) return 1;
2734
3094
 
2735
- if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
3095
+ if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode");
2736
3096
 
2737
3097
  for (i=0; i < s->img_n; ++i) {
2738
3098
  if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
@@ -2744,6 +3104,7 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan)
2744
3104
  z->img_v_max = v_max;
2745
3105
  z->img_mcu_w = h_max * 8;
2746
3106
  z->img_mcu_h = v_max * 8;
3107
+ // these sizes can't be more than 17 bits
2747
3108
  z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
2748
3109
  z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
2749
3110
 
@@ -2755,28 +3116,27 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan)
2755
3116
  // the bogus oversized data from using interleaved MCUs and their
2756
3117
  // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
2757
3118
  // discard the extra data until colorspace conversion
3119
+ //
3120
+ // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)
3121
+ // so these muls can't overflow with 32-bit ints (which we require)
2758
3122
  z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
2759
3123
  z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
2760
- z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
2761
-
2762
- if (z->img_comp[i].raw_data == NULL) {
2763
- for(--i; i >= 0; --i) {
2764
- STBI_FREE(z->img_comp[i].raw_data);
2765
- z->img_comp[i].raw_data = NULL;
2766
- }
2767
- return stbi__err("outofmem", "Out of memory");
2768
- }
3124
+ z->img_comp[i].coeff = 0;
3125
+ z->img_comp[i].raw_coeff = 0;
3126
+ z->img_comp[i].linebuf = NULL;
3127
+ z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3128
+ if (z->img_comp[i].raw_data == NULL)
3129
+ return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
2769
3130
  // align blocks for idct using mmx/sse
2770
3131
  z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
2771
- z->img_comp[i].linebuf = NULL;
2772
3132
  if (z->progressive) {
2773
- z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;
2774
- z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
2775
- z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15);
3133
+ // w2, h2 are multiples of 8 (see above)
3134
+ z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3135
+ z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3136
+ z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);
3137
+ if (z->img_comp[i].raw_coeff == NULL)
3138
+ return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
2776
3139
  z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
2777
- } else {
2778
- z->img_comp[i].coeff = 0;
2779
- z->img_comp[i].raw_coeff = 0;
2780
3140
  }
2781
3141
  }
2782
3142
 
@@ -2795,6 +3155,8 @@ static int stbi__process_frame_header(stbi__jpeg *z, int scan)
2795
3155
  static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
2796
3156
  {
2797
3157
  int m;
3158
+ z->jfif = 0;
3159
+ z->app14_color_transform = -1; // valid values are 0,1,2
2798
3160
  z->marker = STBI__MARKER_none; // initialize cached marker to empty
2799
3161
  m = stbi__get_marker(z);
2800
3162
  if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
@@ -2836,12 +3198,15 @@ static int stbi__decode_jpeg_image(stbi__jpeg *j)
2836
3198
  if (x == 255) {
2837
3199
  j->marker = stbi__get8(j->s);
2838
3200
  break;
2839
- } else if (x != 0) {
2840
- return stbi__err("junk before marker", "Corrupt JPEG");
2841
3201
  }
2842
3202
  }
2843
3203
  // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
2844
3204
  }
3205
+ } else if (stbi__DNL(m)) {
3206
+ int Ld = stbi__get16be(j->s);
3207
+ stbi__uint32 NL = stbi__get16be(j->s);
3208
+ if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG");
3209
+ if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG");
2845
3210
  } else {
2846
3211
  if (!stbi__process_marker(j, m)) return 0;
2847
3212
  }
@@ -3060,38 +3425,9 @@ static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_
3060
3425
  return out;
3061
3426
  }
3062
3427
 
3063
- #ifdef STBI_JPEG_OLD
3064
- // this is the same YCbCr-to-RGB calculation that stb_image has used
3065
- // historically before the algorithm changes in 1.49
3066
- #define float2fixed(x) ((int) ((x) * 65536 + 0.5))
3067
- static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)
3068
- {
3069
- int i;
3070
- for (i=0; i < count; ++i) {
3071
- int y_fixed = (y[i] << 16) + 32768; // rounding
3072
- int r,g,b;
3073
- int cr = pcr[i] - 128;
3074
- int cb = pcb[i] - 128;
3075
- r = y_fixed + cr*float2fixed(1.40200f);
3076
- g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
3077
- b = y_fixed + cb*float2fixed(1.77200f);
3078
- r >>= 16;
3079
- g >>= 16;
3080
- b >>= 16;
3081
- if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
3082
- if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
3083
- if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
3084
- out[0] = (stbi_uc)r;
3085
- out[1] = (stbi_uc)g;
3086
- out[2] = (stbi_uc)b;
3087
- out[3] = 255;
3088
- out += step;
3089
- }
3090
- }
3091
- #else
3092
3428
  // this is a reduced-precision calculation of YCbCr-to-RGB introduced
3093
3429
  // to make sure the code produces the same results in both SIMD and scalar
3094
- #define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3430
+ #define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3095
3431
  static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)
3096
3432
  {
3097
3433
  int i;
@@ -3100,9 +3436,9 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc
3100
3436
  int r,g,b;
3101
3437
  int cr = pcr[i] - 128;
3102
3438
  int cb = pcb[i] - 128;
3103
- r = y_fixed + cr* float2fixed(1.40200f);
3104
- g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3105
- b = y_fixed + cb* float2fixed(1.77200f);
3439
+ r = y_fixed + cr* stbi__float2fixed(1.40200f);
3440
+ g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3441
+ b = y_fixed + cb* stbi__float2fixed(1.77200f);
3106
3442
  r >>= 20;
3107
3443
  g >>= 20;
3108
3444
  b >>= 20;
@@ -3116,7 +3452,6 @@ static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc
3116
3452
  out += step;
3117
3453
  }
3118
3454
  }
3119
- #endif
3120
3455
 
3121
3456
  #if defined(STBI_SSE2) || defined(STBI_NEON)
3122
3457
  static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)
@@ -3235,9 +3570,9 @@ static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc cons
3235
3570
  int r,g,b;
3236
3571
  int cr = pcr[i] - 128;
3237
3572
  int cb = pcb[i] - 128;
3238
- r = y_fixed + cr* float2fixed(1.40200f);
3239
- g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3240
- b = y_fixed + cb* float2fixed(1.77200f);
3573
+ r = y_fixed + cr* stbi__float2fixed(1.40200f);
3574
+ g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3575
+ b = y_fixed + cb* stbi__float2fixed(1.77200f);
3241
3576
  r >>= 20;
3242
3577
  g >>= 20;
3243
3578
  b >>= 20;
@@ -3263,18 +3598,14 @@ static void stbi__setup_jpeg(stbi__jpeg *j)
3263
3598
  #ifdef STBI_SSE2
3264
3599
  if (stbi__sse2_available()) {
3265
3600
  j->idct_block_kernel = stbi__idct_simd;
3266
- #ifndef STBI_JPEG_OLD
3267
3601
  j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3268
- #endif
3269
3602
  j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3270
3603
  }
3271
3604
  #endif
3272
3605
 
3273
3606
  #ifdef STBI_NEON
3274
3607
  j->idct_block_kernel = stbi__idct_simd;
3275
- #ifndef STBI_JPEG_OLD
3276
3608
  j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3277
- #endif
3278
3609
  j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3279
3610
  #endif
3280
3611
  }
@@ -3282,23 +3613,7 @@ static void stbi__setup_jpeg(stbi__jpeg *j)
3282
3613
  // clean up the temporary component buffers
3283
3614
  static void stbi__cleanup_jpeg(stbi__jpeg *j)
3284
3615
  {
3285
- int i;
3286
- for (i=0; i < j->s->img_n; ++i) {
3287
- if (j->img_comp[i].raw_data) {
3288
- STBI_FREE(j->img_comp[i].raw_data);
3289
- j->img_comp[i].raw_data = NULL;
3290
- j->img_comp[i].data = NULL;
3291
- }
3292
- if (j->img_comp[i].raw_coeff) {
3293
- STBI_FREE(j->img_comp[i].raw_coeff);
3294
- j->img_comp[i].raw_coeff = 0;
3295
- j->img_comp[i].coeff = 0;
3296
- }
3297
- if (j->img_comp[i].linebuf) {
3298
- STBI_FREE(j->img_comp[i].linebuf);
3299
- j->img_comp[i].linebuf = NULL;
3300
- }
3301
- }
3616
+ stbi__free_jpeg_components(j, j->s->img_n, 0);
3302
3617
  }
3303
3618
 
3304
3619
  typedef struct
@@ -3311,9 +3626,16 @@ typedef struct
3311
3626
  int ypos; // which pre-expansion row we're on
3312
3627
  } stbi__resample;
3313
3628
 
3629
+ // fast 0..255 * 0..255 => 0..255 rounded multiplication
3630
+ static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
3631
+ {
3632
+ unsigned int t = x*y + 128;
3633
+ return (stbi_uc) ((t + (t >>8)) >> 8);
3634
+ }
3635
+
3314
3636
  static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
3315
3637
  {
3316
- int n, decode_n;
3638
+ int n, decode_n, is_rgb;
3317
3639
  z->s->img_n = 0; // make stbi__cleanup_jpeg safe
3318
3640
 
3319
3641
  // validate req_comp
@@ -3323,9 +3645,11 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp
3323
3645
  if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
3324
3646
 
3325
3647
  // determine actual number of components to generate
3326
- n = req_comp ? req_comp : z->s->img_n;
3648
+ n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3327
3649
 
3328
- if (z->s->img_n == 3 && n < 3)
3650
+ is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3651
+
3652
+ if (z->s->img_n == 3 && n < 3 && !is_rgb)
3329
3653
  decode_n = 1;
3330
3654
  else
3331
3655
  decode_n = z->s->img_n;
@@ -3362,7 +3686,7 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp
3362
3686
  }
3363
3687
 
3364
3688
  // can't error after this so, this is safe
3365
- output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
3689
+ output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3366
3690
  if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
3367
3691
 
3368
3692
  // now go ahead and resample
@@ -3385,7 +3709,39 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp
3385
3709
  if (n >= 3) {
3386
3710
  stbi_uc *y = coutput[0];
3387
3711
  if (z->s->img_n == 3) {
3388
- z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3712
+ if (is_rgb) {
3713
+ for (i=0; i < z->s->img_x; ++i) {
3714
+ out[0] = y[i];
3715
+ out[1] = coutput[1][i];
3716
+ out[2] = coutput[2][i];
3717
+ out[3] = 255;
3718
+ out += n;
3719
+ }
3720
+ } else {
3721
+ z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3722
+ }
3723
+ } else if (z->s->img_n == 4) {
3724
+ if (z->app14_color_transform == 0) { // CMYK
3725
+ for (i=0; i < z->s->img_x; ++i) {
3726
+ stbi_uc m = coutput[3][i];
3727
+ out[0] = stbi__blinn_8x8(coutput[0][i], m);
3728
+ out[1] = stbi__blinn_8x8(coutput[1][i], m);
3729
+ out[2] = stbi__blinn_8x8(coutput[2][i], m);
3730
+ out[3] = 255;
3731
+ out += n;
3732
+ }
3733
+ } else if (z->app14_color_transform == 2) { // YCCK
3734
+ z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3735
+ for (i=0; i < z->s->img_x; ++i) {
3736
+ stbi_uc m = coutput[3][i];
3737
+ out[0] = stbi__blinn_8x8(255 - out[0], m);
3738
+ out[1] = stbi__blinn_8x8(255 - out[1], m);
3739
+ out[2] = stbi__blinn_8x8(255 - out[2], m);
3740
+ out += n;
3741
+ }
3742
+ } else { // YCbCr + alpha? Ignore the fourth channel for now
3743
+ z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3744
+ }
3389
3745
  } else
3390
3746
  for (i=0; i < z->s->img_x; ++i) {
3391
3747
  out[0] = out[1] = out[2] = y[i];
@@ -3393,37 +3749,70 @@ static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp
3393
3749
  out += n;
3394
3750
  }
3395
3751
  } else {
3396
- stbi_uc *y = coutput[0];
3397
- if (n == 1)
3398
- for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3399
- else
3400
- for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3752
+ if (is_rgb) {
3753
+ if (n == 1)
3754
+ for (i=0; i < z->s->img_x; ++i)
3755
+ *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3756
+ else {
3757
+ for (i=0; i < z->s->img_x; ++i, out += 2) {
3758
+ out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3759
+ out[1] = 255;
3760
+ }
3761
+ }
3762
+ } else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
3763
+ for (i=0; i < z->s->img_x; ++i) {
3764
+ stbi_uc m = coutput[3][i];
3765
+ stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
3766
+ stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
3767
+ stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
3768
+ out[0] = stbi__compute_y(r, g, b);
3769
+ out[1] = 255;
3770
+ out += n;
3771
+ }
3772
+ } else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
3773
+ for (i=0; i < z->s->img_x; ++i) {
3774
+ out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
3775
+ out[1] = 255;
3776
+ out += n;
3777
+ }
3778
+ } else {
3779
+ stbi_uc *y = coutput[0];
3780
+ if (n == 1)
3781
+ for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3782
+ else
3783
+ for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
3784
+ }
3401
3785
  }
3402
3786
  }
3403
3787
  stbi__cleanup_jpeg(z);
3404
3788
  *out_x = z->s->img_x;
3405
3789
  *out_y = z->s->img_y;
3406
- if (comp) *comp = z->s->img_n; // report original components, not output
3790
+ if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output
3407
3791
  return output;
3408
3792
  }
3409
3793
  }
3410
3794
 
3411
- static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
3795
+ static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
3412
3796
  {
3413
- stbi__jpeg j;
3414
- j.s = s;
3415
- stbi__setup_jpeg(&j);
3416
- return load_jpeg_image(&j, x,y,comp,req_comp);
3797
+ unsigned char* result;
3798
+ stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));
3799
+ STBI_NOTUSED(ri);
3800
+ j->s = s;
3801
+ stbi__setup_jpeg(j);
3802
+ result = load_jpeg_image(j, x,y,comp,req_comp);
3803
+ STBI_FREE(j);
3804
+ return result;
3417
3805
  }
3418
3806
 
3419
3807
  static int stbi__jpeg_test(stbi__context *s)
3420
3808
  {
3421
3809
  int r;
3422
- stbi__jpeg j;
3423
- j.s = s;
3424
- stbi__setup_jpeg(&j);
3425
- r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
3810
+ stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));
3811
+ j->s = s;
3812
+ stbi__setup_jpeg(j);
3813
+ r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
3426
3814
  stbi__rewind(s);
3815
+ STBI_FREE(j);
3427
3816
  return r;
3428
3817
  }
3429
3818
 
@@ -3435,15 +3824,18 @@ static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
3435
3824
  }
3436
3825
  if (x) *x = j->s->img_x;
3437
3826
  if (y) *y = j->s->img_y;
3438
- if (comp) *comp = j->s->img_n;
3827
+ if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
3439
3828
  return 1;
3440
3829
  }
3441
3830
 
3442
3831
  static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
3443
3832
  {
3444
- stbi__jpeg j;
3445
- j.s = s;
3446
- return stbi__jpeg_info_raw(&j, x, y, comp);
3833
+ int result;
3834
+ stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));
3835
+ j->s = s;
3836
+ result = stbi__jpeg_info_raw(j, x, y, comp);
3837
+ STBI_FREE(j);
3838
+ return result;
3447
3839
  }
3448
3840
  #endif
3449
3841
 
@@ -3489,7 +3881,7 @@ stbi_inline static int stbi__bit_reverse(int v, int bits)
3489
3881
  return stbi__bitreverse16(v) >> (16-bits);
3490
3882
  }
3491
3883
 
3492
- static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num)
3884
+ static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)
3493
3885
  {
3494
3886
  int i,k=0;
3495
3887
  int code, next_code[16], sizes[17];
@@ -3616,14 +4008,15 @@ stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3616
4008
  static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes
3617
4009
  {
3618
4010
  char *q;
3619
- int cur, limit;
4011
+ int cur, limit, old_limit;
3620
4012
  z->zout = zout;
3621
4013
  if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");
3622
4014
  cur = (int) (z->zout - z->zout_start);
3623
- limit = (int) (z->zout_end - z->zout_start);
4015
+ limit = old_limit = (int) (z->zout_end - z->zout_start);
3624
4016
  while (cur + n > limit)
3625
4017
  limit *= 2;
3626
- q = (char *) STBI_REALLOC(z->zout_start, limit);
4018
+ q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
4019
+ STBI_NOTUSED(old_limit);
3627
4020
  if (q == NULL) return stbi__err("outofmem", "Out of memory");
3628
4021
  z->zout_start = q;
3629
4022
  z->zout = q + cur;
@@ -3631,18 +4024,18 @@ static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room
3631
4024
  return 1;
3632
4025
  }
3633
4026
 
3634
- static int stbi__zlength_base[31] = {
4027
+ static const int stbi__zlength_base[31] = {
3635
4028
  3,4,5,6,7,8,9,10,11,13,
3636
4029
  15,17,19,23,27,31,35,43,51,59,
3637
4030
  67,83,99,115,131,163,195,227,258,0,0 };
3638
4031
 
3639
- static int stbi__zlength_extra[31]=
4032
+ static const int stbi__zlength_extra[31]=
3640
4033
  { 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 };
3641
4034
 
3642
- static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
4035
+ static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3643
4036
  257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
3644
4037
 
3645
- static int stbi__zdist_extra[32] =
4038
+ static const int stbi__zdist_extra[32] =
3646
4039
  { 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};
3647
4040
 
3648
4041
  static int stbi__parse_huffman_block(stbi__zbuf *a)
@@ -3689,7 +4082,7 @@ static int stbi__parse_huffman_block(stbi__zbuf *a)
3689
4082
 
3690
4083
  static int stbi__compute_huffman_codes(stbi__zbuf *a)
3691
4084
  {
3692
- static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
4085
+ static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
3693
4086
  stbi__zhuffman z_codelength;
3694
4087
  stbi_uc lencodes[286+32+137];//padding for maximum single op
3695
4088
  stbi_uc codelength_sizes[19];
@@ -3698,6 +4091,7 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a)
3698
4091
  int hlit = stbi__zreceive(a,5) + 257;
3699
4092
  int hdist = stbi__zreceive(a,5) + 1;
3700
4093
  int hclen = stbi__zreceive(a,4) + 4;
4094
+ int ntot = hlit + hdist;
3701
4095
 
3702
4096
  memset(codelength_sizes, 0, sizeof(codelength_sizes));
3703
4097
  for (i=0; i < hclen; ++i) {
@@ -3707,33 +4101,35 @@ static int stbi__compute_huffman_codes(stbi__zbuf *a)
3707
4101
  if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
3708
4102
 
3709
4103
  n = 0;
3710
- while (n < hlit + hdist) {
4104
+ while (n < ntot) {
3711
4105
  int c = stbi__zhuffman_decode(a, &z_codelength);
3712
4106
  if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG");
3713
4107
  if (c < 16)
3714
4108
  lencodes[n++] = (stbi_uc) c;
3715
- else if (c == 16) {
3716
- c = stbi__zreceive(a,2)+3;
3717
- memset(lencodes+n, lencodes[n-1], c);
3718
- n += c;
3719
- } else if (c == 17) {
3720
- c = stbi__zreceive(a,3)+3;
3721
- memset(lencodes+n, 0, c);
3722
- n += c;
3723
- } else {
3724
- STBI_ASSERT(c == 18);
3725
- c = stbi__zreceive(a,7)+11;
3726
- memset(lencodes+n, 0, c);
4109
+ else {
4110
+ stbi_uc fill = 0;
4111
+ if (c == 16) {
4112
+ c = stbi__zreceive(a,2)+3;
4113
+ if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG");
4114
+ fill = lencodes[n-1];
4115
+ } else if (c == 17)
4116
+ c = stbi__zreceive(a,3)+3;
4117
+ else {
4118
+ STBI_ASSERT(c == 18);
4119
+ c = stbi__zreceive(a,7)+11;
4120
+ }
4121
+ if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG");
4122
+ memset(lencodes+n, fill, c);
3727
4123
  n += c;
3728
4124
  }
3729
4125
  }
3730
- if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG");
4126
+ if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG");
3731
4127
  if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
3732
4128
  if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
3733
4129
  return 1;
3734
4130
  }
3735
4131
 
3736
- static int stbi__parse_uncomperssed_block(stbi__zbuf *a)
4132
+ static int stbi__parse_uncompressed_block(stbi__zbuf *a)
3737
4133
  {
3738
4134
  stbi_uc header[4];
3739
4135
  int len,nlen,k;
@@ -3775,9 +4171,24 @@ static int stbi__parse_zlib_header(stbi__zbuf *a)
3775
4171
  return 1;
3776
4172
  }
3777
4173
 
3778
- // @TODO: should statically initialize these for optimal thread safety
3779
- static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
3780
- static void stbi__init_zdefaults(void)
4174
+ static const stbi_uc stbi__zdefault_length[288] =
4175
+ {
4176
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4177
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4178
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4179
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4180
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4181
+ 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4182
+ 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4183
+ 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4184
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8
4185
+ };
4186
+ static const stbi_uc stbi__zdefault_distance[32] =
4187
+ {
4188
+ 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
4189
+ };
4190
+ /*
4191
+ Init algorithm:
3781
4192
  {
3782
4193
  int i; // use <= to match clearly with spec
3783
4194
  for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
@@ -3787,6 +4198,7 @@ static void stbi__init_zdefaults(void)
3787
4198
 
3788
4199
  for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
3789
4200
  }
4201
+ */
3790
4202
 
3791
4203
  static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
3792
4204
  {
@@ -3799,13 +4211,12 @@ static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
3799
4211
  final = stbi__zreceive(a,1);
3800
4212
  type = stbi__zreceive(a,2);
3801
4213
  if (type == 0) {
3802
- if (!stbi__parse_uncomperssed_block(a)) return 0;
4214
+ if (!stbi__parse_uncompressed_block(a)) return 0;
3803
4215
  } else if (type == 3) {
3804
4216
  return 0;
3805
4217
  } else {
3806
4218
  if (type == 1) {
3807
4219
  // use fixed code lengths
3808
- if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
3809
4220
  if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0;
3810
4221
  if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0;
3811
4222
  } else {
@@ -3930,7 +4341,7 @@ static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
3930
4341
 
3931
4342
  static int stbi__check_png_header(stbi__context *s)
3932
4343
  {
3933
- static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4344
+ static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
3934
4345
  int i;
3935
4346
  for (i=0; i < 8; ++i)
3936
4347
  if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
@@ -3941,6 +4352,7 @@ typedef struct
3941
4352
  {
3942
4353
  stbi__context *s;
3943
4354
  stbi_uc *idata, *expanded, *out;
4355
+ int depth;
3944
4356
  } stbi__png;
3945
4357
 
3946
4358
 
@@ -3975,35 +4387,40 @@ static int stbi__paeth(int a, int b, int c)
3975
4387
  return c;
3976
4388
  }
3977
4389
 
3978
- static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4390
+ static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
3979
4391
 
3980
4392
  // create the png data from post-deflated data
3981
4393
  static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)
3982
4394
  {
4395
+ int bytes = (depth == 16? 2 : 1);
3983
4396
  stbi__context *s = a->s;
3984
- stbi__uint32 i,j,stride = x*out_n;
4397
+ stbi__uint32 i,j,stride = x*out_n*bytes;
3985
4398
  stbi__uint32 img_len, img_width_bytes;
3986
4399
  int k;
3987
4400
  int img_n = s->img_n; // copy it into a local for later
3988
4401
 
4402
+ int output_bytes = out_n*bytes;
4403
+ int filter_bytes = img_n*bytes;
4404
+ int width = x;
4405
+
3989
4406
  STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
3990
- a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into
4407
+ a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into
3991
4408
  if (!a->out) return stbi__err("outofmem", "Out of memory");
3992
4409
 
4410
+ if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG");
3993
4411
  img_width_bytes = (((img_n * x * depth) + 7) >> 3);
3994
4412
  img_len = (img_width_bytes + 1) * y;
3995
- if (s->img_x == x && s->img_y == y) {
3996
- if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG");
3997
- } else { // interlaced:
3998
- if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
3999
- }
4413
+
4414
+ // we used to check for exact match between raw_len and img_len on non-interlaced PNGs,
4415
+ // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),
4416
+ // so just check for raw_len < img_len always.
4417
+ if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
4000
4418
 
4001
4419
  for (j=0; j < y; ++j) {
4002
4420
  stbi_uc *cur = a->out + stride*j;
4003
- stbi_uc *prior = cur - stride;
4421
+ stbi_uc *prior;
4004
4422
  int filter = *raw++;
4005
- int filter_bytes = img_n;
4006
- int width = x;
4423
+
4007
4424
  if (filter > 4)
4008
4425
  return stbi__err("invalid filter","Corrupt PNG");
4009
4426
 
@@ -4013,6 +4430,7 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r
4013
4430
  filter_bytes = 1;
4014
4431
  width = img_width_bytes;
4015
4432
  }
4433
+ prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above
4016
4434
 
4017
4435
  // if first row, use special filter that doesn't sample previous row
4018
4436
  if (j == 0) filter = first_row_filter[filter];
@@ -4036,6 +4454,14 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r
4036
4454
  raw += img_n;
4037
4455
  cur += out_n;
4038
4456
  prior += out_n;
4457
+ } else if (depth == 16) {
4458
+ if (img_n != out_n) {
4459
+ cur[filter_bytes] = 255; // first pixel top byte
4460
+ cur[filter_bytes+1] = 255; // first pixel bottom byte
4461
+ }
4462
+ raw += filter_bytes;
4463
+ cur += output_bytes;
4464
+ prior += output_bytes;
4039
4465
  } else {
4040
4466
  raw += 1;
4041
4467
  cur += 1;
@@ -4044,38 +4470,47 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r
4044
4470
 
4045
4471
  // this is a little gross, so that we don't switch per-pixel or per-component
4046
4472
  if (depth < 8 || img_n == out_n) {
4047
- int nk = (width - 1)*img_n;
4048
- #define CASE(f) \
4473
+ int nk = (width - 1)*filter_bytes;
4474
+ #define STBI__CASE(f) \
4049
4475
  case f: \
4050
4476
  for (k=0; k < nk; ++k)
4051
4477
  switch (filter) {
4052
4478
  // "none" filter turns into a memcpy here; make that explicit.
4053
4479
  case STBI__F_none: memcpy(cur, raw, nk); break;
4054
- CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break;
4055
- CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
4056
- CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break;
4057
- CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break;
4058
- CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break;
4059
- CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break;
4480
+ STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break;
4481
+ STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;
4482
+ STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break;
4483
+ STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break;
4484
+ STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break;
4485
+ STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break;
4060
4486
  }
4061
- #undef CASE
4487
+ #undef STBI__CASE
4062
4488
  raw += nk;
4063
4489
  } else {
4064
4490
  STBI_ASSERT(img_n+1 == out_n);
4065
- #define CASE(f) \
4491
+ #define STBI__CASE(f) \
4066
4492
  case f: \
4067
- for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
4068
- for (k=0; k < img_n; ++k)
4493
+ for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4494
+ for (k=0; k < filter_bytes; ++k)
4069
4495
  switch (filter) {
4070
- CASE(STBI__F_none) cur[k] = raw[k]; break;
4071
- CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break;
4072
- CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
4073
- CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break;
4074
- CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;
4075
- CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break;
4076
- CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break;
4496
+ STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break;
4497
+ STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break;
4498
+ STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;
4499
+ STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break;
4500
+ STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break;
4501
+ STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break;
4502
+ STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break;
4503
+ }
4504
+ #undef STBI__CASE
4505
+
4506
+ // the loop above sets the high byte of the pixels' alpha, but for
4507
+ // 16 bit png files we also need the low byte set. we'll do that here.
4508
+ if (depth == 16) {
4509
+ cur = a->out + stride*j; // start at the beginning of the row again
4510
+ for (i=0; i < x; ++i,cur+=output_bytes) {
4511
+ cur[filter_bytes+1] = 255;
4512
+ }
4077
4513
  }
4078
- #undef CASE
4079
4514
  }
4080
4515
  }
4081
4516
 
@@ -4151,6 +4586,17 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r
4151
4586
  }
4152
4587
  }
4153
4588
  }
4589
+ } else if (depth == 16) {
4590
+ // force the image data from big-endian to platform-native.
4591
+ // this is done in a separate pass due to the decoding relying
4592
+ // on the data being untouched, but could probably be done
4593
+ // per-line during decode if care is taken.
4594
+ stbi_uc *cur = a->out;
4595
+ stbi__uint16 *cur16 = (stbi__uint16*)cur;
4596
+
4597
+ for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
4598
+ *cur16 = (cur[0] << 8) | cur[1];
4599
+ }
4154
4600
  }
4155
4601
 
4156
4602
  return 1;
@@ -4158,13 +4604,15 @@ static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 r
4158
4604
 
4159
4605
  static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)
4160
4606
  {
4607
+ int bytes = (depth == 16 ? 2 : 1);
4608
+ int out_bytes = out_n * bytes;
4161
4609
  stbi_uc *final;
4162
4610
  int p;
4163
4611
  if (!interlaced)
4164
4612
  return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4165
4613
 
4166
4614
  // de-interlacing
4167
- final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
4615
+ final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4168
4616
  for (p=0; p < 7; ++p) {
4169
4617
  int xorig[] = { 0,4,0,2,0,1,0 };
4170
4618
  int yorig[] = { 0,0,4,0,2,0,1 };
@@ -4184,8 +4632,8 @@ static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint3
4184
4632
  for (i=0; i < x; ++i) {
4185
4633
  int out_y = j*yspc[p]+yorig[p];
4186
4634
  int out_x = i*xspc[p]+xorig[p];
4187
- memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n,
4188
- a->out + (j*x+i)*out_n, out_n);
4635
+ memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
4636
+ a->out + (j*x+i)*out_bytes, out_bytes);
4189
4637
  }
4190
4638
  }
4191
4639
  STBI_FREE(a->out);
@@ -4223,12 +4671,37 @@ static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)
4223
4671
  return 1;
4224
4672
  }
4225
4673
 
4674
+ static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)
4675
+ {
4676
+ stbi__context *s = z->s;
4677
+ stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4678
+ stbi__uint16 *p = (stbi__uint16*) z->out;
4679
+
4680
+ // compute color-based transparency, assuming we've
4681
+ // already got 65535 as the alpha value in the output
4682
+ STBI_ASSERT(out_n == 2 || out_n == 4);
4683
+
4684
+ if (out_n == 2) {
4685
+ for (i = 0; i < pixel_count; ++i) {
4686
+ p[1] = (p[0] == tc[0] ? 0 : 65535);
4687
+ p += 2;
4688
+ }
4689
+ } else {
4690
+ for (i = 0; i < pixel_count; ++i) {
4691
+ if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4692
+ p[3] = 0;
4693
+ p += 4;
4694
+ }
4695
+ }
4696
+ return 1;
4697
+ }
4698
+
4226
4699
  static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)
4227
4700
  {
4228
4701
  stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4229
4702
  stbi_uc *p, *temp_out, *orig = a->out;
4230
4703
 
4231
- p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
4704
+ p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4232
4705
  if (p == NULL) return stbi__err("outofmem", "Out of memory");
4233
4706
 
4234
4707
  // between here and free(out) below, exitting would leak
@@ -4294,9 +4767,10 @@ static void stbi__de_iphone(stbi__png *z)
4294
4767
  stbi_uc a = p[3];
4295
4768
  stbi_uc t = p[0];
4296
4769
  if (a) {
4297
- p[0] = p[2] * 255 / a;
4298
- p[1] = p[1] * 255 / a;
4299
- p[2] = t * 255 / a;
4770
+ stbi_uc half = a / 2;
4771
+ p[0] = (p[2] * 255 + half) / a;
4772
+ p[1] = (p[1] * 255 + half) / a;
4773
+ p[2] = ( t * 255 + half) / a;
4300
4774
  } else {
4301
4775
  p[0] = p[2];
4302
4776
  p[2] = t;
@@ -4315,14 +4789,15 @@ static void stbi__de_iphone(stbi__png *z)
4315
4789
  }
4316
4790
  }
4317
4791
 
4318
- #define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
4792
+ #define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
4319
4793
 
4320
4794
  static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
4321
4795
  {
4322
4796
  stbi_uc palette[1024], pal_img_n=0;
4323
- stbi_uc has_trans=0, tc[3];
4797
+ stbi_uc has_trans=0, tc[3]={0};
4798
+ stbi__uint16 tc16[3];
4324
4799
  stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4325
- int first=1,k,interlace=0, color=0, depth=0, is_iphone=0;
4800
+ int first=1,k,interlace=0, color=0, is_iphone=0;
4326
4801
  stbi__context *s = z->s;
4327
4802
 
4328
4803
  z->expanded = NULL;
@@ -4347,8 +4822,9 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
4347
4822
  if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");
4348
4823
  s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
4349
4824
  s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
4350
- depth = stbi__get8(s); if (depth != 1 && depth != 2 && depth != 4 && depth != 8) return stbi__err("1/2/4/8-bit only","PNG not supported: 1/2/4/8-bit only");
4825
+ z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only");
4351
4826
  color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG");
4827
+ if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG");
4352
4828
  if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");
4353
4829
  comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG");
4354
4830
  filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG");
@@ -4396,8 +4872,11 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
4396
4872
  if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
4397
4873
  if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
4398
4874
  has_trans = 1;
4399
- for (k=0; k < s->img_n; ++k)
4400
- tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger
4875
+ if (z->depth == 16) {
4876
+ for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is
4877
+ } else {
4878
+ for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger
4879
+ }
4401
4880
  }
4402
4881
  break;
4403
4882
  }
@@ -4408,11 +4887,13 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
4408
4887
  if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; }
4409
4888
  if ((int)(ioff + c.length) < (int)ioff) return 0;
4410
4889
  if (ioff + c.length > idata_limit) {
4890
+ stbi__uint32 idata_limit_old = idata_limit;
4411
4891
  stbi_uc *p;
4412
4892
  if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4413
4893
  while (ioff + c.length > idata_limit)
4414
4894
  idata_limit *= 2;
4415
- p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
4895
+ STBI_NOTUSED(idata_limit_old);
4896
+ p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
4416
4897
  z->idata = p;
4417
4898
  }
4418
4899
  if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");
@@ -4426,7 +4907,7 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
4426
4907
  if (scan != STBI__SCAN_load) return 1;
4427
4908
  if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");
4428
4909
  // initial guess for decoded data size to avoid unnecessary reallocs
4429
- bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component
4910
+ bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component
4430
4911
  raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
4431
4912
  z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);
4432
4913
  if (z->expanded == NULL) return 0; // zlib should set error
@@ -4435,9 +4916,14 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
4435
4916
  s->img_out_n = s->img_n+1;
4436
4917
  else
4437
4918
  s->img_out_n = s->img_n;
4438
- if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0;
4439
- if (has_trans)
4440
- if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
4919
+ if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;
4920
+ if (has_trans) {
4921
+ if (z->depth == 16) {
4922
+ if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;
4923
+ } else {
4924
+ if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
4925
+ }
4926
+ }
4441
4927
  if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4442
4928
  stbi__de_iphone(z);
4443
4929
  if (pal_img_n) {
@@ -4447,6 +4933,9 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
4447
4933
  if (req_comp >= 3) s->img_out_n = req_comp;
4448
4934
  if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4449
4935
  return 0;
4936
+ } else if (has_trans) {
4937
+ // non-paletted image with tRNS -> source image has (constant) alpha
4938
+ ++s->img_n;
4450
4939
  }
4451
4940
  STBI_FREE(z->expanded); z->expanded = NULL;
4452
4941
  return 1;
@@ -4474,21 +4963,28 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
4474
4963
  }
4475
4964
  }
4476
4965
 
4477
- static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp)
4966
+ static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)
4478
4967
  {
4479
- unsigned char *result=NULL;
4968
+ void *result=NULL;
4480
4969
  if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
4481
4970
  if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4971
+ if (p->depth < 8)
4972
+ ri->bits_per_channel = 8;
4973
+ else
4974
+ ri->bits_per_channel = p->depth;
4482
4975
  result = p->out;
4483
4976
  p->out = NULL;
4484
4977
  if (req_comp && req_comp != p->s->img_out_n) {
4485
- result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4978
+ if (ri->bits_per_channel == 8)
4979
+ result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4980
+ else
4981
+ result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4486
4982
  p->s->img_out_n = req_comp;
4487
4983
  if (result == NULL) return result;
4488
4984
  }
4489
4985
  *x = p->s->img_x;
4490
4986
  *y = p->s->img_y;
4491
- if (n) *n = p->s->img_out_n;
4987
+ if (n) *n = p->s->img_n;
4492
4988
  }
4493
4989
  STBI_FREE(p->out); p->out = NULL;
4494
4990
  STBI_FREE(p->expanded); p->expanded = NULL;
@@ -4497,11 +4993,11 @@ static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req
4497
4993
  return result;
4498
4994
  }
4499
4995
 
4500
- static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
4996
+ static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
4501
4997
  {
4502
4998
  stbi__png p;
4503
4999
  p.s = s;
4504
- return stbi__do_png(&p, x,y,comp,req_comp);
5000
+ return stbi__do_png(&p, x,y,comp,req_comp, ri);
4505
5001
  }
4506
5002
 
4507
5003
  static int stbi__png_test(stbi__context *s)
@@ -4530,6 +5026,19 @@ static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
4530
5026
  p.s = s;
4531
5027
  return stbi__png_info_raw(&p, x, y, comp);
4532
5028
  }
5029
+
5030
+ static int stbi__png_is16(stbi__context *s)
5031
+ {
5032
+ stbi__png p;
5033
+ p.s = s;
5034
+ if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5035
+ return 0;
5036
+ if (p.depth != 16) {
5037
+ stbi__rewind(p.s);
5038
+ return 0;
5039
+ }
5040
+ return 1;
5041
+ }
4533
5042
  #endif
4534
5043
 
4535
5044
  // Microsoft/Windows BMP image
@@ -4563,11 +5072,11 @@ static int stbi__high_bit(unsigned int z)
4563
5072
  {
4564
5073
  int n=0;
4565
5074
  if (z == 0) return -1;
4566
- if (z >= 0x10000) n += 16, z >>= 16;
4567
- if (z >= 0x00100) n += 8, z >>= 8;
4568
- if (z >= 0x00010) n += 4, z >>= 4;
4569
- if (z >= 0x00004) n += 2, z >>= 2;
4570
- if (z >= 0x00002) n += 1, z >>= 1;
5075
+ if (z >= 0x10000) { n += 16; z >>= 16; }
5076
+ if (z >= 0x00100) { n += 8; z >>= 8; }
5077
+ if (z >= 0x00010) { n += 4; z >>= 4; }
5078
+ if (z >= 0x00004) { n += 2; z >>= 2; }
5079
+ if (z >= 0x00002) { n += 1; z >>= 1; }
4571
5080
  return n;
4572
5081
  }
4573
5082
 
@@ -4581,36 +5090,46 @@ static int stbi__bitcount(unsigned int a)
4581
5090
  return a & 0xff;
4582
5091
  }
4583
5092
 
4584
- static int stbi__shiftsigned(int v, int shift, int bits)
4585
- {
4586
- int result;
4587
- int z=0;
4588
-
4589
- if (shift < 0) v <<= -shift;
4590
- else v >>= shift;
4591
- result = v;
4592
-
4593
- z = bits;
4594
- while (z < 8) {
4595
- result += v >> z;
4596
- z += bits;
4597
- }
4598
- return result;
5093
+ // extract an arbitrarily-aligned N-bit value (N=bits)
5094
+ // from v, and then make it 8-bits long and fractionally
5095
+ // extend it to full full range.
5096
+ static int stbi__shiftsigned(unsigned int v, int shift, int bits)
5097
+ {
5098
+ static unsigned int mul_table[9] = {
5099
+ 0,
5100
+ 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,
5101
+ 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,
5102
+ };
5103
+ static unsigned int shift_table[9] = {
5104
+ 0, 0,0,1,0,2,4,6,0,
5105
+ };
5106
+ if (shift < 0)
5107
+ v <<= -shift;
5108
+ else
5109
+ v >>= shift;
5110
+ STBI_ASSERT(v >= 0 && v < 256);
5111
+ v >>= (8-bits);
5112
+ STBI_ASSERT(bits >= 0 && bits <= 8);
5113
+ return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
4599
5114
  }
4600
5115
 
4601
- static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
5116
+ typedef struct
4602
5117
  {
4603
- stbi_uc *out;
4604
- unsigned int mr=0,mg=0,mb=0,ma=0, all_a=255;
4605
- stbi_uc pal[256][4];
4606
- int psize=0,i,j,compress=0,width;
4607
- int bpp, flip_vertically, pad, target, offset, hsz;
5118
+ int bpp, offset, hsz;
5119
+ unsigned int mr,mg,mb,ma, all_a;
5120
+ } stbi__bmp_data;
5121
+
5122
+ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
5123
+ {
5124
+ int hsz;
4608
5125
  if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
4609
5126
  stbi__get32le(s); // discard filesize
4610
5127
  stbi__get16le(s); // discard reserved
4611
5128
  stbi__get16le(s); // discard reserved
4612
- offset = stbi__get32le(s);
4613
- hsz = stbi__get32le(s);
5129
+ info->offset = stbi__get32le(s);
5130
+ info->hsz = hsz = stbi__get32le(s);
5131
+ info->mr = info->mg = info->mb = info->ma = 0;
5132
+
4614
5133
  if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
4615
5134
  if (hsz == 12) {
4616
5135
  s->img_x = stbi__get16le(s);
@@ -4620,15 +5139,9 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int
4620
5139
  s->img_y = stbi__get32le(s);
4621
5140
  }
4622
5141
  if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
4623
- bpp = stbi__get16le(s);
4624
- if (bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit");
4625
- flip_vertically = ((int) s->img_y) > 0;
4626
- s->img_y = abs((int) s->img_y);
4627
- if (hsz == 12) {
4628
- if (bpp < 24)
4629
- psize = (offset - 14 - 24) / 3;
4630
- } else {
4631
- compress = stbi__get32le(s);
5142
+ info->bpp = stbi__get16le(s);
5143
+ if (hsz != 12) {
5144
+ int compress = stbi__get32le(s);
4632
5145
  if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
4633
5146
  stbi__get32le(s); // discard sizeof
4634
5147
  stbi__get32le(s); // discard hres
@@ -4642,26 +5155,25 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int
4642
5155
  stbi__get32le(s);
4643
5156
  stbi__get32le(s);
4644
5157
  }
4645
- if (bpp == 16 || bpp == 32) {
4646
- mr = mg = mb = 0;
5158
+ if (info->bpp == 16 || info->bpp == 32) {
4647
5159
  if (compress == 0) {
4648
- if (bpp == 32) {
4649
- mr = 0xffu << 16;
4650
- mg = 0xffu << 8;
4651
- mb = 0xffu << 0;
4652
- ma = 0xffu << 24;
4653
- all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0
5160
+ if (info->bpp == 32) {
5161
+ info->mr = 0xffu << 16;
5162
+ info->mg = 0xffu << 8;
5163
+ info->mb = 0xffu << 0;
5164
+ info->ma = 0xffu << 24;
5165
+ info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0
4654
5166
  } else {
4655
- mr = 31u << 10;
4656
- mg = 31u << 5;
4657
- mb = 31u << 0;
5167
+ info->mr = 31u << 10;
5168
+ info->mg = 31u << 5;
5169
+ info->mb = 31u << 0;
4658
5170
  }
4659
5171
  } else if (compress == 3) {
4660
- mr = stbi__get32le(s);
4661
- mg = stbi__get32le(s);
4662
- mb = stbi__get32le(s);
5172
+ info->mr = stbi__get32le(s);
5173
+ info->mg = stbi__get32le(s);
5174
+ info->mb = stbi__get32le(s);
4663
5175
  // not documented, but generated by photoshop and handled by mspaint
4664
- if (mr == mg && mg == mb) {
5176
+ if (info->mr == info->mg && info->mg == info->mb) {
4665
5177
  // ?!?!?
4666
5178
  return stbi__errpuc("bad BMP", "bad BMP");
4667
5179
  }
@@ -4669,11 +5181,13 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int
4669
5181
  return stbi__errpuc("bad BMP", "bad BMP");
4670
5182
  }
4671
5183
  } else {
4672
- STBI_ASSERT(hsz == 108 || hsz == 124);
4673
- mr = stbi__get32le(s);
4674
- mg = stbi__get32le(s);
4675
- mb = stbi__get32le(s);
4676
- ma = stbi__get32le(s);
5184
+ int i;
5185
+ if (hsz != 108 && hsz != 124)
5186
+ return stbi__errpuc("bad BMP", "bad BMP");
5187
+ info->mr = stbi__get32le(s);
5188
+ info->mg = stbi__get32le(s);
5189
+ info->mb = stbi__get32le(s);
5190
+ info->ma = stbi__get32le(s);
4677
5191
  stbi__get32le(s); // discard color space
4678
5192
  for (i=0; i < 12; ++i)
4679
5193
  stbi__get32le(s); // discard color space parameters
@@ -4684,63 +5198,121 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int
4684
5198
  stbi__get32le(s); // discard reserved
4685
5199
  }
4686
5200
  }
4687
- if (bpp < 16)
4688
- psize = (offset - 14 - hsz) >> 2;
4689
5201
  }
5202
+ return (void *) 1;
5203
+ }
5204
+
5205
+
5206
+ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
5207
+ {
5208
+ stbi_uc *out;
5209
+ unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
5210
+ stbi_uc pal[256][4];
5211
+ int psize=0,i,j,width;
5212
+ int flip_vertically, pad, target;
5213
+ stbi__bmp_data info;
5214
+ STBI_NOTUSED(ri);
5215
+
5216
+ info.all_a = 255;
5217
+ if (stbi__bmp_parse_header(s, &info) == NULL)
5218
+ return NULL; // error code already set
5219
+
5220
+ flip_vertically = ((int) s->img_y) > 0;
5221
+ s->img_y = abs((int) s->img_y);
5222
+
5223
+ mr = info.mr;
5224
+ mg = info.mg;
5225
+ mb = info.mb;
5226
+ ma = info.ma;
5227
+ all_a = info.all_a;
5228
+
5229
+ if (info.hsz == 12) {
5230
+ if (info.bpp < 24)
5231
+ psize = (info.offset - 14 - 24) / 3;
5232
+ } else {
5233
+ if (info.bpp < 16)
5234
+ psize = (info.offset - 14 - info.hsz) >> 2;
5235
+ }
5236
+
4690
5237
  s->img_n = ma ? 4 : 3;
4691
5238
  if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
4692
5239
  target = req_comp;
4693
5240
  else
4694
5241
  target = s->img_n; // if they want monochrome, we'll post-convert
4695
- out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);
5242
+
5243
+ // sanity-check size
5244
+ if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5245
+ return stbi__errpuc("too large", "Corrupt BMP");
5246
+
5247
+ out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
4696
5248
  if (!out) return stbi__errpuc("outofmem", "Out of memory");
4697
- if (bpp < 16) {
5249
+ if (info.bpp < 16) {
4698
5250
  int z=0;
4699
5251
  if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
4700
5252
  for (i=0; i < psize; ++i) {
4701
5253
  pal[i][2] = stbi__get8(s);
4702
5254
  pal[i][1] = stbi__get8(s);
4703
5255
  pal[i][0] = stbi__get8(s);
4704
- if (hsz != 12) stbi__get8(s);
5256
+ if (info.hsz != 12) stbi__get8(s);
4705
5257
  pal[i][3] = 255;
4706
5258
  }
4707
- stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
4708
- if (bpp == 4) width = (s->img_x + 1) >> 1;
4709
- else if (bpp == 8) width = s->img_x;
5259
+ stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5260
+ if (info.bpp == 1) width = (s->img_x + 7) >> 3;
5261
+ else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5262
+ else if (info.bpp == 8) width = s->img_x;
4710
5263
  else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
4711
5264
  pad = (-width)&3;
4712
- for (j=0; j < (int) s->img_y; ++j) {
4713
- for (i=0; i < (int) s->img_x; i += 2) {
4714
- int v=stbi__get8(s),v2=0;
4715
- if (bpp == 4) {
4716
- v2 = v & 15;
4717
- v >>= 4;
5265
+ if (info.bpp == 1) {
5266
+ for (j=0; j < (int) s->img_y; ++j) {
5267
+ int bit_offset = 7, v = stbi__get8(s);
5268
+ for (i=0; i < (int) s->img_x; ++i) {
5269
+ int color = (v>>bit_offset)&0x1;
5270
+ out[z++] = pal[color][0];
5271
+ out[z++] = pal[color][1];
5272
+ out[z++] = pal[color][2];
5273
+ if (target == 4) out[z++] = 255;
5274
+ if (i+1 == (int) s->img_x) break;
5275
+ if((--bit_offset) < 0) {
5276
+ bit_offset = 7;
5277
+ v = stbi__get8(s);
5278
+ }
4718
5279
  }
4719
- out[z++] = pal[v][0];
4720
- out[z++] = pal[v][1];
4721
- out[z++] = pal[v][2];
4722
- if (target == 4) out[z++] = 255;
4723
- if (i+1 == (int) s->img_x) break;
4724
- v = (bpp == 8) ? stbi__get8(s) : v2;
4725
- out[z++] = pal[v][0];
4726
- out[z++] = pal[v][1];
4727
- out[z++] = pal[v][2];
4728
- if (target == 4) out[z++] = 255;
5280
+ stbi__skip(s, pad);
5281
+ }
5282
+ } else {
5283
+ for (j=0; j < (int) s->img_y; ++j) {
5284
+ for (i=0; i < (int) s->img_x; i += 2) {
5285
+ int v=stbi__get8(s),v2=0;
5286
+ if (info.bpp == 4) {
5287
+ v2 = v & 15;
5288
+ v >>= 4;
5289
+ }
5290
+ out[z++] = pal[v][0];
5291
+ out[z++] = pal[v][1];
5292
+ out[z++] = pal[v][2];
5293
+ if (target == 4) out[z++] = 255;
5294
+ if (i+1 == (int) s->img_x) break;
5295
+ v = (info.bpp == 8) ? stbi__get8(s) : v2;
5296
+ out[z++] = pal[v][0];
5297
+ out[z++] = pal[v][1];
5298
+ out[z++] = pal[v][2];
5299
+ if (target == 4) out[z++] = 255;
5300
+ }
5301
+ stbi__skip(s, pad);
4729
5302
  }
4730
- stbi__skip(s, pad);
4731
5303
  }
4732
5304
  } else {
4733
5305
  int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
4734
5306
  int z = 0;
4735
5307
  int easy=0;
4736
- stbi__skip(s, offset - 14 - hsz);
4737
- if (bpp == 24) width = 3 * s->img_x;
4738
- else if (bpp == 16) width = 2*s->img_x;
5308
+ stbi__skip(s, info.offset - 14 - info.hsz);
5309
+ if (info.bpp == 24) width = 3 * s->img_x;
5310
+ else if (info.bpp == 16) width = 2*s->img_x;
4739
5311
  else /* bpp = 32 and pad = 0 */ width=0;
4740
5312
  pad = (-width) & 3;
4741
- if (bpp == 24) {
5313
+ if (info.bpp == 24) {
4742
5314
  easy = 1;
4743
- } else if (bpp == 32) {
5315
+ } else if (info.bpp == 32) {
4744
5316
  if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
4745
5317
  easy = 2;
4746
5318
  }
@@ -4765,9 +5337,10 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int
4765
5337
  if (target == 4) out[z++] = a;
4766
5338
  }
4767
5339
  } else {
5340
+ int bpp = info.bpp;
4768
5341
  for (i=0; i < (int) s->img_x; ++i) {
4769
5342
  stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
4770
- int a;
5343
+ unsigned int a;
4771
5344
  out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
4772
5345
  out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
4773
5346
  out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
@@ -4779,7 +5352,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int
4779
5352
  stbi__skip(s, pad);
4780
5353
  }
4781
5354
  }
4782
-
5355
+
4783
5356
  // if alpha channel is all 0s, replace with all 255s
4784
5357
  if (target == 4 && all_a == 0)
4785
5358
  for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
@@ -4791,7 +5364,7 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int
4791
5364
  stbi_uc *p1 = out + j *s->img_x*target;
4792
5365
  stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
4793
5366
  for (i=0; i < (int) s->img_x*target; ++i) {
4794
- t = p1[i], p1[i] = p2[i], p2[i] = t;
5367
+ t = p1[i]; p1[i] = p2[i]; p2[i] = t;
4795
5368
  }
4796
5369
  }
4797
5370
  }
@@ -4811,20 +5384,55 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int
4811
5384
  // Targa Truevision - TGA
4812
5385
  // by Jonathan Dummer
4813
5386
  #ifndef STBI_NO_TGA
5387
+ // returns STBI_rgb or whatever, 0 on error
5388
+ static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)
5389
+ {
5390
+ // only RGB or RGBA (incl. 16bit) or grey allowed
5391
+ if (is_rgb16) *is_rgb16 = 0;
5392
+ switch(bits_per_pixel) {
5393
+ case 8: return STBI_grey;
5394
+ case 16: if(is_grey) return STBI_grey_alpha;
5395
+ // fallthrough
5396
+ case 15: if(is_rgb16) *is_rgb16 = 1;
5397
+ return STBI_rgb;
5398
+ case 24: // fallthrough
5399
+ case 32: return bits_per_pixel/8;
5400
+ default: return 0;
5401
+ }
5402
+ }
5403
+
4814
5404
  static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
4815
5405
  {
4816
- int tga_w, tga_h, tga_comp;
4817
- int sz;
5406
+ int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5407
+ int sz, tga_colormap_type;
4818
5408
  stbi__get8(s); // discard Offset
4819
- sz = stbi__get8(s); // color type
4820
- if( sz > 1 ) {
5409
+ tga_colormap_type = stbi__get8(s); // colormap type
5410
+ if( tga_colormap_type > 1 ) {
4821
5411
  stbi__rewind(s);
4822
5412
  return 0; // only RGB or indexed allowed
4823
5413
  }
4824
- sz = stbi__get8(s); // image type
4825
- // only RGB or grey allowed, +/- RLE
4826
- if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;
4827
- stbi__skip(s,9);
5414
+ tga_image_type = stbi__get8(s); // image type
5415
+ if ( tga_colormap_type == 1 ) { // colormapped (paletted) image
5416
+ if (tga_image_type != 1 && tga_image_type != 9) {
5417
+ stbi__rewind(s);
5418
+ return 0;
5419
+ }
5420
+ stbi__skip(s,4); // skip index of first colormap entry and number of entries
5421
+ sz = stbi__get8(s); // check bits per palette color entry
5422
+ if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5423
+ stbi__rewind(s);
5424
+ return 0;
5425
+ }
5426
+ stbi__skip(s,4); // skip image x and y origin
5427
+ tga_colormap_bpp = sz;
5428
+ } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE
5429
+ if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5430
+ stbi__rewind(s);
5431
+ return 0; // only RGB or grey allowed, +/- RLE
5432
+ }
5433
+ stbi__skip(s,9); // skip colormap specification and image x/y origin
5434
+ tga_colormap_bpp = 0;
5435
+ }
4828
5436
  tga_w = stbi__get16le(s);
4829
5437
  if( tga_w < 1 ) {
4830
5438
  stbi__rewind(s);
@@ -4835,45 +5443,81 @@ static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
4835
5443
  stbi__rewind(s);
4836
5444
  return 0; // test height
4837
5445
  }
4838
- sz = stbi__get8(s); // bits per pixel
4839
- // only RGB or RGBA or grey allowed
4840
- if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
4841
- stbi__rewind(s);
4842
- return 0;
5446
+ tga_bits_per_pixel = stbi__get8(s); // bits per pixel
5447
+ stbi__get8(s); // ignore alpha bits
5448
+ if (tga_colormap_bpp != 0) {
5449
+ if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5450
+ // when using a colormap, tga_bits_per_pixel is the size of the indexes
5451
+ // I don't think anything but 8 or 16bit indexes makes sense
5452
+ stbi__rewind(s);
5453
+ return 0;
5454
+ }
5455
+ tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5456
+ } else {
5457
+ tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5458
+ }
5459
+ if(!tga_comp) {
5460
+ stbi__rewind(s);
5461
+ return 0;
4843
5462
  }
4844
- tga_comp = sz;
4845
5463
  if (x) *x = tga_w;
4846
5464
  if (y) *y = tga_h;
4847
- if (comp) *comp = tga_comp / 8;
5465
+ if (comp) *comp = tga_comp;
4848
5466
  return 1; // seems to have passed everything
4849
5467
  }
4850
5468
 
4851
5469
  static int stbi__tga_test(stbi__context *s)
4852
5470
  {
4853
- int res;
4854
- int sz;
5471
+ int res = 0;
5472
+ int sz, tga_color_type;
4855
5473
  stbi__get8(s); // discard Offset
4856
- sz = stbi__get8(s); // color type
4857
- if ( sz > 1 ) return 0; // only RGB or indexed allowed
5474
+ tga_color_type = stbi__get8(s); // color type
5475
+ if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed
4858
5476
  sz = stbi__get8(s); // image type
4859
- if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE
4860
- stbi__get16be(s); // discard palette start
4861
- stbi__get16be(s); // discard palette length
4862
- stbi__get8(s); // discard bits per palette color entry
4863
- stbi__get16be(s); // discard x origin
4864
- stbi__get16be(s); // discard y origin
4865
- if ( stbi__get16be(s) < 1 ) return 0; // test width
4866
- if ( stbi__get16be(s) < 1 ) return 0; // test height
5477
+ if ( tga_color_type == 1 ) { // colormapped (paletted) image
5478
+ if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9
5479
+ stbi__skip(s,4); // skip index of first colormap entry and number of entries
5480
+ sz = stbi__get8(s); // check bits per palette color entry
5481
+ if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
5482
+ stbi__skip(s,4); // skip image x and y origin
5483
+ } else { // "normal" image w/o colormap
5484
+ if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE
5485
+ stbi__skip(s,9); // skip colormap specification and image x/y origin
5486
+ }
5487
+ if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width
5488
+ if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height
4867
5489
  sz = stbi__get8(s); // bits per pixel
4868
- if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )
4869
- res = 0;
4870
- else
4871
- res = 1;
5490
+ if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index
5491
+ if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
5492
+
5493
+ res = 1; // if we got this far, everything's good and we can return 1 instead of 0
5494
+
5495
+ errorEnd:
4872
5496
  stbi__rewind(s);
4873
5497
  return res;
4874
5498
  }
4875
5499
 
4876
- static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
5500
+ // read 16bit value and convert to 24bit RGB
5501
+ static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
5502
+ {
5503
+ stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5504
+ stbi__uint16 fiveBitMask = 31;
5505
+ // we have 3 channels with 5bits each
5506
+ int r = (px >> 10) & fiveBitMask;
5507
+ int g = (px >> 5) & fiveBitMask;
5508
+ int b = px & fiveBitMask;
5509
+ // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later
5510
+ out[0] = (stbi_uc)((r * 255)/31);
5511
+ out[1] = (stbi_uc)((g * 255)/31);
5512
+ out[2] = (stbi_uc)((b * 255)/31);
5513
+
5514
+ // some people claim that the most significant bit might be used for alpha
5515
+ // (possibly if an alpha-bit is set in the "image descriptor byte")
5516
+ // but that only made 16bit test images completely translucent..
5517
+ // so let's treat all 15 and 16bit TGAs as RGB with no alpha.
5518
+ }
5519
+
5520
+ static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
4877
5521
  {
4878
5522
  // read in the TGA header stuff
4879
5523
  int tga_offset = stbi__get8(s);
@@ -4888,16 +5532,18 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int
4888
5532
  int tga_width = stbi__get16le(s);
4889
5533
  int tga_height = stbi__get16le(s);
4890
5534
  int tga_bits_per_pixel = stbi__get8(s);
4891
- int tga_comp = tga_bits_per_pixel / 8;
5535
+ int tga_comp, tga_rgb16=0;
4892
5536
  int tga_inverted = stbi__get8(s);
5537
+ // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)
4893
5538
  // image data
4894
5539
  unsigned char *tga_data;
4895
5540
  unsigned char *tga_palette = NULL;
4896
5541
  int i, j;
4897
- unsigned char raw_data[4];
5542
+ unsigned char raw_data[4] = {0};
4898
5543
  int RLE_count = 0;
4899
5544
  int RLE_repeating = 0;
4900
5545
  int read_next_pixel = 1;
5546
+ STBI_NOTUSED(ri);
4901
5547
 
4902
5548
  // do a tiny bit of precessing
4903
5549
  if ( tga_image_type >= 8 )
@@ -4905,38 +5551,30 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int
4905
5551
  tga_image_type -= 8;
4906
5552
  tga_is_RLE = 1;
4907
5553
  }
4908
- /* int tga_alpha_bits = tga_inverted & 15; */
4909
5554
  tga_inverted = 1 - ((tga_inverted >> 5) & 1);
4910
5555
 
4911
- // error check
4912
- if ( //(tga_indexed) ||
4913
- (tga_width < 1) || (tga_height < 1) ||
4914
- (tga_image_type < 1) || (tga_image_type > 3) ||
4915
- ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
4916
- (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
4917
- )
4918
- {
4919
- return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA
4920
- }
4921
-
4922
5556
  // If I'm paletted, then I'll use the number of bits from the palette
4923
- if ( tga_indexed )
4924
- {
4925
- tga_comp = tga_palette_bits / 8;
4926
- }
5557
+ if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5558
+ else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5559
+
5560
+ if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency
5561
+ return stbi__errpuc("bad format", "Can't find out TGA pixelformat");
4927
5562
 
4928
5563
  // tga info
4929
5564
  *x = tga_width;
4930
5565
  *y = tga_height;
4931
5566
  if (comp) *comp = tga_comp;
4932
5567
 
4933
- tga_data = (unsigned char*)stbi__malloc( (size_t)tga_width * tga_height * tga_comp );
5568
+ if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5569
+ return stbi__errpuc("too large", "Corrupt TGA");
5570
+
5571
+ tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
4934
5572
  if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
4935
5573
 
4936
5574
  // skip to the data's starting position (offset usually = 0)
4937
5575
  stbi__skip(s, tga_offset );
4938
5576
 
4939
- if ( !tga_indexed && !tga_is_RLE) {
5577
+ if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
4940
5578
  for (i=0; i < tga_height; ++i) {
4941
5579
  int row = tga_inverted ? tga_height -i - 1 : i;
4942
5580
  stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
@@ -4949,15 +5587,22 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int
4949
5587
  // any data to skip? (offset usually = 0)
4950
5588
  stbi__skip(s, tga_palette_start );
4951
5589
  // load the palette
4952
- tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );
5590
+ tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
4953
5591
  if (!tga_palette) {
4954
5592
  STBI_FREE(tga_data);
4955
5593
  return stbi__errpuc("outofmem", "Out of memory");
4956
5594
  }
4957
- if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
4958
- STBI_FREE(tga_data);
4959
- STBI_FREE(tga_palette);
4960
- return stbi__errpuc("bad palette", "Corrupt TGA");
5595
+ if (tga_rgb16) {
5596
+ stbi_uc *pal_entry = tga_palette;
5597
+ STBI_ASSERT(tga_comp == STBI_rgb);
5598
+ for (i=0; i < tga_palette_len; ++i) {
5599
+ stbi__tga_read_rgb16(s, pal_entry);
5600
+ pal_entry += tga_comp;
5601
+ }
5602
+ } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5603
+ STBI_FREE(tga_data);
5604
+ STBI_FREE(tga_palette);
5605
+ return stbi__errpuc("bad palette", "Corrupt TGA");
4961
5606
  }
4962
5607
  }
4963
5608
  // load the data
@@ -4987,23 +5632,22 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int
4987
5632
  // load however much data we did have
4988
5633
  if ( tga_indexed )
4989
5634
  {
4990
- // read in 1 byte, then perform the lookup
4991
- int pal_idx = stbi__get8(s);
4992
- if ( pal_idx >= tga_palette_len )
4993
- {
4994
- // invalid index
5635
+ // read in index, then perform the lookup
5636
+ int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5637
+ if ( pal_idx >= tga_palette_len ) {
5638
+ // invalid index
4995
5639
  pal_idx = 0;
4996
5640
  }
4997
- pal_idx *= tga_bits_per_pixel / 8;
4998
- for (j = 0; j*8 < tga_bits_per_pixel; ++j)
4999
- {
5641
+ pal_idx *= tga_comp;
5642
+ for (j = 0; j < tga_comp; ++j) {
5000
5643
  raw_data[j] = tga_palette[pal_idx+j];
5001
5644
  }
5002
- } else
5003
- {
5645
+ } else if(tga_rgb16) {
5646
+ STBI_ASSERT(tga_comp == STBI_rgb);
5647
+ stbi__tga_read_rgb16(s, raw_data);
5648
+ } else {
5004
5649
  // read in the data raw
5005
- for (j = 0; j*8 < tga_bits_per_pixel; ++j)
5006
- {
5650
+ for (j = 0; j < tga_comp; ++j) {
5007
5651
  raw_data[j] = stbi__get8(s);
5008
5652
  }
5009
5653
  }
@@ -5042,8 +5686,8 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int
5042
5686
  }
5043
5687
  }
5044
5688
 
5045
- // swap RGB
5046
- if (tga_comp >= 3)
5689
+ // swap RGB - if the source data was RGB16, it already is in the right order
5690
+ if (tga_comp >= 3 && !tga_rgb16)
5047
5691
  {
5048
5692
  unsigned char* tga_pixel = tga_data;
5049
5693
  for (i=0; i < tga_width * tga_height; ++i)
@@ -5079,14 +5723,53 @@ static int stbi__psd_test(stbi__context *s)
5079
5723
  return r;
5080
5724
  }
5081
5725
 
5082
- static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
5726
+ static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)
5083
5727
  {
5084
- int pixelCount;
5728
+ int count, nleft, len;
5729
+
5730
+ count = 0;
5731
+ while ((nleft = pixelCount - count) > 0) {
5732
+ len = stbi__get8(s);
5733
+ if (len == 128) {
5734
+ // No-op.
5735
+ } else if (len < 128) {
5736
+ // Copy next len+1 bytes literally.
5737
+ len++;
5738
+ if (len > nleft) return 0; // corrupt data
5739
+ count += len;
5740
+ while (len) {
5741
+ *p = stbi__get8(s);
5742
+ p += 4;
5743
+ len--;
5744
+ }
5745
+ } else if (len > 128) {
5746
+ stbi_uc val;
5747
+ // Next -len+1 bytes in the dest are replicated from next source byte.
5748
+ // (Interpret len as a negative 8-bit int.)
5749
+ len = 257 - len;
5750
+ if (len > nleft) return 0; // corrupt data
5751
+ val = stbi__get8(s);
5752
+ count += len;
5753
+ while (len) {
5754
+ *p = val;
5755
+ p += 4;
5756
+ len--;
5757
+ }
5758
+ }
5759
+ }
5760
+
5761
+ return 1;
5762
+ }
5763
+
5764
+ static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
5765
+ {
5766
+ int pixelCount;
5085
5767
  int channelCount, compression;
5086
- int channel, i, count, len;
5768
+ int channel, i;
5087
5769
  int bitdepth;
5088
5770
  int w,h;
5089
5771
  stbi_uc *out;
5772
+ STBI_NOTUSED(ri);
5090
5773
 
5091
5774
  // Check identifier
5092
5775
  if (stbi__get32be(s) != 0x38425053) // "8BPS"
@@ -5143,8 +5826,18 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int
5143
5826
  if (compression > 1)
5144
5827
  return stbi__errpuc("bad compression", "PSD has an unknown compression format");
5145
5828
 
5829
+ // Check size
5830
+ if (!stbi__mad3sizes_valid(4, w, h, 0))
5831
+ return stbi__errpuc("too large", "Corrupt PSD");
5832
+
5146
5833
  // Create the destination image.
5147
- out = (stbi_uc *) stbi__malloc(4 * w*h);
5834
+
5835
+ if (!compression && bitdepth == 16 && bpc == 16) {
5836
+ out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
5837
+ ri->bits_per_channel = 16;
5838
+ } else
5839
+ out = (stbi_uc *) stbi__malloc(4 * w*h);
5840
+
5148
5841
  if (!out) return stbi__errpuc("outofmem", "Out of memory");
5149
5842
  pixelCount = w*h;
5150
5843
 
@@ -5161,7 +5854,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int
5161
5854
  // Else if n is 128, noop.
5162
5855
  // Endloop
5163
5856
 
5164
- // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,
5857
+ // The RLE-compressed data is preceded by a 2-byte data count for each row in the data,
5165
5858
  // which we're going to just skip.
5166
5859
  stbi__skip(s, h * channelCount * 2 );
5167
5860
 
@@ -5176,67 +5869,86 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int
5176
5869
  *p = (channel == 3 ? 255 : 0);
5177
5870
  } else {
5178
5871
  // Read the RLE data.
5179
- count = 0;
5180
- while (count < pixelCount) {
5181
- len = stbi__get8(s);
5182
- if (len == 128) {
5183
- // No-op.
5184
- } else if (len < 128) {
5185
- // Copy next len+1 bytes literally.
5186
- len++;
5187
- count += len;
5188
- while (len) {
5189
- *p = stbi__get8(s);
5190
- p += 4;
5191
- len--;
5192
- }
5193
- } else if (len > 128) {
5194
- stbi_uc val;
5195
- // Next -len+1 bytes in the dest are replicated from next source byte.
5196
- // (Interpret len as a negative 8-bit int.)
5197
- len ^= 0x0FF;
5198
- len += 2;
5199
- val = stbi__get8(s);
5200
- count += len;
5201
- while (len) {
5202
- *p = val;
5203
- p += 4;
5204
- len--;
5205
- }
5206
- }
5872
+ if (!stbi__psd_decode_rle(s, p, pixelCount)) {
5873
+ STBI_FREE(out);
5874
+ return stbi__errpuc("corrupt", "bad RLE data");
5207
5875
  }
5208
5876
  }
5209
5877
  }
5210
5878
 
5211
5879
  } else {
5212
5880
  // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...)
5213
- // where each channel consists of an 8-bit value for each pixel in the image.
5881
+ // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.
5214
5882
 
5215
5883
  // Read the data by channel.
5216
5884
  for (channel = 0; channel < 4; channel++) {
5217
- stbi_uc *p;
5218
-
5219
- p = out + channel;
5220
5885
  if (channel >= channelCount) {
5221
5886
  // Fill this channel with default data.
5222
- stbi_uc val = channel == 3 ? 255 : 0;
5223
- for (i = 0; i < pixelCount; i++, p += 4)
5224
- *p = val;
5225
- } else {
5226
- // Read the data.
5227
- if (bitdepth == 16) {
5228
- for (i = 0; i < pixelCount; i++, p += 4)
5229
- *p = (stbi_uc) (stbi__get16be(s) >> 8);
5887
+ if (bitdepth == 16 && bpc == 16) {
5888
+ stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
5889
+ stbi__uint16 val = channel == 3 ? 65535 : 0;
5890
+ for (i = 0; i < pixelCount; i++, q += 4)
5891
+ *q = val;
5230
5892
  } else {
5893
+ stbi_uc *p = out+channel;
5894
+ stbi_uc val = channel == 3 ? 255 : 0;
5231
5895
  for (i = 0; i < pixelCount; i++, p += 4)
5232
- *p = stbi__get8(s);
5896
+ *p = val;
5897
+ }
5898
+ } else {
5899
+ if (ri->bits_per_channel == 16) { // output bpc
5900
+ stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
5901
+ for (i = 0; i < pixelCount; i++, q += 4)
5902
+ *q = (stbi__uint16) stbi__get16be(s);
5903
+ } else {
5904
+ stbi_uc *p = out+channel;
5905
+ if (bitdepth == 16) { // input bpc
5906
+ for (i = 0; i < pixelCount; i++, p += 4)
5907
+ *p = (stbi_uc) (stbi__get16be(s) >> 8);
5908
+ } else {
5909
+ for (i = 0; i < pixelCount; i++, p += 4)
5910
+ *p = stbi__get8(s);
5911
+ }
5912
+ }
5913
+ }
5914
+ }
5915
+ }
5916
+
5917
+ // remove weird white matte from PSD
5918
+ if (channelCount >= 4) {
5919
+ if (ri->bits_per_channel == 16) {
5920
+ for (i=0; i < w*h; ++i) {
5921
+ stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
5922
+ if (pixel[3] != 0 && pixel[3] != 65535) {
5923
+ float a = pixel[3] / 65535.0f;
5924
+ float ra = 1.0f / a;
5925
+ float inv_a = 65535.0f * (1 - ra);
5926
+ pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
5927
+ pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
5928
+ pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
5929
+ }
5930
+ }
5931
+ } else {
5932
+ for (i=0; i < w*h; ++i) {
5933
+ unsigned char *pixel = out + 4*i;
5934
+ if (pixel[3] != 0 && pixel[3] != 255) {
5935
+ float a = pixel[3] / 255.0f;
5936
+ float ra = 1.0f / a;
5937
+ float inv_a = 255.0f * (1 - ra);
5938
+ pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);
5939
+ pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);
5940
+ pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);
5233
5941
  }
5234
5942
  }
5235
5943
  }
5236
5944
  }
5237
5945
 
5946
+ // convert to desired output format
5238
5947
  if (req_comp && req_comp != 4) {
5239
- out = stbi__convert_format(out, 4, req_comp, w, h);
5948
+ if (ri->bits_per_channel == 16)
5949
+ out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
5950
+ else
5951
+ out = stbi__convert_format(out, 4, req_comp, w, h);
5240
5952
  if (out == NULL) return out; // stbi__convert_format frees input on failure
5241
5953
  }
5242
5954
 
@@ -5420,10 +6132,13 @@ static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *c
5420
6132
  return result;
5421
6133
  }
5422
6134
 
5423
- static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp)
6135
+ static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri)
5424
6136
  {
5425
6137
  stbi_uc *result;
5426
- int i, x,y;
6138
+ int i, x,y, internal_comp;
6139
+ STBI_NOTUSED(ri);
6140
+
6141
+ if (!comp) comp = &internal_comp;
5427
6142
 
5428
6143
  for (i=0; i<92; ++i)
5429
6144
  stbi__get8(s);
@@ -5431,14 +6146,14 @@ static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int re
5431
6146
  x = stbi__get16be(s);
5432
6147
  y = stbi__get16be(s);
5433
6148
  if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)");
5434
- if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to decode");
6149
+ if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode");
5435
6150
 
5436
6151
  stbi__get32be(s); //skip `ratio'
5437
6152
  stbi__get16be(s); //skip `fields'
5438
6153
  stbi__get16be(s); //skip `pad'
5439
6154
 
5440
6155
  // intermediate buffer is RGBA
5441
- result = (stbi_uc *) stbi__malloc(x*y*4);
6156
+ result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
5442
6157
  memset(result, 0xff, x*y*4);
5443
6158
 
5444
6159
  if (!stbi__pic_load_core(s,x,y,comp, result)) {
@@ -5475,11 +6190,13 @@ typedef struct
5475
6190
  typedef struct
5476
6191
  {
5477
6192
  int w,h;
5478
- stbi_uc *out, *old_out; // output buffer (always 4 components)
5479
- int flags, bgindex, ratio, transparent, eflags, delay;
6193
+ stbi_uc *out; // output buffer (always 4 components)
6194
+ stbi_uc *background; // The current "background" as far as a gif is concerned
6195
+ stbi_uc *history;
6196
+ int flags, bgindex, ratio, transparent, eflags;
5480
6197
  stbi_uc pal[256][4];
5481
6198
  stbi_uc lpal[256][4];
5482
- stbi__gif_lzw codes[4096];
6199
+ stbi__gif_lzw codes[8192];
5483
6200
  stbi_uc *color_table;
5484
6201
  int parse, step;
5485
6202
  int lflags;
@@ -5487,6 +6204,7 @@ typedef struct
5487
6204
  int max_x, max_y;
5488
6205
  int cur_x, cur_y;
5489
6206
  int line_size;
6207
+ int delay;
5490
6208
  } stbi__gif;
5491
6209
 
5492
6210
  static int stbi__gif_test_raw(stbi__context *s)
@@ -5547,19 +6265,22 @@ static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_in
5547
6265
 
5548
6266
  static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
5549
6267
  {
5550
- stbi__gif g;
5551
- if (!stbi__gif_header(s, &g, comp, 1)) {
6268
+ stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));
6269
+ if (!stbi__gif_header(s, g, comp, 1)) {
6270
+ STBI_FREE(g);
5552
6271
  stbi__rewind( s );
5553
6272
  return 0;
5554
6273
  }
5555
- if (x) *x = g.w;
5556
- if (y) *y = g.h;
6274
+ if (x) *x = g->w;
6275
+ if (y) *y = g->h;
6276
+ STBI_FREE(g);
5557
6277
  return 1;
5558
6278
  }
5559
6279
 
5560
6280
  static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
5561
6281
  {
5562
6282
  stbi_uc *p, *c;
6283
+ int idx;
5563
6284
 
5564
6285
  // recurse to decode the prefixes, since the linked-list is backwards,
5565
6286
  // and working backwards through an interleaved image would be nasty
@@ -5568,10 +6289,12 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
5568
6289
 
5569
6290
  if (g->cur_y >= g->max_y) return;
5570
6291
 
5571
- p = &g->out[g->cur_x + g->cur_y];
5572
- c = &g->color_table[g->codes[code].suffix * 4];
6292
+ idx = g->cur_x + g->cur_y;
6293
+ p = &g->out[idx];
6294
+ g->history[idx / 4] = 1;
5573
6295
 
5574
- if (c[3] >= 128) {
6296
+ c = &g->color_table[g->codes[code].suffix * 4];
6297
+ if (c[3] > 128) { // don't render transparent pixels;
5575
6298
  p[0] = c[2];
5576
6299
  p[1] = c[1];
5577
6300
  p[2] = c[0];
@@ -5645,11 +6368,16 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
5645
6368
  stbi__skip(s,len);
5646
6369
  return g->out;
5647
6370
  } else if (code <= avail) {
5648
- if (first) return stbi__errpuc("no clear code", "Corrupt GIF");
6371
+ if (first) {
6372
+ return stbi__errpuc("no clear code", "Corrupt GIF");
6373
+ }
5649
6374
 
5650
6375
  if (oldcode >= 0) {
5651
6376
  p = &g->codes[avail++];
5652
- if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF");
6377
+ if (avail > 8192) {
6378
+ return stbi__errpuc("too many codes", "Corrupt GIF");
6379
+ }
6380
+
5653
6381
  p->prefix = (stbi__int16) oldcode;
5654
6382
  p->first = g->codes[oldcode].first;
5655
6383
  p->suffix = (code == avail) ? p->first : g->codes[code].first;
@@ -5671,59 +6399,73 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
5671
6399
  }
5672
6400
  }
5673
6401
 
5674
- static void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1)
5675
- {
5676
- int x, y;
5677
- stbi_uc *c = g->pal[g->bgindex];
5678
- for (y = y0; y < y1; y += 4 * g->w) {
5679
- for (x = x0; x < x1; x += 4) {
5680
- stbi_uc *p = &g->out[y + x];
5681
- p[0] = c[2];
5682
- p[1] = c[1];
5683
- p[2] = c[0];
5684
- p[3] = 0;
5685
- }
5686
- }
5687
- }
5688
-
5689
6402
  // this function is designed to support animated gifs, although stb_image doesn't support it
5690
- static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp)
6403
+ // two back is the image from two frames ago, used for a very specific disposal format
6404
+ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)
5691
6405
  {
5692
- int i;
5693
- stbi_uc *prev_out = 0;
6406
+ int dispose;
6407
+ int first_frame;
6408
+ int pi;
6409
+ int pcount;
6410
+ STBI_NOTUSED(req_comp);
5694
6411
 
5695
- if (g->out == 0 && !stbi__gif_header(s, g, comp,0))
5696
- return 0; // stbi__g_failure_reason set by stbi__gif_header
6412
+ // on first frame, any non-written pixels get the background colour (non-transparent)
6413
+ first_frame = 0;
6414
+ if (g->out == 0) {
6415
+ if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
6416
+ g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
6417
+ g->background = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
6418
+ g->history = (stbi_uc *) stbi__malloc(g->w * g->h);
6419
+ if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory");
6420
+
6421
+ // image is treated as "transparent" at the start - ie, nothing overwrites the current background;
6422
+ // background colour is only used for pixels that are not rendered first frame, after that "background"
6423
+ // color refers to the color that was there the previous frame.
6424
+ memset( g->out, 0x00, 4 * g->w * g->h );
6425
+ memset( g->background, 0x00, 4 * g->w * g->h ); // state of the background (starts transparent)
6426
+ memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame
6427
+ first_frame = 1;
6428
+ } else {
6429
+ // second frame - how do we dispoase of the previous one?
6430
+ dispose = (g->eflags & 0x1C) >> 2;
6431
+ pcount = g->w * g->h;
5697
6432
 
5698
- prev_out = g->out;
5699
- g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
5700
- if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory");
6433
+ if ((dispose == 3) && (two_back == 0)) {
6434
+ dispose = 2; // if I don't have an image to revert back to, default to the old background
6435
+ }
5701
6436
 
5702
- switch ((g->eflags & 0x1C) >> 2) {
5703
- case 0: // unspecified (also always used on 1st frame)
5704
- stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);
5705
- break;
5706
- case 1: // do not dispose
5707
- if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
5708
- g->old_out = prev_out;
5709
- break;
5710
- case 2: // dispose to background
5711
- if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
5712
- stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
5713
- break;
5714
- case 3: // dispose to previous
5715
- if (g->old_out) {
5716
- for (i = g->start_y; i < g->max_y; i += 4 * g->w)
5717
- memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
6437
+ if (dispose == 3) { // use previous graphic
6438
+ for (pi = 0; pi < pcount; ++pi) {
6439
+ if (g->history[pi]) {
6440
+ memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
6441
+ }
5718
6442
  }
5719
- break;
6443
+ } else if (dispose == 2) {
6444
+ // restore what was changed last frame to background before that frame;
6445
+ for (pi = 0; pi < pcount; ++pi) {
6446
+ if (g->history[pi]) {
6447
+ memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
6448
+ }
6449
+ }
6450
+ } else {
6451
+ // This is a non-disposal case eithe way, so just
6452
+ // leave the pixels as is, and they will become the new background
6453
+ // 1: do not dispose
6454
+ // 0: not specified.
6455
+ }
6456
+
6457
+ // background is what out is after the undoing of the previou frame;
6458
+ memcpy( g->background, g->out, 4 * g->w * g->h );
5720
6459
  }
5721
6460
 
6461
+ // clear my history;
6462
+ memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame
6463
+
5722
6464
  for (;;) {
5723
- switch (stbi__get8(s)) {
6465
+ int tag = stbi__get8(s);
6466
+ switch (tag) {
5724
6467
  case 0x2C: /* Image Descriptor */
5725
6468
  {
5726
- int prev_trans = -1;
5727
6469
  stbi__int32 x, y, w, h;
5728
6470
  stbi_uc *o;
5729
6471
 
@@ -5756,19 +6498,24 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
5756
6498
  stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
5757
6499
  g->color_table = (stbi_uc *) g->lpal;
5758
6500
  } else if (g->flags & 0x80) {
5759
- if (g->transparent >= 0 && (g->eflags & 0x01)) {
5760
- prev_trans = g->pal[g->transparent][3];
5761
- g->pal[g->transparent][3] = 0;
5762
- }
5763
6501
  g->color_table = (stbi_uc *) g->pal;
5764
6502
  } else
5765
- return stbi__errpuc("missing color table", "Corrupt GIF");
5766
-
6503
+ return stbi__errpuc("missing color table", "Corrupt GIF");
6504
+
5767
6505
  o = stbi__process_gif_raster(s, g);
5768
6506
  if (o == NULL) return NULL;
5769
6507
 
5770
- if (prev_trans != -1)
5771
- g->pal[g->transparent][3] = (stbi_uc) prev_trans;
6508
+ // if this was the first frame,
6509
+ pcount = g->w * g->h;
6510
+ if (first_frame && (g->bgindex > 0)) {
6511
+ // if first frame, any pixel not drawn to gets the background color
6512
+ for (pi = 0; pi < pcount; ++pi) {
6513
+ if (g->history[pi] == 0) {
6514
+ g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
6515
+ memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
6516
+ }
6517
+ }
6518
+ }
5772
6519
 
5773
6520
  return o;
5774
6521
  }
@@ -5776,19 +6523,35 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
5776
6523
  case 0x21: // Comment Extension.
5777
6524
  {
5778
6525
  int len;
5779
- if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.
6526
+ int ext = stbi__get8(s);
6527
+ if (ext == 0xF9) { // Graphic Control Extension.
5780
6528
  len = stbi__get8(s);
5781
6529
  if (len == 4) {
5782
6530
  g->eflags = stbi__get8(s);
5783
- g->delay = stbi__get16le(s);
5784
- g->transparent = stbi__get8(s);
6531
+ g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths.
6532
+
6533
+ // unset old transparent
6534
+ if (g->transparent >= 0) {
6535
+ g->pal[g->transparent][3] = 255;
6536
+ }
6537
+ if (g->eflags & 0x01) {
6538
+ g->transparent = stbi__get8(s);
6539
+ if (g->transparent >= 0) {
6540
+ g->pal[g->transparent][3] = 0;
6541
+ }
6542
+ } else {
6543
+ // don't need transparent
6544
+ stbi__skip(s, 1);
6545
+ g->transparent = -1;
6546
+ }
5785
6547
  } else {
5786
6548
  stbi__skip(s, len);
5787
6549
  break;
5788
6550
  }
5789
- }
5790
- while ((len = stbi__get8(s)) != 0)
6551
+ }
6552
+ while ((len = stbi__get8(s)) != 0) {
5791
6553
  stbi__skip(s, len);
6554
+ }
5792
6555
  break;
5793
6556
  }
5794
6557
 
@@ -5799,26 +6562,92 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
5799
6562
  return stbi__errpuc("unknown code", "Corrupt GIF");
5800
6563
  }
5801
6564
  }
6565
+ }
5802
6566
 
5803
- STBI_NOTUSED(req_comp);
6567
+ static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
6568
+ {
6569
+ if (stbi__gif_test(s)) {
6570
+ int layers = 0;
6571
+ stbi_uc *u = 0;
6572
+ stbi_uc *out = 0;
6573
+ stbi_uc *two_back = 0;
6574
+ stbi__gif g;
6575
+ int stride;
6576
+ memset(&g, 0, sizeof(g));
6577
+ if (delays) {
6578
+ *delays = 0;
6579
+ }
6580
+
6581
+ do {
6582
+ u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
6583
+ if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
6584
+
6585
+ if (u) {
6586
+ *x = g.w;
6587
+ *y = g.h;
6588
+ ++layers;
6589
+ stride = g.w * g.h * 4;
6590
+
6591
+ if (out) {
6592
+ out = (stbi_uc*) STBI_REALLOC( out, layers * stride );
6593
+ if (delays) {
6594
+ *delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers );
6595
+ }
6596
+ } else {
6597
+ out = (stbi_uc*)stbi__malloc( layers * stride );
6598
+ if (delays) {
6599
+ *delays = (int*) stbi__malloc( layers * sizeof(int) );
6600
+ }
6601
+ }
6602
+ memcpy( out + ((layers - 1) * stride), u, stride );
6603
+ if (layers >= 2) {
6604
+ two_back = out - 2 * stride;
6605
+ }
6606
+
6607
+ if (delays) {
6608
+ (*delays)[layers - 1U] = g.delay;
6609
+ }
6610
+ }
6611
+ } while (u != 0);
6612
+
6613
+ // free temp buffer;
6614
+ STBI_FREE(g.out);
6615
+ STBI_FREE(g.history);
6616
+ STBI_FREE(g.background);
6617
+
6618
+ // do the final conversion after loading everything;
6619
+ if (req_comp && req_comp != 4)
6620
+ out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
6621
+
6622
+ *z = layers;
6623
+ return out;
6624
+ } else {
6625
+ return stbi__errpuc("not GIF", "Image was not as a gif type.");
6626
+ }
5804
6627
  }
5805
6628
 
5806
- static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
6629
+ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
5807
6630
  {
5808
6631
  stbi_uc *u = 0;
5809
6632
  stbi__gif g;
5810
6633
  memset(&g, 0, sizeof(g));
6634
+ STBI_NOTUSED(ri);
5811
6635
 
5812
- u = stbi__gif_load_next(s, &g, comp, req_comp);
6636
+ u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
5813
6637
  if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
5814
6638
  if (u) {
5815
6639
  *x = g.w;
5816
6640
  *y = g.h;
6641
+
6642
+ // moved conversion to after successful load so that the same
6643
+ // can be done for multiple frames.
5817
6644
  if (req_comp && req_comp != 4)
5818
6645
  u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
5819
6646
  }
5820
- else if (g.out)
5821
- STBI_FREE(g.out);
6647
+
6648
+ // free buffers needed for multiple frame loading;
6649
+ STBI_FREE(g.history);
6650
+ STBI_FREE(g.background);
5822
6651
 
5823
6652
  return u;
5824
6653
  }
@@ -5833,20 +6662,24 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
5833
6662
  // Radiance RGBE HDR loader
5834
6663
  // originally by Nicolas Schulz
5835
6664
  #ifndef STBI_NO_HDR
5836
- static int stbi__hdr_test_core(stbi__context *s)
6665
+ static int stbi__hdr_test_core(stbi__context *s, const char *signature)
5837
6666
  {
5838
- const char *signature = "#?RADIANCE\n";
5839
6667
  int i;
5840
6668
  for (i=0; signature[i]; ++i)
5841
6669
  if (stbi__get8(s) != signature[i])
5842
- return 0;
6670
+ return 0;
6671
+ stbi__rewind(s);
5843
6672
  return 1;
5844
6673
  }
5845
6674
 
5846
6675
  static int stbi__hdr_test(stbi__context* s)
5847
6676
  {
5848
- int r = stbi__hdr_test_core(s);
6677
+ int r = stbi__hdr_test_core(s, "#?RADIANCE\n");
5849
6678
  stbi__rewind(s);
6679
+ if(!r) {
6680
+ r = stbi__hdr_test_core(s, "#?RGBE\n");
6681
+ stbi__rewind(s);
6682
+ }
5850
6683
  return r;
5851
6684
  }
5852
6685
 
@@ -5900,7 +6733,7 @@ static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
5900
6733
  }
5901
6734
  }
5902
6735
 
5903
- static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
6736
+ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
5904
6737
  {
5905
6738
  char buffer[STBI__HDR_BUFLEN];
5906
6739
  char *token;
@@ -5911,10 +6744,12 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re
5911
6744
  int len;
5912
6745
  unsigned char count, value;
5913
6746
  int i, j, k, c1,c2, z;
5914
-
6747
+ const char *headerToken;
6748
+ STBI_NOTUSED(ri);
5915
6749
 
5916
6750
  // Check identifier
5917
- if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0)
6751
+ headerToken = stbi__hdr_gettoken(s,buffer);
6752
+ if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0)
5918
6753
  return stbi__errpf("not HDR", "Corrupt HDR image");
5919
6754
 
5920
6755
  // Parse header
@@ -5943,8 +6778,13 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re
5943
6778
  if (comp) *comp = 3;
5944
6779
  if (req_comp == 0) req_comp = 3;
5945
6780
 
6781
+ if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))
6782
+ return stbi__errpf("too large", "HDR image is too large");
6783
+
5946
6784
  // Read data
5947
- hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float));
6785
+ hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);
6786
+ if (!hdr_data)
6787
+ return stbi__errpf("outofmem", "Out of memory");
5948
6788
 
5949
6789
  // Load image data
5950
6790
  // image data is stored as some number of sca
@@ -5983,20 +6823,29 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re
5983
6823
  len <<= 8;
5984
6824
  len |= stbi__get8(s);
5985
6825
  if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
5986
- if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4);
6826
+ if (scanline == NULL) {
6827
+ scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
6828
+ if (!scanline) {
6829
+ STBI_FREE(hdr_data);
6830
+ return stbi__errpf("outofmem", "Out of memory");
6831
+ }
6832
+ }
5987
6833
 
5988
6834
  for (k = 0; k < 4; ++k) {
6835
+ int nleft;
5989
6836
  i = 0;
5990
- while (i < width) {
6837
+ while ((nleft = width - i) > 0) {
5991
6838
  count = stbi__get8(s);
5992
6839
  if (count > 128) {
5993
6840
  // Run
5994
6841
  value = stbi__get8(s);
5995
6842
  count -= 128;
6843
+ if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
5996
6844
  for (z = 0; z < count; ++z)
5997
6845
  scanline[i++ * 4 + k] = value;
5998
6846
  } else {
5999
6847
  // Dump
6848
+ if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
6000
6849
  for (z = 0; z < count; ++z)
6001
6850
  scanline[i++ * 4 + k] = stbi__get8(s);
6002
6851
  }
@@ -6005,7 +6854,8 @@ static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int re
6005
6854
  for (i=0; i < width; ++i)
6006
6855
  stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
6007
6856
  }
6008
- STBI_FREE(scanline);
6857
+ if (scanline)
6858
+ STBI_FREE(scanline);
6009
6859
  }
6010
6860
 
6011
6861
  return hdr_data;
@@ -6016,8 +6866,13 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
6016
6866
  char buffer[STBI__HDR_BUFLEN];
6017
6867
  char *token;
6018
6868
  int valid = 0;
6869
+ int dummy;
6870
+
6871
+ if (!x) x = &dummy;
6872
+ if (!y) y = &dummy;
6873
+ if (!comp) comp = &dummy;
6019
6874
 
6020
- if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) {
6875
+ if (stbi__hdr_test(s) == 0) {
6021
6876
  stbi__rewind( s );
6022
6877
  return 0;
6023
6878
  }
@@ -6054,29 +6909,17 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
6054
6909
  #ifndef STBI_NO_BMP
6055
6910
  static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
6056
6911
  {
6057
- int hsz;
6058
- if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') {
6059
- stbi__rewind( s );
6060
- return 0;
6061
- }
6062
- stbi__skip(s,12);
6063
- hsz = stbi__get32le(s);
6064
- if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
6065
- stbi__rewind( s );
6066
- return 0;
6067
- }
6068
- if (hsz == 12) {
6069
- *x = stbi__get16le(s);
6070
- *y = stbi__get16le(s);
6071
- } else {
6072
- *x = stbi__get32le(s);
6073
- *y = stbi__get32le(s);
6074
- }
6075
- if (stbi__get16le(s) != 1) {
6076
- stbi__rewind( s );
6077
- return 0;
6078
- }
6079
- *comp = stbi__get16le(s) / 8;
6912
+ void *p;
6913
+ stbi__bmp_data info;
6914
+
6915
+ info.all_a = 255;
6916
+ p = stbi__bmp_parse_header(s, &info);
6917
+ stbi__rewind( s );
6918
+ if (p == NULL)
6919
+ return 0;
6920
+ if (x) *x = s->img_x;
6921
+ if (y) *y = s->img_y;
6922
+ if (comp) *comp = info.ma ? 4 : 3;
6080
6923
  return 1;
6081
6924
  }
6082
6925
  #endif
@@ -6084,7 +6927,10 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
6084
6927
  #ifndef STBI_NO_PSD
6085
6928
  static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
6086
6929
  {
6087
- int channelCount;
6930
+ int channelCount, dummy, depth;
6931
+ if (!x) x = &dummy;
6932
+ if (!y) y = &dummy;
6933
+ if (!comp) comp = &dummy;
6088
6934
  if (stbi__get32be(s) != 0x38425053) {
6089
6935
  stbi__rewind( s );
6090
6936
  return 0;
@@ -6101,7 +6947,8 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
6101
6947
  }
6102
6948
  *y = stbi__get32be(s);
6103
6949
  *x = stbi__get32be(s);
6104
- if (stbi__get16be(s) != 8) {
6950
+ depth = stbi__get16be(s);
6951
+ if (depth != 8 && depth != 16) {
6105
6952
  stbi__rewind( s );
6106
6953
  return 0;
6107
6954
  }
@@ -6112,14 +6959,45 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
6112
6959
  *comp = 4;
6113
6960
  return 1;
6114
6961
  }
6962
+
6963
+ static int stbi__psd_is16(stbi__context *s)
6964
+ {
6965
+ int channelCount, depth;
6966
+ if (stbi__get32be(s) != 0x38425053) {
6967
+ stbi__rewind( s );
6968
+ return 0;
6969
+ }
6970
+ if (stbi__get16be(s) != 1) {
6971
+ stbi__rewind( s );
6972
+ return 0;
6973
+ }
6974
+ stbi__skip(s, 6);
6975
+ channelCount = stbi__get16be(s);
6976
+ if (channelCount < 0 || channelCount > 16) {
6977
+ stbi__rewind( s );
6978
+ return 0;
6979
+ }
6980
+ (void) stbi__get32be(s);
6981
+ (void) stbi__get32be(s);
6982
+ depth = stbi__get16be(s);
6983
+ if (depth != 16) {
6984
+ stbi__rewind( s );
6985
+ return 0;
6986
+ }
6987
+ return 1;
6988
+ }
6115
6989
  #endif
6116
6990
 
6117
6991
  #ifndef STBI_NO_PIC
6118
6992
  static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
6119
6993
  {
6120
- int act_comp=0,num_packets=0,chained;
6994
+ int act_comp=0,num_packets=0,chained,dummy;
6121
6995
  stbi__pic_packet packets[10];
6122
6996
 
6997
+ if (!x) x = &dummy;
6998
+ if (!y) y = &dummy;
6999
+ if (!comp) comp = &dummy;
7000
+
6123
7001
  if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
6124
7002
  stbi__rewind(s);
6125
7003
  return 0;
@@ -6195,16 +7073,22 @@ static int stbi__pnm_test(stbi__context *s)
6195
7073
  return 1;
6196
7074
  }
6197
7075
 
6198
- static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
7076
+ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
6199
7077
  {
6200
7078
  stbi_uc *out;
7079
+ STBI_NOTUSED(ri);
7080
+
6201
7081
  if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n))
6202
7082
  return 0;
7083
+
6203
7084
  *x = s->img_x;
6204
7085
  *y = s->img_y;
6205
- *comp = s->img_n;
7086
+ if (comp) *comp = s->img_n;
7087
+
7088
+ if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
7089
+ return stbi__errpuc("too large", "PNM too large");
6206
7090
 
6207
- out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y);
7091
+ out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
6208
7092
  if (!out) return stbi__errpuc("outofmem", "Out of memory");
6209
7093
  stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
6210
7094
 
@@ -6222,8 +7106,16 @@ static int stbi__pnm_isspace(char c)
6222
7106
 
6223
7107
  static void stbi__pnm_skip_whitespace(stbi__context *s, char *c)
6224
7108
  {
6225
- while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
6226
- *c = (char) stbi__get8(s);
7109
+ for (;;) {
7110
+ while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7111
+ *c = (char) stbi__get8(s);
7112
+
7113
+ if (stbi__at_eof(s) || *c != '#')
7114
+ break;
7115
+
7116
+ while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' )
7117
+ *c = (char) stbi__get8(s);
7118
+ }
6227
7119
  }
6228
7120
 
6229
7121
  static int stbi__pnm_isdigit(char c)
@@ -6245,16 +7137,20 @@ static int stbi__pnm_getinteger(stbi__context *s, char *c)
6245
7137
 
6246
7138
  static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
6247
7139
  {
6248
- int maxv;
7140
+ int maxv, dummy;
6249
7141
  char c, p, t;
6250
7142
 
6251
- stbi__rewind( s );
7143
+ if (!x) x = &dummy;
7144
+ if (!y) y = &dummy;
7145
+ if (!comp) comp = &dummy;
7146
+
7147
+ stbi__rewind(s);
6252
7148
 
6253
7149
  // Get identifier
6254
7150
  p = (char) stbi__get8(s);
6255
7151
  t = (char) stbi__get8(s);
6256
7152
  if (p != 'P' || (t != '5' && t != '6')) {
6257
- stbi__rewind( s );
7153
+ stbi__rewind(s);
6258
7154
  return 0;
6259
7155
  }
6260
7156
 
@@ -6320,6 +7216,19 @@ static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
6320
7216
  return stbi__err("unknown image type", "Image not of any known type, or corrupt");
6321
7217
  }
6322
7218
 
7219
+ static int stbi__is_16_main(stbi__context *s)
7220
+ {
7221
+ #ifndef STBI_NO_PNG
7222
+ if (stbi__png_is16(s)) return 1;
7223
+ #endif
7224
+
7225
+ #ifndef STBI_NO_PSD
7226
+ if (stbi__psd_is16(s)) return 1;
7227
+ #endif
7228
+
7229
+ return 0;
7230
+ }
7231
+
6323
7232
  #ifndef STBI_NO_STDIO
6324
7233
  STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
6325
7234
  {
@@ -6341,6 +7250,27 @@ STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
6341
7250
  fseek(f,pos,SEEK_SET);
6342
7251
  return r;
6343
7252
  }
7253
+
7254
+ STBIDEF int stbi_is_16_bit(char const *filename)
7255
+ {
7256
+ FILE *f = stbi__fopen(filename, "rb");
7257
+ int result;
7258
+ if (!f) return stbi__err("can't fopen", "Unable to open file");
7259
+ result = stbi_is_16_bit_from_file(f);
7260
+ fclose(f);
7261
+ return result;
7262
+ }
7263
+
7264
+ STBIDEF int stbi_is_16_bit_from_file(FILE *f)
7265
+ {
7266
+ int r;
7267
+ stbi__context s;
7268
+ long pos = ftell(f);
7269
+ stbi__start_file(&s, f);
7270
+ r = stbi__is_16_main(&s);
7271
+ fseek(f,pos,SEEK_SET);
7272
+ return r;
7273
+ }
6344
7274
  #endif // !STBI_NO_STDIO
6345
7275
 
6346
7276
  STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
@@ -6357,14 +7287,62 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int
6357
7287
  return stbi__info_main(&s,x,y,comp);
6358
7288
  }
6359
7289
 
7290
+ STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)
7291
+ {
7292
+ stbi__context s;
7293
+ stbi__start_mem(&s,buffer,len);
7294
+ return stbi__is_16_main(&s);
7295
+ }
7296
+
7297
+ STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user)
7298
+ {
7299
+ stbi__context s;
7300
+ stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
7301
+ return stbi__is_16_main(&s);
7302
+ }
7303
+
6360
7304
  #endif // STB_IMAGE_IMPLEMENTATION
6361
7305
 
6362
7306
  /*
6363
7307
  revision history:
7308
+ 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
7309
+ 2.19 (2018-02-11) fix warning
7310
+ 2.18 (2018-01-30) fix warnings
7311
+ 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
7312
+ 1-bit BMP
7313
+ *_is_16_bit api
7314
+ avoid warnings
7315
+ 2.16 (2017-07-23) all functions have 16-bit variants;
7316
+ STBI_NO_STDIO works again;
7317
+ compilation fixes;
7318
+ fix rounding in unpremultiply;
7319
+ optimize vertical flip;
7320
+ disable raw_len validation;
7321
+ documentation fixes
7322
+ 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;
7323
+ warning fixes; disable run-time SSE detection on gcc;
7324
+ uniform handling of optional "return" values;
7325
+ thread-safe initialization of zlib tables
7326
+ 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
7327
+ 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now
7328
+ 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
7329
+ 2.11 (2016-04-02) allocate large structures on the stack
7330
+ remove white matting for transparent PSD
7331
+ fix reported channel count for PNG & BMP
7332
+ re-enable SSE2 in non-gcc 64-bit
7333
+ support RGB-formatted JPEG
7334
+ read 16-bit PNGs (only as 8-bit)
7335
+ 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED
7336
+ 2.09 (2016-01-16) allow comments in PNM files
7337
+ 16-bit-per-pixel TGA (not bit-per-component)
7338
+ info() for TGA could break due to .hdr handling
7339
+ info() for BMP to shares code instead of sloppy parse
7340
+ can use STBI_REALLOC_SIZED if allocator doesn't support realloc
7341
+ code cleanup
6364
7342
  2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
6365
7343
  2.07 (2015-09-13) fix compiler warnings
6366
7344
  partial animated GIF support
6367
- limited 16-bit PSD support
7345
+ limited 16-bpc PSD support
6368
7346
  #ifdef unused functions
6369
7347
  bug with < 92 byte PIC,PNM,HDR,TGA
6370
7348
  2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value
@@ -6507,3 +7485,46 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int
6507
7485
  0.50 (2006-11-19)
6508
7486
  first released version
6509
7487
  */
7488
+
7489
+
7490
+ /*
7491
+ ------------------------------------------------------------------------------
7492
+ This software is available under 2 licenses -- choose whichever you prefer.
7493
+ ------------------------------------------------------------------------------
7494
+ ALTERNATIVE A - MIT License
7495
+ Copyright (c) 2017 Sean Barrett
7496
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
7497
+ this software and associated documentation files (the "Software"), to deal in
7498
+ the Software without restriction, including without limitation the rights to
7499
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7500
+ of the Software, and to permit persons to whom the Software is furnished to do
7501
+ so, subject to the following conditions:
7502
+ The above copyright notice and this permission notice shall be included in all
7503
+ copies or substantial portions of the Software.
7504
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7505
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7506
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7507
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
7508
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
7509
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
7510
+ SOFTWARE.
7511
+ ------------------------------------------------------------------------------
7512
+ ALTERNATIVE B - Public Domain (www.unlicense.org)
7513
+ This is free and unencumbered software released into the public domain.
7514
+ Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
7515
+ software, either in source code form or as a compiled binary, for any purpose,
7516
+ commercial or non-commercial, and by any means.
7517
+ In jurisdictions that recognize copyright laws, the author or authors of this
7518
+ software dedicate any and all copyright interest in the software to the public
7519
+ domain. We make this dedication for the benefit of the public at large and to
7520
+ the detriment of our heirs and successors. We intend this dedication to be an
7521
+ overt act of relinquishment in perpetuity of all present and future rights to
7522
+ this software under copyright law.
7523
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7524
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7525
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7526
+ AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
7527
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
7528
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7529
+ ------------------------------------------------------------------------------
7530
+ */