|
|
@ -1266,12 +1266,14 @@ void ImageResizeNN(Image *image,int newWidth,int newHeight) |
|
|
|
|
|
|
|
// Resize canvas and fill with color |
|
|
|
// NOTE: Resize offset is relative to the top-left corner of the original image |
|
|
|
void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color color) |
|
|
|
void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill) |
|
|
|
{ |
|
|
|
// Security check to avoid program crash |
|
|
|
if ((image->data == NULL) || (image->width == 0) || (image->height == 0)) return; |
|
|
|
|
|
|
|
if ((newWidth != image->width) || (newHeight != image->height)) |
|
|
|
|
|
|
|
if (image->mipmaps > 1) TRACELOG(LOG_WARNING, "Image manipulation only applied to base mipmap level"); |
|
|
|
if (image->format >= COMPRESSED_DXT1_RGB) TRACELOG(LOG_WARNING, "Image manipulation not supported for compressed formats"); |
|
|
|
else if ((newWidth != image->width) || (newHeight != image->height)) |
|
|
|
{ |
|
|
|
// Support offsets out of canvas new size -> original image is cropped |
|
|
|
if (offsetX < 0) |
|
|
@ -1295,50 +1297,30 @@ void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, i |
|
|
|
ImageCrop(image, (Rectangle) { 0, 0, (float)image->width, (float)(image->height - (offsetY - (newHeight - image->height))) }); |
|
|
|
offsetY = newHeight - image->height; |
|
|
|
} |
|
|
|
|
|
|
|
if ((newWidth > image->width) && (newHeight > image->height)) |
|
|
|
{ |
|
|
|
Image imTemp = GenImageColor(newWidth, newHeight, color); |
|
|
|
|
|
|
|
Rectangle srcRec = { 0.0f, 0.0f, (float)image->width, (float)image->height }; |
|
|
|
Rectangle dstRec = { (float)offsetX, (float)offsetY, srcRec.width, srcRec.height }; |
|
|
|
|
|
|
|
ImageDraw(&imTemp, *image, srcRec, dstRec, WHITE); |
|
|
|
ImageFormat(&imTemp, image->format); |
|
|
|
RL_FREE(image->data); |
|
|
|
*image = imTemp; |
|
|
|
} |
|
|
|
else if ((newWidth < image->width) && (newHeight < image->height)) |
|
|
|
|
|
|
|
if ((newWidth < image->width) || (newHeight < image->height)) |
|
|
|
{ |
|
|
|
Rectangle crop = { (float)offsetX, (float)offsetY, (float)newWidth, (float)newHeight }; |
|
|
|
ImageCrop(image, crop); |
|
|
|
} |
|
|
|
else // One side is bigger and the other is smaller |
|
|
|
{ |
|
|
|
Image imTemp = GenImageColor(newWidth, newHeight, color); |
|
|
|
|
|
|
|
Rectangle srcRec = { 0.0f, 0.0f, (float)image->width, (float)image->height }; |
|
|
|
Rectangle dstRec = { (float)offsetX, (float)offsetY, (float)image->width, (float)image->height }; |
|
|
|
|
|
|
|
if (newWidth < image->width) |
|
|
|
{ |
|
|
|
srcRec.x = (float)offsetX; |
|
|
|
srcRec.width = (float)newWidth; |
|
|
|
dstRec.x = 0.0f; |
|
|
|
} |
|
|
|
|
|
|
|
if (newHeight < image->height) |
|
|
|
{ |
|
|
|
srcRec.y = (float)offsetY; |
|
|
|
srcRec.height = (float)newHeight; |
|
|
|
dstRec.y = 0.0f; |
|
|
|
} |
|
|
|
|
|
|
|
ImageDraw(&imTemp, *image, srcRec, dstRec, WHITE); |
|
|
|
ImageFormat(&imTemp, image->format); |
|
|
|
RL_FREE(image->data); |
|
|
|
o">*image = imTemp; |
|
|
|
int dataSize = GetPixelDataSize(image->width, image->height, image->format); |
|
|
|
int bytesPerPixel = dataSize/(image->width*image->height); |
|
|
|
|
|
|
|
unsigned char *resizedData = (unsigned char *)RL_CALLOC(newWidth*newHeight*bytesPerPixel, 1); |
|
|
|
|
|
|
|
// TODO: Fill resizedData with fill color (must be formatted to image->format) |
|
|
|
|
|
|
|
for (int y = 0, offsetSize = (offsetY*newWidth + offsetX)*bytesPerPixel; y < image->height; y++) |
|
|
|
{ |
|
|
|
memcpy(resizedData + offsetSize, ((unsigned char *)image->data) + y*image->width*bytesPerPixel, image->width*bytesPerPixel); |
|
|
|
offsetSize += (newWidth*bytesPerPixel); |
|
|
|
} |
|
|
|
|
|
|
|
RL_FREE(image->data); |
|
|
|
image->data = resizedData; |
|
|
|
image->width = newWidth; |
|
|
|
image->height = newHeight; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|