Remove bitmap mode from blenfont, only draw with textures.
authorDiego Borghetti <bdiego@gmail.com>
Thu, 6 Aug 2009 20:06:02 +0000 (20:06 +0000)
committerDiego Borghetti <bdiego@gmail.com>
Thu, 6 Aug 2009 20:06:02 +0000 (20:06 +0000)
As Joe point on a previous mail, glBitmap don't work nice
on all cards and also some of the things that we can do
with texture are hard (or need that blender check the font mode)
to implement.

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

index c1b14a14f8c2d96394a3480538396265ef14ca60..05df927f9215f5e0066fee23836bbfc608f7b39e 100644 (file)
@@ -140,17 +140,10 @@ char **BLF_dir_get(int *ndir);
 /* Free the data return by BLF_dir_get. */
 void BLF_dir_free(char **dirs, int count);
 
-/* Set the current draw mode. */
-void BLF_mode(int mode);
-
 /* font->flags. */
 #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
-#define BLF_MODE_BITMAP 1
-
 #endif /* BLF_API_H */
index af57f822c40bf8ed599ea80d9ff10bc38b2a4d7f..ded89d18387fb96a5b2a31a28c48d54d5b890af9 100644 (file)
@@ -333,7 +333,6 @@ void BLF_default_rotation(float angle)
        }
 }
 
-
 void BLF_draw(char *str)
 {
        FontBLF *font;
@@ -342,40 +341,24 @@ void BLF_draw(char *str)
         * The pixmap alignment hack is handle
         * in BLF_position (old ui_rasterpos_safe).
         */
-
        font= global_font[global_font_cur];
        if (font) {
-               if (font->mode == BLF_MODE_BITMAP) {
-                       glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
-                       glPushAttrib(GL_ENABLE_BIT);
-                       glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
-                       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-                       glDisable(GL_BLEND);
-                       glRasterPos3f(font->pos[0], font->pos[1], font->pos[2]);
-
-                       blf_font_draw(font, str);
-
-                       glPopAttrib();
-                       glPopClientAttrib();
-               }
-               else {
-                       glEnable(GL_BLEND);
-                       glEnable(GL_TEXTURE_2D);
-                       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+               glEnable(GL_BLEND);
+               glEnable(GL_TEXTURE_2D);
+               glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-                       glPushMatrix();
-                       glTranslatef(font->pos[0], font->pos[1], font->pos[2]);
-                       glScalef(font->aspect, font->aspect, 1.0);
+               glPushMatrix();
+               glTranslatef(font->pos[0], font->pos[1], font->pos[2]);
+               glScalef(font->aspect, font->aspect, 1.0);
 
-                       if (font->flags & BLF_ROTATION)
-                               glRotatef(font->angle, 0.0f, 0.0f, 1.0f);
+               if (font->flags & BLF_ROTATION)
+                       glRotatef(font->angle, 0.0f, 0.0f, 1.0f);
 
-                       blf_font_draw(font, str);
+               blf_font_draw(font, str);
 
-                       glPopMatrix();
-                       glDisable(GL_BLEND);
-                       glDisable(GL_TEXTURE_2D);
-               }
+               glPopMatrix();
+               glDisable(GL_BLEND);
+               glDisable(GL_TEXTURE_2D);
        }
 }
 
@@ -506,15 +489,6 @@ void BLF_clipping(float xmin, float ymin, float xmax, float ymax)
        }
 }
 
