- added typedefs for all structs - fixed some compiler warningsshared-context
@@ -24,9 +24,9 @@ | |||
#define ICON_LOGIN 0xE740 | |||
#define ICON_TRASH 0xE729 | |||
static float minf(float a, float b) { return a < b ? a : b; } | |||
//static float minf(float a, float b) { return a < b ? a : b; } | |||
static float maxf(float a, float b) { return a > b ? a : b; } | |||
static float absf(float a) { return a >= 0.0f ? a : -a; } | |||
//static float absf(float a) { return a >= 0.0f ? a : -a; } | |||
static float clampf(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); } | |||
// Returns 1 if col.rgba is 0.0f,0.0f,0.0f,0.0f, 0 otherwise | |||
@@ -49,6 +49,8 @@ void startGPUTimer(struct GPUtimer* timer) | |||
int stopGPUTimer(struct GPUtimer* timer, float* times, int maxTimes) | |||
{ | |||
NVG_NOTUSED(times); | |||
NVG_NOTUSED(maxTimes); | |||
GLint available = 1; | |||
int n = 0; | |||
if (!timer->supported) | |||
@@ -59,12 +59,14 @@ struct FONSparams { | |||
void (*renderDraw)(void* uptr, const float* verts, const float* tcoords, const unsigned int* colors, int nverts); | |||
void (*renderDelete)(void* uptr); | |||
}; | |||
typedef struct FONSparams FONSparams; | |||
struct FONSquad | |||
{ | |||
float x0,y0,s0,t0; | |||
float x1,y1,s1,t1; | |||
}; | |||
typedef struct FONSquad FONSquad; | |||
struct FONStextIter { | |||
float x, y, nextx, nexty, scale, spacing; | |||
@@ -77,57 +79,60 @@ struct FONStextIter { | |||
const char* end; | |||
unsigned int utf8state; | |||
}; | |||
typedef struct FONStextIter FONStextIter; | |||
typedef struct FONScontext FONScontext; | |||
// Contructor and destructor. | |||
struct FONScontext* fonsCreateInternal(struct FONSparams* params); | |||
void fonsDeleteInternal(struct FONScontext* s); | |||
FONScontext* fonsCreateInternal(FONSparams* params); | |||
void fonsDeleteInternal(FONScontext* s); | |||
void fonsSetErrorCallback(struct FONScontext* s, void (*callback)(void* uptr, int error, int val), void* uptr); | |||
void fonsSetErrorCallback(FONScontext* s, void (*callback)(void* uptr, int error, int val), void* uptr); | |||
// Returns current atlas size. | |||
void fonsGetAtlasSize(struct FONScontext* s, int* width, int* height); | |||
void fonsGetAtlasSize(FONScontext* s, int* width, int* height); | |||
// Expands the atlas size. | |||
int fonsExpandAtlas(struct FONScontext* s, int width, int height); | |||
int fonsExpandAtlas(FONScontext* s, int width, int height); | |||
// Reseta the whole stash. | |||
int fonsResetAtlas(struct FONScontext* stash, int width, int height); | |||
int fonsResetAtlas(FONScontext* stash, int width, int height); | |||
// Add fonts | |||
int fonsAddFont(struct FONScontext* s, const char* name, const char* path); | |||
int fonsAddFontMem(struct FONScontext* s, const char* name, unsigned char* data, int ndata, int freeData); | |||
int fonsGetFontByName(struct FONScontext* s, const char* name); | |||
int fonsAddFont(FONScontext* s, const char* name, const char* path); | |||
int fonsAddFontMem(FONScontext* s, const char* name, unsigned char* data, int ndata, int freeData); | |||
int fonsGetFontByName(FONScontext* s, const char* name); | |||
// State handling | |||
void fonsPushState(struct FONScontext* s); | |||
void fonsPopState(struct FONScontext* s); | |||
void fonsClearState(struct FONScontext* s); | |||
void fonsPushState(FONScontext* s); | |||
void fonsPopState(FONScontext* s); | |||
void fonsClearState(FONScontext* s); | |||
// State setting | |||
void fonsSetSize(struct FONScontext* s, float size); | |||
void fonsSetColor(struct FONScontext* s, unsigned int color); | |||
void fonsSetSpacing(struct FONScontext* s, float spacing); | |||
void fonsSetBlur(struct FONScontext* s, float blur); | |||
void fonsSetAlign(struct FONScontext* s, int align); | |||
void fonsSetFont(struct FONScontext* s, int font); | |||
void fonsSetSize(FONScontext* s, float size); | |||
void fonsSetColor(FONScontext* s, unsigned int color); | |||
void fonsSetSpacing(FONScontext* s, float spacing); | |||
void fonsSetBlur(FONScontext* s, float blur); | |||
void fonsSetAlign(FONScontext* s, int align); | |||
void fonsSetFont(FONScontext* s, int font); | |||
// Draw text | |||
float fonsDrawText(struct FONScontext* s, float x, float y, const char* string, const char* end); | |||
float fonsDrawText(FONScontext* s, float x, float y, const char* string, const char* end); | |||
// Measure text | |||
float fonsTextBounds(struct FONScontext* s, float x, float y, const char* string, const char* end, float* bounds); | |||
void fonsLineBounds(struct FONScontext* s, float y, float* miny, float* maxy); | |||
void fonsVertMetrics(struct FONScontext* s, float* ascender, float* descender, float* lineh); | |||
float fonsTextBounds(FONScontext* s, float x, float y, const char* string, const char* end, float* bounds); | |||
void fonsLineBounds(FONScontext* s, float y, float* miny, float* maxy); | |||
void fonsVertMetrics(FONScontext* s, float* ascender, float* descender, float* lineh); | |||
// Text iterator | |||
int fonsTextIterInit(struct FONScontext* stash, struct FONStextIter* iter, float x, float y, const char* str, const char* end); | |||
int fonsTextIterNext(struct FONScontext* stash, struct FONStextIter* iter, struct FONSquad* quad); | |||
int fonsTextIterInit(FONScontext* stash, FONStextIter* iter, float x, float y, const char* str, const char* end); | |||
int fonsTextIterNext(FONScontext* stash, FONStextIter* iter, struct FONSquad* quad); | |||
// Pull texture changes | |||
const unsigned char* fonsGetTextureData(struct FONScontext* stash, int* width, int* height); | |||
int fonsValidateTexture(struct FONScontext* s, int* dirty); | |||
const unsigned char* fonsGetTextureData(FONScontext* stash, int* width, int* height); | |||
int fonsValidateTexture(FONScontext* s, int* dirty); | |||
// Draws the stash texture for debugging | |||
void fonsDrawDebug(struct FONScontext* s, float x, float y); | |||
void fonsDrawDebug(FONScontext* s, float x, float y); | |||
#endif // FONS_H | |||
#endif // FONTSTASH_H | |||
#ifdef FONTSTASH_IMPLEMENTATION | |||
@@ -144,6 +149,7 @@ void fonsDrawDebug(struct FONScontext* s, float x, float y); | |||
struct FONSttFontImpl { | |||
FT_Face font; | |||
}; | |||
typedef struct FONSttFontImpl FONSttFontImpl; | |||
static FT_Library ftLibrary; | |||
@@ -154,7 +160,7 @@ int fons__tt_init() | |||
return ftError == 0; | |||
} | |||
int fons__tt_loadFont(struct FONScontext *context, struct FONSttFontImpl *font, unsigned char *data, int dataSize) | |||
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize) | |||
{ | |||
FT_Error ftError; | |||
FONS_NOTUSED(context); | |||
@@ -164,24 +170,25 @@ int fons__tt_loadFont(struct FONScontext *context, struct FONSttFontImpl *font, | |||
return ftError == 0; | |||
} | |||
void fons__tt_getFontVMetrics(struct FONSttFontImpl *font, int *ascent, int *descent, int *lineGap) | |||
void fons__tt_getFontVMetrics(FONSttFontImpl *font, int *ascent, int *descent, int *lineGap) | |||
{ | |||
*ascent = font->font->ascender; | |||
*descent = font->font->descender; | |||
*lineGap = font->font->height - (*ascent - *descent); | |||
} | |||
float fons__tt_getPixelHeightScale(struct FONSttFontImpl *font, float size) | |||
float fons__tt_getPixelHeightScale(FONSttFontImpl *font, float size) | |||
{ | |||
return size / (font->font->ascender - font->font->descender); | |||
} | |||
int fons__tt_getGlyphIndex(struct FONSttFontImpl *font, int codepoint) | |||
int fons__tt_getGlyphIndex(FONSttFontImpl *font, int codepoint) | |||
{ | |||
return FT_Get_Char_Index(font->font, codepoint); | |||
} | |||
int fons__tt_buildGlyphBitmap(struct FONSttFontImpl *font, int glyph, float size, float scale, int *advance, int *lsb, int *x0, int *y0, int *x1, int *y1) | |||
int fons__tt_buildGlyphBitmap(FONSttFontImpl *font, int glyph, float size, float scale, | |||
int *advance, int *lsb, int *x0, int *y0, int *x1, int *y1) | |||
{ | |||
FT_Error ftError; | |||
FT_GlyphSlot ftGlyph; | |||
@@ -202,7 +209,8 @@ int fons__tt_buildGlyphBitmap(struct FONSttFontImpl *font, int glyph, float size | |||
return 1; | |||
} | |||
void fons__tt_renderGlyphBitmap(struct FONSttFontImpl *font, unsigned char *output, int outWidth, int outHeight, int outStride, float scaleX, float scaleY, int glyph) | |||
void fons__tt_renderGlyphBitmap(FONSttFontImpl *font, unsigned char *output, int outWidth, int outHeight, int outStride, | |||
float scaleX, float scaleY, int glyph) | |||
{ | |||
FT_GlyphSlot ftGlyph = font->font->glyph; | |||
int ftGlyphOffset = 0; | |||
@@ -220,7 +228,7 @@ void fons__tt_renderGlyphBitmap(struct FONSttFontImpl *font, unsigned char *outp | |||
} | |||
} | |||
int fons__tt_getGlyphKernAdvance(struct FONSttFontImpl *font, int glyph1, int glyph2) | |||
int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2) | |||
{ | |||
FT_Vector ftKerning; | |||
FT_Get_Kerning(font->font, glyph1, glyph2, FT_KERNING_DEFAULT, &ftKerning); | |||
@@ -239,14 +247,15 @@ static void fons__tmpfree(void* ptr, void* up); | |||
struct FONSttFontImpl { | |||
stbtt_fontinfo font; | |||
}; | |||
typedef struct FONSttFontImpl FONSttFontImpl; | |||
int fons__tt_init(struct FONScontext *context) | |||
int fons__tt_init(FONScontext *context) | |||
{ | |||
FONS_NOTUSED(context); | |||
return 1; | |||
} | |||
int fons__tt_loadFont(struct FONScontext *context, struct FONSttFontImpl *font, unsigned char *data, int dataSize) | |||
int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, unsigned char *data, int dataSize) | |||
{ | |||
int stbError; | |||
FONS_NOTUSED(dataSize); | |||
@@ -256,22 +265,23 @@ int fons__tt_loadFont(struct FONScontext *context, struct FONSttFontImpl *font, | |||
return stbError; | |||
} | |||
void fons__tt_getFontVMetrics(struct FONSttFontImpl *font, int *ascent, int *descent, int *lineGap) | |||
void fons__tt_getFontVMetrics(FONSttFontImpl *font, int *ascent, int *descent, int *lineGap) | |||
{ | |||
stbtt_GetFontVMetrics(&font->font, ascent, descent, lineGap); | |||
} | |||
float fons__tt_getPixelHeightScale(struct FONSttFontImpl *font, float size) | |||
float fons__tt_getPixelHeightScale(FONSttFontImpl *font, float size) | |||
{ | |||
return stbtt_ScaleForPixelHeight(&font->font, size); | |||
} | |||
int fons__tt_getGlyphIndex(struct FONSttFontImpl *font, int codepoint) | |||
int fons__tt_getGlyphIndex(FONSttFontImpl *font, int codepoint) | |||
{ | |||
return stbtt_FindGlyphIndex(&font->font, codepoint); | |||
} | |||
int fons__tt_buildGlyphBitmap(struct FONSttFontImpl *font, int glyph, float size, float scale, int *advance, int *lsb, int *x0, int *y0, int *x1, int *y1) | |||
int fons__tt_buildGlyphBitmap(FONSttFontImpl *font, int glyph, float size, float scale, | |||
int *advance, int *lsb, int *x0, int *y0, int *x1, int *y1) | |||
{ | |||
FONS_NOTUSED(size); | |||
stbtt_GetGlyphHMetrics(&font->font, glyph, advance, lsb); | |||
@@ -279,12 +289,13 @@ int fons__tt_buildGlyphBitmap(struct FONSttFontImpl *font, int glyph, float size | |||
return 1; | |||
} | |||
void fons__tt_renderGlyphBitmap(struct FONSttFontImpl *font, unsigned char *output, int outWidth, int outHeight, int outStride, float scaleX, float scaleY, int glyph) | |||
void fons__tt_renderGlyphBitmap(FONSttFontImpl *font, unsigned char *output, int outWidth, int outHeight, int outStride, | |||
float scaleX, float scaleY, int glyph) | |||
{ | |||
stbtt_MakeGlyphBitmap(&font->font, output, outWidth, outHeight, outStride, scaleX, scaleY, glyph); | |||
} | |||
int fons__tt_getGlyphKernAdvance(struct FONSttFontImpl *font, int glyph1, int glyph2) | |||
int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2) | |||
{ | |||
return stbtt_GetGlyphKernAdvance(&font->font, glyph1, glyph2); | |||
} | |||
@@ -343,10 +354,11 @@ struct FONSglyph | |||
short x0,y0,x1,y1; | |||
short xadv,xoff,yoff; | |||
}; | |||
typedef struct FONSglyph FONSglyph; | |||
struct FONSfont | |||
{ | |||
struct FONSttFontImpl font; | |||
FONSttFontImpl font; | |||
char name[64]; | |||
unsigned char* data; | |||
int dataSize; | |||
@@ -354,11 +366,12 @@ struct FONSfont | |||
float ascender; | |||
float descender; | |||
float lineh; | |||
struct FONSglyph* glyphs; | |||
FONSglyph* glyphs; | |||
int cglyphs; | |||
int nglyphs; | |||
int lut[FONS_HASH_LUT_SIZE]; | |||
}; | |||
typedef struct FONSfont FONSfont; | |||
struct FONSstate | |||
{ | |||
@@ -369,27 +382,30 @@ struct FONSstate | |||
float blur; | |||
float spacing; | |||
}; | |||
typedef struct FONSstate FONSstate; | |||
struct FONSatlasNode { | |||
short x, y, width; | |||
}; | |||
typedef struct FONSatlasNode FONSatlasNode; | |||
struct FONSatlas | |||
{ | |||
int width, height; | |||
struct FONSatlasNode* nodes; | |||
FONSatlasNode* nodes; | |||
int nnodes; | |||
int cnodes; | |||
}; | |||
typedef struct FONSatlas FONSatlas; | |||
struct FONScontext | |||
{ | |||
struct FONSparams params; | |||
FONSparams params; | |||
float itw,ith; | |||
unsigned char* texData; | |||
int dirtyRect[4]; | |||
struct FONSfont** fonts; | |||
struct FONSatlas* atlas; | |||
FONSfont** fonts; | |||
FONSatlas* atlas; | |||
int cfonts; | |||
int nfonts; | |||
float verts[FONS_VERTEX_COUNT*2]; | |||
@@ -398,7 +414,7 @@ struct FONScontext | |||
int nverts; | |||
unsigned char* scratch; | |||
int nscratch; | |||
struct FONSstate states[FONS_MAX_STATES]; | |||
FONSstate states[FONS_MAX_STATES]; | |||
int nstates; | |||
void (*handleError)(void* uptr, int error, int val); | |||
void* errorUptr; | |||
@@ -407,7 +423,7 @@ struct FONScontext | |||
static void* fons__tmpalloc(size_t size, void* up) | |||
{ | |||
unsigned char* ptr; | |||
struct FONScontext* stash = (struct FONScontext*)up; | |||
FONScontext* stash = (FONScontext*)up; | |||
// 16-byte align the returned pointer | |||
size = (size + 0xf) & ~0xf; | |||
@@ -470,29 +486,29 @@ static unsigned int fons__decutf8(unsigned int* state, unsigned int* codep, unsi | |||
// Atlas based on Skyline Bin Packer by Jukka Jylänki | |||
static void fons__deleteAtlas(struct FONSatlas* atlas) | |||
static void fons__deleteAtlas(FONSatlas* atlas) | |||
{ | |||
if (atlas == NULL) return; | |||
if (atlas->nodes != NULL) free(atlas->nodes); | |||
free(atlas); | |||
} | |||
static struct FONSatlas* fons__allocAtlas(int w, int h, int nnodes) | |||
static FONSatlas* fons__allocAtlas(int w, int h, int nnodes) | |||
{ | |||
struct FONSatlas* atlas = NULL; | |||
FONSatlas* atlas = NULL; | |||
// Allocate memory for the font stash. | |||
atlas = (struct FONSatlas*)malloc(sizeof(struct FONSatlas)); | |||
atlas = (FONSatlas*)malloc(sizeof(FONSatlas)); | |||
if (atlas == NULL) goto error; | |||
memset(atlas, 0, sizeof(struct FONSatlas)); | |||
memset(atlas, 0, sizeof(FONSatlas)); | |||
atlas->width = w; | |||
atlas->height = h; | |||
// Allocate space for skyline nodes | |||
atlas->nodes = (struct FONSatlasNode*)malloc(sizeof(struct FONSatlasNode) * nnodes); | |||
atlas->nodes = (FONSatlasNode*)malloc(sizeof(FONSatlasNode) * nnodes); | |||
if (atlas->nodes == NULL) goto error; | |||
memset(atlas->nodes, 0, sizeof(struct FONSatlasNode) * nnodes); | |||
memset(atlas->nodes, 0, sizeof(FONSatlasNode) * nnodes); | |||
atlas->nnodes = 0; | |||
atlas->cnodes = nnodes; | |||
@@ -509,13 +525,13 @@ error: | |||
return NULL; | |||
} | |||
static int fons__atlasInsertNode(struct FONSatlas* atlas, int idx, int x, int y, int w) | |||
static int fons__atlasInsertNode(FONSatlas* atlas, int idx, int x, int y, int w) | |||
{ | |||
int i; | |||
// Insert node | |||
if (atlas->nnodes+1 > atlas->cnodes) { | |||
atlas->cnodes = atlas->cnodes == 0 ? 8 : atlas->cnodes * 2; | |||
atlas->nodes = (struct FONSatlasNode*)realloc(atlas->nodes, sizeof(struct FONSatlasNode) * atlas->cnodes); | |||
atlas->nodes = (FONSatlasNode*)realloc(atlas->nodes, sizeof(FONSatlasNode) * atlas->cnodes); | |||
if (atlas->nodes == NULL) | |||
return 0; | |||
} | |||
@@ -529,7 +545,7 @@ static int fons__atlasInsertNode(struct FONSatlas* atlas, int idx, int x, int y, | |||
return 1; | |||
} | |||
static void fons__atlasRemoveNode(struct FONSatlas* atlas, int idx) | |||
static void fons__atlasRemoveNode(FONSatlas* atlas, int idx) | |||
{ | |||
int i; | |||
if (atlas->nnodes == 0) return; | |||
@@ -538,7 +554,7 @@ static void fons__atlasRemoveNode(struct FONSatlas* atlas, int idx) | |||
atlas->nnodes--; | |||
} | |||
static void fons__atlasExpand(struct FONSatlas* atlas, int w, int h) | |||
static void fons__atlasExpand(FONSatlas* atlas, int w, int h) | |||
{ | |||
// Insert node for empty space | |||
if (w > atlas->width) | |||
@@ -547,7 +563,7 @@ static void fons__atlasExpand(struct FONSatlas* atlas, int w, int h) | |||
atlas->height = h; | |||
} | |||
static void fons__atlasReset(struct FONSatlas* atlas, int w, int h) | |||
static void fons__atlasReset(FONSatlas* atlas, int w, int h) | |||
{ | |||
atlas->width = w; | |||
atlas->height = h; | |||
@@ -560,7 +576,7 @@ static void fons__atlasReset(struct FONSatlas* atlas, int w, int h) | |||
atlas->nnodes++; | |||
} | |||
static int fons__atlasAddSkylineLevel(struct FONSatlas* atlas, int idx, int x, int y, int w, int h) | |||
static int fons__atlasAddSkylineLevel(FONSatlas* atlas, int idx, int x, int y, int w, int h) | |||
{ | |||
int i; | |||
@@ -597,7 +613,7 @@ static int fons__atlasAddSkylineLevel(struct FONSatlas* atlas, int idx, int x, i | |||
return 1; | |||
} | |||
static int fons__atlasRectFits(struct FONSatlas* atlas, int i, int w, int h) | |||
static int fons__atlasRectFits(FONSatlas* atlas, int i, int w, int h) | |||
{ | |||
// Checks if there is enough space at the location of skyline span 'i', | |||
// and return the max height of all skyline spans under that at that location, | |||
@@ -618,7 +634,7 @@ static int fons__atlasRectFits(struct FONSatlas* atlas, int i, int w, int h) | |||
return y; | |||
} | |||
static int fons__atlasAddRect(struct FONSatlas* atlas, int rw, int rh, int* rx, int* ry) | |||
static int fons__atlasAddRect(FONSatlas* atlas, int rw, int rh, int* rx, int* ry) | |||
{ | |||
int besth = atlas->height, bestw = atlas->width, besti = -1; | |||
int bestx = -1, besty = -1, i; | |||
@@ -650,7 +666,7 @@ static int fons__atlasAddRect(struct FONSatlas* atlas, int rw, int rh, int* rx, | |||
return 1; | |||
} | |||
static void fons__addWhiteRect(struct FONScontext* stash, int w, int h) | |||
static void fons__addWhiteRect(FONScontext* stash, int w, int h) | |||
{ | |||
int x, y, gx, gy; | |||
unsigned char* dst; | |||
@@ -671,14 +687,14 @@ static void fons__addWhiteRect(struct FONScontext* stash, int w, int h) | |||
stash->dirtyRect[3] = fons__maxi(stash->dirtyRect[3], gy+h); | |||
} | |||
struct FONScontext* fonsCreateInternal(struct FONSparams* params) | |||
FONScontext* fonsCreateInternal(FONSparams* params) | |||
{ | |||
struct FONScontext* stash = NULL; | |||
FONScontext* stash = NULL; | |||
// Allocate memory for the font stash. | |||
stash = (struct FONScontext*)malloc(sizeof(struct FONScontext)); | |||
stash = (FONScontext*)malloc(sizeof(FONScontext)); | |||
if (stash == NULL) goto error; | |||
memset(stash, 0, sizeof(struct FONScontext)); | |||
memset(stash, 0, sizeof(FONScontext)); | |||
stash->params = *params; | |||
@@ -698,9 +714,9 @@ struct FONScontext* fonsCreateInternal(struct FONSparams* params) | |||
if (stash->atlas == NULL) goto error; | |||
// Allocate space for fonts. | |||
stash->fonts = (struct FONSfont**)malloc(sizeof(struct FONSfont*) * FONS_INIT_FONTS); | |||
stash->fonts = (FONSfont**)malloc(sizeof(FONSfont*) * FONS_INIT_FONTS); | |||
if (stash->fonts == NULL) goto error; | |||
memset(stash->fonts, 0, sizeof(struct FONSfont*) * FONS_INIT_FONTS); | |||
memset(stash->fonts, 0, sizeof(FONSfont*) * FONS_INIT_FONTS); | |||
stash->cfonts = FONS_INIT_FONTS; | |||
stash->nfonts = 0; | |||
@@ -729,42 +745,42 @@ error: | |||
return NULL; | |||
} | |||
static struct FONSstate* fons__getState(struct FONScontext* stash) | |||
static FONSstate* fons__getState(FONScontext* stash) | |||
{ | |||
return &stash->states[stash->nstates-1]; | |||
} | |||
void fonsSetSize(struct FONScontext* stash, float size) | |||
void fonsSetSize(FONScontext* stash, float size) | |||
{ | |||
fons__getState(stash)->size = size; | |||
} | |||
void fonsSetColor(struct FONScontext* stash, unsigned int color) | |||
void fonsSetColor(FONScontext* stash, unsigned int color) | |||
{ | |||
fons__getState(stash)->color = color; | |||
} | |||
void fonsSetSpacing(struct FONScontext* stash, float spacing) | |||
void fonsSetSpacing(FONScontext* stash, float spacing) | |||
{ | |||
fons__getState(stash)->spacing = spacing; | |||
} | |||
void fonsSetBlur(struct FONScontext* stash, float blur) | |||
void fonsSetBlur(FONScontext* stash, float blur) | |||
{ | |||
fons__getState(stash)->blur = blur; | |||
} | |||
void fonsSetAlign(struct FONScontext* stash, int align) | |||
void fonsSetAlign(FONScontext* stash, int align) | |||
{ | |||
fons__getState(stash)->align = align; | |||
} | |||
void fonsSetFont(struct FONScontext* stash, int font) | |||
void fonsSetFont(FONScontext* stash, int font) | |||
{ | |||
fons__getState(stash)->font = font; | |||
} | |||
void fonsPushState(struct FONScontext* stash) | |||
void fonsPushState(FONScontext* stash) | |||
{ | |||
if (stash->nstates >= FONS_MAX_STATES) { | |||
if (stash->handleError) | |||
@@ -772,11 +788,11 @@ void fonsPushState(struct FONScontext* stash) | |||
return; | |||
} | |||
if (stash->nstates > 0) | |||
memcpy(&stash->states[stash->nstates], &stash->states[stash->nstates-1], sizeof(struct FONSstate)); | |||
memcpy(&stash->states[stash->nstates], &stash->states[stash->nstates-1], sizeof(FONSstate)); | |||
stash->nstates++; | |||
} | |||
void fonsPopState(struct FONScontext* stash) | |||
void fonsPopState(FONScontext* stash) | |||
{ | |||
if (stash->nstates <= 1) { | |||
if (stash->handleError) | |||
@@ -786,9 +802,9 @@ void fonsPopState(struct FONScontext* stash) | |||
stash->nstates--; | |||
} | |||
void fonsClearState(struct FONScontext* stash) | |||
void fonsClearState(FONScontext* stash) | |||
{ | |||
struct FONSstate* state = fons__getState(stash); | |||
FONSstate* state = fons__getState(stash); | |||
state->size = 12.0f; | |||
state->color = 0xffffffff; | |||
state->font = 0; | |||
@@ -797,7 +813,7 @@ void fonsClearState(struct FONScontext* stash) | |||
state->align = FONS_ALIGN_LEFT | FONS_ALIGN_BASELINE; | |||
} | |||
static void fons__freeFont(struct FONSfont* font) | |||
static void fons__freeFont(FONSfont* font) | |||
{ | |||
if (font == NULL) return; | |||
if (font->glyphs) free(font->glyphs); | |||
@@ -805,20 +821,20 @@ static void fons__freeFont(struct FONSfont* font) | |||
free(font); | |||
} | |||
static int fons__allocFont(struct FONScontext* stash) | |||
static int fons__allocFont(FONScontext* stash) | |||
{ | |||
struct FONSfont* font = NULL; | |||
FONSfont* font = NULL; | |||
if (stash->nfonts+1 > stash->cfonts) { | |||
stash->cfonts = stash->cfonts == 0 ? 8 : stash->cfonts * 2; | |||
stash->fonts = (struct FONSfont**)realloc(stash->fonts, sizeof(struct FONSfont*) * stash->cfonts); | |||
stash->fonts = (FONSfont**)realloc(stash->fonts, sizeof(FONSfont*) * stash->cfonts); | |||
if (stash->fonts == NULL) | |||
return -1; | |||
} | |||
font = (struct FONSfont*)malloc(sizeof(struct FONSfont)); | |||
font = (FONSfont*)malloc(sizeof(FONSfont)); | |||
if (font == NULL) goto error; | |||
memset(font, 0, sizeof(struct FONSfont)); | |||
memset(font, 0, sizeof(FONSfont)); | |||
font->glyphs = (struct FONSglyph*)malloc(sizeof(struct FONSglyph) * FONS_INIT_GLYPHS); | |||
font->glyphs = (FONSglyph*)malloc(sizeof(FONSglyph) * FONS_INIT_GLYPHS); | |||
if (font->glyphs == NULL) goto error; | |||
font->cglyphs = FONS_INIT_GLYPHS; | |||
font->nglyphs = 0; | |||
@@ -832,7 +848,7 @@ error: | |||
return FONS_INVALID; | |||
} | |||
int fonsAddFont(struct FONScontext* stash, const char* name, const char* path) | |||
int fonsAddFont(FONScontext* stash, const char* name, const char* path) | |||
{ | |||
FILE* fp = 0; | |||
int dataSize = 0; | |||
@@ -858,10 +874,10 @@ error: | |||
return FONS_INVALID; | |||
} | |||
int fonsAddFontMem(struct FONScontext* stash, const char* name, unsigned char* data, int dataSize, int freeData) | |||
int fonsAddFontMem(FONScontext* stash, const char* name, unsigned char* data, int dataSize, int freeData) | |||
{ | |||
int i, ascent, descent, fh, lineGap; | |||
struct FONSfont* font; | |||
FONSfont* font; | |||
int idx = fons__allocFont(stash); | |||
if (idx == FONS_INVALID) | |||
@@ -901,7 +917,7 @@ error: | |||
return FONS_INVALID; | |||
} | |||
int fonsGetFontByName(struct FONScontext* s, const char* name) | |||
int fonsGetFontByName(FONScontext* s, const char* name) | |||
{ | |||
int i; | |||
for (i = 0; i < s->nfonts; i++) { | |||
@@ -912,11 +928,11 @@ int fonsGetFontByName(struct FONScontext* s, const char* name) | |||
} | |||
static struct FONSglyph* fons__allocGlyph(struct FONSfont* font) | |||
static FONSglyph* fons__allocGlyph(FONSfont* font) | |||
{ | |||
if (font->nglyphs+1 > font->cglyphs) { | |||
font->cglyphs = font->cglyphs == 0 ? 8 : font->cglyphs * 2; | |||
font->glyphs = (struct FONSglyph*)realloc(font->glyphs, sizeof(struct FONSglyph) * font->cglyphs); | |||
font->glyphs = (FONSglyph*)realloc(font->glyphs, sizeof(FONSglyph) * font->cglyphs); | |||
if (font->glyphs == NULL) return NULL; | |||
} | |||
font->nglyphs++; | |||
@@ -970,7 +986,7 @@ static void fons__blurRows(unsigned char* dst, int w, int h, int dstStride, int | |||
} | |||
static void fons__blur(struct FONScontext* stash, unsigned char* dst, int w, int h, int dstStride, int blur) | |||
static void fons__blur(FONScontext* stash, unsigned char* dst, int w, int h, int dstStride, int blur) | |||
{ | |||
int alpha; | |||
float sigma; | |||
@@ -989,12 +1005,12 @@ static void fons__blur(struct FONScontext* stash, unsigned char* dst, int w, int | |||
// fons__blurcols(dst, w, h, dstStride, alpha); | |||
} | |||
static struct FONSglyph* fons__getGlyph(struct FONScontext* stash, struct FONSfont* font, unsigned int codepoint, | |||
short isize, short iblur) | |||
static FONSglyph* fons__getGlyph(FONScontext* stash, FONSfont* font, unsigned int codepoint, | |||
short isize, short iblur) | |||
{ | |||
int i, g, advance, lsb, x0, y0, x1, y1, gw, gh, gx, gy, x, y; | |||
float scale; | |||
struct FONSglyph* glyph = NULL; | |||
FONSglyph* glyph = NULL; | |||
unsigned int h; | |||
float size = isize/10.0f; | |||
int pad, added; | |||
@@ -1092,9 +1108,9 @@ static struct FONSglyph* fons__getGlyph(struct FONScontext* stash, struct FONSfo | |||
return glyph; | |||
} | |||
static void fons__getQuad(struct FONScontext* stash, struct FONSfont* font, | |||
int prevGlyphIndex, struct FONSglyph* glyph, | |||
float scale, float spacing, float* x, float* y, struct FONSquad* q) | |||
static void fons__getQuad(FONScontext* stash, FONSfont* font, | |||
int prevGlyphIndex, FONSglyph* glyph, | |||
float scale, float spacing, float* x, float* y, FONSquad* q) | |||
{ | |||
float rx,ry,xoff,yoff,x0,y0,x1,y1; | |||
@@ -1144,7 +1160,7 @@ static void fons__getQuad(struct FONScontext* stash, struct FONSfont* font, | |||
*x += (int)(glyph->xadv / 10.0f + 0.5f); | |||
} | |||
static void fons__flush(struct FONScontext* stash) | |||
static void fons__flush(FONScontext* stash) | |||
{ | |||
// Flush texture | |||
if (stash->dirtyRect[0] < stash->dirtyRect[2] && stash->dirtyRect[1] < stash->dirtyRect[3]) { | |||
@@ -1165,7 +1181,7 @@ static void fons__flush(struct FONScontext* stash) | |||
} | |||
} | |||
static __inline void fons__vertex(struct FONScontext* stash, float x, float y, float s, float t, unsigned int c) | |||
static __inline void fons__vertex(FONScontext* stash, float x, float y, float s, float t, unsigned int c) | |||
{ | |||
stash->verts[stash->nverts*2+0] = x; | |||
stash->verts[stash->nverts*2+1] = y; | |||
@@ -1175,7 +1191,7 @@ static __inline void fons__vertex(struct FONScontext* stash, float x, float y, f | |||
stash->nverts++; | |||
} | |||
static float fons__getVertAlign(struct FONScontext* stash, struct FONSfont* font, int align, short isize) | |||
static float fons__getVertAlign(FONScontext* stash, FONSfont* font, int align, short isize) | |||
{ | |||
if (stash->params.flags & FONS_ZERO_TOPLEFT) { | |||
if (align & FONS_ALIGN_TOP) { | |||
@@ -1201,20 +1217,20 @@ static float fons__getVertAlign(struct FONScontext* stash, struct FONSfont* font | |||
return 0.0; | |||
} | |||
float fonsDrawText(struct FONScontext* stash, | |||
float fonsDrawText(FONScontext* stash, | |||
float x, float y, | |||
const char* str, const char* end) | |||
{ | |||
struct FONSstate* state = fons__getState(stash); | |||
FONSstate* state = fons__getState(stash); | |||
unsigned int codepoint; | |||
unsigned int utf8state = 0; | |||
struct FONSglyph* glyph = NULL; | |||
struct FONSquad q; | |||
FONSglyph* glyph = NULL; | |||
FONSquad q; | |||
int prevGlyphIndex = -1; | |||
short isize = (short)(state->size*10.0f); | |||
short iblur = (short)state->blur; | |||
float scale; | |||
struct FONSfont* font; | |||
FONSfont* font; | |||
float width; | |||
if (stash == NULL) return x; | |||
@@ -1265,10 +1281,10 @@ float fonsDrawText(struct FONScontext* stash, | |||
return x; | |||
} | |||
int fonsTextIterInit(struct FONScontext* stash, struct FONStextIter* iter, | |||
int fonsTextIterInit(FONScontext* stash, FONStextIter* iter, | |||
float x, float y, const char* str, const char* end) | |||
{ | |||
struct FONSstate* state = fons__getState(stash); | |||
FONSstate* state = fons__getState(stash); | |||
float width; | |||
memset(iter, 0, sizeof(*iter)); | |||
@@ -1310,9 +1326,9 @@ int fonsTextIterInit(struct FONScontext* stash, struct FONStextIter* iter, | |||
return 1; | |||
} | |||
int fonsTextIterNext(struct FONScontext* stash, struct FONStextIter* iter, struct FONSquad* quad) | |||
int fonsTextIterNext(FONScontext* stash, FONStextIter* iter, FONSquad* quad) | |||
{ | |||
struct FONSglyph* glyph = NULL; | |||
FONSglyph* glyph = NULL; | |||
const char* str = iter->next; | |||
iter->str = iter->next; | |||
@@ -1337,7 +1353,7 @@ int fonsTextIterNext(struct FONScontext* stash, struct FONStextIter* iter, struc | |||
return 1; | |||
} | |||
void fonsDrawDebug(struct FONScontext* stash, float x, float y) | |||
void fonsDrawDebug(FONScontext* stash, float x, float y) | |||
{ | |||
int i; | |||
int w = stash->params.width; | |||
@@ -1368,7 +1384,7 @@ void fonsDrawDebug(struct FONScontext* stash, float x, float y) | |||
// Drawbug draw atlas | |||
for (i = 0; i < stash->atlas->nnodes; i++) { | |||
struct FONSatlasNode* n = &stash->atlas->nodes[i]; | |||
FONSatlasNode* n = &stash->atlas->nodes[i]; | |||
if (stash->nverts+6 > FONS_VERTEX_COUNT) | |||
fons__flush(stash); | |||
@@ -1385,21 +1401,21 @@ void fonsDrawDebug(struct FONScontext* stash, float x, float y) | |||
fons__flush(stash); | |||
} | |||
float fonsTextBounds(struct FONScontext* stash, | |||
float fonsTextBounds(FONScontext* stash, | |||
float x, float y, | |||
const char* str, const char* end, | |||
float* bounds) | |||
{ | |||
struct FONSstate* state = fons__getState(stash); | |||
FONSstate* state = fons__getState(stash); | |||
unsigned int codepoint; | |||
unsigned int utf8state = 0; | |||
struct FONSquad q; | |||
struct FONSglyph* glyph = NULL; | |||
FONSquad q; | |||
FONSglyph* glyph = NULL; | |||
int prevGlyphIndex = -1; | |||
short isize = (short)(state->size*10.0f); | |||
short iblur = (short)state->blur; | |||
float scale; | |||
struct FONSfont* font; | |||
FONSfont* font; | |||
float startx, advance; | |||
float minx, miny, maxx, maxy; | |||
@@ -1462,11 +1478,11 @@ float fonsTextBounds(struct FONScontext* stash, | |||
return advance; | |||
} | |||
void fonsVertMetrics(struct FONScontext* stash, | |||
void fonsVertMetrics(FONScontext* stash, | |||
float* ascender, float* descender, float* lineh) | |||
{ | |||
struct FONSfont* font; | |||
struct FONSstate* state = fons__getState(stash); | |||
FONSfont* font; | |||
FONSstate* state = fons__getState(stash); | |||
short isize; | |||
if (stash == NULL) return; | |||
@@ -1483,10 +1499,10 @@ void fonsVertMetrics(struct FONScontext* stash, | |||
*lineh = font->lineh*isize/10.0f; | |||
} | |||
void fonsLineBounds(struct FONScontext* stash, float y, float* miny, float* maxy) | |||
void fonsLineBounds(FONScontext* stash, float y, float* miny, float* maxy) | |||
{ | |||
struct FONSfont* font; | |||
struct FONSstate* state = fons__getState(stash); | |||
FONSfont* font; | |||
FONSstate* state = fons__getState(stash); | |||
short isize; | |||
if (stash == NULL) return; | |||
@@ -1506,7 +1522,7 @@ void fonsLineBounds(struct FONScontext* stash, float y, float* miny, float* maxy | |||
} | |||
} | |||
const unsigned char* fonsGetTextureData(struct FONScontext* stash, int* width, int* height) | |||
const unsigned char* fonsGetTextureData(FONScontext* stash, int* width, int* height) | |||
{ | |||
if (width != NULL) | |||
*width = stash->params.width; | |||
@@ -1515,7 +1531,7 @@ const unsigned char* fonsGetTextureData(struct FONScontext* stash, int* width, i | |||
return stash->texData; | |||
} | |||
int fonsValidateTexture(struct FONScontext* stash, int* dirty) | |||
int fonsValidateTexture(FONScontext* stash, int* dirty) | |||
{ | |||
if (stash->dirtyRect[0] < stash->dirtyRect[2] && stash->dirtyRect[1] < stash->dirtyRect[3]) { | |||
dirty[0] = stash->dirtyRect[0]; | |||
@@ -1532,7 +1548,7 @@ int fonsValidateTexture(struct FONScontext* stash, int* dirty) | |||
return 0; | |||
} | |||
void fonsDeleteInternal(struct FONScontext* stash) | |||
void fonsDeleteInternal(FONScontext* stash) | |||
{ | |||
int i; | |||
if (stash == NULL) return; | |||
@@ -1550,21 +1566,21 @@ void fonsDeleteInternal(struct FONScontext* stash) | |||
free(stash); | |||
} | |||
void fonsSetErrorCallback(struct FONScontext* stash, void (*callback)(void* uptr, int error, int val), void* uptr) | |||
void fonsSetErrorCallback(FONScontext* stash, void (*callback)(void* uptr, int error, int val), void* uptr) | |||
{ | |||
if (stash == NULL) return; | |||
stash->handleError = callback; | |||
stash->errorUptr = uptr; | |||
} | |||
void fonsGetAtlasSize(struct FONScontext* stash, int* width, int* height) | |||
void fonsGetAtlasSize(FONScontext* stash, int* width, int* height) | |||
{ | |||
if (stash == NULL) return; | |||
*width = stash->params.width; | |||
*height = stash->params.height; | |||
} | |||
int fonsExpandAtlas(struct FONScontext* stash, int width, int height) | |||
int fonsExpandAtlas(FONScontext* stash, int width, int height) | |||
{ | |||
int i, maxy = 0; | |||
unsigned char* data = NULL; | |||
@@ -1620,7 +1636,7 @@ int fonsExpandAtlas(struct FONScontext* stash, int width, int height) | |||
return 1; | |||
} | |||
int fonsResetAtlas(struct FONScontext* stash, int width, int height) | |||
int fonsResetAtlas(FONScontext* stash, int width, int height) | |||
{ | |||
int i, j; | |||
if (stash == NULL) return 0; | |||
@@ -1650,7 +1666,7 @@ int fonsResetAtlas(struct FONScontext* stash, int width, int height) | |||
// Reset cached glyphs | |||
for (i = 0; i < stash->nfonts; i++) { | |||
struct FONSfont* font = stash->fonts[i]; | |||
FONSfont* font = stash->fonts[i]; | |||
font->nglyphs = 0; | |||
for (j = 0; j < FONS_HASH_LUT_SIZE; j++) | |||
font->lut[j] = -1; | |||
@@ -30,7 +30,7 @@ extern "C" { | |||
#pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union | |||
#endif | |||
struct NVGcontext; | |||
typedef struct NVGcontext NVGcontext; | |||
struct NVGcolor { | |||
union { | |||
@@ -40,17 +40,19 @@ struct NVGcolor { | |||
}; | |||
}; | |||
}; | |||
typedef struct NVGcolor NVGcolor; | |||
struct NVGpaint { | |||
float xform[6]; | |||
float extent[2]; | |||
float radius; | |||
float feather; | |||
struct NVGcolor innerColor; | |||
struct NVGcolor outerColor; | |||
NVGcolor innerColor; | |||
NVGcolor outerColor; | |||
int image; | |||
int repeat; | |||
}; | |||
typedef struct NVGpaint NVGpaint; | |||
enum NVGwinding { | |||
NVG_CCW = 1, // Winding for solid shapes | |||
@@ -93,6 +95,7 @@ struct NVGglyphPosition { | |||
float x; // The x-coordinate of the logical glyph position. | |||
float minx, maxx; // The bounds of the glyph shape. | |||
}; | |||
typedef struct NVGglyphPosition NVGglyphPosition; | |||
struct NVGtextRow { | |||
const char* start; // Pointer to the input text where the row starts. | |||
@@ -101,6 +104,7 @@ struct NVGtextRow { | |||
float width; // Logical width of the row. | |||
float minx, maxx; // Actual bounds of the row. Logical with and bounds can differ because of kerning and some parts over extending. | |||
}; | |||
typedef struct NVGtextRow NVGtextRow; | |||
enum NVGimage { | |||
NVG_IMAGE_GENERATE_MIPMAPS = 1 << 0 // Generate mipmaps during creation of the image. | |||
@@ -114,10 +118,10 @@ enum NVGimage { | |||
// For example, GLFW returns two dimension for an opened window: window size and | |||
// frame buffer size. In that case you would set windowWidth/Height to the window size | |||
// devicePixelRatio to: frameBufferWidth / windowWidth. | |||
void nvgBeginFrame(struct NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio); | |||
void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio); | |||
// Ends drawing flushing remaining render state. | |||
void nvgEndFrame(struct NVGcontext* ctx); | |||
void nvgEndFrame(NVGcontext* ctx); | |||
// | |||
// Color utils | |||
@@ -125,35 +129,35 @@ void nvgEndFrame(struct NVGcontext* ctx); | |||
// Colors in NanoVG are stored as unsigned ints in ABGR format. | |||
// Returns a color value from red, green, blue values. Alpha will be set to 255 (1.0f). | |||
struct NVGcolor nvgRGB(unsigned char r, unsigned char g, unsigned char b); | |||
NVGcolor nvgRGB(unsigned char r, unsigned char g, unsigned char b); | |||
// Returns a color value from red, green, blue values. Alpha will be set to 1.0f. | |||
struct NVGcolor nvgRGBf(float r, float g, float b); | |||
NVGcolor nvgRGBf(float r, float g, float b); | |||
// Returns a color value from red, green, blue and alpha values. | |||
struct NVGcolor nvgRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a); | |||
NVGcolor nvgRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a); | |||
// Returns a color value from red, green, blue and alpha values. | |||
struct NVGcolor nvgRGBAf(float r, float g, float b, float a); | |||
NVGcolor nvgRGBAf(float r, float g, float b, float a); | |||
// Linearly interpoaltes from color c0 to c1, and returns resulting color value. | |||
struct NVGcolor nvgLerpRGBA(struct NVGcolor c0, struct NVGcolor c1, float u); | |||
NVGcolor nvgLerpRGBA(NVGcolor c0, NVGcolor c1, float u); | |||
// Sets transparency of a color value. | |||
struct NVGcolor nvgTransRGBA(struct NVGcolor c0, unsigned char a); | |||
NVGcolor nvgTransRGBA(NVGcolor c0, unsigned char a); | |||
// Sets transparency of a color value. | |||
struct NVGcolor nvgTransRGBAf(struct NVGcolor c0, float a); | |||
NVGcolor nvgTransRGBAf(NVGcolor c0, float a); | |||
// Returns color value specified by hue, saturation and lightness. | |||
// HSL values are all in range [0..1], alpha will be set to 255. | |||
struct NVGcolor nvgHSL(float h, float s, float l); | |||
NVGcolor nvgHSL(float h, float s, float l); | |||
// Returns color value specified by hue, saturation and lightness and alpha. | |||
// HSL values are all in range [0..1], alpha in range [0..255] | |||
struct NVGcolor nvgHSLA(float h, float s, float l, unsigned char a); | |||
NVGcolor nvgHSLA(float h, float s, float l, unsigned char a); | |||
// | |||
// State Handling | |||
@@ -164,13 +168,13 @@ struct NVGcolor nvgHSLA(float h, float s, float l, unsigned char a); | |||
// Pushes and saves the current render state into a state stack. | |||
// A matching nvgRestore() must be used to restore the state. | |||
void nvgSave(struct NVGcontext* ctx); | |||
void nvgSave(NVGcontext* ctx); | |||
// Pops and restores current render state. | |||
void nvgRestore(struct NVGcontext* ctx); | |||
void nvgRestore(NVGcontext* ctx); | |||
// Resets current render state to default values. Does not affect the render state stack. | |||
void nvgReset(struct NVGcontext* ctx); | |||
void nvgReset(NVGcontext* ctx); | |||
// | |||
// Render styles | |||
@@ -182,35 +186,35 @@ void nvgReset(struct NVGcontext* ctx); | |||
// Current render style can be saved and restored using nvgSave() and nvgRestore(). | |||
// Sets current stroke style to a solid color. | |||
void nvgStrokeColor(struct NVGcontext* ctx, struct NVGcolor color); | |||
void nvgStrokeColor(NVGcontext* ctx, NVGcolor color); | |||
// Sets current stroke style to a paint, which can be a one of the gradients or a pattern. | |||
void nvgStrokePaint(struct NVGcontext* ctx, struct NVGpaint paint); | |||
void nvgStrokePaint(NVGcontext* ctx, NVGpaint paint); | |||
// Sets current fill cstyle to a solid color. | |||
void nvgFillColor(struct NVGcontext* ctx, struct NVGcolor color); | |||
void nvgFillColor(NVGcontext* ctx, NVGcolor color); | |||
// Sets current fill style to a paint, which can be a one of the gradients or a pattern. | |||
void nvgFillPaint(struct NVGcontext* ctx, struct NVGpaint paint); | |||
void nvgFillPaint(NVGcontext* ctx, NVGpaint paint); | |||
// Sets the miter limit of the stroke style. | |||
// Miter limit controls when a sharp corner is beveled. | |||
void nvgMiterLimit(struct NVGcontext* ctx, float limit); | |||
void nvgMiterLimit(NVGcontext* ctx, float limit); | |||
// Sets the stroke witdth of the stroke style. | |||
void nvgStrokeWidth(struct NVGcontext* ctx, float size); | |||
void nvgStrokeWidth(NVGcontext* ctx, float size); | |||
// Sets how the end of the line (cap) is drawn, | |||
// Can be one of: NVG_BUTT (default), NVG_ROUND, NVG_SQUARE. | |||
void nvgLineCap(struct NVGcontext* ctx, int cap); | |||
void nvgLineCap(NVGcontext* ctx, int cap); | |||
// Sets how sharp path corners are drawn. | |||
// Can be one of NVG_MITER (default), NVG_ROUND, NVG_BEVEL. | |||
void nvgLineJoin(struct NVGcontext* ctx, int join); | |||
void nvgLineJoin(NVGcontext* ctx, int join); | |||
// Sets the transparency applied to all rendered shapes. | |||
// Alreade transparent paths will get proportionally more transparent as well. | |||
void nvgGlobalAlpha(struct NVGcontext* ctx, float alpha); | |||
void nvgGlobalAlpha(NVGcontext* ctx, float alpha); | |||
// | |||
// Transforms | |||
@@ -230,36 +234,36 @@ void nvgGlobalAlpha(struct NVGcontext* ctx, float alpha); | |||
// Current coordinate system (transformation) can be saved and restored using nvgSave() and nvgRestore(). | |||
// Resets current transform to a identity matrix. | |||
void nvgResetTransform(struct NVGcontext* ctx); | |||
void nvgResetTransform(NVGcontext* ctx); | |||
// Premultiplies current coordinate system by specified matrix. | |||
// The parameters are interpreted as matrix as follows: | |||
// [a c e] | |||
// [b d f] | |||
// [0 0 1] | |||
void nvgTransform(struct NVGcontext* ctx, float a, float b, float c, float d, float e, float f); | |||
void nvgTransform(NVGcontext* ctx, float a, float b, float c, float d, float e, float f); | |||
// Translates current coordinate system. | |||
void nvgTranslate(struct NVGcontext* ctx, float x, float y); | |||
void nvgTranslate(NVGcontext* ctx, float x, float y); | |||
// Rotates current coordinate system. Angle is specifid in radians. | |||
void nvgRotate(struct NVGcontext* ctx, float angle); | |||
void nvgRotate(NVGcontext* ctx, float angle); | |||
// Skews the current coordinate system along X axis. Angle is specifid in radians. | |||
void nvgSkewX(struct NVGcontext* ctx, float angle); | |||
void nvgSkewX(NVGcontext* ctx, float angle); | |||
// Skews the current coordinate system along Y axis. Angle is specifid in radians. | |||
void nvgSkewY(struct NVGcontext* ctx, float angle); | |||
void nvgSkewY(NVGcontext* ctx, float angle); | |||
// Scales the current coordinat system. | |||
void nvgScale(struct NVGcontext* ctx, float x, float y); | |||
void nvgScale(NVGcontext* ctx, float x, float y); | |||
// Stores the top part (a-f) of the current transformation matrix in to the specified buffer. | |||
// [a c e] | |||
// [b d f] | |||
// [0 0 1] | |||
// There should be space for 6 floats in the return buffer for the values a-f. | |||
void nvgCurrentTransform(struct NVGcontext* ctx, float* xform); | |||
void nvgCurrentTransform(NVGcontext* ctx, float* xform); | |||
// The following functions can be used to make calculations on 2x3 transformation matrices. | |||
@@ -308,24 +312,24 @@ float nvgRadToDeg(float rad); | |||
// Creates image by loading it from the disk from specified file name. | |||
// Returns handle to the image. | |||
int nvgCreateImage(struct NVGcontext* ctx, const char* filename, int imageFlags); | |||
int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags); | |||
// Creates image by loading it from the specified chunk of memory. | |||
// Returns handle to the image. | |||
int nvgCreateImageMem(struct NVGcontext* ctx, int imageFlags, unsigned char* data, int ndata); | |||
int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, unsigned char* data, int ndata); | |||
// Creates image from specified image data. | |||
// Returns handle to the image. | |||
int nvgCreateImageRGBA(struct NVGcontext* ctx, int w, int h, int imageFlags, const unsigned char* data); | |||
int nvgCreateImageRGBA(NVGcontext* ctx, int w, int h, int imageFlags, const unsigned char* data); | |||
// Updates image data specified by image handle. | |||
void nvgUpdateImage(struct NVGcontext* ctx, int image, const unsigned char* data); | |||
void nvgUpdateImage(NVGcontext* ctx, int image, const unsigned char* data); | |||
// Returns the domensions of a created image. | |||
void nvgImageSize(struct NVGcontext* ctx, int image, int* w, int* h); | |||
void nvgImageSize(NVGcontext* ctx, int image, int* w, int* h); | |||
// Deletes created image. | |||
void nvgDeleteImage(struct NVGcontext* ctx, int image); | |||
void nvgDeleteImage(NVGcontext* ctx, int image); | |||
// | |||
// Paints | |||
@@ -336,29 +340,29 @@ void nvgDeleteImage(struct NVGcontext* ctx, int image); | |||
// Creates and returns a linear gradient. Parameters (sx,sy)-(ex,ey) specify the start and end coordinates | |||
// of the linear gradient, icol specifies the start color and ocol the end color. | |||
// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). | |||
struct NVGpaint nvgLinearGradient(struct NVGcontext* ctx, float sx, float sy, float ex, float ey, | |||
struct NVGcolor icol, struct NVGcolor ocol); | |||
NVGpaint nvgLinearGradient(NVGcontext* ctx, float sx, float sy, float ex, float ey, | |||
NVGcolor icol, NVGcolor ocol); | |||
// Creates and returns a box gradient. Box gradient is a feathered rounded rectangle, it is useful for rendering | |||
// drop shadows or hilights for boxes. Parameters (x,y) define the top-left corner of the rectangle, | |||
// (w,h) define the size of the rectangle, r defines the corner radius, and f feather. Feather defines how blurry | |||
// the border of the rectangle is. Parameter icol specifies the inner color and ocol the outer color of the gradient. | |||
// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). | |||
struct NVGpaint nvgBoxGradient(struct NVGcontext* ctx, float x, float y, float w, float h, | |||
float r, float f, struct NVGcolor icol, struct NVGcolor ocol); | |||
NVGpaint nvgBoxGradient(NVGcontext* ctx, float x, float y, float w, float h, | |||
float r, float f, NVGcolor icol, NVGcolor ocol); | |||
// Creates and returns a radial gradient. Parameters (cx,cy) specify the center, inr and outr specify | |||
// the inner and outer radius of the gradient, icol specifies the start color and ocol the end color. | |||
// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). | |||
struct NVGpaint nvgRadialGradient(struct NVGcontext* ctx, float cx, float cy, float inr, float outr, | |||
struct NVGcolor icol, struct NVGcolor ocol); | |||
NVGpaint nvgRadialGradient(NVGcontext* ctx, float cx, float cy, float inr, float outr, | |||
NVGcolor icol, NVGcolor ocol); | |||
// Creates and returns an image patter. Parameters (ox,oy) specify the left-top location of the image pattern, | |||
// (ex,ey) the size of one image, angle rotation around the top-left corner, image is handle to the image to render, | |||
// and repeat is combination of NVG_REPEATX and NVG_REPEATY which tells if the image should be repeated across x or y. | |||
// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). | |||
struct NVGpaint nvgImagePattern(struct NVGcontext* ctx, float ox, float oy, float ex, float ey, | |||
float angle, int image, int repeat, float alpha); | |||
NVGpaint nvgImagePattern(NVGcontext* ctx, float ox, float oy, float ex, float ey, | |||
float angle, int image, int repeat, float alpha); | |||
// | |||
// Scissoring | |||
@@ -368,10 +372,10 @@ struct NVGpaint nvgImagePattern(struct NVGcontext* ctx, float ox, float oy, floa | |||
// Sets the current | |||
// The scissor rectangle is transformed by the current transform. | |||
void nvgScissor(struct NVGcontext* ctx, float x, float y, float w, float h); | |||
void nvgScissor(NVGcontext* ctx, float x, float y, float w, float h); | |||
// Reset and disables scissoring. | |||
void nvgResetScissor(struct NVGcontext* ctx); | |||
void nvgResetScissor(NVGcontext* ctx); | |||
// | |||
// Paths | |||
@@ -391,51 +395,51 @@ void nvgResetScissor(struct NVGcontext* ctx); | |||
// The curve segments and sub-paths are transformed by the current transform. | |||
// Clears the current path and sub-paths. | |||
void nvgBeginPath(struct NVGcontext* ctx); | |||
void nvgBeginPath(NVGcontext* ctx); | |||
// Starts new sub-path with specified point as first point. | |||
void nvgMoveTo(struct NVGcontext* ctx, float x, float y); | |||
void nvgMoveTo(NVGcontext* ctx, float x, float y); | |||
// Adds line segment from the last point in the path to the specified point. | |||
void nvgLineTo(struct NVGcontext* ctx, float x, float y); | |||
void nvgLineTo(NVGcontext* ctx, float x, float y); | |||
// Adds cubic bezier segment from last point in the path via two control points to the specified point. | |||
void nvgBezierTo(struct NVGcontext* ctx, float c1x, float c1y, float c2x, float c2y, float x, float y); | |||
void nvgBezierTo(NVGcontext* ctx, float c1x, float c1y, float c2x, float c2y, float x, float y); | |||
// Adds quadratic bezier segment from last point in the path via a control point to the specified point. | |||
void nvgQuadTo(struct NVGcontext* ctx, float cx, float cy, float x, float y); | |||
void nvgQuadTo(NVGcontext* ctx, float cx, float cy, float x, float y); | |||
// Adds an arc segment at the corner defined by the last path point, and two specified points. | |||
void nvgArcTo(struct NVGcontext* ctx, float x1, float y1, float x2, float y2, float radius); | |||
void nvgArcTo(NVGcontext* ctx, float x1, float y1, float x2, float y2, float radius); | |||
// Closes current sub-path with a line segment. | |||
void nvgClosePath(struct NVGcontext* ctx); | |||
void nvgClosePath(NVGcontext* ctx); | |||
// Sets the current sub-path winding, see NVGwinding and NVGsolidity. | |||
void nvgPathWinding(struct NVGcontext* ctx, int dir); | |||
void nvgPathWinding(NVGcontext* ctx, int dir); | |||
// Creates new circle arc shaped sub-path. The arc center is at cx,cy, the arc radius is r, | |||
// and the arc is drawn from angle a0 to a1, and swept in direction dir (NVG_CCW, or NVG_CW). | |||
// Angles are specified in radians. | |||
void nvgArc(struct NVGcontext* ctx, float cx, float cy, float r, float a0, float a1, int dir); | |||
void nvgArc(NVGcontext* ctx, float cx, float cy, float r, float a0, float a1, int dir); | |||
// Creates new rectangle shaped sub-path. | |||
void nvgRect(struct NVGcontext* ctx, float x, float y, float w, float h); | |||
void nvgRect(NVGcontext* ctx, float x, float y, float w, float h); | |||
// Creates new rounded rectangle shaped sub-path. | |||
void nvgRoundedRect(struct NVGcontext* ctx, float x, float y, float w, float h, float r); | |||
void nvgRoundedRect(NVGcontext* ctx, float x, float y, float w, float h, float r); | |||
// Creates new ellipse shaped sub-path. | |||
void nvgEllipse(struct NVGcontext* ctx, float cx, float cy, float rx, float ry); | |||
void nvgEllipse(NVGcontext* ctx, float cx, float cy, float rx, float ry); | |||
// Creates new circle shaped sub-path. | |||
void nvgCircle(struct NVGcontext* ctx, float cx, float cy, float r); | |||
void nvgCircle(NVGcontext* ctx, float cx, float cy, float r); | |||
// Fills the current path with current fill style. | |||
void nvgFill(struct NVGcontext* ctx); | |||
void nvgFill(NVGcontext* ctx); | |||
// Fills the current path with current stroke style. | |||
void nvgStroke(struct NVGcontext* ctx); | |||
void nvgStroke(NVGcontext* ctx); | |||
// | |||
@@ -473,67 +477,67 @@ void nvgStroke(struct NVGcontext* ctx); | |||
// Creates font by loading it from the disk from specified file name. | |||
// Returns handle to the font. | |||
int nvgCreateFont(struct NVGcontext* ctx, const char* name, const char* filename); | |||
int nvgCreateFont(NVGcontext* ctx, const char* name, const char* filename); | |||
// Creates image by loading it from the specified memory chunk. | |||
// Returns handle to the font. | |||
int nvgCreateFontMem(struct NVGcontext* ctx, const char* name, unsigned char* data, int ndata, int freeData); | |||
int nvgCreateFontMem(NVGcontext* ctx, const char* name, unsigned char* data, int ndata, int freeData); | |||
// Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. | |||
int nvgFindFont(struct NVGcontext* ctx, const char* name); | |||
int nvgFindFont(NVGcontext* ctx, const char* name); | |||
// Sets the font size of current text style. | |||
void nvgFontSize(struct NVGcontext* ctx, float size); | |||
void nvgFontSize(NVGcontext* ctx, float size); | |||
// Sets the blur of current text style. | |||
void nvgFontBlur(struct NVGcontext* ctx, float blur); | |||
void nvgFontBlur(NVGcontext* ctx, float blur); | |||
// Sets the letter spacing of current text style. | |||
void nvgTextLetterSpacing(struct NVGcontext* ctx, float spacing); | |||
void nvgTextLetterSpacing(NVGcontext* ctx, float spacing); | |||
// Sets the proportional line height of current text style. The line height is specified as multiple of font size. | |||
void nvgTextLineHeight(struct NVGcontext* ctx, float lineHeight); | |||
void nvgTextLineHeight(NVGcontext* ctx, float lineHeight); | |||
// Sets the text align of current text style, see NVGaling for options. | |||
void nvgTextAlign(struct NVGcontext* ctx, int align); | |||
void nvgTextAlign(NVGcontext* ctx, int align); | |||
// Sets the font face based on specified id of current text style. | |||
void nvgFontFaceId(struct NVGcontext* ctx, int font); | |||
void nvgFontFaceId(NVGcontext* ctx, int font); | |||
// Sets the font face based on specified name of current text style. | |||
void nvgFontFace(struct NVGcontext* ctx, const char* font); | |||
void nvgFontFace(NVGcontext* ctx, const char* font); | |||
// Draws text string at specified location. If end is specified only the sub-string up to the end is drawn. | |||
float nvgText(struct NVGcontext* ctx, float x, float y, const char* string, const char* end); | |||
float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char* end); | |||
// Draws multi-line text string at specified location wrapped at the specified width. If end is specified only the sub-string up to the end is drawn. | |||
// White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. | |||
// Words longer than the max width are slit at nearest character (i.e. no hyphenation). | |||
void nvgTextBox(struct NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end); | |||
void nvgTextBox(NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end); | |||
// Measures the specified text string. Parameter bounds should be a pointer to float[4], | |||
// if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax] | |||
// Returns the horizontal advance of the measured text (i.e. where the next character should drawn). | |||
// Measured values are returned in local coordinate space. | |||
float nvgTextBounds(struct NVGcontext* ctx, float x, float y, const char* string, const char* end, float* bounds); | |||
float nvgTextBounds(NVGcontext* ctx, float x, float y, const char* string, const char* end, float* bounds); | |||
// Measures the specified multi-text string. Parameter bounds should be a pointer to float[4], | |||
// if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax] | |||
// Measured values are returned in local coordinate space. | |||
void nvgTextBoxBounds(struct NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end, float* bounds); | |||
void nvgTextBoxBounds(NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end, float* bounds); | |||
// Calculates the glyph x positions of the specified text. If end is specified only the sub-string will be used. | |||
// Measured values are returned in local coordinate space. | |||
int nvgTextGlyphPositions(struct NVGcontext* ctx, float x, float y, const char* string, const char* end, struct NVGglyphPosition* positions, int maxPositions); | |||
int nvgTextGlyphPositions(NVGcontext* ctx, float x, float y, const char* string, const char* end, NVGglyphPosition* positions, int maxPositions); | |||
// Returns the vertical metrics based on the current text style. | |||
// Measured values are returned in local coordinate space. | |||
void nvgTextMetrics(struct NVGcontext* ctx, float* ascender, float* descender, float* lineh); | |||
void nvgTextMetrics(NVGcontext* ctx, float* ascender, float* descender, float* lineh); | |||
// Breaks the specified text into lines. If end is specified only the sub-string will be used. | |||
// White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. | |||
// Words longer than the max width are slit at nearest character (i.e. no hyphenation). | |||
int nvgTextBreakLines(struct NVGcontext* ctx, const char* string, const char* end, float breakRowWidth, struct NVGtextRow* rows, int maxRows); | |||
int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, float breakRowWidth, NVGtextRow* rows, int maxRows); | |||
// | |||
// Internal Render API | |||
@@ -543,28 +547,30 @@ enum NVGtexture { | |||
NVG_TEXTURE_RGBA = 0x02, | |||
}; | |||
struct NVGscissor | |||
{ | |||
struct NVGscissor { | |||
float xform[6]; | |||
float extent[2]; | |||
}; | |||
typedef struct NVGscissor NVGscissor; | |||
struct NVGvertex { | |||
float x,y,u,v; | |||
}; | |||
typedef struct NVGvertex NVGvertex; | |||
struct NVGpath { | |||
int first; | |||
int count; | |||
unsigned char closed; | |||
int nbevel; | |||
struct NVGvertex* fill; | |||
NVGvertex* fill; | |||
int nfill; | |||
struct NVGvertex* stroke; | |||
NVGvertex* stroke; | |||
int nstroke; | |||
int winding; | |||
int convex; | |||
}; | |||
typedef struct NVGpath NVGpath; | |||
struct NVGparams { | |||
void* userPtr; | |||
@@ -576,20 +582,21 @@ struct NVGparams { | |||
int (*renderGetTextureSize)(void* uptr, int image, int* w, int* h); | |||
void (*renderViewport)(void* uptr, int width, int height); | |||
void (*renderFlush)(void* uptr); | |||
void (*renderFill)(void* uptr, struct NVGpaint* paint, struct NVGscissor* scissor, float fringe, const float* bounds, const struct NVGpath* paths, int npaths); | |||
void (*renderStroke)(void* uptr, struct NVGpaint* paint, struct NVGscissor* scissor, float fringe, float strokeWidth, const struct NVGpath* paths, int npaths); | |||
void (*renderTriangles)(void* uptr, struct NVGpaint* paint, struct NVGscissor* scissor, const struct NVGvertex* verts, int nverts); | |||
void (*renderFill)(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, const float* bounds, const NVGpath* paths, int npaths); | |||
void (*renderStroke)(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, float strokeWidth, const NVGpath* paths, int npaths); | |||
void (*renderTriangles)(void* uptr, NVGpaint* paint, NVGscissor* scissor, const NVGvertex* verts, int nverts); | |||
void (*renderDelete)(void* uptr); | |||
}; | |||
typedef struct NVGparams NVGparams; | |||
// Contructor and destructor, called by the render back-end. | |||
struct NVGcontext* nvgCreateInternal(struct NVGparams* params); | |||
void nvgDeleteInternal(struct NVGcontext* ctx); | |||
NVGcontext* nvgCreateInternal(NVGparams* params); | |||
void nvgDeleteInternal(NVGcontext* ctx); | |||
struct NVGparams* nvgInternalParams(struct NVGcontext* ctx); | |||
NVGparams* nvgInternalParams(NVGcontext* ctx); | |||
// Debug function to dump cached path data. | |||
void nvgDebugDumpPathCache(struct NVGcontext* ctx); | |||
void nvgDebugDumpPathCache(NVGcontext* ctx); | |||
#ifdef _MSC_VER | |||
#pragma warning(pop) | |||
@@ -52,29 +52,29 @@ extern "C" { | |||
#if defined NANOVG_GL2 | |||
struct NVGcontext* nvgCreateGL2(int flags); | |||
void nvgDeleteGL2(struct NVGcontext* ctx); | |||
NVGcontext* nvgCreateGL2(int flags); | |||
void nvgDeleteGL2(NVGcontext* ctx); | |||
#endif | |||
#if defined NANOVG_GL3 | |||
struct NVGcontext* nvgCreateGL3(int flags); | |||
void nvgDeleteGL3(struct NVGcontext* ctx); | |||
NVGcontext* nvgCreateGL3(int flags); | |||
void nvgDeleteGL3(NVGcontext* ctx); | |||
#endif | |||
#if defined NANOVG_GLES2 | |||
struct NVGcontext* nvgCreateGLES2(int flags); | |||
void nvgDeleteGLES2(struct NVGcontext* ctx); | |||
NVGcontext* nvgCreateGLES2(int flags); | |||
void nvgDeleteGLES2(NVGcontext* ctx); | |||
#endif | |||
#if defined NANOVG_GLES3 | |||
struct NVGcontext* nvgCreateGLES3(int flags); | |||
void nvgDeleteGLES3(struct NVGcontext* ctx); | |||
NVGcontext* nvgCreateGLES3(int flags); | |||
void nvgDeleteGLES3(NVGcontext* ctx); | |||
#endif | |||
@@ -84,9 +84,9 @@ enum NVGLtextureflags { | |||
NVGL_TEXTURE_PREMULTIPLIED = 0x04 | |||
}; | |||
int nvglCreateImageFromHandle(struct NVGcontext* ctx, GLuint textureId, int w, int h, int flags); | |||
GLuint nvglImageHandle(struct NVGcontext* ctx, int image); | |||
void nvglImageFlags(struct NVGcontext* ctx, int image, int flags); | |||
int nvglCreateImageFromHandle(NVGcontext* ctx, GLuint textureId, int w, int h, int flags); | |||
GLuint nvglImageHandle(NVGcontext* ctx, int image); | |||
void nvglImageFlags(NVGcontext* ctx, int image, int flags); | |||
#ifdef __cplusplus | |||
@@ -145,6 +145,7 @@ struct GLNVGshader { | |||
GLuint vert; | |||
GLint loc[GLNVG_MAX_LOCS]; | |||
}; | |||
typedef struct GLNVGshader GLNVGshader; | |||
struct GLNVGtexture { | |||
int id; | |||
@@ -153,6 +154,7 @@ struct GLNVGtexture { | |||
int type; | |||
int flags; | |||
}; | |||
typedef struct GLNVGtexture GLNVGtexture; | |||
enum GLNVGcallType { | |||
GLNVG_NONE = 0, | |||
@@ -171,6 +173,7 @@ struct GLNVGcall { | |||
int triangleCount; | |||
int uniformOffset; | |||
}; | |||
typedef struct GLNVGcall GLNVGcall; | |||
struct GLNVGpath { | |||
int fillOffset; | |||
@@ -178,6 +181,7 @@ struct GLNVGpath { | |||
int strokeOffset; | |||
int strokeCount; | |||
}; | |||
typedef struct GLNVGpath GLNVGpath; | |||
struct GLNVGfragUniforms { | |||
float scissorMat[12]; // matrices are actually 3 vec4s | |||
@@ -194,10 +198,11 @@ struct GLNVGfragUniforms { | |||
int texType; | |||
int type; | |||
}; | |||
typedef struct GLNVGfragUniforms GLNVGfragUniforms; | |||
struct GLNVGcontext { | |||
struct GLNVGshader shader; | |||
struct GLNVGtexture* textures; | |||
GLNVGshader shader; | |||
GLNVGtexture* textures; | |||
float view[2]; | |||
int ntextures; | |||
int ctextures; | |||
@@ -213,10 +218,10 @@ struct GLNVGcontext { | |||
int flags; | |||
// Per frame buffers | |||
struct GLNVGcall* calls; | |||
GLNVGcall* calls; | |||
int ccalls; | |||
int ncalls; | |||
struct GLNVGpath* paths; | |||
GLNVGpath* paths; | |||
int cpaths; | |||
int npaths; | |||
struct NVGvertex* verts; | |||
@@ -226,12 +231,13 @@ struct GLNVGcontext { | |||
int cuniforms; | |||
int nuniforms; | |||
}; | |||
typedef struct GLNVGcontext GLNVGcontext; | |||
static int glnvg__maxi(int a, int b) { return a > b ? a : b; } | |||
static struct GLNVGtexture* glnvg__allocTexture(struct GLNVGcontext* gl) | |||
static GLNVGtexture* glnvg__allocTexture(GLNVGcontext* gl) | |||
{ | |||
struct GLNVGtexture* tex = NULL; | |||
GLNVGtexture* tex = NULL; | |||
int i; | |||
for (i = 0; i < gl->ntextures; i++) { | |||
@@ -242,9 +248,9 @@ static struct GLNVGtexture* glnvg__allocTexture(struct GLNVGcontext* gl) | |||
} | |||
if (tex == NULL) { | |||
if (gl->ntextures+1 > gl->ctextures) { | |||
struct GLNVGtexture* textures; | |||
GLNVGtexture* textures; | |||
int ctextures = glnvg__maxi(gl->ntextures+1, 4) + gl->ctextures/2; // 1.5x Overallocate | |||
textures = (struct GLNVGtexture*)realloc(gl->textures, sizeof(struct GLNVGtexture)*ctextures); | |||
textures = (GLNVGtexture*)realloc(gl->textures, sizeof(GLNVGtexture)*ctextures); | |||
if (textures == NULL) return NULL; | |||
gl->textures = textures; | |||
gl->ctextures = ctextures; | |||
@@ -258,7 +264,7 @@ static struct GLNVGtexture* glnvg__allocTexture(struct GLNVGcontext* gl) | |||
return tex; | |||
} | |||
static struct GLNVGtexture* glnvg__findTexture(struct GLNVGcontext* gl, int id) | |||
static GLNVGtexture* glnvg__findTexture(GLNVGcontext* gl, int id) | |||
{ | |||
int i; | |||
for (i = 0; i < gl->ntextures; i++) | |||
@@ -267,7 +273,7 @@ static struct GLNVGtexture* glnvg__findTexture(struct GLNVGcontext* gl, int id) | |||
return NULL; | |||
} | |||
static int glnvg__deleteTexture(struct GLNVGcontext* gl, int id) | |||
static int glnvg__deleteTexture(GLNVGcontext* gl, int id) | |||
{ | |||
int i; | |||
for (i = 0; i < gl->ntextures; i++) { | |||
@@ -311,7 +317,7 @@ static int glnvg__checkError(const char* str) | |||
return 0; | |||
} | |||
static int glnvg__createShader(struct GLNVGshader* shader, const char* name, const char* header, const char* opts, const char* vshader, const char* fshader) | |||
static int glnvg__createShader(GLNVGshader* shader, const char* name, const char* header, const char* opts, const char* vshader, const char* fshader) | |||
{ | |||
GLint status; | |||
GLuint prog, vert, frag; | |||
@@ -363,7 +369,7 @@ static int glnvg__createShader(struct GLNVGshader* shader, const char* name, con | |||
return 1; | |||
} | |||
static void glnvg__deleteShader(struct GLNVGshader* shader) | |||
static void glnvg__deleteShader(GLNVGshader* shader) | |||
{ | |||
if (shader->prog != 0) | |||
glDeleteProgram(shader->prog); | |||
@@ -373,7 +379,7 @@ static void glnvg__deleteShader(struct GLNVGshader* shader) | |||
glDeleteShader(shader->frag); | |||
} | |||
static void glnvg__getUniforms(struct GLNVGshader* shader) | |||
static void glnvg__getUniforms(GLNVGshader* shader) | |||
{ | |||
shader->loc[GLNVG_LOC_VIEWSIZE] = glGetUniformLocation(shader->prog, "viewSize"); | |||
shader->loc[GLNVG_LOC_TEX] = glGetUniformLocation(shader->prog, "tex"); | |||
@@ -399,7 +405,7 @@ static void glnvg__getUniforms(struct GLNVGshader* shader) | |||
static int glnvg__renderCreate(void* uptr) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
int align = 4; | |||
// TODO: mediump float may not be enough for GLES2 in iOS. | |||
@@ -602,7 +608,7 @@ static int glnvg__renderCreate(void* uptr) | |||
glGenBuffers(1, &gl->fragBuf); | |||
glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &align); | |||
#endif | |||
gl->fragSize = sizeof(struct GLNVGfragUniforms) + align - sizeof(struct GLNVGfragUniforms) % align; | |||
gl->fragSize = sizeof(GLNVGfragUniforms) + align - sizeof(GLNVGfragUniforms) % align; | |||
glnvg__checkError("create done"); | |||
@@ -613,8 +619,8 @@ static int glnvg__renderCreate(void* uptr) | |||
static int glnvg__renderCreateTexture(void* uptr, int type, int w, int h, int imageFlags, const unsigned char* data) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
struct GLNVGtexture* tex = glnvg__allocTexture(gl); | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
GLNVGtexture* tex = glnvg__allocTexture(gl); | |||
if (tex == NULL) return 0; | |||
@@ -682,14 +688,14 @@ static int glnvg__renderCreateTexture(void* uptr, int type, int w, int h, int im | |||
static int glnvg__renderDeleteTexture(void* uptr, int image) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
return glnvg__deleteTexture(gl, image); | |||
} | |||
static int glnvg__renderUpdateTexture(void* uptr, int image, int x, int y, int w, int h, const unsigned char* data) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
struct GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
if (tex == NULL) return 0; | |||
glBindTexture(GL_TEXTURE_2D, tex->tex); | |||
@@ -733,8 +739,8 @@ static int glnvg__renderUpdateTexture(void* uptr, int image, int x, int y, int w | |||
static int glnvg__renderGetTextureSize(void* uptr, int image, int* w, int* h) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
struct GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
if (tex == NULL) return 0; | |||
*w = tex->width; | |||
*h = tex->height; | |||
@@ -757,7 +763,7 @@ static void glnvg__xformToMat3x4(float* m3, float* t) | |||
m3[11] = 0.0f; | |||
} | |||
static struct NVGcolor glnvg__premulColor(struct NVGcolor c) | |||
static NVGcolor glnvg__premulColor(NVGcolor c) | |||
{ | |||
c.r *= c.a; | |||
c.g *= c.a; | |||
@@ -765,10 +771,10 @@ static struct NVGcolor glnvg__premulColor(struct NVGcolor c) | |||
return c; | |||
} | |||
static int glnvg__convertPaint(struct GLNVGcontext* gl, struct GLNVGfragUniforms* frag, struct NVGpaint* paint, | |||
struct NVGscissor* scissor, float width, float fringe, float strokeThr) | |||
static int glnvg__convertPaint(GLNVGcontext* gl, GLNVGfragUniforms* frag, NVGpaint* paint, | |||
NVGscissor* scissor, float width, float fringe, float strokeThr) | |||
{ | |||
struct GLNVGtexture* tex = NULL; | |||
GLNVGtexture* tex = NULL; | |||
float invxform[6]; | |||
memset(frag, 0, sizeof(*frag)); | |||
@@ -825,7 +831,7 @@ static int glnvg__convertPaint(struct GLNVGcontext* gl, struct GLNVGfragUniforms | |||
return 1; | |||
} | |||
static struct GLNVGfragUniforms* nvg__fragUniformPtr(struct GLNVGcontext* gl, int i); | |||
static GLNVGfragUniforms* nvg__fragUniformPtr(GLNVGcontext* gl, int i); | |||
#if !NANOVG_GL_USE_UNIFORMBUFFER | |||
static void glnvg__mat3(float* dst, float* src) | |||
@@ -844,12 +850,12 @@ static void glnvg__mat3(float* dst, float* src) | |||
} | |||
#endif | |||
static void glnvg__setUniforms(struct GLNVGcontext* gl, int uniformOffset, int image) | |||
static void glnvg__setUniforms(GLNVGcontext* gl, int uniformOffset, int image) | |||
{ | |||
#if NANOVG_GL_USE_UNIFORMBUFFER | |||
glBindBufferRange(GL_UNIFORM_BUFFER, GLNVG_FRAG_BINDING, gl->fragBuf, uniformOffset, sizeof(struct GLNVGfragUniforms)); | |||
glBindBufferRange(GL_UNIFORM_BUFFER, GLNVG_FRAG_BINDING, gl->fragBuf, uniformOffset, sizeof(GLNVGfragUniforms)); | |||
#else | |||
struct GLNVGfragUniforms* frag = nvg__fragUniformPtr(gl, uniformOffset); | |||
GLNVGfragUniforms* frag = nvg__fragUniformPtr(gl, uniformOffset); | |||
float tmp[9]; // Maybe there's a way to get rid of this... | |||
glnvg__mat3(tmp, frag->scissorMat); | |||
glUniformMatrix3fv(gl->shader.loc[GLNVG_LOC_SCISSORMAT], 1, GL_FALSE, tmp); | |||
@@ -869,7 +875,7 @@ static void glnvg__setUniforms(struct GLNVGcontext* gl, int uniformOffset, int i | |||
#endif | |||
if (image != 0) { | |||
struct GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
glBindTexture(GL_TEXTURE_2D, tex != NULL ? tex->tex : 0); | |||
glnvg__checkError("tex paint tex"); | |||
} else { | |||
@@ -879,14 +885,14 @@ static void glnvg__setUniforms(struct GLNVGcontext* gl, int uniformOffset, int i | |||
static void glnvg__renderViewport(void* uptr, int width, int height) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
gl->view[0] = (float)width; | |||
gl->view[1] = (float)height; | |||
} | |||
static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
static void glnvg__fill(GLNVGcontext* gl, GLNVGcall* call) | |||
{ | |||
struct GLNVGpath* paths = &gl->paths[call->pathOffset]; | |||
GLNVGpath* paths = &gl->paths[call->pathOffset]; | |||
int i, npaths = call->pathCount; | |||
// Draw shapes | |||
@@ -928,9 +934,9 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
glDisable(GL_STENCIL_TEST); | |||
} | |||
static void glnvg__convexFill(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
static void glnvg__convexFill(GLNVGcontext* gl, GLNVGcall* call) | |||
{ | |||
struct GLNVGpath* paths = &gl->paths[call->pathOffset]; | |||
GLNVGpath* paths = &gl->paths[call->pathOffset]; | |||
int i, npaths = call->pathCount; | |||
glnvg__setUniforms(gl, call->uniformOffset, call->image); | |||
@@ -945,9 +951,9 @@ static void glnvg__convexFill(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
} | |||
} | |||
static void glnvg__stroke(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
static void glnvg__stroke(GLNVGcontext* gl, GLNVGcall* call) | |||
{ | |||
struct GLNVGpath* paths = &gl->paths[call->pathOffset]; | |||
GLNVGpath* paths = &gl->paths[call->pathOffset]; | |||
int npaths = call->pathCount, i; | |||
if (gl->flags & NVG_STENCIL_STROKES) { | |||
@@ -992,7 +998,7 @@ static void glnvg__stroke(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
} | |||
} | |||
static void glnvg__triangles(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
static void glnvg__triangles(GLNVGcontext* gl, GLNVGcall* call) | |||
{ | |||
glnvg__setUniforms(gl, call->uniformOffset, call->image); | |||
glnvg__checkError("triangles fill"); | |||
@@ -1002,7 +1008,7 @@ static void glnvg__triangles(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
static void glnvg__renderFlush(void* uptr) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
int i; | |||
if (gl->ncalls > 0) { | |||
@@ -1034,11 +1040,11 @@ static void glnvg__renderFlush(void* uptr) | |||
glBindVertexArray(gl->vertArr); | |||
#endif | |||
glBindBuffer(GL_ARRAY_BUFFER, gl->vertBuf); | |||
glBufferData(GL_ARRAY_BUFFER, gl->nverts * sizeof(struct NVGvertex), gl->verts, GL_STREAM_DRAW); | |||
glBufferData(GL_ARRAY_BUFFER, gl->nverts * sizeof(NVGvertex), gl->verts, GL_STREAM_DRAW); | |||
glEnableVertexAttribArray(0); | |||
glEnableVertexAttribArray(1); | |||
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)0); | |||
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(0 + 2*sizeof(float))); | |||
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(NVGvertex), (const GLvoid*)(size_t)0); | |||
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(NVGvertex), (const GLvoid*)(0 + 2*sizeof(float))); | |||
// Set view and texture just once per frame. | |||
glUniform1i(gl->shader.loc[GLNVG_LOC_TEX], 0); | |||
@@ -1049,7 +1055,7 @@ static void glnvg__renderFlush(void* uptr) | |||
#endif | |||
for (i = 0; i < gl->ncalls; i++) { | |||
struct GLNVGcall* call = &gl->calls[i]; | |||
GLNVGcall* call = &gl->calls[i]; | |||
if (call->type == GLNVG_FILL) | |||
glnvg__fill(gl, call); | |||
else if (call->type == GLNVG_CONVEXFILL) | |||
@@ -1076,7 +1082,7 @@ static void glnvg__renderFlush(void* uptr) | |||
gl->nuniforms = 0; | |||
} | |||
static int glnvg__maxVertCount(const struct NVGpath* paths, int npaths) | |||
static int glnvg__maxVertCount(const NVGpath* paths, int npaths) | |||
{ | |||
int i, count = 0; | |||
for (i = 0; i < npaths; i++) { | |||
@@ -1086,29 +1092,29 @@ static int glnvg__maxVertCount(const struct NVGpath* paths, int npaths) | |||
return count; | |||
} | |||
static struct GLNVGcall* glnvg__allocCall(struct GLNVGcontext* gl) | |||
static GLNVGcall* glnvg__allocCall(GLNVGcontext* gl) | |||
{ | |||
struct GLNVGcall* ret = NULL; | |||
GLNVGcall* ret = NULL; | |||
if (gl->ncalls+1 > gl->ccalls) { | |||
struct GLNVGcall* calls; | |||
GLNVGcall* calls; | |||
int ccalls = glnvg__maxi(gl->ncalls+1, 128) + gl->ccalls/2; // 1.5x Overallocate | |||
calls = (struct GLNVGcall*)realloc(gl->calls, sizeof(struct GLNVGcall) * ccalls); | |||
calls = (GLNVGcall*)realloc(gl->calls, sizeof(GLNVGcall) * ccalls); | |||
if (calls == NULL) return NULL; | |||
gl->calls = calls; | |||
gl->ccalls = ccalls; | |||
} | |||
ret = &gl->calls[gl->ncalls++]; | |||
memset(ret, 0, sizeof(struct GLNVGcall)); | |||
memset(ret, 0, sizeof(GLNVGcall)); | |||
return ret; | |||
} | |||
static int glnvg__allocPaths(struct GLNVGcontext* gl, int n) | |||
static int glnvg__allocPaths(GLNVGcontext* gl, int n) | |||
{ | |||
int ret = 0; | |||
if (gl->npaths+n > gl->cpaths) { | |||
struct GLNVGpath* paths; | |||
GLNVGpath* paths; | |||
int cpaths = glnvg__maxi(gl->npaths + n, 128) + gl->cpaths/2; // 1.5x Overallocate | |||
paths = (struct GLNVGpath*)realloc(gl->paths, sizeof(struct GLNVGpath) * cpaths); | |||
paths = (GLNVGpath*)realloc(gl->paths, sizeof(GLNVGpath) * cpaths); | |||
if (paths == NULL) return -1; | |||
gl->paths = paths; | |||
gl->cpaths = cpaths; | |||
@@ -1118,13 +1124,13 @@ static int glnvg__allocPaths(struct GLNVGcontext* gl, int n) | |||
return ret; | |||
} | |||
static int glnvg__allocVerts(struct GLNVGcontext* gl, int n) | |||
static int glnvg__allocVerts(GLNVGcontext* gl, int n) | |||
{ | |||
int ret = 0; | |||
if (gl->nverts+n > gl->cverts) { | |||
struct NVGvertex* verts; | |||
NVGvertex* verts; | |||
int cverts = glnvg__maxi(gl->nverts + n, 4096) + gl->cverts/2; // 1.5x Overallocate | |||
verts = (struct NVGvertex*)realloc(gl->verts, sizeof(struct NVGvertex) * cverts); | |||
verts = (NVGvertex*)realloc(gl->verts, sizeof(NVGvertex) * cverts); | |||
if (verts == NULL) return -1; | |||
gl->verts = verts; | |||
gl->cverts = cverts; | |||
@@ -1134,7 +1140,7 @@ static int glnvg__allocVerts(struct GLNVGcontext* gl, int n) | |||
return ret; | |||
} | |||
static int glnvg__allocFragUniforms(struct GLNVGcontext* gl, int n) | |||
static int glnvg__allocFragUniforms(GLNVGcontext* gl, int n) | |||
{ | |||
int ret = 0, structSize = gl->fragSize; | |||
if (gl->nuniforms+n > gl->cuniforms) { | |||
@@ -1150,12 +1156,12 @@ static int glnvg__allocFragUniforms(struct GLNVGcontext* gl, int n) | |||
return ret; | |||
} | |||
static struct GLNVGfragUniforms* nvg__fragUniformPtr(struct GLNVGcontext* gl, int i) | |||
static GLNVGfragUniforms* nvg__fragUniformPtr(GLNVGcontext* gl, int i) | |||
{ | |||
return (struct GLNVGfragUniforms*)&gl->uniforms[i]; | |||
return (GLNVGfragUniforms*)&gl->uniforms[i]; | |||
} | |||
static void glnvg__vset(struct NVGvertex* vtx, float x, float y, float u, float v) | |||
static void glnvg__vset(NVGvertex* vtx, float x, float y, float u, float v) | |||
{ | |||
vtx->x = x; | |||
vtx->y = y; | |||
@@ -1163,13 +1169,13 @@ static void glnvg__vset(struct NVGvertex* vtx, float x, float y, float u, float | |||
vtx->v = v; | |||
} | |||
static void glnvg__renderFill(void* uptr, struct NVGpaint* paint, struct NVGscissor* scissor, float fringe, | |||
const float* bounds, const struct NVGpath* paths, int npaths) | |||
static void glnvg__renderFill(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, | |||
const float* bounds, const NVGpath* paths, int npaths) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
struct GLNVGcall* call = glnvg__allocCall(gl); | |||
struct NVGvertex* quad; | |||
struct GLNVGfragUniforms* frag; | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
GLNVGcall* call = glnvg__allocCall(gl); | |||
NVGvertex* quad; | |||
GLNVGfragUniforms* frag; | |||
int i, maxverts, offset; | |||
if (call == NULL) return; | |||
@@ -1189,19 +1195,19 @@ static void glnvg__renderFill(void* uptr, struct NVGpaint* paint, struct NVGscis | |||
if (offset == -1) goto error; | |||
for (i = 0; i < npaths; i++) { | |||
struct GLNVGpath* copy = &gl->paths[call->pathOffset + i]; | |||
const struct NVGpath* path = &paths[i]; | |||
memset(copy, 0, sizeof(struct GLNVGpath)); | |||
GLNVGpath* copy = &gl->paths[call->pathOffset + i]; | |||
const NVGpath* path = &paths[i]; | |||
memset(copy, 0, sizeof(GLNVGpath)); | |||
if (path->nfill > 0) { | |||
copy->fillOffset = offset; | |||
copy->fillCount = path->nfill; | |||
memcpy(&gl->verts[offset], path->fill, sizeof(struct NVGvertex) * path->nfill); | |||
memcpy(&gl->verts[offset], path->fill, sizeof(NVGvertex) * path->nfill); | |||
offset += path->nfill; | |||
} | |||
if (path->nstroke > 0) { | |||
copy->strokeOffset = offset; | |||
copy->strokeCount = path->nstroke; | |||
memcpy(&gl->verts[offset], path->stroke, sizeof(struct NVGvertex) * path->nstroke); | |||
memcpy(&gl->verts[offset], path->stroke, sizeof(NVGvertex) * path->nstroke); | |||
offset += path->nstroke; | |||
} | |||
} | |||
@@ -1244,11 +1250,11 @@ error: | |||
if (gl->ncalls > 0) gl->ncalls--; | |||
} | |||
static void glnvg__renderStroke(void* uptr, struct NVGpaint* paint, struct NVGscissor* scissor, float fringe, | |||
float strokeWidth, const struct NVGpath* paths, int npaths) | |||
static void glnvg__renderStroke(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, | |||
float strokeWidth, const NVGpath* paths, int npaths) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
struct GLNVGcall* call = glnvg__allocCall(gl); | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
GLNVGcall* call = glnvg__allocCall(gl); | |||
int i, maxverts, offset; | |||
if (call == NULL) return; | |||
@@ -1265,13 +1271,13 @@ static void glnvg__renderStroke(void* uptr, struct NVGpaint* paint, struct NVGsc | |||
if (offset == -1) goto error; | |||
for (i = 0; i < npaths; i++) { | |||
struct GLNVGpath* copy = &gl->paths[call->pathOffset + i]; | |||
const struct NVGpath* path = &paths[i]; | |||
memset(copy, 0, sizeof(struct GLNVGpath)); | |||
GLNVGpath* copy = &gl->paths[call->pathOffset + i]; | |||
const NVGpath* path = &paths[i]; | |||
memset(copy, 0, sizeof(GLNVGpath)); | |||
if (path->nstroke) { | |||
copy->strokeOffset = offset; | |||
copy->strokeCount = path->nstroke; | |||
memcpy(&gl->verts[offset], path->stroke, sizeof(struct NVGvertex) * path->nstroke); | |||
memcpy(&gl->verts[offset], path->stroke, sizeof(NVGvertex) * path->nstroke); | |||
offset += path->nstroke; | |||
} | |||
} | |||
@@ -1299,12 +1305,12 @@ error: | |||
if (gl->ncalls > 0) gl->ncalls--; | |||
} | |||
static void glnvg__renderTriangles(void* uptr, struct NVGpaint* paint, struct NVGscissor* scissor, | |||
const struct NVGvertex* verts, int nverts) | |||
static void glnvg__renderTriangles(void* uptr, NVGpaint* paint, NVGscissor* scissor, | |||
const NVGvertex* verts, int nverts) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
struct GLNVGcall* call = glnvg__allocCall(gl); | |||
struct GLNVGfragUniforms* frag; | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
GLNVGcall* call = glnvg__allocCall(gl); | |||
GLNVGfragUniforms* frag; | |||
if (call == NULL) return; | |||
@@ -1316,7 +1322,7 @@ static void glnvg__renderTriangles(void* uptr, struct NVGpaint* paint, struct NV | |||
if (call->triangleOffset == -1) goto error; | |||
call->triangleCount = nverts; | |||
memcpy(&gl->verts[call->triangleOffset], verts, sizeof(struct NVGvertex) * nverts); | |||
memcpy(&gl->verts[call->triangleOffset], verts, sizeof(NVGvertex) * nverts); | |||
// Fill shader | |||
call->uniformOffset = glnvg__allocFragUniforms(gl, 1); | |||
@@ -1335,7 +1341,7 @@ error: | |||
static void glnvg__renderDelete(void* uptr) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)uptr; | |||
GLNVGcontext* gl = (GLNVGcontext*)uptr; | |||
int i; | |||
if (gl == NULL) return; | |||
@@ -1368,20 +1374,20 @@ static void glnvg__renderDelete(void* uptr) | |||
#if defined NANOVG_GL2 | |||
struct NVGcontext* nvgCreateGL2(int flags) | |||
NVGcontext* nvgCreateGL2(int flags) | |||
#elif defined NANOVG_GL3 | |||
struct NVGcontext* nvgCreateGL3(int flags) | |||
NVGcontext* nvgCreateGL3(int flags) | |||
#elif defined NANOVG_GLES2 | |||
struct NVGcontext* nvgCreateGLES2(int flags) | |||
NVGcontext* nvgCreateGLES2(int flags) | |||
#elif defined NANOVG_GLES3 | |||
struct NVGcontext* nvgCreateGLES3(int flags) | |||
NVGcontext* nvgCreateGLES3(int flags) | |||
#endif | |||
{ | |||
struct NVGparams params; | |||
struct NVGcontext* ctx = NULL; | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)malloc(sizeof(struct GLNVGcontext)); | |||
NVGparams params; | |||
NVGcontext* ctx = NULL; | |||
GLNVGcontext* gl = (GLNVGcontext*)malloc(sizeof(GLNVGcontext)); | |||
if (gl == NULL) goto error; | |||
memset(gl, 0, sizeof(struct GLNVGcontext)); | |||
memset(gl, 0, sizeof(GLNVGcontext)); | |||
memset(¶ms, 0, sizeof(params)); | |||
params.renderCreate = glnvg__renderCreate; | |||
@@ -1412,22 +1418,22 @@ error: | |||
} | |||
#if NANOVG_GL2 | |||
void nvgDeleteGL2(struct NVGcontext* ctx) | |||
void nvgDeleteGL2(NVGcontext* ctx) | |||
#elif NANOVG_GL3 | |||
void nvgDeleteGL3(struct NVGcontext* ctx) | |||
void nvgDeleteGL3(NVGcontext* ctx) | |||
#elif NANOVG_GLES2 | |||
void nvgDeleteGLES2(struct NVGcontext* ctx) | |||
void nvgDeleteGLES2(NVGcontext* ctx) | |||
#elif NANOVG_GLES3 | |||
void nvgDeleteGLES3(struct NVGcontext* ctx) | |||
void nvgDeleteGLES3(NVGcontext* ctx) | |||
#endif | |||
{ | |||
nvgDeleteInternal(ctx); | |||
} | |||
int nvglCreateImageFromHandle(struct NVGcontext* ctx, GLuint textureId, int w, int h, int flags) | |||
int nvglCreateImageFromHandle(NVGcontext* ctx, GLuint textureId, int w, int h, int flags) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)nvgInternalParams(ctx)->userPtr; | |||
struct GLNVGtexture* tex = glnvg__allocTexture(gl); | |||
GLNVGcontext* gl = (GLNVGcontext*)nvgInternalParams(ctx)->userPtr; | |||
GLNVGtexture* tex = glnvg__allocTexture(gl); | |||
if (tex == NULL) return 0; | |||
@@ -1440,17 +1446,17 @@ int nvglCreateImageFromHandle(struct NVGcontext* ctx, GLuint textureId, int w, i | |||
return tex->id; | |||
} | |||
GLuint nvglImageHandle(struct NVGcontext* ctx, int image) | |||
GLuint nvglImageHandle(NVGcontext* ctx, int image) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)nvgInternalParams(ctx)->userPtr; | |||
struct GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
GLNVGcontext* gl = (GLNVGcontext*)nvgInternalParams(ctx)->userPtr; | |||
GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
return tex->tex; | |||
} | |||
void nvglImageFlags(struct NVGcontext* ctx, int image, int flags) | |||
void nvglImageFlags(NVGcontext* ctx, int image, int flags) | |||
{ | |||
struct GLNVGcontext* gl = (struct GLNVGcontext*)nvgInternalParams(ctx)->userPtr; | |||
struct GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
GLNVGcontext* gl = (GLNVGcontext*)nvgInternalParams(ctx)->userPtr; | |||
GLNVGtexture* tex = glnvg__findTexture(gl, image); | |||
tex->flags = flags; | |||
} | |||
@@ -19,16 +19,17 @@ | |||
#define NANOVG_GL_UTILS_H | |||
struct NVGLUframebuffer { | |||
struct NVGcontext* ctx; | |||
NVGcontext* ctx; | |||
GLuint fbo; | |||
GLuint rbo; | |||
GLuint texture; | |||
int image; | |||
}; | |||
typedef struct NVGLUframebuffer NVGLUframebuffer; | |||
// Helper function to create GL frame buffer to render to. | |||
struct NVGLUframebuffer* nvgluCreateFramebuffer(struct NVGcontext* ctx, int w, int h); | |||
void nvgluDeleteFramebuffer(struct NVGcontext* ctx, struct NVGLUframebuffer* fb); | |||
NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h); | |||
void nvgluDeleteFramebuffer(NVGcontext* ctx, NVGLUframebuffer* fb); | |||
#endif // NANOVG_GL_UTILS_H | |||
@@ -45,13 +46,13 @@ void nvgluDeleteFramebuffer(struct NVGcontext* ctx, struct NVGLUframebuffer* fb) | |||
# endif | |||
#endif | |||
struct NVGLUframebuffer* nvgluCreateFramebuffer(struct NVGcontext* ctx, int w, int h) | |||
NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h) | |||
{ | |||
#ifdef NANOVG_FBO_VALID | |||
struct NVGLUframebuffer* fb = NULL; | |||
fb = (struct NVGLUframebuffer*)malloc(sizeof(struct NVGLUframebuffer)); | |||
NVGLUframebuffer* fb = NULL; | |||
fb = (NVGLUframebuffer*)malloc(sizeof(NVGLUframebuffer)); | |||
if (fb == NULL) goto error; | |||
memset(fb, 0, sizeof(struct NVGLUframebuffer)); | |||
memset(fb, 0, sizeof(NVGLUframebuffer)); | |||
fb->image = nvgCreateImageRGBA(ctx, w, h, 0, NULL); | |||
fb->texture = nvglImageHandle(ctx, fb->image); | |||
@@ -84,7 +85,7 @@ error: | |||
#endif | |||
} | |||
void nvgluBindFramebuffer(struct NVGLUframebuffer* fb) | |||
void nvgluBindFramebuffer(NVGLUframebuffer* fb) | |||
{ | |||
#ifdef NANOVG_FBO_VALID | |||
glBindFramebuffer(GL_FRAMEBUFFER, fb != NULL ? fb->fbo : 0); | |||
@@ -93,7 +94,7 @@ void nvgluBindFramebuffer(struct NVGLUframebuffer* fb) | |||
#endif | |||
} | |||
void nvgluDeleteFramebuffer(struct NVGcontext* ctx, struct NVGLUframebuffer* fb) | |||
void nvgluDeleteFramebuffer(NVGcontext* ctx, NVGLUframebuffer* fb) | |||
{ | |||
#ifdef NANOVG_FBO_VALID | |||
if (fb == NULL) return; | |||