[Bf-blender-cvs] [bd7eb84] temp-blf-wordwrap: BLF: expose wordwrapped lines though the API
Campbell Barton
noreply at git.blender.org
Sat Aug 29 12:50:24 CEST 2015
Commit: bd7eb84fb5a0cb65f273e6950f98ecac04f2e9ea
Author: Campbell Barton
Date: Sat Aug 29 20:42:55 2015 +1000
Branches: temp-blf-wordwrap
https://developer.blender.org/rBbd7eb84fb5a0cb65f273e6950f98ecac04f2e9ea
BLF: expose wordwrapped lines though the API
===================================================================
M source/blender/blenfont/BLF_api.h
M source/blender/blenfont/intern/blf.c
M source/blender/blenfont/intern/blf_font.c
M source/blender/blenfont/intern/blf_internal.h
M source/blender/blenfont/intern/blf_internal_types.h
===================================================================
diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h
index 49fc2be..bf486cc 100644
--- a/source/blender/blenfont/BLF_api.h
+++ b/source/blender/blenfont/BLF_api.h
@@ -97,7 +97,9 @@ void BLF_boundbox(int fontid, const char *str, size_t len, struct rctf *box) ATT
* of the string, using the current font and both value
* are multiplied by the aspect of the font.
*/
+float BLF_width_ex(int fontid, const char *str, size_t len, int *r_lines) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2);
float BLF_width(int fontid, const char *str, size_t len) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
+float BLF_height_ex(int fontid, const char *str, size_t len, int *r_lines) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2);
float BLF_height(int fontid, const char *str, size_t len) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
/* Return dimensions of the font without any sample text. */
@@ -137,6 +139,7 @@ void BLF_disable_default(int option);
void BLF_rotation(int fontid, float angle);
void BLF_clipping(int fontid, float xmin, float ymin, float xmax, float ymax);
void BLF_clipping_default(float xmin, float ymin, float xmax, float ymax);
+void BLF_wordwrap_width(int fontid, int wrap_width);
void BLF_blur(int fontid, int size);
void BLF_enable(int fontid, int option);
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c
index ca25ef8..41d0a10 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -657,7 +657,7 @@ void BLF_width_and_height(int fontid, const char *str, size_t len, float *r_widt
FontBLF *font = blf_get(fontid);
if (font && font->glyph_cache) {
- blf_font_width_and_height(font, str, len, r_width, r_height);
+ blf_font_width_and_height(font, str, len, r_width, r_height, NULL);
}
else {
*r_width = *r_height = 0.0f;
@@ -672,16 +672,20 @@ void BLF_width_and_height_default(const char *str, size_t len, float *r_width, f
BLF_width_and_height(global_font_default, str, len, r_width, r_height);
}
-float BLF_width(int fontid, const char *str, size_t len)
+float BLF_width_ex(int fontid, const char *str, size_t len, int *r_lines)
{
FontBLF *font = blf_get(fontid);
if (font && font->glyph_cache) {
- return blf_font_width(font, str, len);
+ return blf_font_width(font, str, len, r_lines);
}
return 0.0f;
}
+float BLF_width(int fontid, const char *str, size_t len)
+{
+ return BLF_width_ex(fontid, str, len, NULL);
+}
float BLF_fixed_width(int fontid)
{
@@ -702,16 +706,20 @@ float BLF_width_default(const char *str, size_t len)
return BLF_width(global_font_default, str, len);
}
-float BLF_height(int fontid, const char *str, size_t len)
+float BLF_height_ex(int fontid, const char *str, size_t len, int *r_lines)
{
FontBLF *font = blf_get(fontid);
if (font && font->glyph_cache) {
- return blf_font_height(font, str, len);
+ return blf_font_height(font, str, len, r_lines);
}
return 0.0f;
}
+float BLF_height(int fontid, const char *str, size_t len)
+{
+ return BLF_height_ex(fontid, str, len, NULL);
+}
float BLF_height_max(int fontid)
{
@@ -799,6 +807,15 @@ void BLF_clipping_default(float xmin, float ymin, float xmax, float ymax)
}
}
+void BLF_wordwrap_width(int fontid, int wrap_width)
+{
+ FontBLF *font = blf_get(global_font_default);
+
+ if (font) {
+ font->wrap_width = wrap_width;
+ }
+}
+
void BLF_shadow(int fontid, int level, float r, float g, float b, float a)
{
FontBLF *font = blf_get(fontid);
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 8bff51c..edf63f3 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -634,12 +634,14 @@ struct WordWrapVars {
};
#define BLF_WORDWRAP_VARS(_font, _wrap) \
- struct WordWrapVars _wrap = {(int)_font->clip_rec.xmax - (int)_font->pos[0], 0, {0, 0}}
+ struct WordWrapVars _wrap = {(int)_font->wrap_width, 0, {0, 0}}
/**
* Generic function to add word-wrap support for other existing functions.
+ *
+ * \return number of lines.
*/
-static void blf_font_wrap_apply(
+static int blf_font_wrap_apply(
FontBLF *font, const char *str, size_t len,
void (*callback)(FontBLF *font, const char *str, size_t len, int pen_y, void *userdata),
void *userdata)
@@ -650,13 +652,14 @@ static void blf_font_wrap_apply(
int pen_x = 0, pen_y = 0;
size_t i = 0;
GlyphBLF **glyph_ascii_table = font->glyph_cache->glyph_ascii_table;
+ int lines = 0;
BLF_KERNING_VARS(font, has_kerning, kern_mode);
BLF_WORDWRAP_VARS(font, wrap);
blf_font_ensure_ascii_table(font);
-
+ // printf("%s wrapping `%s`:\n", __func__, str);
while ((i < len) && str[i]) {
/* wrap vars */
@@ -688,18 +691,24 @@ static void blf_font_wrap_apply(
}
if (UNLIKELY(do_draw)) {
- callback(font, &str[wrap.start], (wrap.last[0] - wrap.start), pen_y, userdata);
+ // printf("... `%.*s`\n", wrap.last[0] - wrap.start, &str[wrap.start]);
+ callback(font, &str[wrap.start], wrap.last[0] - wrap.start, pen_y, userdata);
wrap.start = wrap.last[0];
i = wrap.last[1];
pen_x = 0;
pen_y -= font->glyph_cache->max_glyph_height;
g_prev = NULL;
+ lines += 1;
continue;
}
pen_x = pen_x_next;
g_prev = g;
}
+
+ // printf("done! %d lines\n", lines);
+
+ return lines;
}
/* blf_font_draw__wrap */
@@ -731,20 +740,26 @@ static void blf_font_boundbox_wrap_cb(FontBLF *font, const char *str, size_t len
blf_font_boundbox_ex(font, str, len, &box_single, pen_y);
BLI_rctf_union(box, &box_single);
}
-void blf_font_boundbox__wrap(FontBLF *font, const char *str, size_t len, rctf *box)
+void blf_font_boundbox__wrap(FontBLF *font, const char *str, size_t len, rctf *box, int *r_lines)
{
+ int lines;
+
box->xmin = 32000.0f;
box->xmax = -32000.0f;
box->ymin = 32000.0f;
box->ymax = -32000.0f;
- blf_font_wrap_apply(font, str, len, blf_font_boundbox_wrap_cb, box);
+ lines = blf_font_wrap_apply(font, str, len, blf_font_boundbox_wrap_cb, box);
+
+ if (r_lines) {
+ *r_lines = lines;
+ }
}
/** \} */
-void blf_font_width_and_height(FontBLF *font, const char *str, size_t len, float *width, float *height)
+void blf_font_width_and_height(FontBLF *font, const char *str, size_t len, float *width, float *height, int *r_lines)
{
float xa, ya;
rctf box;
@@ -759,16 +774,19 @@ void blf_font_width_and_height(FontBLF *font, const char *str, size_t len, float
}
if (font->flags & BLF_WORDWRAP) {
- blf_font_boundbox__wrap(font, str, len, &box);
+ blf_font_boundbox__wrap(font, str, len, &box, r_lines);
}
else {
+ if (r_lines) {
+ *r_lines = 1;
+ }
blf_font_boundbox(font, str, len, &box);
}
*width = (BLI_rctf_size_x(&box) * xa);
*height = (BLI_rctf_size_y(&box) * ya);
}
-float blf_font_width(FontBLF *font, const char *str, size_t len)
+float blf_font_width(FontBLF *font, const char *str, size_t len, int *r_lines)
{
float xa;
rctf box;
@@ -779,15 +797,18 @@ float blf_font_width(FontBLF *font, const char *str, size_t len)
xa = 1.0f;
if (font->flags & BLF_WORDWRAP) {
- blf_font_boundbox__wrap(font, str, len, &box);
+ blf_font_boundbox__wrap(font, str, len, &box, r_lines);
}
else {
+ if (r_lines) {
+ r_lines = 1;
+ }
blf_font_boundbox(font, str, len, &box);
}
return BLI_rctf_size_x(&box) * xa;
}
-float blf_font_height(FontBLF *font, const char *str, size_t len)
+float blf_font_height(FontBLF *font, const char *str, size_t len, int *r_lines)
{
float ya;
rctf box;
@@ -798,9 +819,12 @@ float blf_font_height(FontBLF *font, const char *str, size_t len)
ya = 1.0f;
if (font->flags & BLF_WORDWRAP) {
- blf_font_boundbox__wrap(font, str, len, &box);
+ blf_font_boundbox__wrap(font, str, len, &box, r_lines);
}
else {
+ if (r_lines) {
+ r_lines = 1;
+ }
blf_font_boundbox(font, str, len, &box);
}
return BLI_rctf_size_y(&box) * ya;
diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h
index ed77e3a..1a111bf 100644
--- a/source/blender/blenfont/intern/blf_internal.h
+++ b/source/blender/blenfont/intern/blf_internal.h
@@ -60,10 +60,10 @@ void blf_font_buffer(struct FontBLF *font, const char *str);
size_t blf_font_width_to_strlen(struct FontBLF *font, const char *str, size_t len, float width, float *r_width);
size_t blf_font_width_to_rstrlen(struct FontBLF *font, const char *str, size_t len, float width, float *r_width);
void blf_font_boundbox(struct FontBLF *font, const char *str, size_t len, struct rctf *box);
-void blf_font_boundbox__wrap(struct FontBLF *font, const char *str, size_t len, struct rctf *box);
-void blf_font_width_and_height(struct FontBLF *font, const char *str, size_t len, float *width, float *height);
-float blf_font_width(struct FontBLF *font, const char *str, size_t len);
-float blf_font_height(struct FontBLF *font, const char *str, size_t len);
+void blf_font_boundbox__wrap(struct FontBLF *font, const char *str, size_t len, struct rctf *box, int *r_lines);
+void blf_font_width_and_height(struct FontBLF *font, const char *str, size_t len, float *width, float *height, int *r_lines);
+float blf_font_width(struct FontBLF *font, const char *str, size_t len, int *r_lines);
+float blf_font_height(struct FontBLF *font, const char *str, size_t len, int *r_lines);
float blf_font_fixed_width(struct FontBLF *font);
int blf_font_count_missing_chars(struct FontBLF *font, const char *str, const size_t len, int *r_tot_chars);
diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h
index 1404b9d..090659e 100644
--- a/source/blender/blenfont/intern/blf_internal_types.h
+++ b/source/blender/blenfont/intern/blf_internal_types.h
@@ -195,6 +195,9 @@ typedef struct FontBLF {
/* clipping rectangle. */
rctf clip_rec;
+ /* the width to wrap the text, see BLF_WORDWRAP */
+ int wrap_width;
+
/* font dpi (default 72). */
unsigned int dpi;
More information about the Bf-blender-cvs
mailing list