Commit: 68da165ff2fc5f5bafe074aeadd5f27e8f41967c
Author: Dalai Felinto
Date:   Tue Oct 23 22:45:31 2018 -0300
Branches: experimental-build
https://developer.blender.org/rB68da165ff2fc5f5bafe074aeadd5f27e8f41967c

Text overflow option tests

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

M       release/scripts/startup/bl_ui/properties_data_curve.py
M       source/blender/blenkernel/intern/font.c
M       source/blender/draw/modes/edit_text_mode.c
M       source/blender/makesdna/DNA_curve_types.h
M       source/blender/makesrna/intern/rna_curve.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_curve.py 
b/release/scripts/startup/bl_ui/properties_data_curve.py
index 9155da14c6b..3469ff04e3a 100644
--- a/release/scripts/startup/bl_ui/properties_data_curve.py
+++ b/release/scripts/startup/bl_ui/properties_data_curve.py
@@ -441,6 +441,9 @@ class DATA_PT_text_boxes(CurveButtonsPanelText, Panel):
         text = context.curve
 
         layout.operator("font.textbox_add", icon='ADD')
+        sub = layout.column()
+        sub.prop(text, "overflow", text="Overflow")
+        sub.active = (text.overflow != 'SCALE') or (len(text.text_boxes) == 1)
 
         for i, box in enumerate(text.text_boxes):
 
