BLF_draw functions take an extra length argument, so the console drawing doenst need...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 11 Nov 2010 06:35:45 +0000 (06:35 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 11 Nov 2010 06:35:45 +0000 (06:35 +0000)
15 files changed:
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.h
source/blender/editors/interface/interface_draw.c
source/blender/editors/interface/interface_style.c
source/blender/editors/interface/view2d.c
source/blender/editors/screen/area.c
source/blender/editors/space_console/console_draw.c
source/blender/editors/space_info/textview.c
source/blender/editors/space_info/textview.h
source/blender/editors/space_text/text_draw.c
source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/view3d_draw.c
source/blender/python/generic/blf_api.c

index c01886be65e630338ec240a388f63b607faadd09..795fb2d51a61e824d9e7d1bf537fe480f5aadac9 100644 (file)
@@ -48,12 +48,12 @@ void BLF_position(int fontid, float x, float y, float z);
 void BLF_size(int fontid, int size, int dpi);
 
 /* Draw the string using the default font, size and dpi. */
-void BLF_draw_default(float x, float y, float z, const char *str);
-void BLF_draw_default_ascii(float x, float y, float z, const char *str);
+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);
 
 /* Draw the string using the current font. */
-void BLF_draw(int fontid, const char *str);
-void BLF_draw_ascii(int fontid, const char *str);
+void BLF_draw(int fontid, const char *str, size_t len);
+void BLF_draw_ascii(int fontid, const char *str, size_t len);
 
 /*
  * This function return the bounding box of the string
index 59189abf1e346c1da4b9125fca6d355f3fadb742..70755ee1f825f8c24f4c96095b4411aaecdb8deb 100644 (file)
@@ -361,7 +361,7 @@ void BLF_blur(int fontid, int size)
                font->blur= size;
 }
 
-void BLF_draw_default(float x, float y, float z, const char *str)
+void BLF_draw_default(float x, float y, float z, const char *str, size_t len)
 {
        if (!str)
                return;
@@ -376,10 +376,10 @@ void BLF_draw_default(float x, float y, float z, const char *str)
 
        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);
+       BLF_draw(global_font_default, str, len);
 }
 /* same as above but call 'BLF_draw_ascii' */
-void BLF_draw_default_ascii(float x, float y, float z, const char *str)
+void BLF_draw_default_ascii(float x, float y, float z, const char *str, size_t len)
 {
        if (!str)
                return;
@@ -394,7 +394,7 @@ void BLF_draw_default_ascii(float x, float y, float z, const char *str)
 
        BLF_size(global_font_default, global_font_points, global_font_dpi);
        BLF_position(global_font_default, x, y, z);
-       BLF_draw_ascii(global_font_default, str);
+       BLF_draw_ascii(global_font_default, str, len); /* XXX, use real length */
 }
 
 void BLF_rotation_default(float angle)
@@ -432,22 +432,22 @@ static void blf_draw__end(void)
        glDisable(GL_TEXTURE_2D);
 }
 
-void BLF_draw(int fontid, const char *str)
+void BLF_draw(int fontid, const char *str, size_t len)
 {
        FontBLF *font= BLF_get(fontid);
        if (font) {
                blf_draw__start(font);
-               blf_font_draw(font, str);
+               blf_font_draw(font, str, len);
                blf_draw__end();
        }
 }
 
-void BLF_draw_ascii(int fontid, const char *str)
+void BLF_draw_ascii(int fontid, const char *str, size_t len)
 {
        FontBLF *font= BLF_get(fontid);
        if (font) {
                blf_draw__start(font);
-               blf_font_draw_ascii(font, str);
+               blf_font_draw_ascii(font, str, len);
                blf_draw__end();
        }
 }
index 9fb40f0206d9f15201eb07d7ba7b0b9ec3817dbe..7542d200be1f86690f8598cff990a32d4ca48662 100644 (file)
@@ -92,7 +92,7 @@ void blf_font_size(FontBLF *font, int size, int dpi)
        }
 }
 
