From b8ace0a40f3cad1d0b56568c4ac61d63dbd190d9 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Fri, 23 Nov 2012 19:04:52 +0200 Subject: [PATCH] Eliminate some nested loops from the packing algorithm --- ttf2png.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/ttf2png.c b/ttf2png.c index 7e78e84..3685b5a 100644 --- a/ttf2png.c +++ b/ttf2png.c @@ -458,7 +458,7 @@ void render_packed(Font *font) unsigned i; unsigned area = 0; char *used_glyphs; - char *used_pixels; + unsigned *used_pixels; unsigned cx = 0, cy; unsigned used_h = 0; @@ -475,8 +475,8 @@ void render_packed(Font *font) font->image.data = (char *)malloc(font->image.w*font->image.h); memset(font->image.data, 255, font->image.w*font->image.h); - used_pixels = (char *)malloc(font->image.w*font->image.h); - memset(used_pixels, 0, font->image.w*font->image.h); + used_pixels = (unsigned *)malloc(font->image.w*sizeof(unsigned)); + memset(used_pixels, 0, font->image.w*sizeof(unsigned)); used_glyphs = (char *)malloc(font->n_glyphs); memset(used_glyphs, 0, font->n_glyphs); @@ -488,21 +488,18 @@ void render_packed(Font *font) unsigned best_score = 0; unsigned target_h = 0; - for(; (cximage.w && used_pixels[cx+cy*font->image.w]); ++cx) ; + for(; (cximage.w && used_pixels[cx]>cy); ++cx) + if(used_pixels[cx]-cy-1>target_h) + target_h = used_pixels[cx]-cy-1; + if(cx>=font->image.w) { cx = 0; ++cy; continue; } - for(w=0; (cx+wimage.w && !used_pixels[cx+w+cy*font->image.w]); ++w) ; - for(x=0; ximage.h && used_pixels[cx-x+(cy+y+1)*font->image.w]); ++y) ; - if(y>target_h) - target_h = y; - } + for(w=0; (cx+wimage.w && used_pixels[cx+w]<=cy); ++w) ; for(i=0; in_glyphs; ++i) { @@ -543,11 +540,12 @@ void render_packed(Font *font) continue; font->image.data[cx+x+(cy+y)*font->image.w] = 255-glyph->image.data[x+y*glyph->image.w]; } - for(y=0; yimage.h+2; ++y) for(x=0; ximage.w+2; ++x) + for(x=0; ximage.w+2; ++x) { - if(cx+x<1 || cx+x>font->image.w || cy+y<1 || cy+y>font->image.h) + if(cx+x<1 || cx+x>font->image.w) continue; - used_pixels[cx+x-1+(cy+y-1)*font->image.w] = 1; + if(used_pixels[cx+x-1]image.h+1) + used_pixels[cx+x-1] = cy+glyph->image.h+1; } if(cy+glyph->image.h>used_h) -- 2.45.2