X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=ttf2png.c;h=236fe9e4ef3ad3e07c70e64ae3f6136027d0d06d;hb=d7364c7589542039d662589f654518ff628217db;hp=2a087ff3ac02eff7acfe403821f6a6704e672f23;hpb=633be0c0c9ae91ab068ee84d4eb5f32328cf6280;p=ttf2png.git diff --git a/ttf2png.c b/ttf2png.c index 2a087ff..236fe9e 100644 --- a/ttf2png.c +++ b/ttf2png.c @@ -74,6 +74,8 @@ int convert_numeric_option(char, int); void convert_code_point_range(char, Range *); unsigned str_to_code_point(const char *, char **); void convert_size(char, unsigned *, unsigned *); +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); @@ -213,6 +215,16 @@ int main(int argc, char **argv) return 1; } + if(!n_ranges) + { + ranges = malloc(sizeof(Range)); + ranges[0].first = 0; + ranges[0].last = 255; + n_ranges = 1; + } + else + sort_and_compact_ranges(ranges, &n_ranges); + font.size = size; err = init_font(&font, face, ranges, n_ranges, autohinter); if(err) @@ -404,6 +416,44 @@ void convert_size(char opt, unsigned *width, unsigned *height) exit(1); } +void sort_and_compact_ranges(Range *ranges, unsigned *n_ranges) +{ + unsigned i, j; + + if(!*n_ranges) + return; + + qsort(ranges, *n_ranges, sizeof(Range), &range_cmp); + for(i=0, j=1; j<*n_ranges; ++j) + { + if(ranges[i].last+1>=ranges[j].first) + { + if(ranges[j].last>ranges[i].last) + ranges[i].last = ranges[j].last; + } + else + { + ++i; + if(i!=j) + ranges[i] = ranges[j]; + } + } + + *n_ranges = i+1; +} + +int range_cmp(const void *p1, const void *p2) +{ + const Range *r1 = (const Range *)p1; + const Range *r2 = (const Range *)p2; + if(r1->first!=r2->first) + return (r1->firstfirst ? -1 : 1); + else if(r1->last!=r2->last) + return (r1->lastlast ? -1 : 1); + else + return 0; +} + unsigned round_to_pot(unsigned n) { n -= 1;