-void blf_font_draw(FontBLF *font, const char *str)
+void blf_font_draw(FontBLF *font, const char *str, unsigned int len)
 {
        unsigned int c;
        GlyphBLF *g, *g_prev;
@@ -110,7 +110,7 @@ void blf_font_draw(FontBLF *font, const char *str)
        has_kerning= FT_HAS_KERNING(font->face);
        g_prev= NULL;
 
-       while (str[i]) {
+       while (str[i] && i < len) {
                c= blf_utf8_next((unsigned char *)str, &i);
                if (c == 0)
                        break;
@@ -147,7 +147,7 @@ void blf_font_draw(FontBLF *font, const char *str)
 }
 
 /* faster version of blf_font_draw, ascii only for view dimensions */
-void blf_font_draw_ascii(FontBLF *font, const char *str)
+void blf_font_draw_ascii(FontBLF *font, const char *str, unsigned int len)
 {
        char c;
        GlyphBLF *g, *g_prev;
@@ -177,7 +177,7 @@ void blf_font_draw_ascii(FontBLF *font, const char *str)
                }
        }
        
-       while ((c= *(str++))) {
+       while ((c= *(str++)) && len--) {
                g= font->glyph_ascii_table[c];
 
                /* if we don't found a glyph, skip it. */
index c7a3cd54740b04ec77bf83480ebba2476f2ad1b7..ec52a1728f4b063b0325481afd80e1f3318be616 100644 (file)
@@ -44,8 +44,8 @@ FontBLF *blf_font_new_from_mem(char *name, unsigned char *mem, int mem_size);
 void blf_font_attach_from_mem(FontBLF *font, const unsigned char *mem, int mem_size);
 
 void blf_font_size(FontBLF *font, int size, int dpi);
-void blf_font_draw(FontBLF *font, const char *str);
-void blf_font_draw_ascii(FontBLF *font, const char *str);
+void blf_font_draw(FontBLF *font, const char *str, unsigned int len);
+void blf_font_draw_ascii(FontBLF *font, const char *str, unsigned int len);
 void blf_font_buffer(FontBLF *font, char *str);
 void blf_font_boundbox(FontBLF *font, char *str, rctf *box);
 void blf_font_width_and_height(FontBLF *font, char *str, float *width, float *height);
index 29278edf4510b42f99f6be9fc9066a605387b77e..1e818289d1e3a9145211d6bf0574d95512b8a354 100644 (file)
@@ -856,7 +856,7 @@ void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol),
                sprintf(str,"%-3d",i*20);
                str[3]='\0';
                fdrawline(rect.xmin+22, yofs+(i/5.f)*h, rect.xmax+1, yofs+(i/5.f)*h);
-               BLF_draw_default(rect.xmin+1, yofs-5+(i/5.f)*h, 0, str);
+               BLF_draw_default(rect.xmin+1, yofs-5+(i/5.f)*h, 0, str, sizeof(str)-1);
                /* in the loop because blf_draw reset it */
                glEnable(GL_BLEND);
                glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
index fda52e927afd0c05a334ee1980640a21ccc70bc1..719be6c3463f8649004ecca1877a119689989498 100644 (file)
@@ -165,7 +165,7 @@ void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
        if (fs->kerning == 1)
                BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT);
 
-       BLF_draw(fs->uifont_id, str);
+       BLF_draw(fs->uifont_id, str, 65535); /* XXX, use real length */
        BLF_disable(fs->uifont_id, BLF_CLIPPING);
        if (fs->shadow)
                BLF_disable(fs->uifont_id, BLF_SHADOW);
@@ -218,7 +218,7 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str)
        if (fs->kerning == 1)
                BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT);
 
-       BLF_draw(fs->uifont_id, str);
+       BLF_draw(fs->uifont_id, str, 65535); /* XXX, use real length */
        BLF_disable(fs->uifont_id, BLF_ROTATION);
        BLF_disable(fs->uifont_id, BLF_CLIPPING);
        if (fs->shadow)
@@ -258,7 +258,7 @@ void UI_DrawString(float x, float y, char *str)
 
        uiStyleFontSet(&style->widget);
        BLF_position(style->widget.uifont_id, x, y, 0.0f);
-       BLF_draw(style->widget.uifont_id, str);
+       BLF_draw(style->widget.uifont_id, str, 65535); /* XXX, use real length */
 
        if (style->widget.kerning == 1)
                BLF_disable(style->widget.uifont_id, BLF_KERNING_DEFAULT);
index c1c10bf33c6a4dd59b8490a76e1d204bb93bc1fe..43d4e20b8bbbdb359c25c5f2c281b609875c6af1 100644 (file)
@@ -1525,7 +1525,7 @@ static void scroll_printstr(Scene *scene, float x, float y, float val, int power
        }
        
        /* draw it */
