[Bf-blender-cvs] [8b0729a] master: 3D Text: replace multiple float arrays with struct (much easier to understand)

Campbell Barton noreply at git.blender.org
Thu May 15 23:55:29 CEST 2014


Commit: 8b0729a7314324e1aea6655de8bd16bb3e5ff5cc
Author: Campbell Barton
Date:   Fri May 16 07:45:13 2014 +1000
https://developer.blender.org/rB8b0729a7314324e1aea6655de8bd16bb3e5ff5cc

3D Text: replace multiple float arrays with struct (much easier to understand)

===================================================================

M	source/blender/blenkernel/intern/font.c

===================================================================

diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index 109d791..23e0a66 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -518,6 +518,16 @@ static float char_width(Curve *cu, VChar *che, CharInfo *info)
 	}
 }
 
+/**
+ * Used for storing per-line data for alignment & wrapping.
+ */
+struct TempLineInfo {
+	float x_min;      /* left margin */
+	float x_max;      /* right margin */
+	int   char_nr;    /* number of characters */
+	int   wspace_nr;  /* number of whitespaces of line */
+};
+
 bool BKE_vfont_to_curve_ex(Main *bmain, Object *ob, int mode, ListBase *r_nubase,
                            const wchar_t **r_text, int *r_text_len, bool *r_text_free,
                            struct CharTrans **r_chartransdata)
