[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32782] trunk/blender/source/blender: Minor speedups for 3D view text drawing ~10-15% improved frame-rate with particle display .

Campbell Barton ideasman42 at gmail.com
Sun Oct 31 01:02:38 CEST 2010


Revision: 32782
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32782
Author:   campbellbarton
Date:     2010-10-31 01:02:38 +0200 (Sun, 31 Oct 2010)

Log Message:
-----------
Minor speedups for 3D view text drawing ~10-15% improved frame-rate with particle display.
- ascii text drawing functions, slightly faster since they dont have to do hash lookups & utf8 conversions for each char.
- used ascii drawing functions for the view3d's number display.
- each text item was using fixed 128 chars, now only allocate the string length needed.

Modified Paths:
--------------
    trunk/blender/source/blender/blenfont/BLF_api.h
    trunk/blender/source/blender/blenfont/intern/blf.c
    trunk/blender/source/blender/blenfont/intern/blf_font.c
    trunk/blender/source/blender/blenfont/intern/blf_internal.h
    trunk/blender/source/blender/blenfont/intern/blf_internal_types.h
    trunk/blender/source/blender/editors/space_view3d/drawanimviz.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_intern.h

Modified: trunk/blender/source/blender/blenfont/BLF_api.h
===================================================================
--- trunk/blender/source/blender/blenfont/BLF_api.h	2010-10-30 22:15:12 UTC (rev 32781)
+++ trunk/blender/source/blender/blenfont/BLF_api.h	2010-10-30 23:02:38 UTC (rev 32782)
@@ -48,10 +48,12 @@
 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, char *str);
+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);
 
 /* Draw the string using the current font. */
-void BLF_draw(int fontid, char *str);
+void BLF_draw(int fontid, const char *str);
+void BLF_draw_ascii(int fontid, const char *str);
 
 /*
  * This function return the bounding box of the string

Modified: trunk/blender/source/blender/blenfont/intern/blf.c
===================================================================
--- trunk/blender/source/blender/blenfont/intern/blf.c	2010-10-30 22:15:12 UTC (rev 32781)
+++ trunk/blender/source/blender/blenfont/intern/blf.c	2010-10-30 23:02:38 UTC (rev 32782)
@@ -361,7 +361,7 @@
 		font->blur= size;
 }
 
-void BLF_draw_default(float x, float y, float z, char *str)
+void BLF_draw_default(float x, float y, float z, const char *str)
 {
 	if (!str)
 		return;
@@ -378,7 +378,25 @@
 	BLF_position(global_font_default, x, y, z);
 	BLF_draw(global_font_default, str);
 }
+/* same as above but call 'BLF_draw_ascii' */
+void BLF_draw_default_ascii(float x, float y, float z, const char *str)
+{
+	if (!str)
+		return;
 
+	if (global_font_default == -1)
+		global_font_default= blf_search("default");
+
+	if (global_font_default == -1) {
+		printf("Warning: Can't found default font!!\n");
+		return;
+	}
+
+	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);
+}
+
 void BLF_rotation_default(float angle)
 {
 	FontBLF *font;
@@ -388,32 +406,49 @@
 		font->angle= angle;
 }
 
-void BLF_draw(int fontid, char *str)
+
+static void blf_draw__start(FontBLF *font)
 {
-	FontBLF *font;
-
 	/*
 	 * The pixmap alignment hack is handle
 	 * in BLF_position (old ui_rasterpos_safe).
 	 */
-	font= BLF_get(fontid);
-	if (font) {
-		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);
+	glEnable(GL_BLEND);
+	glEnable(GL_TEXTURE_2D);
+	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
-		if (font->flags & BLF_ROTATION)
-			glRotatef(font->angle, 0.0f, 0.0f, 1.0f);
+	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);
+}
+static void blf_draw__end(void)
+{
+	glPopMatrix();
+	glDisable(GL_BLEND);
+	glDisable(GL_TEXTURE_2D);
+}
+
+void BLF_draw(int fontid, const char *str)
+{
+	FontBLF *font= BLF_get(fontid);
+	if (font) {
+		blf_draw__start(font);
 		blf_font_draw(font, str);
+		blf_draw__end();
+	}
+}
 