-       BLF_draw_default(x, y, 0.0f, str);
+       BLF_draw_default(x, y, 0.0f, str, sizeof(str)-1);
 }
 
 /* Draw scrollbars in the given 2d-region */
@@ -2054,7 +2054,7 @@ void UI_view2d_text_cache_draw(ARegion *ar)
        for(v2s= strings.first; v2s; v2s= v2s->next) {
                glColor3fv(v2s->col);
                if(v2s->rect.xmin==v2s->rect.xmax)
-                       BLF_draw_default((float)v2s->mval[0], (float)v2s->mval[1], 0.0, v2s->str);
+                       BLF_draw_default((float)v2s->mval[0], (float)v2s->mval[1], 0.0, v2s->str, sizeof(v2s->str)-1);
                else {
                        int xofs=0, yofs;
                        
@@ -2063,7 +2063,7 @@ void UI_view2d_text_cache_draw(ARegion *ar)
                        
                        BLF_clipping_default(v2s->rect.xmin-4, v2s->rect.ymin-4, v2s->rect.xmax+4, v2s->rect.ymax+4);
                        BLF_enable_default(BLF_CLIPPING);
-                       BLF_draw_default(v2s->rect.xmin+xofs, v2s->rect.ymin+yofs, 0.0f, v2s->str);
+                       BLF_draw_default(v2s->rect.xmin+xofs, v2s->rect.ymin+yofs, 0.0f, v2s->str, sizeof(v2s->str)-1);
                        BLF_disable_default(BLF_CLIPPING);
                }
        }
index 7838fbdd5f45a124103cf0ffe7e1eb809494e3fb..e7c6441c077c1bdea839e023d169e5bfa7a0b9dd 100644 (file)
@@ -338,7 +338,7 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
                glClear(GL_COLOR_BUFFER_BIT);
                
                UI_ThemeColor(TH_TEXT);
-               BLF_draw_default(20, 8, 0.0f, ar->headerstr);
+               BLF_draw_default(20, 8, 0.0f, ar->headerstr, 65535); /* XXX, use real length */
        }
        else if(at->draw) {
                at->draw(C, ar);
index 38222f097ceabf91d225ef2ec431c365d5e651c3..5c2ba2cf8389c6a7b3b1f580d17c180f68efb306 100644 (file)
@@ -168,7 +168,7 @@ static int console_textview_step(TextViewContext *tvc)
        return ((tvc->iter= (void *)((Link *)tvc->iter)->prev) != NULL);
 }
 
-static int console_textview_line_get(struct TextViewContext *tvc, char **line, int *len)
+static int console_textview_line_get(struct TextViewContext *tvc, const char **line, int *len)
 {
        ConsoleLine *cl= (ConsoleLine *)tvc->iter;
        *line= cl->line;
@@ -231,7 +231,7 @@ static int report_textview_step(TextViewContext *tvc)
        return ((tvc->iter= (void *)((Link *)tvc->iter)->prev) != NULL);
 }
 
