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-07-17 21:11:23 +02:00
|
|
|
#include "GPU_vertex_buffer.h"
|
2018-06-22 02:35:37 +02:00
|
|
|
#include "GPU_texture.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;
|
|
|
|
struct GPUVertBufRaw pos_step, tex_step, col_step;
|
|
|
|
unsigned int pos_loc, tex_loc, col_loc;
|
|
|
|
unsigned int glyph_len;
|
|
|
|
float ofs[2]; /* copy of font->pos */
|
|
|
|
float mat[4][4]; /* previous call modelmatrix. */
|
|
|
|
bool enabled, active, simple_shader;
|
|
|
|
GPUTexture *tex_bind_state;
|
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. */
|
|
|
|
GPUTexture **textures;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* size of the array. */
|
|
|
|
unsigned int textures_len;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* and the last texture, aka. the current texture. */
|
|
|
|
unsigned int texture_current;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-10-17 03:19:59 +02:00
|
|
|
/* We draw every glyph in a big texture, so this is the
|
|
|
|
* current position inside the texture. */
|
2019-04-17 06:17:24 +02:00
|
|
|
int offset_x;
|
|
|
|
int offset_y;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* and the space from one to other. */
|
|
|
|
int pad;
|
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
|
|
|
/* next two integer power of two, to build the texture. */
|
|
|
|
int p2_width;
|
|
|
|
int p2_height;
|
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
|
|
|
/* texture id where this glyph is store. */
|
|
|
|
GPUTexture *tex;
|
2009-02-09 08:15:22 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* position inside the texture where this glyph is store. */
|
|
|
|
int offset_x;
|
|
|
|
int offset_y;
|
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
|
|
|
/* uv coords. */
|
|
|
|
float uv[2][2];
|
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
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* with value of zero mean that we need build the texture. */
|
|
|
|
char build_tex;
|
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
|
|
|
/* cache current OpenGL texture to save calls into the API */
|
|
|
|
GPUTexture *tex_bind_state;
|
2011-09-17 12:45:20 +02: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
|
|
|
|
2018-03-31 13:40:23 +02:00
|
|
|
#define BLF_TEXTURE_UNSET ((unsigned int)-1)
|
2013-09-01 02:46:04 +02:00
|
|
|
|
2012-02-17 19:59:41 +01:00
|
|
|
#endif /* __BLF_INTERNAL_TYPES_H__ */
|