Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2014-01-03 10:04:42 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-01-03 10:08:23 +0400
commit15bc30f4ee49c69f3ed6f92701a0f5cd52d306c5 (patch)
treefc77fe7096673256d90c512267adb58eb53c23de /source/blender/blenkernel
parenta5cb2229abbc7d43f34dabea332afd33614fc0db (diff)
Text3d: store number of characters and utf8 length separately
EditFont's use of Curve.len was very confusing, in editmode it represented the number of characters, in object mode the number of bytes. add Curve.len_wchar and keep track of both. Also don't convert the editmode text into utf8 on every keystroke. Now this is done on exiting editmode or save - to match most other object types. This also fixes curves 'body_format' being reported with an invalid size.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/BKE_font.h7
-rw-r--r--source/blender/blenkernel/intern/curve.c6
-rw-r--r--source/blender/blenkernel/intern/font.c76
4 files changed, 47 insertions, 44 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index f397e6be2c9..e2f86c26626 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -42,7 +42,7 @@ extern "C" {
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
#define BLENDER_VERSION 269
-#define BLENDER_SUBVERSION 7
+#define BLENDER_SUBVERSION 8
/* 262 was the last editmesh release but it has compatibility code for bmesh data */
#define BLENDER_MINVERSION 262
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_font.h b/source/blender/blenkernel/BKE_font.h
index 76fc7350d19..16cbcde0167 100644
--- a/source/blender/blenkernel/BKE_font.h
+++ b/source/blender/blenkernel/BKE_font.h
@@ -65,6 +65,11 @@ typedef struct EditFont {
struct CharInfo *textbufinfo;
float textcurs[4][2];
+
+ /* positional vars relative to the textbuf, textbufinfo (not utf8 bytes)
+ * a copy of these is kept in Curve, but use these in editmode */
+ int len, pos;
+ int selstart, selend;
} EditFont;
@@ -80,7 +85,7 @@ struct VFont *BKE_vfont_load(struct Main *bmain, const char *name);
bool BKE_vfont_to_curve(struct Main *bmain, struct Scene *scene, struct Object *ob, int mode,
struct CharTrans **r_chartransdata);
-int BKE_vfont_select_get(struct Object *ob, int *start, int *end);
+int BKE_vfont_select_get(struct Object *ob, int *r_start, int *r_end);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 1c4560cd2b2..d1dde91feb6 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -190,7 +190,7 @@ Curve *BKE_curve_add(Main *bmain, const char *name, int type)
cu->vfont->id.us += 4;
cu->str = MEM_mallocN(12, "str");
BLI_strncpy(cu->str, "Text", 12);
- cu->len = cu->pos = 4;
+ cu->len = cu->len_wchar = cu->pos = 4;
cu->strinfo = MEM_callocN(12 * sizeof(CharInfo), "strinfo new");
cu->totbox = cu->actbox = 1;
cu->tb = MEM_callocN(MAXTEXTBOX * sizeof(TextBox), "textbox");
@@ -4041,7 +4041,7 @@ void BKE_curve_material_index_remove(Curve *cu, int index)
if (curvetype == OB_FONT) {
struct CharInfo *info = cu->strinfo;
int i;
- for (i = cu->len - 1; i >= 0; i--, info++) {
+ for (i = cu->len_wchar - 1; i >= 0; i--, info++) {
if (info->mat_nr && info->mat_nr >= index) {
info->mat_nr--;
}
@@ -4068,7 +4068,7 @@ void BKE_curve_material_index_clear(Curve *cu)
if (curvetype == OB_FONT) {
struct CharInfo *info = cu->strinfo;
int i;
- for (i = cu->len - 1; i >= 0; i--, info++) {
+ for (i = cu->len_wchar - 1; i >= 0; i--, info++) {
info->mat_nr = 0;
}
}
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index 90362c7a3ad..222251f6e5e 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -457,25 +457,26 @@ static void buildchar(Main *bmain, Curve *cu, unsigned int character, CharInfo *
}
}
-int BKE_vfont_select_get(Object *ob, int *start, int *end)
+int BKE_vfont_select_get(Object *ob, int *r_start, int *r_end)
{
Curve *cu = ob->data;
+ EditFont *ef = cu->editfont;
- if (cu->editfont == NULL || ob->type != OB_FONT) return 0;
+ if ((ob->type != OB_FONT) || (ef == NULL)) return 0;
- BLI_assert(cu->selstart >= 0 && cu->selstart <= cu->len + 1);
- BLI_assert(cu->selend >= 0 && cu->selend <= cu->len + 1);
- BLI_assert(cu->pos >= 0 && cu->pos <= cu->len);
+ BLI_assert(ef->selstart >= 0 && ef->selstart <= ef->len + 1);
+ BLI_assert(ef->selend >= 0 && ef->selend <= ef->len + 1);
+ BLI_assert(ef->pos >= 0 && ef->pos <= ef->len);
- if (cu->selstart == 0) return 0;
- if (cu->selstart <= cu->selend) {
- *start = cu->selstart - 1;
- *end = cu->selend - 1;
+ if (ef->selstart == 0) return 0;
+ if (ef->selstart <= ef->selend) {
+ *r_start = ef->selstart - 1;
+ *r_end = ef->selend - 1;
return 1;
}
else {
- *start = cu->selend;
- *end = cu->selstart - 2;
+ *r_start = ef->selend;
+ *r_end = ef->selstart - 2;
return -1;
}
}
@@ -497,9 +498,10 @@ static float char_width(Curve *cu, VChar *che, CharInfo *info)
bool BKE_vfont_to_curve(Main *bmain, Scene *scene, Object *ob, int mode,
struct CharTrans **r_chartransdata)
{
+ Curve *cu = ob->data;
+ EditFont *ef = cu->editfont;
VFont *vfont, *oldvfont;
VFontData *vfd = NULL;
- Curve *cu;
CharInfo *info = NULL, *custrinfo;
TextBox *tb;
VChar *che;
@@ -519,7 +521,6 @@ bool BKE_vfont_to_curve(Main *bmain, Scene *scene, Object *ob, int mode,
BLI_assert(ob->type == OB_FONT);
/* Set font data */
- cu = (Curve *) ob->data;
vfont = cu->vfont;
if (cu->str == NULL) return ok;
@@ -533,20 +534,18 @@ bool BKE_vfont_to_curve(Main *bmain, Scene *scene, Object *ob, int mode,
if (cu->ulheight == 0.0f)
cu->ulheight = 0.05f;
- if (cu->editfont) {
- slen = cu->len;
- mem = cu->editfont->textbuf;
- custrinfo = cu->editfont->textbufinfo;
+ if (ef) {
+ slen = ef->len;
+ mem = ef->textbuf;
+ custrinfo = ef->textbufinfo;
}
else {
- size_t utf8len;
-
- utf8len = BLI_strlen_utf8(cu->str);
+ slen = cu->len_wchar;
/* Create unicode string */
- mem = MEM_mallocN(((utf8len + 1) * sizeof(wchar_t)), "convertedmem");
+ mem = MEM_mallocN(((slen + 1) * sizeof(wchar_t)), "convertedmem");
- slen = BLI_strncpy_wchar_from_utf8(mem, cu->str, utf8len + 1);
+ BLI_strncpy_wchar_from_utf8(mem, cu->str, slen + 1);
if (cu->strinfo == NULL) { /* old file */
cu->strinfo = MEM_callocN((slen + 4) * sizeof(CharInfo), "strinfo compat");
@@ -945,10 +944,8 @@ makebreak:
}
if (mode == FO_CURSUP || mode == FO_CURSDOWN || mode == FO_PAGEUP || mode == FO_PAGEDOWN) {
- /* 2: curs up
- * 3: curs down */
- ct = chartransdata + cu->pos;
-
+ ct = &chartransdata[ef->pos];
+
if ((mode == FO_CURSUP || mode == FO_PAGEUP) && ct->linenr == 0) {
/* pass */
}
@@ -964,7 +961,7 @@ makebreak:
}
cnr = ct->charnr;
/* seek for char with lnr en cnr */
- cu->pos = 0;
+ ef->pos = 0;
ct = chartransdata;
for (i = 0; i < slen; i++) {
if (ct->linenr == lnr) {
@@ -975,21 +972,21 @@ makebreak:
else if (ct->linenr > lnr) {
break;
}
- cu->pos++;
+ ef->pos++;
ct++;
}
}
}
/* cursor first */
- if (cu->editfont) {
+ if (ef) {
float si, co;
- ct = chartransdata + cu->pos;
+ ct = &chartransdata[ef->pos];
si = sinf(ct->rot);
co = cosf(ct->rot);
- f = cu->editfont->textcurs[0];
+ f = ef->textcurs[0];
f[0] = cu->fsize * (-0.1f * co + ct->xof);
f[1] = cu->fsize * ( 0.1f * si + ct->yof);
@@ -1071,8 +1068,7 @@ makebreak:
mem[0] = ascii;
mem[1] = 0;
custrinfo[0] = *info;
- cu->pos = 1;
- cu->len = 1;
+ cu->len = cu->len_wchar = cu->pos = 1;
mul_v3_m4v3(ob->loc, ob->obmat, vecyo);
outta = 1;
cu->sepchar = 0;
@@ -1086,14 +1082,16 @@ makebreak:
finally:
- if (cu->editfont == NULL)
+ if (ef == NULL)
MEM_freeN(mem);
- if (r_chartransdata) {
- *r_chartransdata = chartransdata;
- }
- else {
- MEM_freeN(chartransdata);
+ if (chartransdata) {
+ if (ok && r_chartransdata) {
+ *r_chartransdata = chartransdata;
+ }
+ else {
+ MEM_freeN(chartransdata);
+ }
}
return ok;