Commit: 4a372102c708ee5a53af5b70a4efec30f2d87b6f
Author: Campbell Barton
Date:   Tue Jan 7 17:04:19 2014 +1100
https://developer.blender.org/rB4a372102c708ee5a53af5b70a4efec30f2d87b6f

Text3d: move text selection boxes from Curve to EditFont struct

resolves T38079

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

M       source/blender/blenkernel/BKE_font.h
M       source/blender/blenkernel/intern/curve.c
M       source/blender/blenkernel/intern/font.c
M       source/blender/blenloader/intern/readfile.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/makesdna/DNA_curve_types.h

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

diff --git a/source/blender/blenkernel/BKE_font.h 
b/source/blender/blenkernel/BKE_font.h
index 7697713..d7c40e8 100644
--- a/source/blender/blenkernel/BKE_font.h
+++ b/source/blender/blenkernel/BKE_font.h
@@ -53,18 +53,20 @@ struct CharTrans {
        char dobreak;
 };
 
-typedef struct SelBox {
+typedef struct EditFontSelBox {
        float x, y, w, h;
        float rot;
-} SelBox;
+} EditFontSelBox;
 
-typedef struct EditFont {      
+typedef struct EditFont {
        wchar_t *copybuf;
        struct CharInfo *copybufinfo;
        
        wchar_t *textbuf;
        struct CharInfo *textbufinfo;
        
+       /* array of rectangles & rotation */
+       EditFontSelBox *selboxes;
        float textcurs[4][2];
 
        /* positional vars relative to the textbuf, textbufinfo (not utf8 bytes)
diff --git a/source/blender/blenkernel/intern/curve.c 
b/source/blender/blenkernel/intern/curve.c
index d1dde91..4898832 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -112,12 +112,12 @@ void BKE_curve_editfont_free(Curve *cu)
                        MEM_freeN(ef->copybuf);
                if (ef->copybufinfo)
                        MEM_freeN(ef->copybufinfo);
+               if (ef->selboxes)
+                       MEM_freeN(ef->selboxes);
 
                MEM_freeN(ef);
                cu->editfont = NULL;
        }
-
-       MEM_SAFE_FREE(cu->selboxes);
 }
 
 void BKE_curve_editNurb_keyIndex_free(EditNurb *editnurb)
@@ -224,7 +224,6 @@ Curve *BKE_curve_copy(Curve *cu)
 
        cun->editnurb = NULL;
        cun->editfont = NULL;
-       cun->selboxes = NULL;
        cun->lastsel = NULL;
 
 #if 0   // XXX old animation system
diff --git a/source/blender/blenkernel/intern/font.c 
b/source/blender/blenkernel/intern/font.c
index a70ab00..454db17 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -502,6 +502,7 @@ bool BKE_vfont_to_curve_ex(Main *bmain, Scene *scene, 
Object *ob, int mode,
 {
        Curve *cu = ob->data;
        EditFont *ef = cu->editfont;
+       EditFontSelBox *selboxes = NULL;
        VFont *vfont, *oldvfont;
        VFontData *vfd = NULL;
        CharInfo *info = NULL, *custrinfo;
@@ -562,6 +563,18 @@ bool BKE_vfont_to_curve_ex(Main *bmain, Scene *scene, 
Object *ob, int mode,
        if (cu->tb == NULL)
                cu->tb = MEM_callocN(MAXTEXTBOX * sizeof(TextBox), "TextBox 
compat");
 
+       if (ef) {
+               if (ef->selboxes)
+                       MEM_freeN(ef->selboxes);
+
+               if (BKE_vfont_select_get(ob, &selstart, &selend))
+                       ef->selboxes = MEM_callocN((selend - selstart + 1) * 
sizeof(EditFontSelBox), "font selboxes");
+               else
+                       ef->selboxes = NULL;
+
+               selboxes = ef->selboxes;
+       }
+
        /* calc offset and rotation of each char */
        ct = chartransdata = MEM_callocN((slen + 1) * sizeof(struct CharTrans), 
"buildtext");
 
@@ -583,11 +596,6 @@ bool BKE_vfont_to_curve_ex(Main *bmain, Scene *scene, 
Object *ob, int mode,
 
        for (i = 0; i < slen; i++) custrinfo[i].flag &= ~(CU_CHINFO_WRAP | 
CU_CHINFO_SMALLCAPS_CHECK);
 
-       if (cu->selboxes) MEM_freeN(cu->selboxes);
-       cu->selboxes = NULL;
-       if (BKE_vfont_select_get(ob, &selstart, &selend))
-               cu->selboxes = MEM_callocN((selend - selstart + 1) * 
sizeof(SelBox), "font selboxes");
-
        tb = &(cu->tb[0]);
        curbox = 0;
        for (i = 0; i <= slen; i++) {
@@ -729,7 +737,7 @@ makebreak:
                        xof = cu->xof + tabfac;
                }
                else {
-                       SelBox *sb = NULL;
+                       EditFontSelBox *sb = NULL;
                        float wsfac;
 
                        ct->xof = xof;
@@ -737,8 +745,8 @@ makebreak:
                        ct->linenr = lnr;
                        ct->charnr = cnr++;
 
-                       if (cu->selboxes && (i >= selstart) && (i <= selend)) {
-                               sb = &(cu->selboxes[i - selstart]);
+                       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;
@@ -929,9 +937,9 @@ makebreak:
                                ct->xof = vec[0] + si * yof;
                                ct->yof = vec[1] + co * yof;
 
-                               if (cu->selboxes && (i >= selstart) && (i <= 
selend)) {
-                                       SelBox *sb;
-                                       sb = &(cu->selboxes[i - selstart]);
+                               if (selboxes && (i >= selstart) && (i <= 
selend)) {
+                                       EditFontSelBox *sb;
+                                       sb = &selboxes[i - selstart];
                                        sb->rot = -ct->rot;
                                }
                                
@@ -940,12 +948,12 @@ makebreak:
                }
        }
 
-       if (cu->selboxes) {
+       if (selboxes) {
                ct = chartransdata;
                for (i = 0; i <= selend; i++, ct++) {
                        if (i >= selstart) {
-                               cu->selboxes[i - selstart].x = ct->xof * 
cu->fsize;
-                               cu->selboxes[i - selstart].y = ct->yof * 
cu->fsize;
+                               selboxes[i - selstart].x = ct->xof * cu->fsize;
+                               selboxes[i - selstart].y = ct->yof * cu->fsize;
                        }
                }
        }
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index ee6068a..fe867ae 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3335,8 +3335,6 @@ static void lib_link_curve(FileData *fd, Main *main)
                        
                        cu->ipo = newlibadr_us(fd, cu->id.lib, cu->ipo); // XXX 
deprecated - old animation system
                        cu->key = newlibadr_us(fd, cu->id.lib, cu->key);
-
-                       cu->selboxes = NULL;  /* runtime, clear */
                        
                        cu->id.flag -= LIB_NEED_LINK;
                }
diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index 93106ea..f34eb6a 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -6815,7 +6815,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, 
Base *base, const short
                        case OB_FONT:
                                cu = ob->data;
                                if (cu->editfont) {
-                                       draw_textcurs(rv3d, 
cu->editfont->textcurs);
+                                       EditFont *ef = cu->editfont;
+
+                                       draw_textcurs(rv3d, ef->textcurs);
 
                                        if (cu->flag & CU_FAST) {
                                                cpack(0xFFFFFF);
@@ -6866,18 +6868,19 @@ void draw_object(Scene *scene, ARegion *ar, View3D 
*v3d, Base *base, const short
                                        setlinestyle(0);
 
 
-                                       if (BKE_vfont_select_get(ob, &selstart, 
&selend) && cu->selboxes) {
+                                       if (BKE_vfont_select_get(ob, &selstart, 
&selend) && ef->selboxes) {
+                                               const int seltot = selend - 
selstart;
                                                float selboxw;
 
                                                cpack(0xffffff);
                                                set_inverted_drawing(1);
-                                               for (i = 0; i <= (selend - 
selstart); i++) {
-                                                       SelBox *sb = 
&(cu->selboxes[i]);
+                                               for (i = 0; i <= seltot; i++) {
+                                                       EditFontSelBox *sb = 
&ef->selboxes[i];
                                                        float tvec[3];
 
-                                                       if (i < (selend - 
selstart)) {
-                                                               if 
(cu->selboxes[i + 1].y == sb->y)
-                                                                       selboxw 
= cu->selboxes[i + 1].x - sb->x;
+                                                       if (i != seltot) {
+                                                               if 
(ef->selboxes[i + 1].y == sb->y)
+                                                                       selboxw 
= ef->selboxes[i + 1].x - sb->x;
                                                                else
                                                                        selboxw 
= sb->w;
                                                        }
diff --git a/source/blender/makesdna/DNA_curve_types.h 
b/source/blender/makesdna/DNA_curve_types.h
index adcc4af..f30ecad 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -210,7 +210,8 @@ typedef struct Curve {
        int actnu;
        /* edit, last selected point */
        void *lastsel;
-       
+
+
        /* font part */
        short lines;
        char spacemode, pad1;
@@ -218,35 +219,35 @@ typedef struct Curve {
        float xof, yof;
        float linewidth;
 
-       int pad3;
-       int len_wchar;  /* number of characters (strinfo) */
-       int len;        /* number of bytes (str - utf8) */
-       char *str;
-       struct SelBox *selboxes;  /* runtime variable for drawing selections 
(editmode data) */
-       struct EditFont *editfont;
-       
        /* copy of EditFont vars (wchar_t aligned),
         * warning! don't use in editmode (storage only) */
        int pos;
        int selstart, selend;
-       int pad2;
+
+       /* text data */
+       int len_wchar;  /* number of characters (strinfo) */
+       int len;        /* number of bytes (str - utf8) */
+       char *str;
+       struct EditFont *editfont;
 
        char family[64];
        struct VFont *vfont;
        struct VFont *vfontb;
        struct VFont *vfonti;
        struct VFont *vfontbi;
-
-       int pad4;
        
-       float ctime;                    /* current evaltime - for use by 
Objects parented to curves */
-       int totbox, actbox;
        struct TextBox *tb;
+       int totbox, actbox;
        
        struct CharInfo *strinfo;
        struct CharInfo curinfo;
+       /* font part end */
+
 
+       float ctime;                    /* current evaltime - for use by 
Objects parented to curves */
        float bevfac1, bevfac2;
+
+       char pad[4];
 } Curve;
 
 /* **************** CURVE ********************* */

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

Reply via email to