From aebfd788c7b343242ba6bb3f745a9277d57ff1b3 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 7 Jun 2026 21:53:07 +0200 Subject: [PATCH] WARNING: BREAKING: REDESIGNED: `ImageDraw()` API, align with `DrawTexture()` --- src/raylib.h | 4 +++- src/rtext.c | 2 +- src/rtextures.c | 31 ++++++++++++++++++++++++------- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/raylib.h b/src/raylib.h index ee71ee0ed..e49d6b2f7 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1437,9 +1437,11 @@ RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Col RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw a filled circle within an image (Vector version) RLAPI void ImageDrawCircleLines(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle outline within an image RLAPI void ImageDrawCircleLinesV(Image *dst, Vector2 center, int radius, Color color); // Draw circle outline within an image (Vector version) -RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); // Draw a source image into a destination image (tint applied to source) RLAPI void ImageDrawCircleGradient(Image *dst, Vector2 center, float radius, Color inner, Color outer); // Draw a gradient-filled circle within an image +RLAPI void ImageDrawImage(Image *dst, Image src, int posX, int posY, Color tint); // Draw an image within an image +RLAPI void ImageDrawImageRec(Image *dst, Image src, Rectangle srcRec, Vector2 position, Color tint); // Draw a part of an image defined by a rectangle within an image +RLAPI void ImageDrawImagePro(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Vector2 origin, float rotation, Color tint); // Draw a part of an image defined by a rectangle into destination rectangle, with scaling and rotation, within an image RLAPI void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) within an image (destination) RLAPI void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text (custom sprite font) within an image (destination) diff --git a/src/rtext.c b/src/rtext.c index 79baa85e1..a7f715ba3 100644 --- a/src/rtext.c +++ b/src/rtext.c @@ -2673,7 +2673,7 @@ static Font LoadBMFont(const char *fileName) { Rectangle srcRec = { 0.0f, 0.0f, (float)imWidth, (float)imHeight }; Rectangle dstRec = { 0.0f, (float)imHeight*(float)i, (float)imWidth, (float)imHeight }; - ImageDraw(&fullFont, imFonts[i], srcRec, dstRec, WHITE); + ImageDrawImagePro(&fullFont, imFonts[i], srcRec, dstRec, (Vector2){ 0 }, 0.0f, WHITE); } } diff --git a/src/rtextures.c b/src/rtextures.c index cfd1d4019..5b85401ee 100644 --- a/src/rtextures.c +++ b/src/rtextures.c @@ -1500,7 +1500,8 @@ Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Co if ((codepoint != ' ') && (codepoint != '\t')) { Rectangle rec = { (float)(textOffsetX + font.glyphs[index].offsetX), (float)(textOffsetY + font.glyphs[index].offsetY), (float)font.recs[index].width, (float)font.recs[index].height }; - ImageDraw(&imText, font.glyphs[index].image, (Rectangle){ 0, 0, (float)font.glyphs[index].image.width, (float)font.glyphs[index].image.height }, rec, tint); + ImageDrawImagePro(&imText, font.glyphs[index].image, (Rectangle){ 0, 0, (float)font.glyphs[index].image.width, (float)font.glyphs[index].image.height }, + rec, (Vector2){ 0 }, 0.0f, tint); } if (font.glyphs[index].advanceX == 0) textOffsetX += (int)(font.recs[index].width + spacing); @@ -3941,15 +3942,31 @@ void ImageDrawCircleLinesV(Image *dst, Vector2 center, int radius, Color color) ImageDrawCircleLines(dst, (int)center.x, (int)center.y, radius, color); } -// Draw an image (source) within an image (destination) // Draw a gradient-filled circle within an image void ImageDrawCircleGradient(Image *dst, Vector2 center, float radius, Color inner, Color outer) { // TODO: Implement gradient circle drawing } +// Draw an image within an image +void ImageDrawImage(Image *dst, Image src, int posX, int posY, Color tint) +{ + Rectangle srcRec = { 0, 0, src.width, src.height }; + Rectangle dstRec = { posX, posY, srcRec.width, srcRec.height }; + ImageDrawImagePro(dst, src, srcRec, dstRec, (Vector2){ 0 }, 0.0f, tint); +} + +// Draw a part of an image defined by a rectangle within an image +void ImageDrawImageRec(Image *dst, Image src, Rectangle srcRec, Vector2 position, Color tint) +{ + Rectangle dstRec = { position.x, position.y, srcRec.width, srcRec.height }; + ImageDrawImagePro(dst, src, srcRec, dstRec, (Vector2){ 0 }, 0.0f, tint); +} + +// Draw a part of an image defined by a rectangle into destination rectangle, with scaling and rotation, within an image // NOTE: Color tint is applied to source image -void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint) +// TODO: WARNING: origin and rotation are not implemented +void ImageDrawImagePro(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Vector2 origin, float rotation, Color tint) { // Security check to avoid program crash if ((dst->data == NULL) || (dst->width == 0) || (dst->height == 0) || @@ -4010,7 +4027,7 @@ void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color // [x] Consider fast path: no alpha blending required cases (src has no alpha) // [x] Consider fast path: same src/dst format with no alpha -> direct line copy // [-] GetPixelColor(): Get Vector4 instead of Color, easier for ColorAlphaBlend() - // [ ] TODO: Support 16bit and 32bit (float) channels drawing + // [-] Support 16bit and 32bit (float) channels drawing Color colSrc = { 0 }; Color colDst = { 0 }; @@ -4094,7 +4111,7 @@ void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color mipmapDstRec.x /= 2; mipmapDstRec.y /= 2; - ImageDraw(&mipmapDst, mipmapSrc, mipmapSrcRec, mipmapDstRec, tint); + ImageDrawImagePro(&mipmapDst, mipmapSrc, mipmapSrcRec, mipmapDstRec, (Vector2){ 0 }, 0.0f, tint); } } } @@ -4121,7 +4138,7 @@ void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, Rectangle srcRec = { 0.0f, 0.0f, (float)imText.width, (float)imText.height }; Rectangle dstRec = { position.x, position.y, (float)imText.width, (float)imText.height }; - ImageDraw(dst, imText, srcRec, dstRec, WHITE); + ImageDrawImagePro(dst, imText, srcRec, dstRec, (Vector2){ 0 }, 0.0f, WHITE); UnloadImage(imText); } @@ -4247,7 +4264,7 @@ TextureCubemap LoadTextureCubemap(Image image, int layout) ImageMipmaps(&faces); } - for (int i = 0; i < 6; i++) ImageDraw(&faces, mipmapped, faceRecs[i], (Rectangle){ 0, (float)size*i, (float)size, (float)size }, WHITE); + for (int i = 0; i < 6; i++) ImageDrawImagePro(&faces, mipmapped, faceRecs[i], (Rectangle){ 0, (float)size*i, (float)size, (float)size }, (Vector2){ 0 }, 0.0f, WHITE); UnloadImage(mipmapped); }