diff --git a/stb_resample.h b/stb_resample.h index 843b6b4..8f51d40 100644 --- a/stb_resample.h +++ b/stb_resample.h @@ -43,7 +43,7 @@ // // input_data is your supplied texels. // output_data will be the resized texels. It should be of size output_w * output_h * channels -// Returned result is 1 for success or 0 in case of an error. Currently the only error is failure to allocate memory. +// 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 STBR_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. @@ -59,7 +59,7 @@ // // 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. -// Returned result is 1 for success or 0 in case of an error. Currently the only error is that the memory passed in is insufficient. +// 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 STBR_ASSERT() to see it. // stbr_resize_arbitrary() will not allocate any memory, it will use the memory you pass in to do its work. @@ -1230,6 +1230,8 @@ STBRDEF int stbr_resize_arbitrary(const void* input_data, int input_w, int input int channels, stbr_type type, stbr_filter filter, stbr_edge edge, stbr_colorspace colorspace, void* tempmem, stbr_size_t tempmem_size_in_bytes) { + stbr_size_t memory_required = stbr_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 * stbr__type_size[type]; int width_stride_output = output_stride_in_bytes ? output_stride_in_bytes : channels * output_w * stbr__type_size[type]; @@ -1250,13 +1252,28 @@ STBRDEF int stbr_resize_arbitrary(const void* input_data, int input_w, int input STBR_ASSERT(filter != 0); STBR_ASSERT(filter < STBR_ARRAY_SIZE(stbr__filter_info_table)); + if (!filter || filter >= STBR_ARRAY_SIZE(stbr__filter_info_table)) + return 0; + STBR_ASSERT(s1 > s0); STBR_ASSERT(t1 > t0); + if (s1 <= s0 || t1 <= t0) + return 0; + + STBR_ASSERT(s1 <= 1 && s0 >= 0 && t1 <= 1 && t0 >= 0); + + if (s1 > 1 || s0 < 0 || t1 > 1 || t0 < 0) + return 0; + + STBR_ASSERT(tempmem); + if (!tempmem) return 0; - if (tempmem_size_in_bytes < stbr_calculate_memory(input_w, input_h, output_w, output_h, s0, t0, s1, t1, channels, filter)) + STBR_ASSERT(tempmem_size_in_bytes >= memory_required); + + if (tempmem_size_in_bytes < memory_required) return 0; memset(tempmem, 0, tempmem_size_in_bytes);