From 4a372102c708ee5a53af5b70a4efec30f2d87b6f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 7 Jan 2014 17:04:19 +1100 Subject: Text3d: move text selection boxes from Curve to EditFont struct resolves T38079 --- source/blender/blenkernel/BKE_font.h | 8 ++++-- source/blender/blenkernel/intern/curve.c | 5 ++-- source/blender/blenkernel/intern/font.c | 36 +++++++++++++++--------- source/blender/blenloader/intern/readfile.c | 2 -- source/blender/editors/space_view3d/drawobject.c | 17 ++++++----- source/blender/makesdna/DNA_curve_types.h | 27 +++++++++--------- 6 files changed, 53 insertions(+), 42 deletions(-) diff --git a/source/blender/blenkernel/BKE_font.h b/source/blender/blenkernel/BKE_font.h index 769771363ec..d7c40e8e719 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 d1dde91feb6..4898832d97c 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 a70ab000a32..454db17b649 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 ee6068ac7b3..fe867ae0dc5 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 93106ea9161..f34eb6a763f 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 adcc4af41e0..f30ecad4cd9 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 ********************* */ -- cgit v1.2.3