@@ -531,12 +541,13 @@ bool BKE_vfont_to_curve_ex(Main *bmain, Object *ob, int mode, ListBase *r_nubase
 	TextBox *tb;
 	VChar *che;
 	struct CharTrans *chartransdata = NULL, *ct;
-	float *f, xof, yof, xtrax, linedist, *linedata, *linedata2, *linedata3, *linedata4;
+	struct TempLineInfo *lineinfo;
+	float *f, xof, yof, xtrax, linedist;
 	float twidth, maxlen = 0;
 	int i, slen, j;
 	int curbox;
 	int selstart, selend;
-	short cnr = 0, lnr = 0, wsnr = 0;
+	int cnr = 0, lnr = 0, wsnr = 0;
 	const wchar_t *mem;
 	wchar_t ascii;
 	bool ok = false;
@@ -598,11 +609,7 @@ bool BKE_vfont_to_curve_ex(Main *bmain, Object *ob, int mode, ListBase *r_nubase
 	ct = chartransdata = MEM_callocN((slen + 1) * sizeof(struct CharTrans), "buildtext");
 
 	/* We assume the worst case: 1 character per line (is freed at end anyway) */
-
-	linedata  = MEM_mallocN(sizeof(float) * (slen * 2 + 1), "buildtext2");
-	linedata2 = MEM_mallocN(sizeof(float) * (slen * 2 + 1), "buildtext3");
-	linedata3 = MEM_callocN(sizeof(float) * (slen * 2 + 1), "buildtext4");
-	linedata4 = MEM_callocN(sizeof(float) * (slen * 2 + 1), "buildtext5");
+	lineinfo = MEM_mallocN(sizeof(*lineinfo) * (slen * 2 + 1), "lineinfo");
 	
 	linedist = cu->linedist;
 	
@@ -613,7 +620,9 @@ bool BKE_vfont_to_curve_ex(Main *bmain, Object *ob, int mode, ListBase *r_nubase
 
 	oldvfont = NULL;
 
-	for (i = 0; i < slen; i++) custrinfo[i].flag &= ~(CU_CHINFO_WRAP | CU_CHINFO_SMALLCAPS_CHECK);
+	for (i = 0; i < slen; i++) {
+		custrinfo[i].flag &= ~(CU_CHINFO_WRAP | CU_CHINFO_SMALLCAPS_CHECK);
+	}
 
 	tb = &(cu->tb[0]);
 	curbox = 0;
@@ -714,12 +723,12 @@ makebreak:
 
 			yof -= linedist;
 
-			linedata[lnr] = (xof - xtrax) - (tb->x / cu->fsize);
-			linedata2[lnr] = cnr;
-			linedata3[lnr] = tb->w / cu->fsize;
-			linedata4[lnr] = wsnr;
+			lineinfo[lnr].x_min     = (xof - xtrax) - (tb->x / cu->fsize);
+			lineinfo[lnr].x_max     = tb->w / cu->fsize;
+			lineinfo[lnr].char_nr   = cnr;
+			lineinfo[lnr].wspace_nr = wsnr;
 
-			CLAMP_MIN(maxlen, linedata[lnr]);
+			CLAMP_MIN(maxlen, lineinfo[lnr].x_min);
 
 			if ((tb->h != 0.0f) &&
 			    ((-(yof - (tb->y / cu->fsize))) > ((tb->h / cu->fsize) - (linedist * cu->fsize)) - cu->yof) &&
@@ -799,33 +808,43 @@ makebreak:
 		if (ascii == '\n' || ct->dobreak) cu->lines++;
 	}
 
-	/* linedata is now: width of line
-	 * linedata2 is now: number of characters
-	 * linedata3 is now: maxlen of that line
-	 * linedata4 is now: number of whitespaces of line */
+	/* linedata is now: width of line */
 
 	if (cu->spacemode != CU_LEFT) {
 		ct = chartransdata;
 
 		if (cu->spacemode == CU_RIGHT) {
-			for (i = 0; i < lnr; i++) linedata[i] = (linedata3[i] - linedata[i]) + cu->xof;
+			struct TempLineInfo *li;
+
+			for (i = 0, li = lineinfo; i < lnr; i++, li++) {
+				li->x_min = (li->x_max - li->x_min) + cu->xof;
+			}
+
 			for (i = 0; i <= slen; i++) {
-				ct->xof += linedata[ct->linenr];
+				ct->xof += lineinfo[ct->linenr].x_min;
 				ct++;
 			}
 		}
 		else if (cu->spacemode == CU_MIDDLE) {
-			for (i = 0; i < lnr; i++) linedata[i] = ((linedata3[i] - linedata[i]) + cu->xof) / 2;
+			struct TempLineInfo *li;
+
+			for (i = 0, li = lineinfo; i < lnr; i++, li++) {
+				li->x_min = ((li->x_max - li->x_min) + cu->xof) / 2.0f;
+			}
+
 			for (i = 0; i <= slen; i++) {
-				ct->xof += linedata[ct->linenr];
+				ct->xof += lineinfo[ct->linenr].x_min;
 				ct++;
 			}
 		}
 		else if ((cu->spacemode == CU_FLUSH) && (cu->tb[0].w != 0.0f)) {
-			for (i = 0; i < lnr; i++) {
-				linedata[i] = ((linedata3[i] - linedata[i]) + cu->xof);
-				if (linedata2[i] > 1) {
-					linedata[i] /= (linedata2[i] - 1);
+			struct TempLineInfo *li;
+
+			for (i = 0, li = lineinfo; i < lnr; i++, li++) {
+				li->x_min = ((li->x_max - li->x_min) + cu->xof);
+
+				if (li->char_nr > 1) {
+					li->x_min /= (float)(li->char_nr - 1);
 				}
 			}
 			for (i = 0; i <= slen; i++) {
@@ -834,7 +853,7 @@ makebreak:
 				}
 
 //				if ((mem[j] != '\n') && (mem[j])) {
-				ct->xof += ct->charnr * linedata[ct->linenr];
+				ct->xof += ct->charnr * lineinfo[ct->linenr].x_min;
 //				}
 				ct++;
 			}
@@ -852,8 +871,12 @@ makebreak:
 				if ((mem[j] != '\n') &&
 				    ((chartransdata[j].dobreak != 0)))
 				{
-					if (mem[i] == ' ')
-						curofs += ((linedata3[ct->linenr] - linedata[ct->linenr]) + cu->xof) / linedata4[ct->linenr];
+					if (mem[i] == ' ') {
+						struct TempLineInfo *li;
+
+						li = &lineinfo[ct->linenr];
+						curofs += ((li->x_max - li->x_min) + cu->xof) / (float)li->wspace_nr;
+					}
 					ct->xof += curofs;
 				}
 				if (mem[i] == '\n' || chartransdata[i].dobreak) curofs = 0;
@@ -861,7 +884,9 @@ makebreak:
 			}
 		}
 	}
-	
+
+	MEM_freeN(lineinfo);
+
 	/* TEXT ON CURVE */
 	/* Note: Only OB_CURVE objects could have a path  */
 	if (cu->textoncurve && cu->textoncurve->type == OB_CURVE) {
@@ -1033,11 +1058,6 @@ makebreak:
 		
 	}
 
-	MEM_freeN(linedata);
-	MEM_freeN(linedata2);
-	MEM_freeN(linedata3);
-	MEM_freeN(linedata4);
-
 	if (mode == FO_SELCHANGE) {
 		MEM_freeN(chartransdata);
 		chartransdata = NULL;




More information about the Bf-blender-cvs mailing list