-void BLF_mode(int mode)
-{
-       FontBLF *font;
-
-       font= global_font[global_font_cur];
-       if (font)
-               font->mode= mode;
-}
-
 void BLF_shadow(int level, float r, float g, float b, float a)
 {
        FontBLF *font;
index 6fc35a96e1eb90d42f5f654f1830eefb97400a03..c804fb6399d9c8ce2e00a2949ea16596036e7474 100644 (file)
@@ -128,17 +128,6 @@ void blf_font_draw(FontBLF *font, char *str)
                if (!g)
                        continue;
 
-               /*
-                * This happen if we change the mode of the
-                * font, we don't drop the glyph cache, so it's
-                * possible that some glyph don't have the
-                * bitmap or texture information.
-                */
-               if (font->mode == BLF_MODE_BITMAP && (!g->bitmap_data))
-                       g= blf_glyph_add(font, glyph_index, c);
-               else if (font->mode == BLF_MODE_TEXTURE && (!g->tex_data))
-                       g= blf_glyph_add(font, glyph_index, c);
-
                if (has_kerning && g_prev) {
                        delta.x= 0;
                        delta.y= 0;
@@ -200,17 +189,6 @@ void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
                if (!g)
                        continue;
 
-               /*
-                * This happen if we change the mode of the
-                * font, we don't drop the glyph cache, so it's
-                * possible that some glyph don't have the
-                * bitmap or texture information.
-                */
-               if (font->mode == BLF_MODE_BITMAP && (!g->bitmap_data))
-                       g= blf_glyph_add(font, glyph_index, c);
-               else if (font->mode == BLF_MODE_TEXTURE && (!g->tex_data))
-                       g= blf_glyph_add(font, glyph_index, c);
-
                if (has_kerning && g_prev) {
                        delta.x= 0;
                        delta.y= 0;
@@ -316,7 +294,6 @@ void blf_font_free(FontBLF *font)
 
 void blf_font_fill(FontBLF *font)
 {
-       font->mode= BLF_MODE_TEXTURE;
        font->aspect= 1.0f;
        font->pos[0]= 0.0f;
        font->pos[1]= 0.0f;
index 805da02ba36b721639d9b4dded64e7957d71f1d1..253d21cad5bdd6b14b4bd3a30e05260f0ba27f95 100644 (file)
@@ -189,12 +189,11 @@ GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, unsigned int c)
        return(NULL);
 }
 
-GlyphBLF *blf_glyph_texture_add(FontBLF *font, FT_UInt index, unsigned int c)
+GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
 {
        FT_GlyphSlot slot;
        GlyphCacheBLF *gc;
        GlyphBLF *g;
-       GlyphTextureBLF *gt;
        FT_Error err;
        FT_Bitmap bitmap;
        FT_BBox bbox;
@@ -202,13 +201,7 @@ GlyphBLF *blf_glyph_texture_add(FontBLF *font, FT_UInt index, unsigned int c)
        int do_new;
 
        g= blf_glyph_search(font->glyph_cache, c);
-
-       /* The glyph can be add on Bitmap mode, so we have the
-        * glyph, but not the texture data.
-        */
-       if (g && g->tex_data)
-               return(g);
-       else if (g)
+       if (g)
                do_new= 0;
        else
                do_new= 1;
@@ -228,14 +221,10 @@ GlyphBLF *blf_glyph_texture_add(FontBLF *font, FT_UInt index, unsigned int c)
                g= (GlyphBLF *)MEM_mallocN(sizeof(GlyphBLF), "blf_glyph_add");
                g->next= NULL;
                g->prev= NULL;
-               g->tex_data= NULL;
-               g->bitmap_data= NULL;
                g->c= c;
        }
 
-       gt= (GlyphTextureBLF *)MEM_mallocN(sizeof(GlyphTextureBLF), "blf_glyph_texture_add");
        gc= font->glyph_cache;
-
        if (gc->cur_tex == -1) {
                blf_glyph_cache_texture(font, gc);
                gc->x_offs= gc->pad;
@@ -253,27 +242,27 @@ GlyphBLF *blf_glyph_texture_add(FontBLF *font, FT_UInt index, unsigned int c)
        }
 
        bitmap= slot->bitmap;
-       gt->tex= gc->textures[gc->cur_tex];
+       g->tex= gc->textures[gc->cur_tex];
 
-       gt->xoff= gc->x_offs;
-       gt->yoff= gc->y_offs;
-       gt->width= bitmap.width;
-       gt->height= bitmap.rows;
+       g->xoff= gc->x_offs;
+       g->yoff= gc->y_offs;
+       g->width= bitmap.width;
+       g->height= bitmap.rows;
 
-       if (gt->width && gt->height) {
+       if (g->width && g->height) {
                glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
                glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
                glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
                glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 
-               glBindTexture(GL_TEXTURE_2D, gt->tex);
-               glTexSubImage2D(GL_TEXTURE_2D, 0, gt->xoff, gt->yoff, gt->width, gt->height, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.buffer);
+               glBindTexture(GL_TEXTURE_2D, g->tex);
+               glTexSubImage2D(GL_TEXTURE_2D, 0, g->xoff, g->yoff, g->width, g->height, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.buffer);
                glPopClientAttrib();
        }
 
        g->advance= ((float)slot->advance.x) / 64.0f;
-       gt->pos_x= slot->bitmap_left;
-       gt->pos_y= slot->bitmap_top;
+       g->pos_x= slot->bitmap_left;
+       g->pos_y= slot->bitmap_top;
 
        FT_Outline_Get_CBox(&(slot->outline), &bbox);
        g->box.xmin= ((float)bbox.xMin) / 64.0f;
@@ -281,10 +270,10 @@ GlyphBLF *blf_glyph_texture_add(FontBLF *font, FT_UInt index, unsigned int c)
        g->box.ymin= ((float)bbox.yMin) / 64.0f;
        g->box.ymax= ((float)bbox.yMax) / 64.0f;
 
-       gt->uv[0][0]= ((float)gt->xoff) / ((float)gc->p2_width);
-       gt->uv[0][1]= ((float)gt->yoff) / ((float)gc->p2_height);
-       gt->uv[1][0]= ((float)(gt->xoff + gt->width)) / ((float)gc->p2_width);
-       gt->uv[1][1]= ((float)(gt->yoff + gt->height)) / ((float)gc->p2_height);
+       g->uv[0][0]= ((float)g->xoff) / ((float)gc->p2_width);
+       g->uv[0][1]= ((float)g->yoff) / ((float)gc->p2_height);
+       g->uv[1][0]= ((float)(g->xoff + g->width)) / ((float)gc->p2_width);
+       g->uv[1][1]= ((float)(g->yoff + g->height)) / ((float)gc->p2_height);
 
        /* update the x offset for the next glyph. */
        gc->x_offs += (int)(g->box.xmax - g->box.xmin + gc->pad);
@@ -295,126 +284,11 @@ GlyphBLF *blf_glyph_texture_add(FontBLF *font, FT_UInt index, unsigned int c)
                gc->rem_glyphs--;
        }
 
-       /* and attach the texture information. */
-       g->tex_data= gt;
-
-       return(g);
-}
-
-GlyphBLF *blf_glyph_bitmap_add(FontBLF *font, FT_UInt index, unsigned int c)
-{
-       FT_GlyphSlot slot;
-       GlyphCacheBLF *gc;
-       GlyphBLF *g;
-       GlyphBitmapBLF *gt;
-       FT_Error err;
-       FT_Bitmap bitmap;
-       FT_BBox bbox;
-       unsigned char *dest, *src;
-       unsigned int key, y;
-       unsigned int src_width, src_height, src_pitch;
-       int do_new;
-
-       g= blf_glyph_search(font->glyph_cache, c);
-
-       /*
-        * The glyph can be add on Texture mode, so we have the
-        * glyph, but not the bitmap data.
-        */
-       if (g && g->bitmap_data)
-               return(g);
-       else if (g)
-               do_new= 0;
-       else
-               do_new= 1;
-
-       err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP);
-       if (err)
-               return(NULL);
-
-       /* get the glyph. */
-       slot= font->face->glyph;
-
-       err= FT_Render_Glyph(slot, FT_RENDER_MODE_MONO);
-       if (err || slot->format != FT_GLYPH_FORMAT_BITMAP)
-               return(NULL);
-
-       if (do_new) {
-               g= (GlyphBLF *)MEM_mallocN(sizeof(GlyphBLF), "blf_glyph_add");
-               g->next= NULL;
-               g->prev= NULL;
-               g->tex_data= NULL;
-               g->bitmap_data= NULL;
-               g->c= c;
-       }
-
-       gt= (GlyphBitmapBLF *)MEM_mallocN(sizeof(GlyphBitmapBLF), "blf_glyph_bitmap_add");
-       gc= font->glyph_cache;
-
-       bitmap= slot->bitmap;
-
-       src_width= bitmap.width;
-       src_height= bitmap.rows;
-       src_pitch= bitmap.pitch;
-
-       gt->width= src_width;
-       gt->height= src_height;
-       gt->pitch= src_pitch;
-       gt->image= NULL;
-
-       if (gt->width && gt->height) {
-               gt->image= (unsigned char *)malloc(gt->pitch * gt->height);
-
-               dest= gt->image + ((gt->height - 1) * gt->pitch);
-               src= bitmap.buffer;
-
-               for (y= 0; y < src_height; ++y) {
-                       memcpy((void *)dest, (void *)src, src_pitch);
-                       dest -= gt->pitch;
-                       src += src_pitch;
-               }
-       }
-
-       g->advance= ((float)slot->advance.x) / 64.0f;
-       gt->pos_x= slot->bitmap_left;
-       gt->pos_y= ((int)src_height) - slot->bitmap_top;
-
-       FT_Outline_Get_CBox(&(slot->outline), &bbox);
-       g->box.xmin= ((float)bbox.xMin) / 64.0f;
-       g->box.xmax= ((float)bbox.xMax) / 64.0f;
-       g->box.ymin= ((float)bbox.yMin) / 64.0f;
-       g->box.ymax= ((float)bbox.yMax) / 64.0f;
-
-       if (do_new) {
-               key= blf_hash(g->c);
-               BLI_addhead(&(gc->bucket[key]), g);
-               gc->rem_glyphs--;
-       }
-
-       /* and attach the bitmap information. */
-       g->bitmap_data= gt;
-
        return(g);
 }
 
-GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
-{
-       if (font->mode == BLF_MODE_BITMAP)
-               return(blf_glyph_bitmap_add(font, index, c));
-       return(blf_glyph_texture_add(font, index, c));
-}
-
 void blf_glyph_free(GlyphBLF *g)
 {
-       if (g->tex_data)
-               MEM_freeN(g->tex_data);
-
-       if (g->bitmap_data) {
-               if (g->bitmap_data->image)
-                       free((void *)g->bitmap_data->image);
-               MEM_freeN(g->bitmap_data);
-       }
-
        /* don't need free the texture, the GlyphCache already
         * have a list of all the texture and free it.
         */
@@ -482,16 +356,14 @@ static void blf_texture3_draw(float uv[2][2], float x1, float y1, float x2, floa
        glColor4fv(color);
 }
 
-int blf_glyph_texture_render(FontBLF *font, GlyphBLF *g, float x, float y)
+int blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
 {
-       GlyphTextureBLF *gt;
        GLint cur_tex;
        float dx, dx1;
        float y1, y2;
        float xo, yo;
        float color[4];
 
-       gt= g->tex_data;
        xo= 0.0f;
        yo= 0.0f;
 
@@ -502,10 +374,10 @@ int blf_glyph_texture_render(FontBLF *font, GlyphBLF *g, float x, float y)
                y += font->shadow_y;
        }
 
-       dx= floor(x + gt->pos_x);
-       dx1= dx + gt->width;
-       y1= y + gt->pos_y;
-       y2= y + gt->pos_y - gt->height;
+       dx= floor(x + g->pos_x);
+       dx1= dx + g->width;
+       y1= y + g->pos_y;
+       y2= y + g->pos_y - g->height;
 
        if (font->flags & BLF_CLIPPING) {
                if (!BLI_in_rctf(&font->clip_rec, dx + font->pos[0], y1 + font->pos[1]))
@@ -519,70 +391,36 @@ int blf_glyph_texture_render(FontBLF *font, GlyphBLF *g, float x, float y)
        }
 
        glGetIntegerv(GL_TEXTURE_2D_BINDING_EXT, &cur_tex);
-       if (cur_tex != gt->tex)
-               glBindTexture(GL_TEXTURE_2D, gt->tex);
+       if (cur_tex != g->tex)
+               glBindTexture(GL_TEXTURE_2D, g->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);
+                       blf_texture3_draw(g->uv, dx, y1, dx1, y2);
                else if (font->shadow == 5)
-                       blf_texture5_draw(gt->uv, dx, y1, dx1, y2);
+                       blf_texture5_draw(g->uv, dx, y1, dx1, y2);
                else
-                       blf_texture_draw(gt->uv, dx, y1, dx1, y2);
+                       blf_texture_draw(g->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;
+               dx= floor(x + g->pos_x);
+               dx1= dx + g->width;
+               y1= y + g->pos_y;
+               y2= y + g->pos_y - g->height;
        }
 
        if (font->blur==3)
-               blf_texture3_draw(gt->uv, dx, y1, dx1, y2);
+               blf_texture3_draw(g->uv, dx, y1, dx1, y2);
        else if (font->blur==5)
-               blf_texture5_draw(gt->uv, dx, y1, dx1, y2);
+               blf_texture5_draw(g->uv, dx, y1, dx1, y2);
        else
-               blf_texture_draw(gt->uv, dx, y1, dx1, y2);
-       
-       return(1);
-}
-
-int blf_glyph_bitmap_render(FontBLF *font, GlyphBLF *g, float x, float y)
-{
-       GlyphBitmapBLF *gt;
-       GLubyte null_bitmap= 0;
-
-       gt= g->bitmap_data;
-       if (!gt->image)
-               return(1);
+               blf_texture_draw(g->uv, dx, y1, dx1, y2);
 
-       if (font->flags & BLF_CLIPPING) {
-               if (!BLI_in_rctf(&font->clip_rec, x + font->pos[0], y + font->pos[1]))
-                       return(0);
-               if (!BLI_in_rctf(&font->clip_rec, x + font->pos[0], y + gt->height + font->pos[1]))
-                       return(0);
-               if (!BLI_in_rctf(&font->clip_rec, x + gt->width + font->pos[0], y + gt->height + font->pos[1]))
-                       return(0);
-               if (!BLI_in_rctf(&font->clip_rec, x + gt->width + font->pos[0], y + font->pos[1]))
-                       return(0);
-       }
-
-       glBitmap(0, 0, 0.0, 0.0, x + gt->pos_x, y, (const GLubyte *)&null_bitmap);
-       glPixelStorei(GL_UNPACK_ROW_LENGTH, gt->pitch * 8);
-       glBitmap(gt->width, gt->height, 0.0, gt->pos_y, 0.0, 0.0, (const GLubyte *)gt->image);
-       glBitmap(0, 0, 0.0, 0.0, -x - gt->pos_x, -y, (const GLubyte *)&null_bitmap);
        return(1);
 }
