Allow the user set which style to use for the kerning value.
authorDiego Borghetti <bdiego@gmail.com>
Fri, 10 Jul 2009 22:16:25 +0000 (22:16 +0000)
committerDiego Borghetti <bdiego@gmail.com>
Fri, 10 Jul 2009 22:16:25 +0000 (22:16 +0000)
This are freetype2 options:
 Unfitted - Scaled but un-grid-fitted kerning distances
 Default - Scaled and grid-fitted kerning distances

We always use Unfitted, but the "Default" style give better result here,
so please test and if nobody complain we can set this style as the default.

source/blender/blenfont/BLF_api.h
source/blender/blenfont/intern/blf_font.c
source/blender/editors/interface/interface_style.c
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesrna/intern/rna_userdef.c

index 53f108f87ebaa3ec0f15c6b5d66828f640e582fb..99934a80143f2968e89f5d20581b6fca5576953d 100644 (file)
@@ -137,6 +137,7 @@ void BLF_dir_free(char **dirs, int count);
 #define BLF_ROTATION (1<<0)
 #define BLF_CLIPPING (1<<1)
 #define BLF_SHADOW (1<<2)
+#define BLF_KERNING_DEFAULT (1<<3)
 
 /* font->mode. */
 #define BLF_MODE_TEXTURE 0
index 989746ca501344389df9900817cf29e5b35202ab..affc35ea11eb1b53bb09fde928ddf9892c717fdb 100644 (file)
@@ -102,7 +102,7 @@ void blf_font_draw(FontBLF *font, char *str)
        FT_Vector delta;
        FT_UInt glyph_index, g_prev_index;
        int pen_x, pen_y;
-       int i, has_kerning;
+       int i, has_kerning, st;
 
        if (!font->glyph_cache)
                return;
@@ -143,9 +143,13 @@ void blf_font_draw(FontBLF *font, char *str)
                        delta.x= 0;
                        delta.y= 0;
 
-                       if (FT_Get_Kerning(font->face, g_prev_index, glyph_index, FT_KERNING_UNFITTED, &delta) == 0) {
+                       if (font->flags & BLF_KERNING_DEFAULT)
+                               st= FT_Get_Kerning(font->face, g_prev_index, glyph_index, ft_kerning_default, &delta);
+                       else
+                               st= FT_Get_Kerning(font->face, g_prev_index, glyph_index, FT_KERNING_UNFITTED, &delta);
+
+                       if (st == 0)
                                pen_x += delta.x >> 6;
-                       }
                }
 
                /* do not return this loop if clipped, we want every character tested */
@@ -165,7 +169,7 @@ void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
        FT_UInt glyph_index, g_prev_index;
        rctf gbox;
        int pen_x, pen_y;
-       int i, has_kerning;
+       int i, has_kerning, st;
 
        if (!font->glyph_cache)
                return;
@@ -211,9 +215,13 @@ void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
                        delta.x= 0;
                        delta.y= 0;
 
-                       if (FT_Get_Kerning(font->face, g_prev_index, glyph_index, FT_KERNING_UNFITTED, &delta) == 0) {
+                       if (font->flags & BLF_KERNING_DEFAULT)
+                               st= FT_Get_Kerning(font->face, g_prev_index, glyph_index, ft_kerning_default, &delta);
+                       else
+                               st= FT_Get_Kerning(font->face, g_prev_index, glyph_index, FT_KERNING_UNFITTED, &delta);
+
+                       if (st == 0)
                                pen_x += delta.x >> 6;
-                       }
                }
 
                gbox.xmin= g->box.xmin + pen_x;
index 83eb8a3270199179f08166a81117f2d91585749f..57f35f719276f96b650a23cf65f1b09cbebb6ad5 100644 (file)
@@ -93,6 +93,7 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
 
        style->paneltitle.uifont_id= UIFONT_DEFAULT;
        style->paneltitle.points= 13;
