diff --git a/src/rtextures.c b/src/rtextures.c index 219067a66..610b78674 100644 --- a/src/rtextures.c +++ b/src/rtextures.c @@ -1228,18 +1228,25 @@ Image ImageFromImage(Image image, Rectangle rec) { Image result = { 0 }; - int bytesPerPixel = GetPixelDataSize(1, 1, image.format); - - result.width = (int)rec.width; - result.height = (int)rec.height; - result.data = RL_CALLOC((int)rec.width*(int)rec.height*bytesPerPixel, 1); - result.format = image.format; - result.mipmaps = 1; - - for (int y = 0; y < (int)rec.height; y++) + // Basic rectangle validation: size smaller than image size + if ((rec.x > 0) && (rec.y > 0) && (rec.width > 0) && (rec.height > 0) && + (((int)rec.x + (int)rec.width) < image.width) && + (((int)rec.y + (int)rec.height) < image.height)) { - memcpy(((unsigned char *)result.data) + y*(int)rec.width*bytesPerPixel, ((unsigned char *)image.data) + ((y + (int)rec.y)*image.width + (int)rec.x)*bytesPerPixel, (int)rec.width*bytesPerPixel); + int bytesPerPixel = GetPixelDataSize(1, 1, image.format); + + result.width = (int)rec.width; + result.height = (int)rec.height; + result.data = RL_CALLOC((int)rec.width*(int)rec.height*bytesPerPixel, 1); + result.format = image.format; + result.mipmaps = 1; + + for (int y = 0; y < (int)rec.height; y++) + { + memcpy(((unsigned char *)result.data) + y*(int)rec.width*bytesPerPixel, ((unsigned char *)image.data) + ((y + (int)rec.y)*image.width + (int)rec.x)*bytesPerPixel, (int)rec.width*bytesPerPixel); + } } + else TRACELOG(LOG_WARNING, "IMAGE: Rectangle provided for ImageToImage not valid"); return result; }