-		glPopMatrix();
-		glDisable(GL_BLEND);
-		glDisable(GL_TEXTURE_2D);
+void BLF_draw_ascii(int fontid, const char *str)
+{
+	FontBLF *font= BLF_get(fontid);
+	if (font) {
+		blf_draw__start(font);
+		blf_font_draw_ascii(font, str);
+		blf_draw__end();
 	}
 }
 

Modified: trunk/blender/source/blender/blenfont/intern/blf_font.c
===================================================================
--- trunk/blender/source/blender/blenfont/intern/blf_font.c	2010-10-30 22:15:12 UTC (rev 32781)
+++ trunk/blender/source/blender/blenfont/intern/blf_font.c	2010-10-30 23:02:38 UTC (rev 32782)
@@ -92,7 +92,7 @@
 	}
 }
 
-void blf_font_draw(FontBLF *font, char *str)
+void blf_font_draw(FontBLF *font, const char *str)
 {
 	unsigned int c;
 	GlyphBLF *g, *g_prev;
@@ -146,6 +146,65 @@
 	}
 }
 
+/* faster version of blf_font_draw, ascii only for view dimensions */
+void blf_font_draw_ascii(FontBLF *font, const char *str)
+{
+	char c;
+	GlyphBLF *g, *g_prev;
+	FT_Vector delta;
+	FT_UInt glyph_index;
+	int pen_x, pen_y;
+	int i, has_kerning, st;
+
+	if (!font->glyph_cache)
+		return;
+
+	i= 0;
+	pen_x= 0;
+	pen_y= 0;
+	has_kerning= FT_HAS_KERNING(font->face);
+	g_prev= NULL;
+
+	/* build ascii on demand */
+	if(font->glyph_ascii_table['0']==NULL) {
+		for(i=0; i<256; i++) {
+			g= blf_glyph_search(font->glyph_cache, i);
+			if (!g) {
+				glyph_index= FT_Get_Char_Index(font->face, i);
+				g= blf_glyph_add(font, glyph_index, i);
+			}
+			font->glyph_ascii_table[i]= g;
+		}
+	}
+	
+	while ((c= *(str++))) {
+		g= font->glyph_ascii_table[c];
+
+		/* if we don't found a glyph, skip it. */
+		if (!g)
+			continue;
+
+		if (has_kerning && g_prev) {
+			delta.x= 0;
+			delta.y= 0;
+
+			if (font->flags & BLF_KERNING_DEFAULT)
+				st= FT_Get_Kerning(font->face, g_prev->idx, g->idx, ft_kerning_default, &delta);
+			else
+				st= FT_Get_Kerning(font->face, g_prev->idx, g->idx, FT_KERNING_UNFITTED, &delta);
+
+			if (st == 0)
+				pen_x += delta.x >> 6;
+		}
+
+		/* do not return this loop if clipped, we want every character tested */
+		blf_glyph_render(font, g, (float)pen_x, (float)pen_y);
+
+		pen_x += g->advance;
+		g_prev= g;
+	}
+}
+
 void blf_font_buffer(FontBLF *font, char *str)
 {
 	unsigned char *cbuf;
@@ -460,6 +519,8 @@
 	font->b_col[1]= 0;
 	font->b_col[2]= 0;
 	font->b_col[3]= 0;
+
+	memset(font->glyph_ascii_table, 0, sizeof(font->glyph_ascii_table));
 }
 
 FontBLF *blf_font_new(char *name, char *filename)

Modified: trunk/blender/source/blender/blenfont/intern/blf_internal.h
===================================================================
--- trunk/blender/source/blender/blenfont/intern/blf_internal.h	2010-10-30 22:15:12 UTC (rev 32781)
+++ trunk/blender/source/blender/blenfont/intern/blf_internal.h	2010-10-30 23:02:38 UTC (rev 32782)
@@ -44,7 +44,8 @@
 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, char *str);
