From a9778b8dbd2313ec67bc41bdb1d8268d11c9f588 Mon Sep 17 00:00:00 2001 From: Sean Barrett Date: Fri, 12 Sep 2014 04:46:41 -0700 Subject: [PATCH] tweak docs; fix compile error in UNUSED_PARAM stuff --- stb_image_resize.h | 44 +++++++++++++++++++++++++++----------------- tests/resample_test.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/stb_image_resize.h b/stb_image_resize.h index 9085783..0fdf47d 100644 --- a/stb_image_resize.h +++ b/stb_image_resize.h @@ -47,13 +47,19 @@ For interactive use with slow resize operations, you can install a progress-report callback: - #define STBIR_PROGRESS_REPORT(val) my_progress_report(val) + #define STBIR_PROGRESS_REPORT(val) some_func(val) The parameter val is a float which goes from 0 to 1 as progress is made. For example: - void my_progress_report(float progress) + static void my_progress_report(float progress); + #define STBIR_PROGRESS_REPORT(val) my_progress_report(val) + + #define STB_IMAGE_RESIZE_IMPLEMENTATION + #include "stb_image_resize.h" + + static void my_progress_report(float progress) { printf("Progress: %f%%\n", progress*100); } @@ -87,7 +93,9 @@ 4. If you pass the flag STBIR_FLAG_ALPHA_PREMULTIPLIED, the resizer does not do anything special for the alpha channel; - it is resampled identically to other channels. + it is resampled identically to other channels. This produces + the correct results for premultiplied-alpha images, but produces + less-than-ideal results for non-premultiplied-alpha images. 5. If you do not pass the flag STBIR_FLAG_ALPHA_PREMULTIPLIED, then the resizer weights the contribution of input pixels @@ -105,7 +113,11 @@ value to the alpha channel of every image, and then subtracting or clamping it at the end.) - 6. You can separately control whether the alpha channel is + 6. You can suppress the behavior described in #5 and make + all-0-alpha pixels have 0 in all channels by #defining + STBIR_NO_ALPHA_EPSILON. + + 7. You can separately control whether the alpha channel is interpreted as linear or affected by the colorspace. By default it is linear; you almost never want to apply the colorspace. (For example, graphics hardware does not apply sRGB conversion @@ -123,7 +135,8 @@ and modify this file as you see fit. TODO - Installable filters + Don't decode all of the image data when only processing a subtile + Installable filters? Resize that respects alpha test coverage (Reference code: FloatImage::alphaTestCoverage and FloatImage::scaleAlphaToCoverage: https://code.google.com/p/nvidia-texture-tools/source/browse/trunk/src/nvimage/FloatImage.cpp ) @@ -640,7 +653,7 @@ static float stbir__support_trapezoid(float scale) static float stbir__filter_bilinear(float x, float s) { - STBIR__UNUSED_PARAM(s) + STBIR__UNUSED_PARAM(s); x = (float)fabs(x); @@ -652,7 +665,7 @@ static float stbir__filter_bilinear(float x, float s) static float stbir__filter_bicubic(float x, float s) { - STBIR__UNUSED_PARAM(s) + STBIR__UNUSED_PARAM(s); x = (float)fabs(x); @@ -666,7 +679,7 @@ static float stbir__filter_bicubic(float x, float s) static float stbir__filter_catmullrom(float x, float s) { - STBIR__UNUSED_PARAM(s) + STBIR__UNUSED_PARAM(s); x = (float)fabs(x); @@ -680,7 +693,7 @@ static float stbir__filter_catmullrom(float x, float s) static float stbir__filter_mitchell(float x, float s) { - STBIR__UNUSED_PARAM(s) + STBIR__UNUSED_PARAM(s); x = (float)fabs(x); @@ -694,19 +707,19 @@ static float stbir__filter_mitchell(float x, float s) static float stbir__support_zero(float s) { - STBIR__UNUSED_PARAM(s) + STBIR__UNUSED_PARAM(s); return 0; } static float stbir__support_one(float s) { - STBIR__UNUSED_PARAM(s) + STBIR__UNUSED_PARAM(s); return 1; } static float stbir__support_two(float s) { - STBIR__UNUSED_PARAM(s) + STBIR__UNUSED_PARAM(s); return 2; } @@ -1281,7 +1294,6 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n) break; } -#ifndef STBIR_NO_ALPHA_EPSILON if (!(stbir_info->flags & STBIR_FLAG_ALPHA_PREMULTIPLIED)) { for (x = -stbir__get_filter_pixel_margin_horizontal(stbir_info); x < max_x; x++) @@ -1290,11 +1302,12 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n) // If the alpha value is 0 it will clobber the color values. Make sure it's not. float alpha = decode_buffer[decode_pixel_index + alpha_channel]; +#ifndef STBIR_NO_ALPHA_EPSILON if (stbir_info->type != STBIR_TYPE_FLOAT) { alpha += STBIR_ALPHA_EPSILON; decode_buffer[decode_pixel_index + alpha_channel] = alpha; } - +#endif for (c = 0; c < channels; c++) { if (c == alpha_channel) @@ -1304,7 +1317,6 @@ static void stbir__decode_scanline(stbir__info* stbir_info, int n) } } } -#endif if (edge_horizontal == STBIR_EDGE_ZERO) { @@ -1474,7 +1486,6 @@ static void stbir__encode_scanline(stbir__info* stbir_info, int num_pixels, void int x; int n; -#ifndef STBIR_NO_ALPHA_EPSILON if (!(stbir_info->flags&STBIR_FLAG_ALPHA_PREMULTIPLIED)) { for (x=0; x < num_pixels; ++x) @@ -1492,7 +1503,6 @@ static void stbir__encode_scanline(stbir__info* stbir_info, int num_pixels, void // conversion. } } -#endif switch (decode) { diff --git a/tests/resample_test.cpp b/tests/resample_test.cpp index 6028cd5..07b8837 100644 --- a/tests/resample_test.cpp +++ b/tests/resample_test.cpp @@ -124,6 +124,23 @@ inline float mtfrand() return (float)(mtrand() % ninenine)/ninenine; } +static void resizer(int argc, char **argv) +{ + unsigned char* input_pixels; + unsigned char* output_pixels; + int w, h; + int n; + int out_w, out_h; + input_pixels = stbi_load(argv[1], &w, &h, &n, 0); + out_w = w/4; + out_h = h/4; + output_pixels = (unsigned char*) malloc(out_w*out_h*n); + //stbir_resize_uint8_srgb(input_pixels, w, h, 0, output_pixels, out_w, out_h, 0, n, -1,0); + stbir_resize_uint8(input_pixels, w, h, 0, output_pixels, out_w, out_h, 0, n); + stbi_write_png("output.png", out_w, out_h, n, output_pixels, 0); + exit(0); +} + void test_suite(int argc, char **argv); @@ -135,6 +152,8 @@ int main(int argc, char** argv) int n; int out_w, out_h, out_stride; + //resizer(argc, argv); + #if 1 test_suite(argc, argv); return 0; @@ -733,6 +752,12 @@ void test_filters(void) STBIR_ASSERT(output[2] == input[1]); } + // checkerboard + { + + + } + { // Now for some fun. unsigned char input[2 * 1];