Add the possibility to set a 4x4 matrix to be used on blf.
authorDiego Borghetti <bdiego@gmail.com>
Thu, 9 Dec 2010 04:36:58 +0000 (04:36 +0000)
committerDiego Borghetti <bdiego@gmail.com>
Thu, 9 Dec 2010 04:36:58 +0000 (04:36 +0000)
This option allow the user to set a 4x4 matrix to be
multiplied before draw the text, for example:

double *m;

/* Get the matrix or build it! */

BLF_matrix(m);
BLF_enable(BLF_MATRIX);

/* set color, size, etc and draw! */

BLF_disable(BLF_MATRIX);

You don't need the last line (disable), but remember
that if you use the font to draw in any other place,
the matrix will be used!.

The GL code is:

glPushMatrix();
glMultMatrixd(m);
glTranslatef();
glScalef();
glRotatef();

glPopMatrix();

Let's Dalai test this!!! :D

source/blender/blenfont/BLF_api.h
source/blender/blenfont/intern/blf.c
source/blender/blenfont/intern/blf_font.c
source/blender/blenfont/intern/blf_internal_types.h

index d32922f..8408674 100644 (file)
@@ -49,6 +49,20 @@ void BLF_aspect(int fontid, float aspect);
 void BLF_position(int fontid, float x, float y, float z);
 void BLF_size(int fontid, int size, int dpi);
 
+/* Set a 4x4 matrix to be multiplied before draw the text.
+ * Remember that you need call BLF_enable(BLF_MATRIX)
+ * to enable this.
+ *
+ * The order of the matrix is like GL:
+
+       | m[0]  m[4]  m[8]  m[12] |
+       | m[1]  m[5]  m[9]  m[13] |
+       | m[2]  m[6]  m[10] m[14] |
+       | m[3]  m[7]  m[11] m[15] |
+
+ */
+void BLF_matrix(int fontid, double *m);
+
 /* Draw the string using the default font, size and dpi. */
 void BLF_draw_default(float x, float y, float z, const char *str, size_t len);
 void BLF_draw_default_ascii(float x, float y, float z, const char *str, size_t len);
@@ -180,6 +194,7 @@ void BLF_dir_free(char **dirs, int count);
 #define BLF_CLIPPING (1<<1)
 #define BLF_SHADOW (1<<2)
 #define BLF_KERNING_DEFAULT (1<<3)
+#define BLF_MATRIX (1<<4)
 
 // XXX, bad design
 extern int blf_mono_font;
index febd3d9..d9a02b0 100644 (file)
@@ -330,6 +330,18 @@ void BLF_aspect(int fontid, float aspect)
                font->aspect= aspect;
 }
 
+void BLF_matrix(int fontid, double *m)
+{
+       FontBLF *font;
+       int i;
+
+       font= BLF_get(fontid);
+       if (font) {
+               for (i= 0; i < 16; i++)
+                       font->m[i]= m[i];
+       }
+}
+
 void BLF_position(int fontid, float x, float y, float z)
 {
        FontBLF *font;
@@ -435,6 +447,10 @@ static void blf_draw__start(FontBLF *font)
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
        glPushMatrix();
+
+       if (font->flags & BLF_MATRIX)
+               glMultMatrixd((GLdouble *)&font->m);
+
        glTranslatef(font->pos[0], font->pos[1], font->pos[2]);
        glScalef(font->aspect, font->aspect, 1.0);
 
index 1ae654c..3adda7b 100644 (file)
@@ -493,11 +493,16 @@ void blf_font_free(FontBLF *font)
 
 static void blf_font_fill(FontBLF *font)
 {
+       int i;
+
        font->aspect= 1.0f;
        font->pos[0]= 0.0f;
        font->pos[1]= 0.0f;
        font->angle= 0.0f;
-       unit_m4(font->mat);
+
+       for (i= 0; i < 16; i++)
+               font->m[i]= 0;
+
        font->clip_rec.xmin= 0.0f;
        font->clip_rec.xmax= 0.0f;
        font->clip_rec.ymin= 0.0f;
index 70318c5..04afaeb 100644 (file)
@@ -154,8 +154,10 @@ typedef struct FontBLF {
        /* shadow color. */
        float shadow_col[4];
        
-       /* this is the matrix that we load before rotate/scale/translate. */
-       float mat[4][4];
+       /* Multiplied this matrix with the current one before
+        * draw the text! see blf_draw__start.
+        */
+       double m[16];
 
        /* clipping rectangle. */
        rctf clip_rec;