|
|
|
@ -985,14 +985,14 @@ static unsigned char stbiw__paeth(int a, int b, int c) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// @OPTIMIZE: provide an option that always forces left-predict or paeth predict
|
|
|
|
|
static void stbiw__encode_png_line(const unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) |
|
|
|
|
static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) |
|
|
|
|
{ |
|
|
|
|
static int mapping[] = { 0,1,2,3,4 }; |
|
|
|
|
static int firstmap[] = { 0,1,0,5,6 }; |
|
|
|
|
int *mymap = (y != 0) ? mapping : firstmap; |
|
|
|
|
int i; |
|
|
|
|
int type = mymap[filter_type]; |
|
|
|
|
const unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); |
|
|
|
|
unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); |
|
|
|
|
int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; |
|
|
|
|
for (i = 0; i < n; ++i) { |
|
|
|
|
switch (type) { |
|
|
|
@ -1040,11 +1040,11 @@ unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_byt |
|
|
|
|
int filter_type; |
|
|
|
|
if (force_filter > -1) { |
|
|
|
|
filter_type = force_filter; |
|
|
|
|
stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, force_filter, line_buffer); |
|
|
|
|
stbiw__encode_png_line(const_cast<unsigned char*>(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); |
|
|
|
|
} else { // Estimate the best filter by running through all of them:
|
|
|
|
|
int best_filter = 0, best_filter_val = 0x7fffffff, est, i; |
|
|
|
|
for (filter_type = 0; filter_type < 5; filter_type++) { |
|
|
|
|
stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, filter_type, line_buffer); |
|
|
|
|
stbiw__encode_png_line(const_cast<unsigned char*>(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); |
|
|
|
|
|
|
|
|
|
// Estimate the entropy of the line using this filter; the less, the better.
|
|
|
|
|
est = 0; |
|
|
|
@ -1057,7 +1057,7 @@ unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_byt |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it
|
|
|
|
|
stbiw__encode_png_line(pixels, stride_bytes, x, y, j, n, best_filter, line_buffer); |
|
|
|
|
stbiw__encode_png_line(const_cast<unsigned char*>(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); |
|
|
|
|
filter_type = best_filter; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|