2011-02-23 11:52:22 +01:00
|
|
|
/*
|
2009-01-29 06:19:27 +01:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
2018-06-01 18:19:39 +02:00
|
|
|
* of the License, or (at your option) any later version.
|
2009-01-29 06:19:27 +01:00
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 14:34:04 +01:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2009-01-29 06:19:27 +01:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2008 Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*/
|
|
|
|
|
2019-02-17 22:08:12 +01:00
|
|
|
/** \file
|
|
|
|
* \ingroup blf
|
2011-02-27 21:42:42 +01:00
|
|
|
*/
|
|
|
|
|
2012-02-17 19:59:41 +01:00
|
|
|
#ifndef __BLF_INTERNAL_TYPES_H__
|
|
|
|
#define __BLF_INTERNAL_TYPES_H__
|
2009-01-29 06:19:27 +01:00
|
|
|
|
2018-06-22 02:35:37 +02:00
|
|
|
#include "GPU_texture.h"
|
2020-03-19 09:33:03 +01:00
|
|
|
#include "GPU_vertex_buffer.h"
|
2018-03-30 19:16:14 +02:00
|
|
|
|
2018-03-31 13:09:03 +02:00
|
|
|
#define BLF_BATCH_DRAW_LEN_MAX 2048 /* in glyph */
|
2018-03-30 19:16:14 +02:00
|
|
|
|
2018-04-21 20:42:27 +02:00
|
|
|
typedef struct BatchBLF {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct FontBLF *font; /* can only batch glyph from the same font */
|
|
|
|
struct GPUBatch *batch;
|
|
|
|
struct GPUVertBuf *verts;
|
BLF: Optimize text rendering and caching
The current code allocates and transfers a lot of memory to the GPU,
but only a small portion of this memory is actually used.
In addition, the code calls many costly gl operations during the
caching process.
This commit significantly reduce the amount of memory by allocating
and transferring a flat array without pads to the GPU.
It also calls as little as possible the gl operations during the cache.
This code also simulate a billinear filter `GL_LINEAR` using a 1D texture.
**Average drawing time:**
|before:|0.00003184 sec
|now:|0.00001943 sec
|fac:|1.6385156675048407
**5 worst times:**
|before:|[0.001075, 0.001433, 0.002143, 0.002915, 0.003242]
|now:|[0.00094, 0.000993, 0.001502, 0.002284, 0.002328]
Differential Revision: https://developer.blender.org/D6886
2020-02-23 21:30:27 +01:00
|
|
|
struct GPUVertBufRaw pos_step, col_step, offset_step, glyph_size_step;
|
|
|
|
unsigned int pos_loc, col_loc, offset_loc, glyph_size_loc;
|
2019-04-17 06:17:24 +02:00
|
|
|
unsigned int glyph_len;
|
|
|
|
float ofs[2]; /* copy of font->pos */
|
|
|
|
float mat[4][4]; /* previous call modelmatrix. */
|
|
|
|
bool enabled, active, simple_shader;
|
BLF: Optimize text rendering and caching
The current code allocates and transfers a lot of memory to the GPU,
but only a small portion of this memory is actually used.
In addition, the code calls many costly gl operations during the
caching process.
This commit significantly reduce the amount of memory by allocating
and transferring a flat array without pads to the GPU.
It also calls as little as possible the gl operations during the cache.
This code also simulate a billinear filter `GL_LINEAR` using a 1D texture.
**Average drawing time:**
|before:|0.00003184 sec
|now:|0.00001943 sec
|fac:|1.6385156675048407
**5 worst times:**
|before:|[0.001075, 0.001433, 0.002143, 0.002915, 0.003242]
|now:|[0.00094, 0.000993, 0.001502, 0.002284, 0.002328]
Differential Revision: https://developer.blender.org/D6886
2020-02-23 21:30:27 +01:00
|
|
|
struct GlyphCacheBLF *glyph_cache;
|
2018-03-30 19:16:14 +02:00
|
|
|
} BatchBLF;
|
|
|
|
|
|
|
|
extern BatchBLF g_batch;
|
|
|
|
|
2018-03-31 15:24:10 +02:00
|
|
|
typedef struct KerningCacheBLF {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct KerningCacheBLF *next, *prev;
|
2018-03-31 15:24:10 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* kerning mode. */
|
|
|
|
FT_UInt mode;
|
2018-03-31 15:24:10 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* only cache a ascii glyph pairs. Only store the x
|
|
|
|
* offset we are interested in, instead of the full FT_Vector. */
|
|
|
|
int table[0x80][0x80];
|
2018-03-31 15:24:10 +02:00
|
|
|
} KerningCacheBLF;
|
|
|
|
|
2009-02-17 17:56:29 +01:00
|
|
|
typedef struct GlyphCacheBLF {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct GlyphCacheBLF *next;
|
|
|
|
struct GlyphCacheBLF *prev;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* font size. */
|
|
|
|
unsigned int size;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* and dpi. */
|
|
|
|
unsigned int dpi;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* and the glyphs. */
|
|
|
|
ListBase bucket[257];
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* fast ascii lookup */
|
|
|
|
struct GlyphBLF *glyph_ascii_table[256];
|
2011-09-12 11:12:34 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* texture array, to draw the glyphs. */
|
BLF: Optimize text rendering and caching
The current code allocates and transfers a lot of memory to the GPU,
but only a small portion of this memory is actually used.
In addition, the code calls many costly gl operations during the
caching process.
This commit significantly reduce the amount of memory by allocating
and transferring a flat array without pads to the GPU.
It also calls as little as possible the gl operations during the cache.
This code also simulate a billinear filter `GL_LINEAR` using a 1D texture.
**Average drawing time:**
|before:|0.00003184 sec
|now:|0.00001943 sec
|fac:|1.6385156675048407
**5 worst times:**
|before:|[0.001075, 0.001433, 0.002143, 0.002915, 0.003242]
|now:|[0.00094, 0.000993, 0.001502, 0.002284, 0.002328]
Differential Revision: https://developer.blender.org/D6886
2020-02-23 21:30:27 +01:00
|
|
|
GPUTexture *texture;
|
|
|
|
char *bitmap_result;
|
|
|
|
int bitmap_len;
|
|
|
|
int bitmap_len_landed;
|
|
|
|
int bitmap_len_alloc;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* and the bigger glyph in the font. */
|
|
|
|
int glyph_width_max;
|
|
|
|
int glyph_height_max;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* number of glyphs in the font. */
|
|
|
|
int glyphs_len_max;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* number of glyphs not yet loaded (decreases every glyph loaded). */
|
|
|
|
int glyphs_len_free;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* ascender and descender value. */
|
|
|
|
float ascender;
|
|
|
|
float descender;
|
2009-02-09 08:15:22 +01:00
|
|
|
} GlyphCacheBLF;
|
|
|
|
|
2009-08-06 22:06:02 +02:00
|
|
|
typedef struct GlyphBLF {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct GlyphBLF *next;
|
|
|
|
struct GlyphBLF *prev;
|
2009-08-06 22:06:02 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* and the character, as UTF8 */
|
|
|
|
unsigned int c;
|
2009-08-06 22:06:02 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* freetype2 index, to speed-up the search. */
|
|
|
|
FT_UInt idx;
|
2009-08-18 21:26:53 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* glyph box. */
|
|
|
|
rctf box;
|
2009-08-06 22:06:02 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* advance size. */
|
|
|
|
float advance;
|
|
|
|
/* avoid conversion to int while drawing */
|
|
|
|
int advance_i;
|
2009-08-06 22:06:02 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* position inside the texture where this glyph is store. */
|
BLF: Optimize text rendering and caching
The current code allocates and transfers a lot of memory to the GPU,
but only a small portion of this memory is actually used.
In addition, the code calls many costly gl operations during the
caching process.
This commit significantly reduce the amount of memory by allocating
and transferring a flat array without pads to the GPU.
It also calls as little as possible the gl operations during the cache.
This code also simulate a billinear filter `GL_LINEAR` using a 1D texture.
**Average drawing time:**
|before:|0.00003184 sec
|now:|0.00001943 sec
|fac:|1.6385156675048407
**5 worst times:**
|before:|[0.001075, 0.001433, 0.002143, 0.002915, 0.003242]
|now:|[0.00094, 0.000993, 0.001502, 0.002284, 0.002328]
Differential Revision: https://developer.blender.org/D6886
2020-02-23 21:30:27 +01:00
|
|
|
int offset;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Bitmap data, from freetype. Take care that this
|
|
|
|
* can be NULL.
|
|
|
|
*/
|
|
|
|
unsigned char *bitmap;
|
2009-08-06 22:51:41 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* glyph width and height. */
|
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
int pitch;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* X and Y bearing of the glyph.
|
|
|
|
* The X bearing is from the origin to the glyph left bbox edge.
|
|
|
|
* The Y bearing is from the baseline to the top of the glyph edge.
|
|
|
|
*/
|
|
|
|
float pos_x;
|
|
|
|
float pos_y;
|
2009-08-06 22:51:41 +02:00
|
|
|
|
2020-02-27 14:55:07 +01:00
|
|
|
struct GlyphCacheBLF *glyph_cache;
|
2009-02-09 08:15:22 +01:00
|
|
|
} GlyphBLF;
|
|
|
|
|
2012-08-13 00:18:20 +02:00
|
|
|
typedef struct FontBufInfoBLF {
|
2019-04-17 06:17:24 +02:00
|
|
|
/* for draw to buffer, always set this to NULL after finish! */
|
|
|
|
float *fbuf;
|
2012-08-13 00:18:20 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* the same but unsigned char */
|
|
|
|
unsigned char *cbuf;
|
2012-08-13 00:18:20 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* buffer size, keep signed so comparisons with negative values work */
|
|
|
|
int w;
|
|
|
|
int h;
|
2012-08-13 00:18:20 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* number of channels. */
|
|
|
|
int ch;
|
2012-08-13 00:18:20 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* display device used for color management */
|
|
|
|
struct ColorManagedDisplay *display;
|
2012-08-13 00:18:20 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* and the color, the alphas is get from the glyph!
|
|
|
|
* color is srgb space */
|
|
|
|
float col_init[4];
|
|
|
|
/* cached conversion from 'col_init' */
|
|
|
|
unsigned char col_char[4];
|
|
|
|
float col_float[4];
|
2015-09-18 12:10:26 +02:00
|
|
|
|
2012-08-13 00:18:20 +02:00
|
|
|
} FontBufInfoBLF;
|
|
|
|
|
2009-02-09 08:15:22 +01:00
|
|
|
typedef struct FontBLF {
|
2019-04-17 06:17:24 +02:00
|
|
|
/* font name. */
|
|
|
|
char *name;
|
2009-02-12 06:02:42 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* # of times this font was loaded */
|
|
|
|
unsigned int reference_count;
|
2019-01-14 06:28:07 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* filename or NULL. */
|
|
|
|
char *filename;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* aspect ratio or scale. */
|
|
|
|
float aspect[3];
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* initial position for draw the text. */
|
|
|
|
float pos[3];
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* angle in radians. */
|
|
|
|
float angle;
|
2018-06-08 08:07:48 +02:00
|
|
|
|
2016-10-16 17:28:12 +02:00
|
|
|
#if 0 /* BLF_BLUR_ENABLE */
|
2019-04-17 06:17:24 +02:00
|
|
|
/* blur: 3 or 5 large kernel */
|
|
|
|
int blur;
|
2016-10-16 01:40:41 +02:00
|
|
|
#endif
|
2009-06-23 18:27:35 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* shadow level. */
|
|
|
|
int shadow;
|
2009-06-23 18:27:35 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* and shadow offset. */
|
|
|
|
int shadow_x;
|
|
|
|
int shadow_y;
|
2009-06-23 18:27:35 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* shadow color. */
|
|
|
|
unsigned char shadow_color[4];
|
2011-09-17 12:45:20 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* main text color. */
|
|
|
|
unsigned char color[4];
|
2011-09-17 12:45:20 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Multiplied this matrix with the current one before
|
|
|
|
* draw the text! see blf_draw__start.
|
|
|
|
*/
|
|
|
|
float m[16];
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* clipping rectangle. */
|
|
|
|
rctf clip_rec;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* the width to wrap the text, see BLF_WORD_WRAP */
|
|
|
|
int wrap_width;
|
2015-09-18 12:10:26 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* font dpi (default 72). */
|
|
|
|
unsigned int dpi;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* font size. */
|
|
|
|
unsigned int size;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* max texture size. */
|
|
|
|
int tex_size_max;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* font options. */
|
|
|
|
int flags;
|
2009-02-20 06:42:44 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* list of glyph cache for this font. */
|
|
|
|
ListBase cache;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-09-14 02:22:42 +02:00
|
|
|
/* current glyph cache, size and dpi.
|
|
|
|
* Use blf_glyph_cache_acquire(font) and blf_glyph_cache_release(font) to access cache!
|
|
|
|
*/
|
2019-04-17 06:17:24 +02:00
|
|
|
GlyphCacheBLF *glyph_cache;
|
2009-03-02 06:20:48 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* list of kerning cache for this font. */
|
|
|
|
ListBase kerning_caches;
|
2018-03-31 15:24:10 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* current kerning cache for this font and kerning mode. */
|
|
|
|
KerningCacheBLF *kerning_cache;
|
2018-03-31 15:24:10 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* freetype2 lib handle. */
|
|
|
|
FT_Library ft_lib;
|
2011-02-19 14:43:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Mutex lock for library */
|
|
|
|
SpinLock *ft_lib_mutex;
|
2013-06-28 15:05:15 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* freetype2 face. */
|
|
|
|
FT_Face face;
|
2009-08-18 21:26:53 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* freetype kerning */
|
|
|
|
FT_UInt kerning_mode;
|
2018-03-31 15:24:10 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* data for buffer usage (drawing into a texture buffer) */
|
|
|
|
FontBufInfoBLF buf_info;
|
2019-09-14 02:22:42 +02:00
|
|
|
|
|
|
|
/* Mutex lock for glyph cache. */
|
|
|
|
SpinLock *glyph_cache_mutex;
|
2009-02-09 08:15:22 +01:00
|
|
|
} FontBLF;
|
|
|
|
|
2009-03-02 06:20:48 +01:00
|
|
|
typedef struct DirBLF {
|
2019-04-17 06:17:24 +02:00
|
|
|
struct DirBLF *next;
|
|
|
|
struct DirBLF *prev;
|
2009-03-02 06:20:48 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* full path where search fonts. */
|
|
|
|
char *path;
|
2009-03-02 06:20:48 +01:00
|
|
|
} DirBLF;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2012-02-17 19:59:41 +01:00
|
|
|
#endif /* __BLF_INTERNAL_TYPES_H__ */
|