|
|
@ -1313,25 +1313,50 @@ void ImageResize(Image *image, int newWidth, int newHeight) |
|
|
|
{ |
|
|
|
// Security check to avoid program crash |
|
|
|
if ((image->data == NULL) || (image->width == 0) || (image->height == 0)) return; |
|
|
|
|
|
|
|
bool fastPath = true; |
|
|
|
if ((image->format != UNCOMPRESSED_GRAYSCALE) && (image->format != UNCOMPRESSED_GRAY_ALPHA) && (image->format != UNCOMPRESSED_R8G8B8) && (image->format != UNCOMPRESSED_R8G8B8A8)) fastPath = true; |
|
|
|
|
|
|
|
if (fastPath) |
|
|
|
{ |
|
|
|
int bytesPerPixel = GetPixelDataSize(1, 1, image->format); |
|
|
|
unsigned char *output = RL_MALLOC(newWidth*newHeight*bytesPerPixel); |
|
|
|
|
|
|
|
switch (image->format) |
|
|
|
{ |
|
|
|
case UNCOMPRESSED_GRAYSCALE: stbir_resize_uint8((unsigned char *)image->data, image->width, image->height, 0, output, newWidth, newHeight, 0, 1); break; |
|
|
|
case UNCOMPRESSED_GRAY_ALPHA: stbir_resize_uint8((unsigned char *)image->data, image->width, image->height, 0, output, newWidth, newHeight, 0, 2); break; |
|
|
|
case UNCOMPRESSED_R8G8B8: stbir_resize_uint8((unsigned char *)image->data, image->width, image->height, 0, output, newWidth, newHeight, 0, 3); break; |
|
|
|
case UNCOMPRESSED_R8G8B8A8: stbir_resize_uint8((unsigned char *)image->data, image->width, image->height, 0, output, newWidth, newHeight, 0, 4); break; |
|
|
|
default: break; |
|
|
|
} |
|
|
|
|
|
|
|
// Get data as Color pixels array to work with it |
|
|
|
Color *pixels = GetImageData(*image); |
|
|
|
Color *output = (Color *)RL_MALLOC(newWidth*newHeight*sizeof(Color)); |
|
|
|
RL_FREE(image->data); |
|
|
|
image->data = output; |
|
|
|
image->width = newWidth; |
|
|
|
image->height = newHeight; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// Get data as Color pixels array to work with it |
|
|
|
Color *pixels = GetImageData(*image); |
|
|
|
Color *output = (Color *)RL_MALLOC(newWidth*newHeight*sizeof(Color)); |
|
|
|
|
|
|
|
// NOTE: Color data is casted to (unsigned char *), there shouldn't been any problem... |
|
|
|
stbir_resize_uint8((unsigned char *)pixels, image->width, image->height, 0, (unsigned char *)output, newWidth, newHeight, 0, 4); |
|
|
|
// NOTE: Color data is casted to (unsigned char *), there shouldn't been any problem... |
|
|
|
stbir_resize_uint8((unsigned char *)pixels, image->width, image->height, 0, (unsigned char *)output, newWidth, newHeight, 0, 4); |
|
|
|
|
|
|
|
int format = image->format; |
|
|
|
|
|
|
|
RL_FREE(pixels); |
|
|
|
RL_FREE(image->data); |
|
|
|
int format = image->format; |
|
|
|
|
|
|
|
RL_FREE(pixels); |
|
|
|
RL_FREE(image->data); |
|
|
|
|
|
|
|
image->data = output; |
|
|
|
image->width = newWidth; |
|
|
|
image->height = newHeight; |
|
|
|
image->format = UNCOMPRESSED_R8G8B8A8; |
|
|
|
image->data = output; |
|
|
|
image->width = newWidth; |
|
|
|
image->height = newHeight; |
|
|
|
image->format = UNCOMPRESSED_R8G8B8A8; |
|
|
|
|
|
|
|
ImageFormat(image, format); // Reformat 32bit RGBA image to original format |
|
|
|
ImageFormat(image, format); // Reformat 32bit RGBA image to original format |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Resize and image to new size using Nearest-Neighbor scaling algorithm |
|
|
|