]> git.tdb.fi Git - ttf2png.git/blobdiff - ttf2png.c
Add an option to control distance field border zone
[ttf2png.git] / ttf2png.c
index 1c17c6b16b11795d07a58e524e800a68d6e263df..0a66de26cc72f2c09772743db26f6eb7696cd5da 100644 (file)
--- a/ttf2png.c
+++ b/ttf2png.c
@@ -78,8 +78,8 @@ void sort_and_compact_ranges(Range *, unsigned *);
 int range_cmp(const void *, const void *);
 unsigned round_to_pot(unsigned);
 void *alloc_image_data(size_t, size_t);
-int init_font(Font *, FT_Face, const Range *, unsigned, bool, unsigned);
-int init_glyphs(Font *, FT_Face, const Range *, bool, unsigned);
+int init_font(Font *, FT_Face, const Range *, unsigned, bool, unsigned, unsigned);
+int init_glyphs(Font *, FT_Face, const Range *, bool, unsigned, unsigned);
 int copy_bitmap(const FT_Bitmap *, Image *);
 unsigned sqrti(unsigned);
 unsigned find_distance_to_edge(const Image *, int, int, unsigned);
@@ -109,6 +109,7 @@ int main(int argc, char **argv)
        unsigned padding = 1;
        bool npot = 0;
        unsigned distfield = 0;
+       unsigned border = 0;
 
        FT_Library freetype;
        FT_Face face;
@@ -127,7 +128,7 @@ int main(int argc, char **argv)
                return 1;
        }
 
-       while((i = getopt(argc, argv, "r:s:l:c:o:atvh?ed:pim:n:gf:")) != -1)
+       while((i = getopt(argc, argv, "r:s:l:c:o:atvh?ed:pim:n:gf:b:")) != -1)
        {
                switch(i)
                {
@@ -184,6 +185,9 @@ int main(int argc, char **argv)
                case 'f':
                        distfield = convert_numeric_option('f', 1);
                        break;
+               case 'b':
+                       border = convert_numeric_option('b', 1);
+                       break;
                }
        }
        if(!strcmp(out_fn, "-"))
@@ -222,7 +226,11 @@ int main(int argc, char **argv)
 
        font.size = size;
        if(distfield)
+       {
+               if(!border)
+                       border = sqrti(font.size);
                size *= distfield;
+       }
 
        err = FT_Set_Pixel_Sizes(face, 0, size);
        if(err)
@@ -241,7 +249,7 @@ int main(int argc, char **argv)
        else
                sort_and_compact_ranges(ranges, &n_ranges);
 
-       err = init_font(&font, face, ranges, n_ranges, autohinter, distfield);
+       err = init_font(&font, face, ranges, n_ranges, autohinter, distfield, border);
        if(err)
                return 1;
 
@@ -508,7 +516,7 @@ void *alloc_image_data(size_t a, size_t b)
        return ptr;
 }
 
-int init_font(Font *font, FT_Face face, const Range *ranges, unsigned n_ranges, bool autohinter, unsigned distfield)
+int init_font(Font *font, FT_Face face, const Range *ranges, unsigned n_ranges, bool autohinter, unsigned distfield, unsigned border)
 {
        unsigned i, j;
        unsigned size = 0;
@@ -526,7 +534,7 @@ int init_font(Font *font, FT_Face face, const Range *ranges, unsigned n_ranges,
        font->n_glyphs = 0;
        font->glyphs = NULL;
        for(i=0; i<n_ranges; ++i)
-               if(init_glyphs(font, face, &ranges[i], autohinter, distfield))
+               if(init_glyphs(font, face, &ranges[i], autohinter, distfield, border))
                        return -1;
 
        if(verbose>=1)
@@ -565,7 +573,7 @@ int init_font(Font *font, FT_Face face, const Range *ranges, unsigned n_ranges,
        return 0;
 }
 
-int init_glyphs(Font *font, FT_Face face, const Range *range, bool autohinter, unsigned distfield)
+int init_glyphs(Font *font, FT_Face face, const Range *range, bool autohinter, unsigned distfield, unsigned border)
 {
        unsigned i, j;
        unsigned size = font->n_glyphs;
@@ -632,11 +640,9 @@ int init_glyphs(Font *font, FT_Face face, const Range *range, bool autohinter, u
                start from the bottom. */
                if(distfield)
                {
-                       unsigned margin = 3;
-
-                       glyph->offset_x -= margin;
-                       glyph->offset_y -= margin;
-                       create_distance_field(bmp, &glyph->image, distfield, margin);
+                       glyph->offset_x -= border;
+                       glyph->offset_y -= border;
+                       create_distance_field(bmp, &glyph->image, distfield, border);
                }
                else
                {