diff options
author | Diego Borghetti <bdiego@gmail.com> | 2009-08-07 00:06:02 +0400 |
---|---|---|
committer | Diego Borghetti <bdiego@gmail.com> | 2009-08-07 00:06:02 +0400 |
commit | 74b3681532b028e66f29aef19d2a0a7e18da6ee2 (patch) | |
tree | 03f2b984694b9d64ce84db504d53b525f71e0a09 /source/blender/blenfont/intern/blf_glyph.c | |
parent | e84e6664c225c0aed7e4d4c2ea812a48bc57ca3a (diff) |
Remove bitmap mode from blenfont, only draw with textures.
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.
Diffstat (limited to 'source/blender/blenfont/intern/blf_glyph.c')
-rw-r--r-- | source/blender/blenfont/intern/blf_glyph.c | 228 |
1 files changed, 33 insertions, 195 deletions
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index 805da02ba36..253d21cad5b 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -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)); -} |