+       style->paneltitle.kerning= 0;
        style->paneltitle.shadow= 5;
        style->paneltitle.shadx= 2;
        style->paneltitle.shady= -2;
@@ -101,6 +102,7 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
        
        style->grouplabel.uifont_id= UIFONT_DEFAULT;
        style->grouplabel.points= 12;
+       style->grouplabel.kerning= 0;
        style->grouplabel.shadow= 3;
        style->grouplabel.shadx= 1;
        style->grouplabel.shady= -1;
@@ -108,6 +110,7 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
        
        style->widgetlabel.uifont_id= UIFONT_DEFAULT;
        style->widgetlabel.points= 11;
+       style->widgetlabel.kerning= 0;
        style->widgetlabel.shadow= 3;
        style->widgetlabel.shadx= 1;
        style->widgetlabel.shady= -1;
@@ -116,6 +119,7 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
        
        style->widget.uifont_id= UIFONT_DEFAULT;
        style->widget.points= 11;
+       style->widget.kerning= 0;
        style->widget.shadowalpha= 0.25f;
 
        style->columnspace= 5;
@@ -169,10 +173,15 @@ void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
                BLF_shadow_offset(fs->shadx, fs->shady);
        }
 
+       if (fs->kerning == 1)
+               BLF_enable(BLF_KERNING_DEFAULT);
+
        BLF_draw(str);
        BLF_disable(BLF_CLIPPING);
        if (fs->shadow)
                BLF_disable(BLF_SHADOW);
+       if (fs->kerning == 1)
+               BLF_disable(BLF_KERNING_DEFAULT);
 }
 
 /* ************** helpers ************************ */
index fcb10a33fdaf073897280279672eafb4da928bcd..0709d2d58b023e64eee36c4d1732cb4654661d8e 100644 (file)
@@ -66,6 +66,8 @@ typedef struct uiFont {
 typedef struct uiFontStyle {
        short uifont_id;                /* saved in file, 0 is default */
        short points;                   /* actual size depends on 'global' dpi */
+       short kerning;                  /* unfitted or default kerning value. */
+       char pad[6];
        short italic, bold;             /* style hint */
        short shadow;                   /* value is amount of pixels blur */
        short shadx, shady;             /* shadow offset in pixels */
index 03bd0c9cfe2c09da902422379aaf8c895c7fd97c..977c43e6b95a7875cc14b1362f7672557e015674 100644 (file)
@@ -128,6 +128,11 @@ static void rna_def_userdef_theme_ui_font_style(BlenderRNA *brna)
        StructRNA *srna;
        PropertyRNA *prop;
        
+       static EnumPropertyItem font_kerning_style[] = {
+               {0, "UNFITTED", 0, "Unfitted", "Use scaled but un-grid-fitted kerning distances."},
+               {1, "DEFAULT", 0, "Default", "Use scaled and grid-fitted kerning distances."},
+               {0, NULL, 0, NULL, NULL}};
+
        srna= RNA_def_struct(brna, "ThemeFontStyle", NULL);
        RNA_def_struct_sdna(srna, "uiFontStyle");
        RNA_def_struct_ui_text(srna, "Font Style", "Theme settings for Font.");
@@ -137,6 +142,12 @@ static void rna_def_userdef_theme_ui_font_style(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Points", "");
        RNA_def_property_update(prop, NC_WINDOW, NULL);
 
+       prop= RNA_def_property(srna, "font_kerning_style", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "kerning");
+       RNA_def_property_enum_items(prop, font_kerning_style);
+       RNA_def_property_ui_text(prop, "Kerning Style", "Which style to use for font kerning.");
+       RNA_def_property_update(prop, NC_WINDOW, NULL);
+
        prop= RNA_def_property(srna, "shadow", PROP_INT, PROP_NONE);
        RNA_def_property_range(prop, 0, 5);
        RNA_def_property_ui_text(prop, "Shadow Size", "Shadow size in pixels (0, 3 and 5 supported)");