-static int report_textview_line_get(struct TextViewContext *tvc, char **line, int *len)
+static int report_textview_line_get(struct TextViewContext *tvc, const char **line, int *len)
 {
        Report *report= (Report *)tvc->iter;
        *line= report->message;
index e7b9826568a97461d2760d27e4a78a9a52a2ba74..5f2ed46789e3446d812d676b778e48f55e2dd17b 100644 (file)
@@ -89,7 +89,7 @@ static void console_draw_sel(int sel[2], int xy[2], int str_len_draw, int cwidth
 /* return 0 if the last line is off the screen
  * should be able to use this for any string type */
 
-static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len, unsigned char *fg, unsigned char *bg)
+static int console_draw_string(ConsoleDrawContext *cdc, const char *str, int str_len, unsigned char *fg, unsigned char *bg)
 {
 #define STEP_SEL(value) cdc->sel[0] += (value); cdc->sel[1] += (value)
        int rct_ofs= cdc->lheight/4;
@@ -131,8 +131,7 @@ static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len,
 
        if(str_len > cdc->console_width) { /* wrap? */
                const int initial_offset= ((tot_lines-1) * cdc->console_width);
-               char *line_stride= str + initial_offset;        /* advance to the last line and draw it first */
-               char eol;                                                                                                       /* baclup the end of wrapping */
+               const char *line_stride= str + initial_offset;  /* advance to the last line and draw it first */
                
                int sel_orig[2];
                VECCOPY2D(sel_orig, cdc->sel);
@@ -150,7 +149,7 @@ static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len,
 
                /* last part needs no clipping */
                BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
-               BLF_draw(mono, line_stride);
+               BLF_draw(mono, line_stride, str_len - initial_offset);
 
                if(cdc->sel[0] != cdc->sel[1]) {
                        STEP_SEL(-initial_offset);
@@ -165,11 +164,8 @@ static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len,
                line_stride -= cdc->console_width;
                
                for(; line_stride >= str; line_stride -= cdc->console_width) {
-                       eol = line_stride[cdc->console_width];
-                       line_stride[cdc->console_width]= '\0';
-                       
                        BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
-                       BLF_draw(mono, line_stride);
+                       BLF_draw(mono, line_stride, cdc->console_width);
                        
                        if(cdc->sel[0] != cdc->sel[1]) {
                                // glColor4ub(0, 255, 0, 96); // debug
@@ -179,8 +175,6 @@ static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len,
                        }
 
                        cdc->xy[1] += cdc->lheight;
-
-                       line_stride[cdc->console_width] = eol; /* restore */
                        
                        /* check if were out of view bounds */
                        if(cdc->xy[1] > cdc->ymax)
@@ -200,7 +194,7 @@ static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len,
                glColor3ubv(fg);
 
                BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
-               BLF_draw(mono, str);
+               BLF_draw(mono, str, str_len);
                
                if(cdc->sel[0] != cdc->sel[1]) {
                        int isel[2];
@@ -269,9 +263,9 @@ int textview_draw(TextViewContext *tvc, int draw, int mval[2], void **mouse_pick
        }
 
        if(tvc->begin(tvc)) {
-       
+
                do {
-                       char *ext_line;
+                       const char *ext_line;
                        int ext_len;
                        int color_flag= 0;
 
index b664ca1a155cd5ee4caad58b206e85b6ee1f0058..35c44d36f272763784d2cc047517d926a3a00e23 100644 (file)
@@ -39,7 +39,7 @@ typedef struct TextViewContext {
 
        /* iterator */
        int (*step)(struct TextViewContext *tvc);
-       int (*line_get)(struct TextViewContext *tvc, char **, int *);
+       int (*line_get)(struct TextViewContext *tvc, const char **, int *);
        int (*line_color)(struct TextViewContext *tvc, unsigned char fg[3], unsigned char bg[3]);
        void *iter;
        int iter_index;
index 024eef9092aa75a6984b27305c2aaad97e050895..ee00ffa9f87002baca38c8b68c01e88c573467b9 100644 (file)
@@ -74,20 +74,18 @@ static void text_font_end(SpaceText *UNUSED(st))
 static int text_font_draw(SpaceText *UNUSED(st), int x, int y, char *str)
 {
        BLF_position(mono, x, y, 0);
-       BLF_draw(mono, str);
+       BLF_draw(mono, str, 65535); /* XXX, use real length */
 
        return BLF_width(mono, str);
 }
 
 static int text_font_draw_character(SpaceText *st, int x, int y, char c)
 {
-       char str[2];
-
+       char str[1];
        str[0]= c;
-       str[1]= '\0';
 
        BLF_position(mono, x, y, 0);
-       BLF_draw(mono, str);
+       BLF_draw(mono, str, 1);
 
        return st->cwidth;
 }
index ba33b19cad79285a6926d3029e01dfa1fbff3cee..662acb82b3e0c80e566675819e0a3ca3d0941645 100644 (file)
@@ -643,10 +643,10 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
                                const char *str= (char *)(vos+1);
                                glColor3fv(vos->col);
                                if(vos->flag & V3D_CACHE_TEXT_ASCII) {
-                                       BLF_draw_default_ascii((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str);
+                                       BLF_draw_default_ascii((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
                                }
                                else {
-                                       BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str);
+                                       BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
                                }
                        }
                }
index 27afe07c4b25abc1afe10da46ec9702712d1f819..c890c884f64ab8e1e7949e477eef3ce49eac30f1 100644 (file)
@@ -604,7 +604,7 @@ static void draw_view_axis(RegionView3D *rv3d)
        glEnd();
 
        if (fabs(dx) > toll || fabs(dy) > toll) {
-               BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "x");
+               BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "x", 1);
        }
        
        /* BLF_draw_default disables blending */
@@ -624,7 +624,7 @@ static void draw_view_axis(RegionView3D *rv3d)
        glEnd();
 
        if (fabs(dx) > toll || fabs(dy) > toll) {
-               BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "y");
+               BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "y", 1);
        }
 
        glEnable(GL_BLEND);
@@ -643,7 +643,7 @@ static void draw_view_axis(RegionView3D *rv3d)
        glEnd();
 
        if (fabs(dx) > toll || fabs(dy) > toll) {
-               BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "z");
+               BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "z", 1);
        }
 
        /* restore line-width */
@@ -724,24 +724,17 @@ static char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
 static void draw_viewport_name(ARegion *ar, View3D *v3d)
 {
        RegionView3D *rv3d= ar->regiondata;
-       char *name = view3d_get_name(v3d, rv3d);
-       char *printable = NULL;
+       char *name= view3d_get_name(v3d, rv3d);
+       char tmpstr[24];
        
        if (v3d->localvd) {
-               printable = MEM_mallocN(strlen(name) + strlen(" (Local)_"), "viewport_name"); /* '_' gives space for '\0' */
-                                                                                                strcpy(printable, name);
-                                                                                                strcat(printable, " (Local)");
-       } else {
-               printable = name;
+               snprintf(tmpstr, sizeof(tmpstr), "%s (Local)", name);
+               name= tmpstr;
        }
 
-       if (printable) {
+       if (name) {
                UI_ThemeColor(TH_TEXT_HI);
-               BLF_draw_default(22,  ar->winy-17, 0.0f, printable);
-       }
-
-       if (v3d->localvd) {
-               MEM_freeN(printable);
+               BLF_draw_default(22,  ar->winy-17, 0.0f, name, sizeof(tmpstr));
        }
 }
 
@@ -836,7 +829,7 @@ static void draw_selected_name(Scene *scene, Object *ob, View3D *v3d)
        if (U.uiflag & USER_SHOW_ROTVIEWICON)
                offset = 14 + (U.rvisize * 2);
 
-       BLF_draw_default(offset,  10, 0.0f, info);
+       BLF_draw_default(offset,  10, 0.0f, info, sizeof(info)-1);
 }
 
 static void view3d_get_viewborder_size(Scene *scene, ARegion *ar, float size_r[2])
@@ -1015,7 +1008,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
        /* camera name - draw in highlighted text color */
        if (ca && (ca->flag & CAM_SHOWNAME)) {
                UI_ThemeColor(TH_TEXT_HI);
-               BLF_draw_default(x1i, y1i-15, 0.0f, v3d->camera->id.name+2);
+               BLF_draw_default(x1i, y1i-15, 0.0f, v3d->camera->id.name+2, sizeof(v3d->camera->id.name)-2);
                UI_ThemeColor(TH_WIRE);
        }
 }
@@ -2274,7 +2267,7 @@ static void draw_viewport_fps(Scene *scene, ARegion *ar)
                BLI_snprintf(printable, sizeof(printable), "fps: %i", (int)(fps+0.5));
        }
        
-       BLF_draw_default(22,  ar->winy-17, 0.0f, printable);
+       BLF_draw_default(22,  ar->winy-17, 0.0f, printable, sizeof(printable)-1);
 }
 
 void view3d_main_area_draw(const bContext *C, ARegion *ar)
@@ -2507,7 +2500,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
        }
        if (grid_unit) { /* draw below the viewport name */
                UI_ThemeColor(TH_TEXT_HI);
-               BLF_draw_default(22,  ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, grid_unit);
+               BLF_draw_default(22,  ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, grid_unit, 65535); /* XXX, use real length */
        }
 
        ob= OBACT;
index 80e140b7eac418a7e14e8cf0d2f92447e72a0d49..e81b885f7bbd8633738b2a8754b8119f1b8ca34e 100644 (file)
@@ -141,12 +141,13 @@ static char py_blf_draw_doc[] =
 static PyObject *py_blf_draw(PyObject *UNUSED(self), PyObject *args)
 {
        char *text;
+       int text_length;
        int fontid;
 
-       if (!PyArg_ParseTuple(args, "is:blf.draw", &fontid, &text))
+       if (!PyArg_ParseTuple(args, "is#:blf.draw", &fontid, &text, &text_length))
                return NULL;
 
-       BLF_draw(fontid, text);
+       BLF_draw(fontid, text, (unsigned int)text_length);
 
        Py_RETURN_NONE;
 }