commit 01af6735cccfa25ce2d0f9c449900975a273176f
parent 7b3b7bacf5b57afd294603642811e72452847f17
Author: falkTX <falktx@falktx.com>
Date: Fri, 7 Jan 2022 17:48:28 +0000
Update to latest fontstash, allow nanovg freetype builds
Signed-off-by: falkTX <falktx@falktx.com>
Diffstat:
2 files changed, 147 insertions(+), 138 deletions(-)
diff --git a/dgl/Makefile b/dgl/Makefile
@@ -25,6 +25,9 @@ endif
ifeq ($(USE_NANOVG_FBO),true)
BUILD_CXX_FLAGS += -DDGL_USE_NANOVG_FBO
endif
+ifeq ($(USE_NANOVG_FREETYPE),true)
+BUILD_CXX_FLAGS += -DFONS_USE_FREETYPE $(shell $(PKG_CONFIG) --cflags freetype2)
+endif
ifeq ($(USE_RGBA),true)
BUILD_CXX_FLAGS += -DDGL_USE_RGBA
endif
diff --git a/dgl/src/nanovg/fontstash.h b/dgl/src/nanovg/fontstash.h
@@ -157,31 +157,167 @@ struct FONSttFontImpl {
};
typedef struct FONSttFontImpl FONSttFontImpl;
-static FT_Library ftLibrary;
+#else
+
+#define STB_TRUETYPE_IMPLEMENTATION
+
+#include "stb_truetype.h"
+
+struct FONSttFontImpl {
+ stbtt_fontinfo font;
+};
+typedef struct FONSttFontImpl FONSttFontImpl;
+
+#endif
+
+#ifndef FONS_SCRATCH_BUF_SIZE
+# define FONS_SCRATCH_BUF_SIZE 96000
+#endif
+#ifndef FONS_HASH_LUT_SIZE
+# define FONS_HASH_LUT_SIZE 256
+#endif
+#ifndef FONS_INIT_FONTS
+# define FONS_INIT_FONTS 4
+#endif
+#ifndef FONS_INIT_GLYPHS
+# define FONS_INIT_GLYPHS 256
+#endif
+#ifndef FONS_INIT_ATLAS_NODES
+# define FONS_INIT_ATLAS_NODES 256
+#endif
+#ifndef FONS_VERTEX_COUNT
+# define FONS_VERTEX_COUNT 1024
+#endif
+#ifndef FONS_MAX_STATES
+# define FONS_MAX_STATES 20
+#endif
+#ifndef FONS_MAX_FALLBACKS
+# define FONS_MAX_FALLBACKS 20
+#endif
+
+static unsigned int fons__hashint(unsigned int a)
+{
+ a += ~(a<<15);
+ a ^= (a>>10);
+ a += (a<<3);
+ a ^= (a>>6);
+ a += ~(a<<11);
+ a ^= (a>>16);
+ return a;
+}
+
+static int fons__mini(int a, int b)
+{
+ return a < b ? a : b;
+}
+
+static int fons__maxi(int a, int b)
+{
+ return a > b ? a : b;
+}
+
+struct FONSglyph
+{
+ unsigned int codepoint;
+ int index;
+ int next;
+ short size, blur;
+ short x0,y0,x1,y1;
+ short xadv,xoff,yoff;
+};
+typedef struct FONSglyph FONSglyph;
+
+struct FONSfont
+{
+ FONSttFontImpl font;
+ char name[64];
+ unsigned char* data;
+ int dataSize;
+ unsigned char freeData;
+ float ascender;
+ float descender;
+ float lineh;
+ FONSglyph* glyphs;
+ int cglyphs;
+ int nglyphs;
+ int lut[FONS_HASH_LUT_SIZE];
+ int fallbacks[FONS_MAX_FALLBACKS];
+ int nfallbacks;
+};
+typedef struct FONSfont FONSfont;
+
+struct FONSstate
+{
+ int font;
+ int align;
+ float size;
+ unsigned int color;
+ float blur;
+ float spacing;
+};
+typedef struct FONSstate FONSstate;
+
+struct FONSatlasNode {
+ short x, y, width;
+};
+typedef struct FONSatlasNode FONSatlasNode;
+
+struct FONSatlas
+{
+ int width, height;
+ FONSatlasNode* nodes;
+ int nnodes;
+ int cnodes;
+};
+typedef struct FONSatlas FONSatlas;
+
+struct FONScontext
+{
+ FONSparams params;
+ float itw,ith;
+ unsigned char* texData;
+ int dirtyRect[4];
+ FONSfont** fonts;
+ FONSatlas* atlas;
+ int cfonts;
+ int nfonts;
+ float verts[FONS_VERTEX_COUNT*2];
+ float tcoords[FONS_VERTEX_COUNT*2];
+ unsigned int colors[FONS_VERTEX_COUNT];
+ int nverts;
+ unsigned char* scratch;
+ int nscratch;
+ FONSstate states[FONS_MAX_STATES];
+ int nstates;
+ void (*handleError)(void* uptr, int error, int val);
+ void* errorUptr;
+#ifdef FONS_USE_FREETYPE
+ FT_Library ftLibrary;
+#endif
+};
+
+#ifdef FONS_USE_FREETYPE
int fons__tt_init(FONScontext *context)
{
FT_Error ftError;
- FONS_NOTUSED(context);
- ftError = FT_Init_FreeType(&ftLibrary);
+ ftError = FT_Init_FreeType(&context->ftLibrary);
return ftError == 0;
}
int fons__tt_done(FONScontext *context)
{
FT_Error ftError;
- FONS_NOTUSED(context);
- ftError = FT_Done_FreeType(ftLibrary);
+ ftError = FT_Done_FreeType(context->ftLibrary);
return ftError == 0;
}
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize, int fontIndex)
{
FT_Error ftError;
- FONS_NOTUSED(context);
//font->font.userdata = stash;
- ftError = FT_New_Memory_Face(ftLibrary, (const FT_Byte*)data, dataSize, fontIndex, &font->font);
+ ftError = FT_New_Memory_Face(context->ftLibrary, (const FT_Byte*)data, dataSize, fontIndex, &font->font);
return ftError == 0;
}
@@ -269,17 +405,10 @@ int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2)
#else
-#define STB_TRUETYPE_IMPLEMENTATION
static void* fons__tmpalloc(size_t size, void* up);
static void fons__tmpfree(void* ptr, void* up);
#define STBTT_malloc(x,u) fons__tmpalloc(x,u)
#define STBTT_free(x,u) fons__tmpfree(x,u)
-#include "stb_truetype.h"
-
-struct FONSttFontImpl {
- stbtt_fontinfo font;
-};
-typedef struct FONSttFontImpl FONSttFontImpl;
int fons__tt_init(FONScontext *context)
{
@@ -350,129 +479,6 @@ int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2)
#endif
-#ifndef FONS_SCRATCH_BUF_SIZE
-# define FONS_SCRATCH_BUF_SIZE 96000
-#endif
-#ifndef FONS_HASH_LUT_SIZE
-# define FONS_HASH_LUT_SIZE 256
-#endif
-#ifndef FONS_INIT_FONTS
-# define FONS_INIT_FONTS 4
-#endif
-#ifndef FONS_INIT_GLYPHS
-# define FONS_INIT_GLYPHS 256
-#endif
-#ifndef FONS_INIT_ATLAS_NODES
-# define FONS_INIT_ATLAS_NODES 256
-#endif
-#ifndef FONS_VERTEX_COUNT
-# define FONS_VERTEX_COUNT 1024
-#endif
-#ifndef FONS_MAX_STATES
-# define FONS_MAX_STATES 20
-#endif
-#ifndef FONS_MAX_FALLBACKS
-# define FONS_MAX_FALLBACKS 20
-#endif
-
-static unsigned int fons__hashint(unsigned int a)
-{
- a += ~(a<<15);
- a ^= (a>>10);
- a += (a<<3);
- a ^= (a>>6);
- a += ~(a<<11);
- a ^= (a>>16);
- return a;
-}
-
-static int fons__mini(int a, int b)
-{
- return a < b ? a : b;
-}
-
-static int fons__maxi(int a, int b)
-{
- return a > b ? a : b;
-}
-
-struct FONSglyph
-{
- unsigned int codepoint;
- int index;
- int next;
- short size, blur;
- short x0,y0,x1,y1;
- short xadv,xoff,yoff;
-};
-typedef struct FONSglyph FONSglyph;
-
-struct FONSfont
-{
- FONSttFontImpl font;
- char name[64];
- unsigned char* data;
- int dataSize;
- unsigned char freeData;
- float ascender;
- float descender;
- float lineh;
- FONSglyph* glyphs;
- int cglyphs;
- int nglyphs;
- int lut[FONS_HASH_LUT_SIZE];
- int fallbacks[FONS_MAX_FALLBACKS];
- int nfallbacks;
-};
-typedef struct FONSfont FONSfont;
-
-struct FONSstate
-{
- int font;
- int align;
- float size;
- unsigned int color;
- float blur;
- float spacing;
-};
-typedef struct FONSstate FONSstate;
-
-struct FONSatlasNode {
- short x, y, width;
-};
-typedef struct FONSatlasNode FONSatlasNode;
-
-struct FONSatlas
-{
- int width, height;
- FONSatlasNode* nodes;
- int nnodes;
- int cnodes;
-};
-typedef struct FONSatlas FONSatlas;
-
-struct FONScontext
-{
- FONSparams params;
- float itw,ith;
- unsigned char* texData;
- int dirtyRect[4];
- FONSfont** fonts;
- FONSatlas* atlas;
- int cfonts;
- int nfonts;
- float verts[FONS_VERTEX_COUNT*2];
- float tcoords[FONS_VERTEX_COUNT*2];
- unsigned int colors[FONS_VERTEX_COUNT];
- int nverts;
- unsigned char* scratch;
- int nscratch;
- FONSstate states[FONS_MAX_STATES];
- int nstates;
- void (*handleError)(void* uptr, int error, int val);
- void* errorUptr;
-};
-
#ifdef STB_TRUETYPE_IMPLEMENTATION
static void* fons__tmpalloc(size_t size, void* up)
@@ -1684,8 +1690,8 @@ void fonsDeleteInternal(FONScontext* stash)
if (stash->fonts) free(stash->fonts);
if (stash->texData) free(stash->texData);
if (stash->scratch) free(stash->scratch);
- free(stash);
fons__tt_done(stash);
+ free(stash);
}
void fonsSetErrorCallback(FONScontext* stash, void (*callback)(void* uptr, int error, int val), void* uptr)