summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorHanaxar <[email protected]>2023-03-22 13:00:13 +0300
committerGitHub <[email protected]>2023-03-22 11:00:13 +0100
commite55bdd5d8af913016b74776d0878b30eb830f138 (patch)
tree91c49e91e2100d523823b94fd44f7325dc786096 /src
parent02a8a49961190cb2076955d0960695134ba83fe2 (diff)
downloadraylib-e55bdd5d8af913016b74776d0878b30eb830f138.tar.gz
raylib-e55bdd5d8af913016b74776d0878b30eb830f138.zip
Fix packing logic error in ```GenImageFontAtlas``` (#2979)
Basic packing algorithm currently follows this order: Copy pixel data -> Move offsetX for current glyph -> Check remaining space for current glyph... Since X offset already moved according current glyph, remaining space should be checked for next glyph. Because of this, occasionally, current logic causes glyphs wrapping around texture. Proposed fix accomplishes that by moving offsetX check to the beginning of the loop.
Diffstat (limited to 'src')
-rw-r--r--src/rtext.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/src/rtext.c b/src/rtext.c
index da93af7e..e8493778 100644
--- a/src/rtext.c
+++ b/src/rtext.c
@@ -725,24 +725,7 @@ Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **charRecs, int glyphC
// NOTE: Using simple packaging, one char after another
for (int i = 0; i < glyphCount; i++)
{
- // Copy pixel data from fc.data to atlas
- for (int y = 0; y < chars[i].image.height; y++)
- {
- for (int x = 0; x < chars[i].image.width; x++)
- {
- ((unsigned char *)atlas.data)[(offsetY + y)*atlas.width + (offsetX + x)] = ((unsigned char *)chars[i].image.data)[y*chars[i].image.width + x];
- }
- }
-
- // Fill chars rectangles in atlas info
- recs[i].x = (float)offsetX;
- recs[i].y = (float)offsetY;
- recs[i].width = (float)chars[i].image.width;
- recs[i].height = (float)chars[i].image.height;
-
- // Move atlas position X for next character drawing
- offsetX += (chars[i].image.width + 2*padding);
-
+ // Check remaining space for glyph
if (offsetX >= (atlas.width - chars[i].image.width - 2*padding))
{
offsetX = padding;
@@ -766,6 +749,24 @@ Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **charRecs, int glyphC
break;
}
}
+
+ // Copy pixel data from fc.data to atlas
+ for (int y = 0; y < chars[i].image.height; y++)
+ {
+ for (int x = 0; x < chars[i].image.width; x++)
+ {
+ ((unsigned char *)atlas.data)[(offsetY + y)*atlas.width + (offsetX + x)] = ((unsigned char *)chars[i].image.data)[y*chars[i].image.width + x];
+ }
+ }
+
+ // Fill chars rectangles in atlas info
+ recs[i].x = (float)offsetX;
+ recs[i].y = (float)offsetY;
+ recs[i].width = (float)chars[i].image.width;
+ recs[i].height = (float)chars[i].image.height;
+
+ // Move atlas position X for next character drawing
+ offsetX += (chars[i].image.width + 2*padding);
}
}
else if (packMethod == 1) // Use Skyline rect packing algorithm (stb_pack_rect)