|
@@ -83,6 +83,7 @@ RECENT REVISION HISTORY:
|
|
|
Optimizations & bugfixes
|
|
|
Fabian "ryg" Giesen
|
|
|
Arseny Kapoulkine
|
|
|
+ John-Mark Allen
|
|
|
|
|
|
Bug & warning fixes
|
|
|
Marc LeBlanc David Woo Guillaume George Martins Mozeiko
|
|
@@ -1031,6 +1032,30 @@ static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int chan
|
|
|
return enlarged;
|
|
|
}
|
|
|
|
|
|
+static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)
|
|
|
+{
|
|
|
+ int row;
|
|
|
+ size_t bytes_per_row = (size_t)w * bytes_per_pixel;
|
|
|
+ stbi_uc temp[2048];
|
|
|
+ stbi_uc *bytes = (stbi_uc *)image;
|
|
|
+
|
|
|
+ for (row = 0; row < (h>>1); row++) {
|
|
|
+ stbi_uc *row0 = bytes + row*bytes_per_row;
|
|
|
+ stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
|
|
|
+ // swap row0 with row1
|
|
|
+ size_t bytes_left = bytes_per_row;
|
|
|
+ while (bytes_left) {
|
|
|
+ size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);
|
|
|
+ memcpy(temp, row0, bytes_copy);
|
|
|
+ memcpy(row0, row1, bytes_copy);
|
|
|
+ memcpy(row1, temp, bytes_copy);
|
|
|
+ row0 += bytes_copy;
|
|
|
+ row1 += bytes_copy;
|
|
|
+ bytes_left -= bytes_copy;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
|
|
|
{
|
|
|
stbi__result_info ri;
|
|
@@ -1048,21 +1073,8 @@ static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x,
|
|
|
// @TODO: move stbi__convert_format to here
|
|
|
|
|
|
if (stbi__vertically_flip_on_load) {
|
|
|
- int w = *x, h = *y;
|
|
|
int channels = req_comp ? req_comp : *comp;
|
|
|
- int row,col,z;
|
|
|
- stbi_uc *image = (stbi_uc *) result;
|
|
|
-
|
|
|
- // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once
|
|
|
- for (row = 0; row < (h>>1); row++) {
|
|
|
- for (col = 0; col < w; col++) {
|
|
|
- for (z = 0; z < channels; z++) {
|
|
|
- stbi_uc temp = image[(row * w + col) * channels + z];
|
|
|
- image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z];
|
|
|
- image[((h - row - 1) * w + col) * channels + z] = temp;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));
|
|
|
}
|
|
|
|
|
|
return (unsigned char *) result;
|
|
@@ -1086,21 +1098,8 @@ static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x,
|
|
|
// @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision
|
|
|
|
|
|
if (stbi__vertically_flip_on_load) {
|
|
|
- int w = *x, h = *y;
|
|
|
int channels = req_comp ? req_comp : *comp;
|
|
|
- int row,col,z;
|
|
|
- stbi__uint16 *image = (stbi__uint16 *) result;
|
|
|
-
|
|
|
- // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once
|
|
|
- for (row = 0; row < (h>>1); row++) {
|
|
|
- for (col = 0; col < w; col++) {
|
|
|
- for (z = 0; z < channels; z++) {
|
|
|
- stbi__uint16 temp = image[(row * w + col) * channels + z];
|
|
|
- image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z];
|
|
|
- image[((h - row - 1) * w + col) * channels + z] = temp;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));
|
|
|
}
|
|
|
|
|
|
return (stbi__uint16 *) result;
|
|
@@ -1110,21 +1109,8 @@ static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x,
|
|
|
static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
|
|
|
{
|
|
|
if (stbi__vertically_flip_on_load && result != NULL) {
|
|
|
- int w = *x, h = *y;
|
|
|
- int depth = req_comp ? req_comp : *comp;
|
|
|
- int row,col,z;
|
|
|
- float temp;
|
|
|
-
|
|
|
- // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once
|
|
|
- for (row = 0; row < (h>>1); row++) {
|
|
|
- for (col = 0; col < w; col++) {
|
|
|
- for (z = 0; z < depth; z++) {
|
|
|
- temp = result[(row * w + col) * depth + z];
|
|
|
- result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
|
|
|
- result[((h - row - 1) * w + col) * depth + z] = temp;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ int channels = req_comp ? req_comp : *comp;
|
|
|
+ stbi__vertical_flip(result, *x, *y, channels * sizeof(float));
|
|
|
}
|
|
|
}
|
|
|
#endif
|