diff options
Diffstat (limited to 'source/blender/blenfont/intern/blf.c')
-rw-r--r-- | source/blender/blenfont/intern/blf.c | 278 |
1 files changed, 157 insertions, 121 deletions
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c index 682a0aabb4f..f6b7c5f71e6 100644 --- a/source/blender/blenfont/intern/blf.c +++ b/source/blender/blenfont/intern/blf.c @@ -1,5 +1,5 @@ /** - * $Id: + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -41,14 +41,7 @@ #include "DNA_listBase.h" #include "DNA_vec_types.h" -#include "BKE_utildefines.h" - -#include "BLI_blenlib.h" -#include "BLI_linklist.h" /* linknode */ -#include "BLI_string.h" - #include "BIF_gl.h" -#include "BIF_glutil.h" #include "BLF_api.h" #include "blf_internal_types.h" @@ -68,14 +61,18 @@ FontBLF *global_font[BLF_MAX_FONT]; /* Number of font. */ int global_font_num= 0; -/* Current font. */ -int global_font_cur= 0; - /* Default size and dpi, for BLF_draw_default. */ int global_font_default= -1; int global_font_points= 11; int global_font_dpi= 72; +static FontBLF *BLF_get(int fontid) +{ + if (fontid >= 0 && fontid < BLF_MAX_FONT) + return(global_font[fontid]); + return(NULL); +} + int BLF_init(int points, int dpi) { int i; @@ -156,11 +153,48 @@ int BLF_load(char *name) return(i); } -void BLF_metrics_attach(unsigned char *mem, int mem_size) +int BLF_load_unique(char *name) +{ + FontBLF *font; + char *filename; + int i; + + if (!name) + return(-1); + + /* Don't search in the cache!! make a new + * object font, this is for keep fonts threads safe. + */ + if (global_font_num+1 >= BLF_MAX_FONT) { + printf("Too many fonts!!!\n"); + return(-1); + } + + filename= blf_dir_search(name); + if (!filename) { + printf("Can't find font: %s\n", name); + return(-1); + } + + font= blf_font_new(name, filename); + MEM_freeN(filename); + + if (!font) { + printf("Can't load font: %s\n", name); + return(-1); + } + + global_font[global_font_num]= font; + i= global_font_num; + global_font_num++; + return(i); +} + +void BLF_metrics_attach(int fontid, unsigned char *mem, int mem_size) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_attach_from_mem(font, mem, mem_size); } @@ -201,50 +235,91 @@ int BLF_load_mem(char *name, unsigned char *mem, int mem_size) return(i); } -void BLF_set(int fontid) +int BLF_load_mem_unique(char *name, unsigned char *mem, int mem_size) { - if (fontid >= 0 && fontid < BLF_MAX_FONT) - global_font_cur= fontid; + FontBLF *font; + int i; + + if (!name) + return(-1); + + /* + * Don't search in the cache, make a new object font! + * this is to keep the font thread safe. + */ + if (global_font_num+1 >= BLF_MAX_FONT) { + printf("Too many fonts!!!\n"); + return(-1); + } + + if (!mem || !mem_size) { + printf("Can't load font: %s from memory!!\n", name); + return(-1); + } + + font= blf_font_new_from_mem(name, mem, mem_size); + if (!font) { + printf("Can't load font: %s from memory!!\n", name); + return(-1); + } + + global_font[global_font_num]= font; + i= global_font_num; + global_font_num++; + return(i); +} + +void BLF_enable(int fontid, int option) +{ + FontBLF *font; + + font= BLF_get(fontid); + if (font) + font->flags |= option; } -int BLF_get(void) +void BLF_disable(int fontid, int option) { - return(global_font_cur); + FontBLF *font; + + font= BLF_get(fontid); + if (font) + font->flags &= ~option; } -void BLF_enable(int option) +void BLF_enable_default(int option) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(global_font_default); if (font) font->flags |= option; } -void BLF_disable(int option) +void BLF_disable_default(int option) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(global_font_default); if (font) font->flags &= ~option; } -void BLF_aspect(float aspect) +void BLF_aspect(int fontid, float aspect) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) font->aspect= aspect; } -void BLF_position(float x, float y, float z) +void BLF_position(int fontid, float x, float y, float z) { FontBLF *font; float remainder; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { remainder= x - floor(x); if (remainder > 0.4 && remainder < 0.6) { @@ -268,29 +343,26 @@ void BLF_position(float x, float y, float z) } } -void BLF_size(int size, int dpi) +void BLF_size(int fontid, int size, int dpi) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_size(font, size, dpi); } -void BLF_blur(int size) +void BLF_blur(int fontid, int size) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) font->blur= size; } void BLF_draw_default(float x, float y, float z, char *str) { - FontBLF *font; - int old_font=0, old_point=0, old_dpi=0; - if (!str) return; @@ -302,38 +374,21 @@ void BLF_draw_default(float x, float y, float z, char *str) return; } - font= global_font[global_font_cur]; - if (font) { - old_font= global_font_cur; - old_point= font->size; - old_dpi= font->dpi; - } - - global_font_cur= global_font_default; - BLF_size(global_font_points, global_font_dpi); - BLF_position(x, y, z); - BLF_draw(str); - - /* restore the old font. */ - if (font) { - global_font_cur= old_font; - BLF_size(old_point, old_dpi); - } + BLF_size(global_font_default, global_font_points, global_font_dpi); + BLF_position(global_font_default, x, y, z); + BLF_draw(global_font_default, str); } -void BLF_default_rotation(float angle) +void BLF_rotation_default(float angle) { - - if (global_font_default>=0) { - global_font[global_font_default]->angle= angle; - if(angle) - global_font[global_font_default]->flags |= BLF_ROTATION; - else - global_font[global_font_default]->flags &= ~BLF_ROTATION; - } + FontBLF *font; + + font= BLF_get(global_font_default); + if (font) + font->angle= angle; } -void BLF_draw(char *str) +void BLF_draw(int fontid, char *str) { FontBLF *font; @@ -341,7 +396,7 @@ void BLF_draw(char *str) * The pixmap alignment hack is handle * in BLF_position (old ui_rasterpos_safe). */ - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); @@ -362,39 +417,39 @@ void BLF_draw(char *str) } } -void BLF_boundbox(char *str, rctf *box) +void BLF_boundbox(int fontid, char *str, rctf *box) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_boundbox(font, str, box); } -void BLF_width_and_height(char *str, float *width, float *height) +void BLF_width_and_height(int fontid, char *str, float *width, float *height) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_width_and_height(font, str, width, height); } -float BLF_width(char *str) +float BLF_width(int fontid, char *str) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) return(blf_font_width(font, str)); return(0.0f); } -float BLF_fixed_width(void) +float BLF_fixed_width(int fontid) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) return(blf_font_fixed_width(font)); return(0.0f); @@ -402,9 +457,7 @@ float BLF_fixed_width(void) float BLF_width_default(char *str) { - FontBLF *font; float width; - int old_font=0, old_point=0, old_dpi=0; if (global_font_default == -1) global_font_default= blf_search("default"); @@ -414,30 +467,16 @@ float BLF_width_default(char *str) return(0.0f); } - font= global_font[global_font_cur]; - if (font) { - old_font= global_font_cur; - old_point= font->size; - old_dpi= font->dpi; - } - - global_font_cur= global_font_default; - BLF_size(global_font_points, global_font_dpi); - width= BLF_width(str); - - /* restore the old font. */ - if (font) { - global_font_cur= old_font; - BLF_size(old_point, old_dpi); - } + BLF_size(global_font_default, global_font_points, global_font_dpi); + width= BLF_width(global_font_default, str); return(width); } -float BLF_height(char *str) +float BLF_height(int fontid, char *str) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) return(blf_font_height(font, str)); return(0.0f); @@ -445,9 +484,7 @@ float BLF_height(char *str) float BLF_height_default(char *str) { - FontBLF *font; float height; - int old_font=0, old_point=0, old_dpi=0; if (global_font_default == -1) global_font_default= blf_search("default"); @@ -457,39 +494,38 @@ float BLF_height_default(char *str) return(0.0f); } - font= global_font[global_font_cur]; - if (font) { - old_font= global_font_cur; - old_point= font->size; - old_dpi= font->dpi; - } - - global_font_cur= global_font_default; - BLF_size(global_font_points, global_font_dpi); - height= BLF_height(str); - - /* restore the old font. */ - if (font) { - global_font_cur= old_font; - BLF_size(old_point, old_dpi); - } + BLF_size(global_font_default, global_font_points, global_font_dpi); + height= BLF_height(global_font_default, str); return(height); } -void BLF_rotation(float angle) +void BLF_rotation(int fontid, float angle) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) font->angle= angle; } -void BLF_clipping(float xmin, float ymin, float xmax, float ymax) +void BLF_clipping(int fontid, float xmin, float ymin, float xmax, float ymax) +{ + FontBLF *font; + + font= BLF_get(fontid); + if (font) { + font->clip_rec.xmin= xmin; + font->clip_rec.ymin= ymin; + font->clip_rec.xmax= xmax; + font->clip_rec.ymax= ymax; + } +} + +void BLF_clipping_default(float xmin, float ymin, float xmax, float ymax) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(global_font_default); if (font) { font->clip_rec.xmin= xmin; font->clip_rec.ymin= ymin; @@ -498,11 +534,11 @@ void BLF_clipping(float xmin, float ymin, float xmax, float ymax) } } -void BLF_shadow(int level, float r, float g, float b, float a) +void BLF_shadow(int fontid, int level, float r, float g, float b, float a) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { font->shadow= level; font->shadow_col[0]= r; @@ -512,22 +548,22 @@ void BLF_shadow(int level, float r, float g, float b, float a) } } -void BLF_shadow_offset(int x, int y) +void BLF_shadow_offset(int fontid, int x, int y) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { font->shadow_x= x; font->shadow_y= y; } } -void BLF_buffer(float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h, int nch) +void BLF_buffer(int fontid, float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h, int nch) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { font->b_fbuf= fbuf; font->b_cbuf= cbuf; @@ -537,11 +573,11 @@ void BLF_buffer(float *fbuf, unsigned char *cbuf, unsigned int w, unsigned int h } } -void BLF_buffer_col(float r, float g, float b, float a) +void BLF_buffer_col(int fontid, float r, float g, float b, float a) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) { font->b_col[0]= r; font->b_col[1]= g; @@ -550,11 +586,11 @@ void BLF_buffer_col(float r, float g, float b, float a) } } -void BLF_draw_buffer(char *str) +void BLF_draw_buffer(int fontid, char *str) { FontBLF *font; - font= global_font[global_font_cur]; + font= BLF_get(fontid); if (font) blf_font_buffer(font, str); } |