@ -7,8 +7,9 @@
# define STBIR_ASSERT(x) to avoid using assert.h.
# define STBIR_ASSERT(x) to avoid using assert.h.
# define STBIR_MALLOC and STBIR_FREE to avoid using stdlib.h malloc. This will apply
# define STBIR_MALLOC(context,size) and STBIR_FREE(context,ptr) to avoid using stdlib.h malloc.
to all functions except stbir_resize_arbitrary ( ) , which doesn ' t allocate memory .
Each function makes exactly one call to malloc / free , so to avoid allocations ,
pass in a temp memory block as context and return that from MALLOC .
QUICK NOTES :
QUICK NOTES :
Written with emphasis on usage and speed . Only the resize operation is
Written with emphasis on usage and speed . Only the resize operation is
@ -36,82 +37,6 @@
# ifndef STBIR_INCLUDE_STB_IMAGE_RESIZE_H
# ifndef STBIR_INCLUDE_STB_IMAGE_RESIZE_H
# define STBIR_INCLUDE_STB_IMAGE_RESIZE_H
# define STBIR_INCLUDE_STB_IMAGE_RESIZE_H
// Basic usage:
// result = stbir_resize_uint8_srgb(input_data, input_w, input_h, output_data, output_w, output_h, channels, STBIR_FILTER_CATMULLROM, STBIR_EDGE_CLAMP);
// * input_data is your supplied pixels.
// * output_data will be the resized pixels. It should be of size output_w * output_h * channels
// * Returned result is 1 for success or 0 in case of an error. In the case of an error an assert with be triggered, #define STBIR_ASSERT() to see it.
// * If you're unsure of which filter to use, Catmull-Rom is a good upsampling filter and Mitchell is a good downsampling filter.
//
//
// Data types provided: uint8, uint16, uint32, float.
//
//
// Other function groups are provided, one for each data type, for more advanced functionality:
//
// stbir_resize_type_alphaweighted(input_data, input_w, input_h, output_data, output_w, output_h, channels, alpha_channel, STBIR_FILTER_CATMULLROM, STBIR_EDGE_CLAMP, STBIR_COLORSPACE_SRGB)
// * alpha_channel - if nonnegative, this channel will be multiplied into all other channels before resampling, then divided back out after.
//
// stbir_resize_type_subpixel(input_data, input_w, input_h, output_data, output_w, output_h, s0, t0, s1, t1, channels, filter, edge)
// * s0, t0, s1, t1 are the top-left and bottom right corner (uv addressing style: [0, 1]x[0, 1]) of a region of the input image to use.
//
//
// All functionality is offered in this function:
//
// result = stbir_resize_arbitrary(input_data, input_w, input_h, input_stride_in_bytes,
// output_data, output_w, output_h, output_stride_in_bytes,
// s0, t0, s1, t1,
// channels, alpha_channel, flags, STBIR_TYPE_UINT8, STBIR_FILTER_CATMULLROM, STBIR_EDGE_CLAMP, STBIR_EDGE_CLAMP, STBIR_COLORSPACE_SRGB);
//
// * input_stride_in_bytes and output_stride_in_bytes can be 0. If so they will be automatically calculated as width * channels.
// * s0, t0, s1, t1 are the top-left and bottom right corner (uv addressing style: [0, 1]x[0, 1]) of a region of the input image to use.
// * flags are from the stbir_flags enum and should be bitwise OR'd together.
// * First edge parameter is for horizontal edge behavior, second is for vertical.
// * Returned result is 1 for success or 0 in case of an error. In the case of an error an assert with be triggered, #define STBIR_ASSERT() to see it.
// * Memory required grows approximately linearly with input and output size, but with discontinuities at input_w == output_w and input_h == output_height.
// * To use temporary memory, define an STBIR_MALLOC that returns the temp memory and make STBIR_FREE do nothing--each function only ever allocates one block
typedef enum
{
STBIR_FILTER_NEAREST = 1 ,
STBIR_FILTER_BILINEAR = 2 ,
STBIR_FILTER_BICUBIC = 3 , // A cubic b spline
STBIR_FILTER_CATMULLROM = 4 ,
STBIR_FILTER_MITCHELL = 5 ,
} stbir_filter ;
typedef enum
{
STBIR_EDGE_CLAMP = 1 ,
STBIR_EDGE_REFLECT = 2 ,
STBIR_EDGE_WRAP = 3 ,
} stbir_edge ;
typedef enum
{
STBIR_COLORSPACE_LINEAR ,
STBIR_COLORSPACE_SRGB ,
STBIR_MAX_COLORSPACES ,
} stbir_colorspace ;
typedef enum
{
STBIR_TYPE_UINT8 ,
STBIR_TYPE_UINT16 ,
STBIR_TYPE_UINT32 ,
STBIR_TYPE_FLOAT ,
STBIR_MAX_TYPES
} stbir_type ;
typedef enum
{
STBIR_FLAG_NONPREMUL_ALPHA = ( 1 < < 0 ) , // The specified alpha channel will be multiplied into all other channels before resampling, then divided back out after.
STBIR_FLAG_GAMMA_CORRECT_ALPHA = ( 1 < < 1 ) , // The specified alpha channel should be handled as a linear value even when doing sRGB operations.
} stbir_flags ;
typedef unsigned char stbir_uint8 ;
typedef unsigned char stbir_uint8 ;
# ifdef _MSC_VER
# ifdef _MSC_VER
@ -123,88 +48,176 @@ typedef uint16_t stbir_uint16;
typedef uint32_t stbir_uint32 ;
typedef uint32_t stbir_uint32 ;
# endif
# endif
typedef unsigned int stbir_size_t ; // to avoid including a header for size_t
# ifdef STB_IMAGE_RESIZE_STATIC
# ifdef STB_IMAGE_RESIZE_STATIC
# define STBRDEF static
# define STBIRDEF static
# else
# else
# ifdef __cplusplus
# ifdef __cplusplus
# define STBRDEF extern "C"
# define STBI RDEF extern "C"
# else
# else
# define STBRDEF extern
# define STBI RDEF extern
# endif
# endif
# endif
# endif
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
//
// PRIMARY API - sRGB type-safe image resizing.
// Easy-to-use API:
//
//
// * "input pixels" points to an array of image data with 'num_channels' channels (e.g. RGB=3, RGBA=4)
// * input_w is input image width (x-axis), input_h is input image height (y-axis)
// * stride is the offset between successive rows of image data in memory, in bytes. you can
// specify 0 to mean packed continuously in memory
// * alpha channel is treated identically to other channels.
// * colorspace is linear or sRGB as specified by function name
// * returned result is 1 for success or 0 in case of an error.
// In the case of an error an assert with be triggered, #define STBIR_ASSERT() to see it.
// * Memory required grows approximately linearly with input and output size, but with
// discontinuities at input_w == output_w and input_h == output_h.
// * These functions use a "default" resampling filter defined at compile time. To change the filter,
// you can change the compile-time defaults by #defining STBIR_DEFAULT_FILTER_UPSAMPLE
// and STBIR_DEFAULT_FILTER_DOWNSAMPLE, or you can use the medium-complexity API.
STBIRDEF int stbir_resize_uint8 ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels ) ;
STBIRDEF int stbir_resize_uint8_srgb ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels ) ;
STBIRDEF int stbir_resize_float ( float * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
float * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels ) ;
STBRDEF int stbir_resize_uint8_srgb ( const stbir_uint8 * input_data , int input_w , int input_h ,
typedef enum
stbir_uint8 * output_data , int output_w , int output_h ,
{
int channels , stbir_filter filter , stbir_edge edge ) ;
STBIR_EDGE_CLAMP = 1 ,
STBIR_EDGE_REFLECT = 2 ,
STBIR_EDGE_WRAP = 3 ,
} stbir_edge ;
STBRDEF int stbir_resize_uint16_srgb ( const stbir_uint16 * input_data , int input_w , int input_h ,
// This function adds the ability to specify how requests to sample off the edge of the image are handled.
stbir_uint16 * output_data , int output_w , int output_h ,
STBIRDEF int stbir_resize_uint8_srgb_edgemode ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
int channels , stbir_filter filter , stbir_edge edge ) ;
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels ,
stbir_edge edge_wrap_mode ) ;
STBRDEF int stbir_resize_uint32_srgb ( const stbir_uint32 * input_data , int input_w , int input_h ,
//////////////////////////////////////////////////////////////////////////////
stbir_uint32 * output_data , int output_w , int output_h ,
//
int channels , stbir_filter filter , stbir_edge edge ) ;
// Medium-complexity API
//
// This extends the easy-to-use API as follows:
//
// * Alpha-channel can be processed separately
// * If alpha_channel is not STBIR_ALPHA_CHANNEL_NONE
// * Alpha channel will not be gamma corrected (unless flags&STBIR_FLAG_GAMMA_CORRECT)
// * Filters can be weighted by alpha channel (if flags&STBIR_FLAG_NONPREMUL_ALPHA)
// * Filter can be selected explicitly
// * uint16 image type
// * sRGB colorspace available for all types
// * context parameter for passing to STBIR_MALLOC
STBRDEF int stbir_resize_float_srgb ( const float * input_data , int input_w , int input_h ,
typedef enum
float * output_data , int output_w , int output_h ,
{
int channels , stbir_filter filter , stbir_edge edge ) ;
STBIR_FILTER_NEAREST = 1 ,
STBIR_FILTER_BILINEAR = 2 ,
STBIR_FILTER_BICUBIC = 3 , // A cubic b spline
STBIR_FILTER_CATMULLROM = 4 ,
STBIR_FILTER_MITCHELL = 5 ,
} stbir_filter ;
# define STBIR_FLAG_NONPREMUL_ALPHA (1 << 0) // The specified alpha channel will be multiplied into all other channels before resampling, then divided back out after.
# define STBIR_FLAG_GAMMA_CORRECT_ALPHA (1 << 1) // The specified alpha channel should be handled as gamma-corrected value even when doing sRGB operations.
STBRDEF int stbir_resize_uint8_alphaweighted ( const stbir_uint8 * input_data , int input_w , int input_h ,
typedef enum
stbir_uint8 * output_data , int output_w , int output_h ,
{
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace ) ;
STBIR_COLORSPACE_LINEAR ,
STBIR_COLORSPACE_SRGB ,
STBRDEF int stbir_resize_uint16_alphaweighted ( const stbir_uint16 * input_data , int input_w , int input_h ,
STBIR_MAX_COLORSPACES ,
stbir_uint16 * output_data , int output_w , int output_h ,
} stbir_colorspace ;
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace ) ;
STBRDEF int stbir_resize_uint32_alphaweighted ( const stbir_uint32 * input_data , int input_w , int input_h ,
// The following functions are all identical except for the type of the image data
stbir_uint32 * output_data , int output_w , int output_h ,
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace ) ;
STBRDEF int stbir_resize_float_alphaweighted ( const float * input_data , int input_w , int input_h ,
STBIRDEF int stbir_resize_uint8_generic ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
float * output_data , int output_w , int output_h ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace ) ;
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_wrap_mode , stbir_colorspace space , stbir_filter filter ,
void * context ) ;
STBIRDEF int stbir_resize_uint16_generic ( stbir_uint16 * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
stbir_uint16 * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_wrap_mode , stbir_colorspace space , stbir_filter filter ,
void * context ) ;
STBRDEF int stbir_resize_uint8_subpixel ( const stbir_uint8 * input_data , int input_w , int input_h ,
STBIRDEF int stbir_resize_float_generic ( float * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
stbir_uint8 * output_data , int output_w , int output_h ,
float * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
float s0 , float t0 , float s1 , float t1 ,
int num_channels , int alpha_channel , int flags ,
int channels , stbir_filter filter , stbir_edge edge ) ;
stbir_edge edge_wrap_mode , stbir_colorspace space , stbir_filter filter ,
void * context ) ;
STBRDEF int stbir_resize_uint16_subpixel ( const stbir_uint16 * input_data , int input_w , int input_h ,
# define STBIR_ALPHA_CHANNEL_NONE -1
stbir_uint16 * output_data , int output_w , int output_h ,
float s0 , float t0 , float s1 , float t1 ,
int channels , stbir_filter filter , stbir_edge edge ) ;
STBRDEF int stbir_resize_uint32_subpixel ( const stbir_uint32 * input_data , int input_w , int input_h ,
stbir_uint32 * output_data , int output_w , int output_h ,
float s0 , float t0 , float s1 , float t1 ,
int channels , stbir_filter filter , stbir_edge edge ) ;
STBRDEF int stbir_resize_float_subpixel ( const float * input_data , int input_w , int input_h ,
//////////////////////////////////////////////////////////////////////////////
float * output_data , int output_w , int output_h ,
//
float s0 , float t0 , float s1 , float t1 ,
// Full-complexity API
int channels , stbir_filter filter , stbir_edge edge ) ;
//
// This extends the medium API as follows:
//
// * uint32 image type
// * not typesafe
// * separate filter types for each axis
// * separate edge modes for each axis
// * can specify scale explicitly for subpixel correctness
// * can specify image source tile using texture coordinates
typedef enum
{
STBIR_TYPE_UINT8 ,
STBIR_TYPE_UINT16 ,
STBIR_TYPE_UINT32 ,
STBIR_TYPE_FLOAT ,
STBIR_MAX_TYPES
} stbir_datatype ;
STBIRDEF int stbir_resize ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_mode_horizontal , stbir_filter filter_horizontal ,
stbir_edge edge_mode_vertical , stbir_filter filter_vertical ,
stbir_colorspace space ) ;
STBIRDEF int stbir_resize_subpixel ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_mode_horizontal , stbir_filter filter_horizontal ,
stbir_edge edge_mode_vertical , stbir_filter filter_vertical ,
stbir_colorspace space ,
float x_scale , float x_offset ,
float y_scale , float y_offset ) ;
STBIRDEF int stbir_resize_region ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_mode_horizontal , stbir_filter filter_horizontal ,
stbir_edge edge_mode_vertical , stbir_filter filter_vertical ,
stbir_colorspace space ,
float s0 , float t0 , float s1 , float t1 ) ;
// (s0, t0) & (s1, t1) are the top-left and bottom right corner (uv addressing style: [0, 1]x[0, 1]) of a region of the input image to use.
STBRDEF int stbir_resize_arbitrary ( const void * input_data , int input_w , int input_h , int input_stride_in_bytes ,
void * output_data , int output_w , int output_h , int output_stride_in_bytes ,
float s0 , float t0 , float s1 , float t1 ,
int channels , int alpha_channel , stbir_uint32 flags , stbir_type type , stbir_filter filter , stbir_edge edge_horizontal , stbir_edge edge_vertical , stbir_colorspace colorspace ) ;
//
//
//
//
//// end header file /////////////////////////////////////////////////////
//// end header file /////////////////////////////////////////////////////
# endif // STBIR_INCLUDE_STB_IMAGE_RESIZE_H
# endif // STBIR_INCLUDE_STB_IMAGE_RESIZE_H
# ifdef STB_IMAGE_RESIZE_IMPLEMENTATION
# ifdef STB_IMAGE_RESIZE_IMPLEMENTATION
# ifndef STBIR_ASSERT
# ifndef STBIR_ASSERT
@ -229,11 +242,10 @@ STBRDEF int stbir_resize_arbitrary(const void* input_data, int input_w, int inpu
# ifndef STBIR_MALLOC
# ifndef STBIR_MALLOC
# include <stdlib.h>
# include <stdlib.h>
# define STBIR_MALLOC(x) malloc(x)
# define STBIR_MALLOC(c, x) malloc(c, x)
# define STBIR_FREE(x) free(x)
# define STBIR_FREE(c, x) free(c, x)
# endif
# endif
# ifndef _MSC_VER
# ifndef _MSC_VER
# ifdef __cplusplus
# ifdef __cplusplus
# define stbir__inline inline
# define stbir__inline inline
@ -256,7 +268,15 @@ typedef unsigned char stbir__validate_uint32[sizeof(stbir_uint32) == 4 ? 1 : -1]
# define STBIR__ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0]))
# define STBIR__ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0]))
// must match stbir_type
# ifndef STBIR_DEFAULT_FILTER_UPSAMPLE
# define STBIR_DEFAULT_FILTER_UPSAMPLE STBIR_FILTER_CATMULLROM
# endif
# ifndef STBIR_DEFAULT_FILTER_DOWNSAMPLE
# define STBIR_DEFAULT_FILTER_DOWNSAMPLE STBIR_FILTER_MITCHELL
# endif
// must match stbir_datatype
static unsigned char stbir__type_size [ ] = {
static unsigned char stbir__type_size [ ] = {
1 , // STBIR_TYPE_UINT8
1 , // STBIR_TYPE_UINT8
2 , // STBIR_TYPE_UINT16
2 , // STBIR_TYPE_UINT16
@ -303,7 +323,7 @@ typedef struct
int channels ;
int channels ;
int alpha_channel ;
int alpha_channel ;
stbir_uint32 flags ;
stbir_uint32 flags ;
stbir_type type ;
stbir_data type type ;
stbir_filter filter ;
stbir_filter filter ;
stbir_edge edge_horizontal ;
stbir_edge edge_horizontal ;
stbir_edge edge_vertical ;
stbir_edge edge_vertical ;
@ -1395,7 +1415,7 @@ static void stbir__buffer_loop_downsample(stbir__info* stbir_info)
stbir__empty_ring_buffer ( stbir_info , stbir_info - > output_h ) ;
stbir__empty_ring_buffer ( stbir_info , stbir_info - > output_h ) ;
}
}
static stbir__inline stbir_size_t stbir__calculate_memory ( int input_w , int input_h , int output_w , int output_h , float s0 , float t0 , float s1 , float t1 , int channels , stbir_filter filter )
static stbir__inline stbir_uint32 stbir__calculate_memory ( int input_w , int input_h , int output_w , int output_h , float s0 , float t0 , float s1 , float t1 , int channels , stbir_filter filter )
{
{
float horizontal_scale = ( ( float ) output_w / input_w ) / ( s1 - s0 ) ;
float horizontal_scale = ( ( float ) output_w / input_w ) / ( s1 - s0 ) ;
float vertical_scale = ( ( float ) output_h / input_h ) / ( t1 - t0 ) ;
float vertical_scale = ( ( float ) output_h / input_h ) / ( t1 - t0 ) ;
@ -1430,13 +1450,13 @@ static stbir__inline stbir_size_t stbir__calculate_memory(int input_w, int input
static int stbir__resize_allocated ( const void * input_data , int input_w , int input_h , int input_stride_in_bytes ,
static int stbir__resize_allocated ( const void * input_data , int input_w , int input_h , int input_stride_in_bytes ,
void * output_data , int output_w , int output_h , int output_stride_in_bytes ,
void * output_data , int output_w , int output_h , int output_stride_in_bytes ,
float s0 , float t0 , float s1 , float t1 ,
float s0 , float t0 , float s1 , float t1 , float * transform ,
int channels , int alpha_channel , stbir_uint32 flags , stbir_type type , stbir_filter filter , stbir_edge edge_horizontal , stbir_edge edge_vertical , stbir_colorspace colorspace ,
int channels , int alpha_channel , stbir_uint32 flags , stbir_data type type , stbir_filter x_filter , stbir_filter y_ filter, stbir_edge edge_horizontal , stbir_edge edge_vertical , stbir_colorspace colorspace ,
void * tempmem , stbir_s ize_t tempmem_size_in_bytes )
void * tempmem , size_t tempmem_size_in_bytes )
{
{
stbir__info * stbir_info = ( stbir__info * ) tempmem ;
stbir__info * stbir_info = ( stbir__info * ) tempmem ;
stbir_s ize_t memory_required = stbir__calculate_memory ( input_w , input_h , output_w , output_h , s0 , t0 , s1 , t1 , channels , filter ) ;
size_t memory_required = stbir__calculate_memory ( input_w , input_h , output_w , output_h , s0 , t0 , s1 , t1 , channels , filter ) ;
int width_stride_input = input_stride_in_bytes ? input_stride_in_bytes : channels * input_w * stbir__type_size [ type ] ;
int width_stride_input = input_stride_in_bytes ? input_stride_in_bytes : channels * input_w * stbir__type_size [ type ] ;
int width_stride_output = output_stride_in_bytes ? output_stride_in_bytes : channels * output_w * stbir__type_size [ type ] ;
int width_stride_output = output_stride_in_bytes ? output_stride_in_bytes : channels * output_w * stbir__type_size [ type ] ;
@ -1508,12 +1528,21 @@ static int stbir__resize_allocated(const void* input_data, int input_w, int inpu
stbir_info - > s1 = s1 ;
stbir_info - > s1 = s1 ;
stbir_info - > t1 = t1 ;
stbir_info - > t1 = t1 ;
stbir_info - > horizontal_scale = ( ( float ) output_w / input_w ) / ( s1 - s0 ) ;
if ( transform )
stbir_info - > vertical_scale = ( ( float ) output_h / input_h ) / ( t1 - t0 ) ;
{
stbir_info - > horizontal_scale = transform [ 0 ] ;
stbir_info - > horizontal_shift = s0 * input_w / ( s1 - s0 ) ;
stbir_info - > vertical_scale = transform [ 1 ] ;
stbir_info - > vertical_shift = t0 * input_h / ( t1 - t0 ) ;
stbir_info - > horizontal_shift = transform [ 2 ] ;
stbir_info - > vertical_shift = transform [ 3 ] ;
}
else
{
stbir_info - > horizontal_scale = ( ( float ) output_w / input_w ) / ( s1 - s0 ) ;
stbir_info - > vertical_scale = ( ( float ) output_h / input_h ) / ( t1 - t0 ) ;
stbir_info - > horizontal_shift = s0 * input_w / ( s1 - s0 ) ;
stbir_info - > vertical_shift = t0 * input_h / ( t1 - t0 ) ;
}
stbir_info - > channels = channels ;
stbir_info - > channels = channels ;
stbir_info - > alpha_channel = alpha_channel ;
stbir_info - > alpha_channel = alpha_channel ;
stbir_info - > flags = flags ;
stbir_info - > flags = flags ;
@ -1573,10 +1602,10 @@ static int stbir__resize_allocated(const void* input_data, int input_w, int inpu
}
}
STBRDEF int stbir_resize_arbitrary ( const void * input_data , int input_w , int input_h , int input_stride_in_bytes ,
STBI RDEF int stbir_resize_arbitrary ( const void * input_data , int input_w , int input_h , int input_stride_in_bytes ,
void * output_data , int output_w , int output_h , int output_stride_in_bytes ,
void * output_data , int output_w , int output_h , int output_stride_in_bytes ,
float s0 , float t0 , float s1 , float t1 ,
float s0 , float t0 , float s1 , float t1 ,
int channels , int alpha_channel , stbir_uint32 flags , stbir_type type , stbir_filter filter , stbir_edge edge_horizontal , stbir_edge edge_vertical , stbir_colorspace colorspace )
int channels , int alpha_channel , stbir_uint32 flags , stbir_data type type , stbir_filter filter , stbir_edge edge_horizontal , stbir_edge edge_vertical , stbir_colorspace colorspace )
{
{
int result ;
int result ;
size_t memory_required = stbir__calculate_memory ( input_w , input_h , output_w , output_h , 0 , 0 , 1 , 1 , channels , filter ) ;
size_t memory_required = stbir__calculate_memory ( input_w , input_h , output_w , output_h , 0 , 0 , 1 , 1 , channels , filter ) ;
@ -1592,63 +1621,63 @@ STBRDEF int stbir_resize_arbitrary(const void* input_data, int input_w, int inpu
return result ;
return result ;
}
}
STBRDEF int stbir_resize_uint8_srgb ( const stbir_uint8 * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_uint8_srgb ( const stbir_uint8 * input_data , int input_w , int input_h ,
stbir_uint8 * output_data , int output_w , int output_h ,
stbir_uint8 * output_data , int output_w , int output_h ,
int channels , stbir_filter filter , stbir_edge edge )
int channels , stbir_filter filter , stbir_edge edge )
{
{
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , 0 , 0 , STBIR_TYPE_UINT8 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , 0 , 0 , STBIR_TYPE_UINT8 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
}
}
STBRDEF int stbir_resize_uint16_srgb ( const stbir_uint16 * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_uint16_srgb ( const stbir_uint16 * input_data , int input_w , int input_h ,
stbir_uint16 * output_data , int output_w , int output_h ,
stbir_uint16 * output_data , int output_w , int output_h ,
int channels , stbir_filter filter , stbir_edge edge )
int channels , stbir_filter filter , stbir_edge edge )
{
{
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , 0 , 0 , STBIR_TYPE_UINT16 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , 0 , 0 , STBIR_TYPE_UINT16 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
}
}
STBRDEF int stbir_resize_uint32_srgb ( const stbir_uint32 * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_uint32_srgb ( const stbir_uint32 * input_data , int input_w , int input_h ,
stbir_uint32 * output_data , int output_w , int output_h ,
stbir_uint32 * output_data , int output_w , int output_h ,
int channels , stbir_filter filter , stbir_edge edge )
int channels , stbir_filter filter , stbir_edge edge )
{
{
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , 0 , 0 , STBIR_TYPE_UINT32 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , 0 , 0 , STBIR_TYPE_UINT32 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
}
}
STBRDEF int stbir_resize_float_srgb ( const float * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_float_srgb ( const float * input_data , int input_w , int input_h ,
float * output_data , int output_w , int output_h ,
float * output_data , int output_w , int output_h ,
int channels , stbir_filter filter , stbir_edge edge )
int channels , stbir_filter filter , stbir_edge edge )
{
{
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , 0 , 0 , STBIR_TYPE_FLOAT , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , 0 , 0 , STBIR_TYPE_FLOAT , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
}
}
STBRDEF int stbir_resize_uint8_alphaweighted ( const stbir_uint8 * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_uint8_alphaweighted ( const stbir_uint8 * input_data , int input_w , int input_h ,
stbir_uint8 * output_data , int output_w , int output_h ,
stbir_uint8 * output_data , int output_w , int output_h ,
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace )
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace )
{
{
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , alpha_channel , STBIR_FLAG_NONPREMUL_ALPHA , STBIR_TYPE_UINT8 , filter , edge , edge , colorspace ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , alpha_channel , STBIR_FLAG_NONPREMUL_ALPHA , STBIR_TYPE_UINT8 , filter , edge , edge , colorspace ) ;
}
}
STBRDEF int stbir_resize_uint16_alphaweighted ( const stbir_uint16 * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_uint16_alphaweighted ( const stbir_uint16 * input_data , int input_w , int input_h ,
stbir_uint16 * output_data , int output_w , int output_h ,
stbir_uint16 * output_data , int output_w , int output_h ,
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace )
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace )
{
{
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , alpha_channel , STBIR_FLAG_NONPREMUL_ALPHA , STBIR_TYPE_UINT16 , filter , edge , edge , colorspace ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , alpha_channel , STBIR_FLAG_NONPREMUL_ALPHA , STBIR_TYPE_UINT16 , filter , edge , edge , colorspace ) ;
}
}
STBRDEF int stbir_resize_uint32_alphaweighted ( const stbir_uint32 * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_uint32_alphaweighted ( const stbir_uint32 * input_data , int input_w , int input_h ,
stbir_uint32 * output_data , int output_w , int output_h ,
stbir_uint32 * output_data , int output_w , int output_h ,
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace )
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace )
{
{
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , alpha_channel , STBIR_FLAG_NONPREMUL_ALPHA , STBIR_TYPE_UINT32 , filter , edge , edge , colorspace ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , alpha_channel , STBIR_FLAG_NONPREMUL_ALPHA , STBIR_TYPE_UINT32 , filter , edge , edge , colorspace ) ;
}
}
STBRDEF int stbir_resize_float_alphaweighted ( const float * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_float_alphaweighted ( const float * input_data , int input_w , int input_h ,
float * output_data , int output_w , int output_h ,
float * output_data , int output_w , int output_h ,
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace )
int channels , int alpha_channel , stbir_filter filter , stbir_edge edge , stbir_colorspace colorspace )
{
{
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , alpha_channel , STBIR_FLAG_NONPREMUL_ALPHA , STBIR_TYPE_FLOAT , filter , edge , edge , colorspace ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , 0 , 0 , 1 , 1 , channels , alpha_channel , STBIR_FLAG_NONPREMUL_ALPHA , STBIR_TYPE_FLOAT , filter , edge , edge , colorspace ) ;
}
}
STBRDEF int stbir_resize_uint8_subpixel ( const stbir_uint8 * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_uint8_subpixel ( const stbir_uint8 * input_data , int input_w , int input_h ,
stbir_uint8 * output_data , int output_w , int output_h ,
stbir_uint8 * output_data , int output_w , int output_h ,
float s0 , float t0 , float s1 , float t1 ,
float s0 , float t0 , float s1 , float t1 ,
int channels , stbir_filter filter , stbir_edge edge )
int channels , stbir_filter filter , stbir_edge edge )
@ -1656,7 +1685,7 @@ STBRDEF int stbir_resize_uint8_subpixel(const stbir_uint8* input_data, int input
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , s0 , t0 , s1 , t1 , channels , 0 , 0 , STBIR_TYPE_UINT8 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , s0 , t0 , s1 , t1 , channels , 0 , 0 , STBIR_TYPE_UINT8 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
}
}
STBRDEF int stbir_resize_uint16_subpixel ( const stbir_uint16 * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_uint16_subpixel ( const stbir_uint16 * input_data , int input_w , int input_h ,
stbir_uint16 * output_data , int output_w , int output_h ,
stbir_uint16 * output_data , int output_w , int output_h ,
float s0 , float t0 , float s1 , float t1 ,
float s0 , float t0 , float s1 , float t1 ,
int channels , stbir_filter filter , stbir_edge edge )
int channels , stbir_filter filter , stbir_edge edge )
@ -1664,7 +1693,7 @@ STBRDEF int stbir_resize_uint16_subpixel(const stbir_uint16* input_data, int inp
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , s0 , t0 , s1 , t1 , channels , 0 , 0 , STBIR_TYPE_UINT16 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , s0 , t0 , s1 , t1 , channels , 0 , 0 , STBIR_TYPE_UINT16 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
}
}
STBRDEF int stbir_resize_uint32_subpixel ( const stbir_uint32 * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_uint32_subpixel ( const stbir_uint32 * input_data , int input_w , int input_h ,
stbir_uint32 * output_data , int output_w , int output_h ,
stbir_uint32 * output_data , int output_w , int output_h ,
float s0 , float t0 , float s1 , float t1 ,
float s0 , float t0 , float s1 , float t1 ,
int channels , stbir_filter filter , stbir_edge edge )
int channels , stbir_filter filter , stbir_edge edge )
@ -1672,7 +1701,7 @@ STBRDEF int stbir_resize_uint32_subpixel(const stbir_uint32* input_data, int inp
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , s0 , t0 , s1 , t1 , channels , 0 , 0 , STBIR_TYPE_UINT32 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , s0 , t0 , s1 , t1 , channels , 0 , 0 , STBIR_TYPE_UINT32 , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
}
}
STBRDEF int stbir_resize_float_subpixel ( const float * input_data , int input_w , int input_h ,
STBI RDEF int stbir_resize_float_subpixel ( const float * input_data , int input_w , int input_h ,
float * output_data , int output_w , int output_h ,
float * output_data , int output_w , int output_h ,
float s0 , float t0 , float s1 , float t1 ,
float s0 , float t0 , float s1 , float t1 ,
int channels , stbir_filter filter , stbir_edge edge )
int channels , stbir_filter filter , stbir_edge edge )
@ -1680,6 +1709,73 @@ STBRDEF int stbir_resize_float_subpixel(const float* input_data, int input_w, in
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , s0 , t0 , s1 , t1 , channels , 0 , 0 , STBIR_TYPE_FLOAT , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
return stbir_resize_arbitrary ( input_data , input_w , input_h , 0 , output_data , output_w , output_h , 0 , s0 , t0 , s1 , t1 , channels , 0 , 0 , STBIR_TYPE_FLOAT , filter , edge , edge , STBIR_COLORSPACE_SRGB ) ;
}
}
STBIRDEF int stbir_resize_uint8 ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels ) ;
STBIRDEF int stbir_resize_uint8_srgb ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels ) ;
STBIRDEF int stbir_resize_float ( float * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
float * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels ) ;
typedef enum
{
STBIR_EDGE_CLAMP = 1 ,
STBIR_EDGE_REFLECT = 2 ,
STBIR_EDGE_WRAP = 3 ,
} stbir_edge ;
// This function adds the ability to specify how requests to sample off the edge of the image are handled.
STBIRDEF int stbir_resize_uint8_srgb_edgemode ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels ,
stbir_edge edge_wrap_mode ) ;
STBIRDEF int stbir_resize_uint8_generic ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_wrap_mode , stbir_colorspace space , stbir_filter filter ,
void * context ) ;
STBIRDEF int stbir_resize_uint16_generic ( stbir_uint16 * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
stbir_uint16 * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_wrap_mode , stbir_colorspace space , stbir_filter filter ,
void * context ) ;
STBIRDEF int stbir_resize_float_generic ( float * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
float * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_wrap_mode , stbir_colorspace space , stbir_filter filter ,
void * context ) ;
STBIRDEF int stbir_resize ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_mode_horizontal , stbir_filter filter_horizontal ,
stbir_edge edge_mode_vertical , stbir_filter filter_vertical ,
stbir_colorspace space ) ;
STBIRDEF int stbir_resize_subpixel ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_mode_horizontal , stbir_filter filter_horizontal ,
stbir_edge edge_mode_vertical , stbir_filter filter_vertical ,
stbir_colorspace space ,
float x_scale , float x_offset ,
float y_scale , float y_offset ) ;
STBIRDEF int stbir_resize_region ( unsigned char * input_pixels , int input_w , int input_h , int input_stride_in_bytes ,
unsigned char * output_pixels , int output_w , int output_h , int output_stride_in_bytes ,
int num_channels , int alpha_channel , int flags ,
stbir_edge edge_mode_horizontal , stbir_filter filter_horizontal ,
stbir_edge edge_mode_vertical , stbir_filter filter_vertical ,
stbir_colorspace space ,
float s0 , float t0 , float s1 , float t1 ) ;
# endif // STB_IMAGE_RESIZE_IMPLEMENTATION
# endif // STB_IMAGE_RESIZE_IMPLEMENTATION
/*
/*