+void blf_font_draw(FontBLF *font, const char *str);
+void blf_font_draw_ascii(FontBLF *font, const char *str);
 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);

Modified: trunk/blender/source/blender/blenfont/intern/blf_internal_types.h
===================================================================
--- trunk/blender/source/blender/blenfont/intern/blf_internal_types.h	2010-10-30 22:15:12 UTC (rev 32781)
+++ trunk/blender/source/blender/blenfont/intern/blf_internal_types.h	2010-10-30 23:02:38 UTC (rev 32782)
@@ -177,6 +177,9 @@
 
 	/* current glyph cache, size and dpi. */
 	GlyphCacheBLF *glyph_cache;
+	
+	/* fast ascii lookip */
+	GlyphBLF *glyph_ascii_table[256];
 
 	/* freetype2 face. */
 	FT_Face face;

Modified: trunk/blender/source/blender/editors/space_view3d/drawanimviz.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawanimviz.c	2010-10-30 22:15:12 UTC (rev 32781)
+++ trunk/blender/source/blender/editors/space_view3d/drawanimviz.c	2010-10-30 23:02:38 UTC (rev 32782)
@@ -31,6 +31,7 @@
 #include <string.h>
 #include <math.h>
 
+#include "BLO_sys_types.h"
 
 #include "DNA_anim_types.h"
 #include "DNA_armature_types.h"
@@ -213,7 +214,7 @@
 			if (i == 0) {
 				sprintf(str, "%d", (i+sfra));
 				mul_v3_m4v3(co, ob->imat, mpv->co);
-				view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE);
+				view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII);
 			}
 			else if ((i > stepsize) && (i < len-stepsize)) { 
 				bMotionPathVert *mpvP = (mpv - stepsize);
@@ -222,7 +223,7 @@
 				if ((equals_v3v3(mpv->co, mpvP->co)==0) || (equals_v3v3(mpv->co, mpvN->co)==0)) {
 					sprintf(str, "%d", (sfra+i));
 					mul_v3_m4v3(co, ob->imat, mpv->co);
-					view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE);
+					view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII);
 				}
 			}
 		}
@@ -280,7 +281,7 @@
 					
 					sprintf(str, "%d", (sfra+i));
 					mul_v3_m4v3(co, ob->imat, mpv->co);
-					view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE);
+					view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII);
 				}
 			}
 		}

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2010-10-30 22:15:12 UTC (rev 32781)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2010-10-30 23:02:38 UTC (rev 32782)
@@ -558,10 +558,10 @@
 typedef struct ViewCachedString {
 	struct ViewCachedString *next, *prev;
 	float vec[3], col[4];
-	char str[128]; 
 	short mval[2];
 	short xoffs;
 	short flag;
+	/* str is allocated past the end */
 } ViewCachedString;
 
 void view3d_cached_text_draw_begin()
@@ -573,15 +573,18 @@
 
 void view3d_cached_text_draw_add(const float co[3], const char *str, short xoffs, short flag)
 {
+	int alloc_len= strlen(str) + 1;
 	ListBase *strings= &CachedText[CachedTextLevel-1];
-	ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString), "ViewCachedString");
+	ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString) + alloc_len, "ViewCachedString");
 
 	BLI_addtail(strings, vos);
-	BLI_strncpy(vos->str, str, 128);
 	copy_v3_v3(vos->vec, co);
 	glGetFloatv(GL_CURRENT_COLOR, vos->col);
 	vos->xoffs= xoffs;
 	vos->flag= flag;
+
+	/* allocate past the end */
+	memcpy(++vos, str, alloc_len);
 }
 
 void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, float mat[][4])
@@ -635,8 +638,14 @@
 			}
 #endif
 			if(vos->mval[0]!=IS_CLIPPED) {
+				const char *str= (char *)(vos+1);
 				glColor3fv(vos->col);
-				BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, vos->str);
+				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);
+				}
+				else {
+					BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list