-
-int blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y)
-{
-       if (font->mode == BLF_MODE_BITMAP)
-               return(blf_glyph_bitmap_render(font, g, x, y));
-       return(blf_glyph_texture_render(font, g, x, y));
-}
index 64d959868675f3989de1f2ef41945673be4cf637..60c2933eb61620c9421c044473624ffc95773e4d 100644 (file)
@@ -78,7 +78,19 @@ typedef struct GlyphCacheBLF {
        float descender;
 } GlyphCacheBLF;
 
-typedef struct GlyphTextureBLF {
+typedef struct GlyphBLF {
+       struct GlyphBLF *next;
+       struct GlyphBLF *prev;
+
+       /* and the character, as UTF8 */
+       unsigned int c;
+
+       /* glyph box. */
+       rctf box;
+
+       /* advance size. */
+       float advance;
+
        /* texture id where this glyph is store. */
        GLuint tex;
 
@@ -99,38 +111,6 @@ typedef struct GlyphTextureBLF {
         */
        float pos_x;
        float pos_y;
-} GlyphTextureBLF;
-
-typedef struct GlyphBitmapBLF {
-       /* image data. */
-       unsigned char *image;
-
-       int width;
-       int height;
-       int pitch;
-
-       float pos_x;
-       float pos_y;
-} GlyphBitmapBLF;
-
-typedef struct GlyphBLF {
-       struct GlyphBLF *next;
-       struct GlyphBLF *prev;
-
-       /* and the character, as UTF8 */
-       unsigned int c;
-
-       /* glyph box. */
-       rctf box;
-
-       /* advance size. */
-       float advance;
-
-       /* texture information. */
-       GlyphTextureBLF *tex_data;
-
-       /* bitmap information. */
-       GlyphBitmapBLF *bitmap_data;
 } GlyphBLF;
 
 typedef struct FontBLF {
@@ -140,9 +120,6 @@ typedef struct FontBLF {
        /* filename or NULL. */
        char *filename;
 
-       /* draw mode, texture or bitmap. */
-       int mode;
-
        /* aspect ratio or scale. */
        float aspect;
 
index 67ee29a1d3c0132fbf31638eb838039c7b522a31..cb9216ec1c50bb6aa5db09bd92a16b80014afcd9 100644 (file)
@@ -248,9 +248,6 @@ void uiStyleInit(void)
                        BLF_size(11, U.dpi);
                        BLF_size(12, U.dpi);
                        BLF_size(14, U.dpi);
-
-                       if (!(U.transopts & USER_USETEXTUREFONT))
-                               BLF_mode(BLF_MODE_BITMAP);
                }
        }