tweak docs; fix compile error in UNUSED_PARAM stuff

pull/43/head
Sean Barrett 2014-09-12 04:46:41 -07:00
parent 99f3b78bbd
commit a9778b8dbd
2 changed files with 52 additions and 17 deletions

View File

@ -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)
{

View File

@ -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];