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:
Diffstat (limited to 'source/blender/blenfont/intern/blf_font.c')
-rw-r--r--source/blender/blenfont/intern/blf_font.c53
1 files changed, 49 insertions, 4 deletions
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 25ea0770f8b..f0afe184233 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -84,16 +84,19 @@ static void blf_batch_draw_init(void)
{
GPUVertFormat format = {0};
g_batch.pos_loc = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
- g_batch.tex_loc = GPU_vertformat_attr_add(&format, "tex", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
g_batch.col_loc = GPU_vertformat_attr_add(
&format, "col", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ g_batch.offset_loc = GPU_vertformat_attr_add(&format, "offset", GPU_COMP_I32, 1, GPU_FETCH_INT);
+ g_batch.glyph_size_loc = GPU_vertformat_attr_add(
+ &format, "glyph_size", GPU_COMP_I32, 2, GPU_FETCH_INT);
g_batch.verts = GPU_vertbuf_create_with_format_ex(&format, GPU_USAGE_STREAM);
GPU_vertbuf_data_alloc(g_batch.verts, BLF_BATCH_DRAW_LEN_MAX);
GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.pos_loc, &g_batch.pos_step);
- GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.tex_loc, &g_batch.tex_step);
GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.col_loc, &g_batch.col_step);
+ GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.offset_loc, &g_batch.offset_step);
+ GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.glyph_size_loc, &g_batch.glyph_size_step);
g_batch.glyph_len = 0;
/* A dummy vbo containing 4 points, attribs are not used. */
@@ -177,6 +180,46 @@ void blf_batch_draw_begin(FontBLF *font)
}
}
+static GPUTexture *blf_batch_cache_texture_load(void)
+{
+ GlyphCacheBLF *gc = g_batch.glyph_cache;
+ BLI_assert(gc);
+ BLI_assert(gc->bitmap_len > 0);
+
+ if (gc->bitmap_len > gc->bitmap_len_landed) {
+ const int tex_width = GPU_texture_width(gc->texture);
+
+ int bitmap_len_landed = gc->bitmap_len_landed;
+ int remain = gc->bitmap_len - bitmap_len_landed;
+ int offset_x = bitmap_len_landed % tex_width;
+ int offset_y = bitmap_len_landed / tex_width;
+
+ /* TODO(germano): Update more than one row in a single call. */
+ while (remain) {
+ int remain_row = tex_width - offset_x;
+ int width = remain > remain_row ? remain_row : remain;
+ GPU_texture_update_sub(gc->texture,
+ GPU_DATA_UNSIGNED_BYTE,
+ &gc->bitmap_result[bitmap_len_landed],
+ offset_x,
+ offset_y,
+ 0,
+ width,
+ 1,
+ 0);
+
+ bitmap_len_landed += width;
+ remain -= width;
+ offset_x = 0;
+ offset_y += 1;
+ }
+
+ gc->bitmap_len_landed = bitmap_len_landed;
+ }
+
+ return gc->texture;
+}
+
void blf_batch_draw(void)
{
if (g_batch.glyph_len == 0) {
@@ -190,7 +233,8 @@ void blf_batch_draw(void)
/* We need to flush widget base first to ensure correct ordering. */
UI_widgetbase_draw_cache_flush();
- GPU_texture_bind(g_batch.tex_bind_state, 0);
+ GPUTexture *texture = blf_batch_cache_texture_load();
+ GPU_texture_bind(texture, 0);
GPU_vertbuf_data_len_set(g_batch.verts, g_batch.glyph_len);
GPU_vertbuf_use(g_batch.verts); /* send data */
@@ -202,8 +246,9 @@ void blf_batch_draw(void)
/* restart to 1st vertex data pointers */
GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.pos_loc, &g_batch.pos_step);
- GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.tex_loc, &g_batch.tex_step);
GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.col_loc, &g_batch.col_step);
+ GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.offset_loc, &g_batch.offset_step);
+ GPU_vertbuf_attr_get_raw_data(g_batch.verts, g_batch.glyph_size_loc, &g_batch.glyph_size_step);
g_batch.glyph_len = 0;
}