diff --git a/source/blender/blenkernel/intern/font.c 
b/source/blender/blenkernel/intern/font.c
index 51ab82fd593..cd05db5f6ba 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -364,7 +364,8 @@ static VChar *find_vfont_char(VFontData *vfd, unsigned int 
character)
 }
 
 static void build_underline(Curve *cu, ListBase *nubase, const rctf *rect,
-                            float yofs, float rot, int charidx, short mat_nr)
+                            float yofs, float rot, int charidx, short mat_nr,
+                            const float font_size)
 {
        Nurb *nu2;
        BPoint *bp;
@@ -417,18 +418,19 @@ static void build_underline(Curve *cu, ListBase *nubase, 
const rctf *rect,
                bp = nu2->bp;
        }
 
-       mul_v2_fl(bp[0].vec, cu->fsize);
-       mul_v2_fl(bp[1].vec, cu->fsize);
-       mul_v2_fl(bp[2].vec, cu->fsize);
-       mul_v2_fl(bp[3].vec, cu->fsize);
+       mul_v2_fl(bp[0].vec, font_size);
+       mul_v2_fl(bp[1].vec, font_size);
+       mul_v2_fl(bp[2].vec, font_size);
+       mul_v2_fl(bp[3].vec, font_size);
 }
 
 static void buildchar(Curve *cu, ListBase *nubase, unsigned int character, 
CharInfo *info,
-                      float ofsx, float ofsy, float rot, int charidx)
+                      float ofsx, float ofsy, float rot, int charidx,
+                      const float fsize)
 {
        BezTriple *bezt1, *bezt2;
        Nurb *nu1 = NULL, *nu2 = NULL;
-       float *fp, fsize, shear, x, si, co;
+       float *fp, shear, x, si, co;
        VFontData *vfd = NULL;
        VChar *che = NULL;
        int i;
@@ -448,7 +450,6 @@ static void buildchar(Curve *cu, ListBase *nubase, unsigned 
int character, CharI
 #endif
 
        /* make a copy at distance ofsx, ofsy with shear */
-       fsize = cu->fsize;
        shear = cu->shear;
        si = sinf(rot);
        co = cosf(rot);
@@ -651,9 +652,10 @@ struct TempLineInfo {
 #define ASCENT(vfd) ((vfd)->ascender * (vfd)->em_height)
 #define DESCENT(vfd) ((vfd)->em_height - ASCENT(vfd))
 
-bool BKE_vfont_to_curve_ex(Object *ob, Curve *cu, int mode, ListBase *r_nubase,
+static bool vfont_to_curve(Object *ob, Curve *cu, int mode, ListBase *r_nubase,
                            const wchar_t **r_text, int *r_text_len, bool 
*r_text_free,
-                           struct CharTrans **r_chartransdata)
+                           struct CharTrans **r_chartransdata,
+                           const float scale)
 {
        EditFont *ef = cu->editfont;
        EditFontSelBox *selboxes = NULL;
@@ -671,11 +673,16 @@ bool BKE_vfont_to_curve_ex(Object *ob, Curve *cu, int 
mode, ListBase *r_nubase,
        int curbox;
        int selstart, selend;
        int cnr = 0, lnr = 0, wsnr = 0;
-       const wchar_t *mem;
+       const wchar_t *mem = NULL;
        wchar_t ascii;
        bool ok = false;
-       const float xof_scale = cu->xof / cu->fsize;
-       const float yof_scale = cu->yof / cu->fsize;
+       const float font_size = cu->fsize * scale;
+       const float xof_scale = cu->xof / font_size;
+       const float yof_scale = cu->yof / font_size;
+       int last_line = -1;
+       /* Length of the text disregarding \n breaks. */
+       float current_line_length = 0.0f;
+       float longest_line_length = 0.0f;
 
        /* Text at the beginning of the last used text-box (use for y-axis 
alignment).
         * We overallocate by one to simplify logic of getting last char. */
@@ -756,7 +763,7 @@ bool BKE_vfont_to_curve_ex(Object *ob, Curve *cu, int mode, 
ListBase *r_nubase,
        linedist = cu->linedist;
 
        curbox = 0;
-       textbox_scale(&tb_scale, &cu->tb[curbox], 1.0f / cu->fsize);
+       textbox_scale(&tb_scale, &cu->tb[curbox], 1.0f / font_size);
        use_textbox = (tb_scale.w != 0.0f);
 
 
@@ -768,7 +775,7 @@ bool BKE_vfont_to_curve_ex(Object *ob, Curve *cu, int mode, 
ListBase *r_nubase,
        oldvfont = NULL;
 
        for (i = 0; i < slen; i++) {
-               custrinfo[i].flag &= ~(CU_CHINFO_WRAP | 
CU_CHINFO_SMALLCAPS_CHECK);
+               custrinfo[i].flag &= ~(CU_CHINFO_WRAP | 
CU_CHINFO_SMALLCAPS_CHECK | CU_CHINFO_OVERFLOW);
        }
 
        for (i = 0; i <= slen; i++) {
@@ -837,6 +844,7 @@ makebreak:
                {
                        //              fprintf(stderr, "linewidth exceeded: 
%c%c%c...\n", mem[i], mem[i+1], mem[i+2]);
                        for (j = i; j && (mem[j] != '\n') && 
(chartransdata[j].dobreak == 0); j--) {
+                               bool dobreak = false;
                                if (mem[j] == ' ' || mem[j] == '-') {
                                        ct -= (i - (j - 1));
                                        cnr -= (i - (j - 1));
@@ -846,9 +854,9 @@ makebreak:
                                        xof = ct->xof;
                                        ct[1].dobreak = 1;
                                        custrinfo[i + 1].flag |= CU_CHINFO_WRAP;
-                                       goto makebreak;
+                                       dobreak = true;
                                }
-                               if (chartransdata[j].dobreak) {
+                               else if (chartransdata[j].dobreak) {
                                        //                              
fprintf(stderr, "word too long: %c%c%c...\n", mem[j], mem[j+1], mem[j+2]);
                                        ct->dobreak = 1;
                                        custrinfo[i + 1].flag |= CU_CHINFO_WRAP;
@@ -856,6 +864,13 @@ makebreak:
                                        cnr -= 1;
                                        i--;
                                        xof = ct->xof;
+                                       dobreak = true;
+                               }
+                               if (dobreak) {
+                                       if (tb_scale.h == 0.0f) {
+                                               /* Note: If underlined text is 
truncated away, the extra space is also truncated. */
+                                               custrinfo[i + 1].flag |= 
CU_CHINFO_OVERFLOW;
+                                       }
                                        goto makebreak;
                                }
                        }
@@ -877,16 +892,30 @@ makebreak:
                        CLAMP_MIN(maxlen, lineinfo[lnr].x_min);
 
                        if ((tb_scale.h != 0.0f) &&
-                           (cu->totbox > (curbox + 1)) &&
                            ((-(yof - tb_scale.y)) > (tb_scale.h - linedist) - 
yof_scale))
                        {
-                               maxlen = 0;
-                               curbox++;
-                               i_textbox_array[curbox] = i + 1;
+                               if (cu->totbox > (curbox + 1)) {
+                                       maxlen = 0;
+                                       curbox++;
+                                       i_textbox_array[curbox] = i + 1;
 
-                               textbox_scale(&tb_scale, &cu->tb[curbox], 1.0f 
/ cu->fsize);
+                                       textbox_scale(&tb_scale, 
&cu->tb[curbox], 1.0f / font_size);
 
-                               yof = MARGIN_Y_MIN;
+                                       yof = MARGIN_Y_MIN;
+                               }
+                               else if (last_line == -1) {
+                                       last_line = lnr + 1;
+                                       info->flag |= CU_CHINFO_OVERFLOW;
+                               }
+                       }
+
+                       current_line_length += xof;
+                       if (ct->dobreak) {
+                               current_line_length += twidth;
+                       }
+                       else {
+                               longest_line_length = MAX2(current_line_length, 
longest_line_length);
+                               current_line_length = 0.0f;
                        }
 
                        /* XXX, has been unused for years, need to check if 
this is useful, r4613 r5282 - campbell */
@@ -925,9 +954,9 @@ makebreak:
 
                        if (selboxes && (i >= selstart) && (i <= selend)) {
                                sb = &selboxes[i - selstart];
-                               sb->y = yof * cu->fsize - linedist * cu->fsize 
* 0.1f;
-                               sb->h = linedist * cu->fsize;
-                               sb->w = xof * cu->fsize;
+                               sb->y = yof * font_size - linedist * font_size 
* 0.1f;
+                               sb->h = linedist * font_size;
+                               sb->w = xof * font_size;
                        }
 
                        if (ascii == 32) {
@@ -944,11 +973,13 @@ makebreak:
                        xof += (twidth * wsfac * (1.0f + (info->kern / 40.0f)) 
) + xtrax;
 
                        if (sb) {
-                               sb->w = (xof * cu->fsize) - sb->w;
+                               sb->w = (xof * font_size) - sb->w;
                        }
                }
                ct++;
        }
+       current_line_length += xof + twidth;
+       longest_line_length = MAX2(current_line_length, longest_line_length);
 
        cu->lines = 1;
        for (i = 0; i <= slen; i++) {
@@ -1050,7 +1081,7 @@ makebreak:
                                ct_last = chartransdata + 
(is_last_filled_textbox ? slen: i_textbox_next - 1);
                                lines = ct_last->linenr - ct_first->linenr + 1;
 
-                               textbox_scale(&tb_scale, &cu->tb[tb_index], 
1.0f / cu->fsize);
+                               textbox_scale(&tb_scale, &cu->tb[tb_index], 
1.0f / font_size);
                                /* The initial Y origin of the textbox is 
hardcoded to 1.0f * text scale. */
                                const float textbox_y_origin = 1.0f;
                                float yoff;
@@ -1133,7 +1164,7 @@ makebreak:
 
                        copy_m3_m4(cmat, cu->textoncurve->obmat);
                        mul_m3_m3m3(cmat, cmat, imat3);
-                       sizefac = normalize_v3(cmat[0]) / cu->fsize;
+                       sizefac = normalize_v3(cmat[0]) / font_size;
 
                        minx = miny = 1.0e20f;
                        maxx = maxy = -1.0e20f;
@@ -1226,8 +1257,8 @@ makebreak:
                ct = chartransdata;
                for (i = 0; i <= selend; i++, ct++) {
                        if (i >= selstart) {
-                               selboxes[i - selstart].x = ct->xof * cu->fsize;
-                               selboxes[i - selstart].y = ct->yof * cu->fsize;
+                               selboxes[i - selstart].x = ct->xof * font_size;
+                               selboxes[i - selstart].y = ct->yof * font_size;
                        }
                }
        }
@@ -1277,27 +1308,25 @@ makebreak:
 
                f = ef->textcurs[0];
 
-               f[0] = cu->fsize * (-0.1f * co + ct->xof);
-               f[1] = cu->fsize * ( 0.1f * si + ct->yof);
+               f[0] = font_size * (-0.1f * co + ct->xof);
+               f[1] = font_size * ( 0.1f * si + ct->yof);
 
-               f[2] = cu->fsize * ( 0.1f * co + ct->xof);
-               f[3] = cu->fsize * (-0.1f * si + ct->yof);
+               f[2] = font_size * ( 0.1f * co + ct->xof);
+               f[3] = font_size * (-0.1f * si + ct->yof);
 
-               f[4] = cu->fsize * ( 0.1f * co + 0.8f * si + ct->xof);
-               f[5] = cu->fsize * (-0.1f * si + 0.8f * co + ct->yof);
+               f[4] = font_size * ( 0.1f * co + 0.8f * si + ct->xof);
+               f[5] = font_size * (-0.1f * si + 0.8f * co + ct->yof);
 
-               f[6] = cu->fsize * (-0.1f * co + 0.8f * si + ct->xof);
-               f[7] = cu->fsize * ( 0.1f * si + 0.8f * co + ct->yof);
+               f[6] = font_size * (-0.1f * co + 0.8f * si + ct->xof);
+               f[7] = font_size * ( 0.1f * si + 0.8f * co + ct->yof);
 
        }
 
        if (mode == FO_SELCHANGE) {
                MEM_freeN(chartransdata);
                chartransdata = NULL;
-               goto finally;
        }
-
-       if (mode == FO_EDIT) {
+       else if (mode == FO_EDIT) {
                /* make nurbdata */
                BKE_nurbList_free(r_nubase);
 
@@ -1306,6 +1335,13 @@ makebreak:
                        unsigned int cha = (unsigned int) mem[i];
                        info = &(custrinfo[i]);
 
+                       if ((cu->overflow == CU_OVERFLOW_TRUNCATE) &&
+                           (ob && ob->mode != OB_MODE_EDIT) &&
+                           (info->flag & CU_CHINFO_OVERFLOW))
+                       {
+                               break;
+                       }
+
                        if (info->flag & CU_CHINFO_SMALLCAPS_CHECK) {
                                cha = towupper(cha);
                        }
@@ -1316,7 +1352,7 @@ makebreak:
                        }
                        /* We do not want to see any character for \n or \r */
                        if (cha != '\n')
-                               buildchar(cu, r_nubase, cha, info, ct->xof, 
ct->yof, ct->rot, i);
+                               buildchar(cu, r_nubase, cha, info, ct->xof, ct-

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to