Move shadow option (for text) from editor/interface to blenfont.
authorDiego Borghetti <bdiego@gmail.com>
Tue, 23 Jun 2009 16:27:35 +0000 (16:27 +0000)
committerDiego Borghetti <bdiego@gmail.com>
Tue, 23 Jun 2009 16:27:35 +0000 (16:27 +0000)
Two new function:
 BLF_shadow: set the level (for blur) and the shadow color.
 BLF_shadow_offset: set the x and y offset for shadow.
 (this is the current position plus offset)

By default shadow is not enable in the font, so before draw the
text you need call BLF_enable(BLF_SHADOW), also remember disable
the option in the end.

source/blender/blenfont/BLF_api.h
source/blender/blenfont/intern/blf.c
source/blender/blenfont/intern/blf_glyph.c
source/blender/blenfont/intern/blf_internal_types.h
source/blender/editors/interface/interface_style.c

index e871de490f3ad8d3fbf424d21c0b1418d27fee23..cb64615d64c86e5ed32831480f6b56c0a59bff91 100644 (file)
@@ -90,6 +90,21 @@ void BLF_kerning(float space);
 void BLF_enable(int option);
 void BLF_disable(int option);
 
+/*
+ * Shadow options, level is the blur level, can be 3, 5 or 0 and
+ * the other argument are the rgba color.
+ * Take care that shadow need to be enable using BLF_enable!!.
+ */
+void BLF_shadow(int level, float r, float g, float b, float a);
+
+/*
+ * Set the offset for shadow text, this is the current cursor
+ * position plus this offset, don't need call BLF_position before
+ * this function, the current position is calculate only on
+ * BLF_draw, so it's safe call this whenever you like.
+ */
+void BLF_shadow_offset(int x, int y);
+
 /*
  * Search the path directory to the locale files, this try all
  * the case for Linux, Win and Mac.
@@ -119,6 +134,7 @@ void BLF_dir_free(char **dirs, int count);
 #define BLF_CLIPPING (1<<1)
 #define BLF_FONT_KERNING (1<<2)
 #define BLF_USER_KERNING (1<<3)
+#define BLF_SHADOW (1<<4)
 
 /* font->mode. */
 #define BLF_MODE_TEXTURE 0
index f06c7fb0d28055b8f9ad947dfdbf7dc65c95b4a6..9dad5a4bfa06fb9b567cf4b218c5d00e7d4f2de8 100644 (file)
@@ -500,3 +500,28 @@ void BLF_kerning(float space)
        if (font)
                font->kerning= space;
 }
+
+void BLF_shadow(int level, float r, float g, float b, float a)
+{
+       FontBLF *font;
+
+       font= global_font[global_font_cur];
+       if (font) {
+               font->shadow= level;
+               font->shadow_col[0]= r;
+               font->shadow_col[1]= g;
+               font->shadow_col[2]= b;
+               font->shadow_col[3]= a;
+       }
+}
+
+void BLF_shadow_offset(int x, int y)
+{
+       FontBLF *font;
+
+       font= global_font[global_font_cur];
+       if (font) {
+               font->shadow_x= x;
+               font->shadow_y= y;
+       }
+}
index 33a435cc5be1104dc4247d1d81d15981ce2a0654..5e0868ea68053664e06e358b286f7a7e66357f9b 100644 (file)
@@ -496,8 +496,18 @@ int blf_glyph_texture_render(FontBLF *font, GlyphBLF *g, float x, float y)
        GLint cur_tex;
        float dx, dx1;
        float y1, y2;
+       float xo, yo;
+       float color[4];
 
        gt= g->tex_data;
+
+       if (font->flags & BLF_SHADOW) {
+               xo= x;
+               yo= y;
+               x += font->shadow_x;
+               y += font->shadow_y;
+       }
+
        dx= floor(x + gt->pos_x);
        dx1= dx + gt->width;
        y1= y + gt->pos_y;
@@ -518,6 +528,27 @@ int blf_glyph_texture_render(FontBLF *font, GlyphBLF *g, float x, float y)
        if (cur_tex != gt->tex)
                glBindTexture(GL_TEXTURE_2D, gt->tex);
 
+       if (font->flags & BLF_SHADOW) {
+               glGetFloatv(GL_CURRENT_COLOR, color);
+               glColor4fv(font->shadow_col);
+
+               if (font->shadow == 3)
+                       blf_texture3_draw(gt->uv, dx, y1, dx1, y2);
+               else if (font->shadow == 5)
+                       blf_texture5_draw(gt->uv, dx, y1, dx1, y2);
+               else
+                       blf_texture_draw(gt->uv, dx, y1, dx1, y2);
+
+               glColor4fv(color);
+               x= xo;
+               y= yo;
+
+               dx= floor(x + gt->pos_x);
+               dx1= dx + gt->width;
+               y1= y + gt->pos_y;
+               y2= y + gt->pos_y - gt->height;
+       }
+
        if (font->blur==3)
                blf_texture3_draw(gt->uv, dx, y1, dx1, y2);
        else if (font->blur==5)
index 60446aa93b24fe6462b460978754c0e0eaca78e3..5382ac19aae2ba933a0f8b13faacbc4229087b98 100644 (file)
@@ -154,6 +154,16 @@ typedef struct FontBLF {
        
        /* blur: 3 or 5 large kernel */
        int blur;
+
+       /* shadow level. */
+       int shadow;
+
+       /* and shadow offset. */
+       int shadow_x;
+       int shadow_y;
+
+       /* shadow color. */
+       float shadow_col[4];
        
        /* this is the matrix that we load before rotate/scale/translate. */
        float mat[4][4];
index 831a8a5bf6c7a7c1181012e44e212842d848d3cd..0d30d8e69c02b447c395e316da86153ac410cd44 100644 (file)
@@ -145,22 +145,6 @@ static uiFont *uifont_to_blfont(int id)
 
 /* *************** draw ************************ */
 
-static void ui_font_shadow_draw(uiFontStyle *fs, int x, int y, char *str)
-{
-       float color[4];
-       
-       glGetFloatv(GL_CURRENT_COLOR, color);
-       
-       glColor4f(fs->shadowcolor, fs->shadowcolor, fs->shadowcolor, fs->shadowalpha);
-       
-       BLF_blur(fs->shadow);
-       BLF_position(x+fs->shadx, y+fs->shady, 0.0f);
-       BLF_draw(str);
-       BLF_blur(0);
-       
-       glColor4fv(color);
-}
-
 void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
 {
        float height;
@@ -179,14 +163,18 @@ void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
        /* clip is very strict, so we give it some space */
        BLF_clipping(rect->xmin-1, rect->ymin-4, rect->xmax+1, rect->ymax+4);
        BLF_enable(BLF_CLIPPING);
-       
-       if(fs->shadow) 
-               ui_font_shadow_draw(fs, rect->xmin+xofs, rect->ymin+yofs, str);
-       
        BLF_position(rect->xmin+xofs, rect->ymin+yofs, 0.0f);
-       BLF_draw(str);
 
+       if (fs->shadow) {
+               BLF_enable(BLF_SHADOW);
+               BLF_shadow(fs->shadow, fs->shadowcolor, fs->shadowcolor, fs->shadowcolor, fs->shadowalpha);
+               BLF_shadow_offset(fs->shadx, fs->shady);
+       }
+
+       BLF_draw(str);
        BLF_disable(BLF_CLIPPING);
+       if (fs->shadow)
+               BLF_disable(BLF_SHADOW);
 }
 
 /* ************** helpers ************************ */