From 8b0729a7314324e1aea6655de8bd16bb3e5ff5cc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 16 May 2014 07:45:13 +1000 Subject: 3D Text: replace multiple float arrays with struct (much easier to understand) --- source/blender/blenkernel/intern/font.c | 88 ++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 34 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 109d79127ca..23e0a666213 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; -- cgit v1.2.3