From 3ea6caa46577f716fa0e5cb46574469c44ee74ed Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 14 Apr 2018 17:20:02 +0300 Subject: [PATCH] Add a flag for non-power-of-two images --- Readme | 5 +++++ ttf2png.c | 36 ++++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/Readme b/Readme index 9d10f6c..946c9b7 100644 --- a/Readme +++ b/Readme @@ -69,6 +69,10 @@ Command-line options Control the amount of padding between glyphs. The default is 1 pixel. Only used with -p. + -f + Allow the resulting image to have a non-power-of-two size. By default the + image size is rounded up to a power of two for maximum compatibility. + -d File name to write glyph definitions. See the section below for details. @@ -139,6 +143,7 @@ Changelog next - Alternate ways of specifying code point ranges - Multiple code point ranges can be specified +- Option to generate non-power-of-two images 1.1 - Controllable margin and padding in packed mode diff --git a/ttf2png.c b/ttf2png.c index 236fe9e..e39c328 100644 --- a/ttf2png.c +++ b/ttf2png.c @@ -80,8 +80,8 @@ unsigned round_to_pot(unsigned); void *alloc_image_data(size_t, size_t); int init_font(Font *, FT_Face, const Range *, unsigned, bool); int init_glyphs(Font *, FT_Face, const Range *, bool); -int render_grid(Font *, unsigned, unsigned, unsigned, bool); -int render_packed(Font *, unsigned, unsigned); +int render_grid(Font *, unsigned, unsigned, unsigned, bool, bool); +int render_packed(Font *, unsigned, unsigned, bool); int save_defs(const char *, const Font *); int save_png(const char *, const Image *, char); @@ -103,6 +103,7 @@ int main(int argc, char **argv) bool pack = 0; unsigned margin = 0; unsigned padding = 1; + bool npot = 0; FT_Library freetype; FT_Face face; @@ -121,7 +122,7 @@ int main(int argc, char **argv) return 1; } - while((i = getopt(argc, argv, "r:s:l:c:o:atvh?ed:pim:n:")) != -1) + while((i = getopt(argc, argv, "r:s:l:c:o:atvh?ed:pim:n:f")) != -1) { switch(i) { @@ -172,6 +173,9 @@ int main(int argc, char **argv) case 'n': padding = convert_numeric_option('n', 0); break; + case 'f': + npot = 1; + break; } } if(!strcmp(out_fn, "-")) @@ -237,9 +241,9 @@ int main(int argc, char **argv) } if(pack) - err = render_packed(&font, margin, padding); + err = render_packed(&font, margin, padding, npot); else - err = render_grid(&font, cellw, cellh, cpl, seq); + err = render_grid(&font, cellw, cellh, cpl, seq, npot); if(err) return 1; @@ -289,6 +293,7 @@ void usage(void) " -p Pack the glyphs tightly instead of in a grid\n" " -m Margin around image edges (packed mode only) [0]\n" " -n Padding between glyphs (packed mode only) [1]\n" + " -f Allow non-power-of-two result\n" " -d File name for writing glyph definitions\n" " -h Print this message\n"); } @@ -634,7 +639,7 @@ int init_glyphs(Font *font, FT_Face face, const Range *range, bool autohinter) return 0; } -int render_grid(Font *font, unsigned cellw, unsigned cellh, unsigned cpl, bool seq) +int render_grid(Font *font, unsigned cellw, unsigned cellh, unsigned cpl, bool seq, bool npot) { unsigned i; int top = 0, bot = 0; @@ -698,11 +703,15 @@ int render_grid(Font *font, unsigned cellw, unsigned cellh, unsigned cpl, bool s first -= first%cpl; last = font->glyphs[font->n_glyphs-1].code; - font->image.w = round_to_pot(cpl*cellw); + font->image.w = cpl*cellw; + if(!npot) + font->image.w = round_to_pot(font->image.w); if(seq) - font->image.h = round_to_pot((font->n_glyphs+cpl-1)/cpl*cellh); + font->image.h = (font->n_glyphs+cpl-1)/cpl*cellh; else - font->image.h = round_to_pot((last-first+cpl)/cpl*cellh); + font->image.h = (last-first+cpl)/cpl*cellh; + if(!npot) + font->image.h = round_to_pot(font->image.h); font->image.data = (char *)alloc_image_data(font->image.w, font->image.h); if(!font->image.data) @@ -743,7 +752,7 @@ int render_grid(Font *font, unsigned cellw, unsigned cellh, unsigned cpl, bool s return 0; } -int render_packed(Font *font, unsigned margin, unsigned padding) +int render_packed(Font *font, unsigned margin, unsigned padding, bool npot) { unsigned i; size_t area = 0; @@ -774,7 +783,8 @@ int render_packed(Font *font, unsigned margin, unsigned padding) if(font->image.h<=font->image.w) break; } - font->image.h = round_to_pot(font->image.h); + if(!npot) + font->image.h = round_to_pot(font->image.h); /* Allocate arrays for storing the image and keeping track of used pixels and glyphs. Since glyphs are rectangular and the image is filled starting from @@ -870,7 +880,9 @@ int render_packed(Font *font, unsigned margin, unsigned padding) /* Trim the image to the actually used size, in case the original estimate was too pessimistic. */ - font->image.h = round_to_pot(used_h); + font->image.h = used_h; + if(!npot) + font->image.h = round_to_pot(font->image.h); free(used_glyphs); free(used_pixels); -- 2.43.0