summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/examples/common/nanovg/nanovg.cpp')
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/nanovg.cpp107
1 files changed, 61 insertions, 46 deletions
diff --git a/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp b/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp
index db392092c8b..4832fb42156 100644
--- a/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp
+++ b/3rdparty/bgfx/examples/common/nanovg/nanovg.cpp
@@ -347,7 +347,7 @@ error:
NVGparams* nvgInternalParams(NVGcontext* ctx)
{
- return &ctx->params;
+ return &ctx->params;
}
void nvgDeleteInternal(NVGcontext* ctx)
@@ -373,7 +373,7 @@ void nvgDeleteInternal(NVGcontext* ctx)
free(ctx);
}
-void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio)
+void nvgBeginFrame(NVGcontext* ctx, float windowWidth, float windowHeight, float devicePixelRatio)
{
/* printf("Tris: draws:%d fill:%d stroke:%d text:%d TOT:%d\n",
ctx->drawCallCount, ctx->fillTriCount, ctx->strokeTriCount, ctx->textTriCount,
@@ -1421,7 +1421,8 @@ static void nvg__chooseBevel(int bevel, NVGpoint* p0, NVGpoint* p1, float w,
}
static NVGvertex* nvg__roundJoin(NVGvertex* dst, NVGpoint* p0, NVGpoint* p1,
- float lw, float rw, float lu, float ru, int ncap, float fringe)
+ float lw, float rw, float lu, float ru, int ncap,
+ float fringe)
{
int i, n;
float dlx0 = p0->dy;
@@ -1554,36 +1555,39 @@ static NVGvertex* nvg__bevelJoin(NVGvertex* dst, NVGpoint* p0, NVGpoint* p1,
}
static NVGvertex* nvg__buttCapStart(NVGvertex* dst, NVGpoint* p,
- float dx, float dy, float w, float d, float aa)
+ float dx, float dy, float w, float d,
+ float aa, float u0, float u1)
{
float px = p->x - dx*d;
float py = p->y - dy*d;
float dlx = dy;
float dly = -dx;
- nvg__vset(dst, px + dlx*w - dx*aa, py + dly*w - dy*aa, 0,0); dst++;
- nvg__vset(dst, px - dlx*w - dx*aa, py - dly*w - dy*aa, 1,0); dst++;
- nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++;
- nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++;
+ nvg__vset(dst, px + dlx*w - dx*aa, py + dly*w - dy*aa, u0,0); dst++;
+ nvg__vset(dst, px - dlx*w - dx*aa, py - dly*w - dy*aa, u1,0); dst++;
+ nvg__vset(dst, px + dlx*w, py + dly*w, u0,1); dst++;
+ nvg__vset(dst, px - dlx*w, py - dly*w, u1,1); dst++;
return dst;
}
static NVGvertex* nvg__buttCapEnd(NVGvertex* dst, NVGpoint* p,
- float dx, float dy, float w, float d, float aa)
+ float dx, float dy, float w, float d,
+ float aa, float u0, float u1)
{
float px = p->x + dx*d;
float py = p->y + dy*d;
float dlx = dy;
float dly = -dx;
- nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++;
- nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++;
- nvg__vset(dst, px + dlx*w + dx*aa, py + dly*w + dy*aa, 0,0); dst++;
- nvg__vset(dst, px - dlx*w + dx*aa, py - dly*w + dy*aa, 1,0); dst++;
+ nvg__vset(dst, px + dlx*w, py + dly*w, u0,1); dst++;
+ nvg__vset(dst, px - dlx*w, py - dly*w, u1,1); dst++;
+ nvg__vset(dst, px + dlx*w + dx*aa, py + dly*w + dy*aa, u0,0); dst++;
+ nvg__vset(dst, px - dlx*w + dx*aa, py - dly*w + dy*aa, u1,0); dst++;
return dst;
}
static NVGvertex* nvg__roundCapStart(NVGvertex* dst, NVGpoint* p,
- float dx, float dy, float w, int ncap, float aa)
+ float dx, float dy, float w, int ncap,
+ float aa, float u0, float u1)
{
int i;
float px = p->x;
@@ -1594,16 +1598,17 @@ static NVGvertex* nvg__roundCapStart(NVGvertex* dst, NVGpoint* p,
for (i = 0; i < ncap; i++) {
float a = i/(float)(ncap-1)*NVG_PI;
float ax = cosf(a) * w, ay = sinf(a) * w;
- nvg__vset(dst, px - dlx*ax - dx*ay, py - dly*ax - dy*ay, 0,1); dst++;
+ nvg__vset(dst, px - dlx*ax - dx*ay, py - dly*ax - dy*ay, u0,1); dst++;
nvg__vset(dst, px, py, 0.5f,1); dst++;
}
- nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++;
- nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++;
+ nvg__vset(dst, px + dlx*w, py + dly*w, u0,1); dst++;
+ nvg__vset(dst, px - dlx*w, py - dly*w, u1,1); dst++;
return dst;
}
static NVGvertex* nvg__roundCapEnd(NVGvertex* dst, NVGpoint* p,
- float dx, float dy, float w, int ncap, float aa)
+ float dx, float dy, float w, int ncap,
+ float aa, float u0, float u1)
{
int i;
float px = p->x;
@@ -1611,13 +1616,13 @@ static NVGvertex* nvg__roundCapEnd(NVGvertex* dst, NVGpoint* p,
float dlx = dy;
float dly = -dx;
NVG_NOTUSED(aa);
- nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++;
- nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++;
+ nvg__vset(dst, px + dlx*w, py + dly*w, u0,1); dst++;
+ nvg__vset(dst, px - dlx*w, py - dly*w, u1,1); dst++;
for (i = 0; i < ncap; i++) {
float a = i/(float)(ncap-1)*NVG_PI;
float ax = cosf(a) * w, ay = sinf(a) * w;
nvg__vset(dst, px, py, 0.5f,1); dst++;
- nvg__vset(dst, px - dlx*ax + dx*ay, py - dly*ax + dy*ay, 0,1); dst++;
+ nvg__vset(dst, px - dlx*ax + dx*ay, py - dly*ax + dy*ay, u0,1); dst++;
}
return dst;
}
@@ -1693,15 +1698,24 @@ static void nvg__calculateJoins(NVGcontext* ctx, float w, int lineJoin, float mi
}
-static int nvg__expandStroke(NVGcontext* ctx, float w, int lineCap, int lineJoin, float miterLimit)
+static int nvg__expandStroke(NVGcontext* ctx, float w, float fringe, int lineCap, int lineJoin, float miterLimit)
{
NVGpathCache* cache = ctx->cache;
NVGvertex* verts;
NVGvertex* dst;
int cverts, i, j;
- float aa = ctx->fringeWidth;
+ float aa = fringe;//ctx->fringeWidth;
+ float u0 = 0.0f, u1 = 1.0f;
int ncap = nvg__curveDivs(w, NVG_PI, ctx->tessTol); // Calculate divisions per half circle.
+ w += aa * 0.5f;
+
+ // Disable the gradient used for antialiasing when antialiasing is not used.
+ if (aa == 0.0f) {
+ u0 = 0.5f;
+ u1 = 0.5f;
+ }
+
nvg__calculateJoins(ctx, w, lineJoin, miterLimit);
// Calculate max vertex usage.
@@ -1762,42 +1776,42 @@ static int nvg__expandStroke(NVGcontext* ctx, float w, int lineCap, int lineJoin
dy = p1->y - p0->y;
nvg__normalize(&dx, &dy);
if (lineCap == NVG_BUTT)
- dst = nvg__buttCapStart(dst, p0, dx, dy, w, -aa*0.5f, aa);
+ dst = nvg__buttCapStart(dst, p0, dx, dy, w, -aa*0.5f, aa, u0, u1);
else if (lineCap == NVG_BUTT || lineCap == NVG_SQUARE)
- dst = nvg__buttCapStart(dst, p0, dx, dy, w, w-aa, aa);
+ dst = nvg__buttCapStart(dst, p0, dx, dy, w, w-aa, aa, u0, u1);
else if (lineCap == NVG_ROUND)
- dst = nvg__roundCapStart(dst, p0, dx, dy, w, ncap, aa);
+ dst = nvg__roundCapStart(dst, p0, dx, dy, w, ncap, aa, u0, u1);
}
for (j = s; j < e; ++j) {
if ((p1->flags & (NVG_PT_BEVEL | NVG_PR_INNERBEVEL)) != 0) {
if (lineJoin == NVG_ROUND) {
- dst = nvg__roundJoin(dst, p0, p1, w, w, 0, 1, ncap, aa);
+ dst = nvg__roundJoin(dst, p0, p1, w, w, u0, u1, ncap, aa);
} else {
- dst = nvg__bevelJoin(dst, p0, p1, w, w, 0, 1, aa);
+ dst = nvg__bevelJoin(dst, p0, p1, w, w, u0, u1, aa);
}
} else {
- nvg__vset(dst, p1->x + (p1->dmx * w), p1->y + (p1->dmy * w), 0,1); dst++;
- nvg__vset(dst, p1->x - (p1->dmx * w), p1->y - (p1->dmy * w), 1,1); dst++;
+ nvg__vset(dst, p1->x + (p1->dmx * w), p1->y + (p1->dmy * w), u0,1); dst++;
+ nvg__vset(dst, p1->x - (p1->dmx * w), p1->y - (p1->dmy * w), u1,1); dst++;
}
p0 = p1++;
}
if (loop) {
// Loop it
- nvg__vset(dst, verts[0].x, verts[0].y, 0,1); dst++;
- nvg__vset(dst, verts[1].x, verts[1].y, 1,1); dst++;
+ nvg__vset(dst, verts[0].x, verts[0].y, u0,1); dst++;
+ nvg__vset(dst, verts[1].x, verts[1].y, u1,1); dst++;
} else {
// Add cap
dx = p1->x - p0->x;
dy = p1->y - p0->y;
nvg__normalize(&dx, &dy);
if (lineCap == NVG_BUTT)
- dst = nvg__buttCapEnd(dst, p1, dx, dy, w, -aa*0.5f, aa);
+ dst = nvg__buttCapEnd(dst, p1, dx, dy, w, -aa*0.5f, aa, u0, u1);
else if (lineCap == NVG_BUTT || lineCap == NVG_SQUARE)
- dst = nvg__buttCapEnd(dst, p1, dx, dy, w, w-aa, aa);
+ dst = nvg__buttCapEnd(dst, p1, dx, dy, w, w-aa, aa, u0, u1);
else if (lineCap == NVG_ROUND)
- dst = nvg__roundCapEnd(dst, p1, dx, dy, w, ncap, aa);
+ dst = nvg__roundCapEnd(dst, p1, dx, dy, w, ncap, aa, u0, u1);
}
path->nstroke = (int)(dst - verts);
@@ -1956,13 +1970,13 @@ void nvgBezierTo(NVGcontext* ctx, float c1x, float c1y, float c2x, float c2y, fl
void nvgQuadTo(NVGcontext* ctx, float cx, float cy, float x, float y)
{
- float x0 = ctx->commandx;
- float y0 = ctx->commandy;
- float vals[] = { NVG_BEZIERTO,
- x0 + 2.0f/3.0f*(cx - x0), y0 + 2.0f/3.0f*(cy - y0),
- x + 2.0f/3.0f*(cx - x), y + 2.0f/3.0f*(cy - y),
- x, y };
- nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals));
+ float x0 = ctx->commandx;
+ float y0 = ctx->commandy;
+ float vals[] = { NVG_BEZIERTO,
+ x0 + 2.0f/3.0f*(cx - x0), y0 + 2.0f/3.0f*(cy - y0),
+ x + 2.0f/3.0f*(cx - x), y + 2.0f/3.0f*(cy - y),
+ x, y };
+ nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals));
}
void nvgArcTo(NVGcontext* ctx, float x1, float y1, float x2, float y2, float radius)
@@ -2221,6 +2235,7 @@ void nvgStroke(NVGcontext* ctx)
const NVGpath* path;
int i;
+
if (strokeWidth < ctx->fringeWidth) {
// If the stroke width is less than pixel size, use alpha to emulate coverage.
// Since coverage is area, scale by alpha*alpha.
@@ -2237,9 +2252,9 @@ void nvgStroke(NVGcontext* ctx)
nvg__flattenPaths(ctx);
if (ctx->params.edgeAntiAlias && state->shapeAntiAlias)
- nvg__expandStroke(ctx, strokeWidth*0.5f + ctx->fringeWidth*0.5f, state->lineCap, state->lineJoin, state->miterLimit);
+ nvg__expandStroke(ctx, strokeWidth*0.5f, ctx->fringeWidth, state->lineCap, state->lineJoin, state->miterLimit);
else
- nvg__expandStroke(ctx, strokeWidth*0.5f, state->lineCap, state->lineJoin, state->miterLimit);
+ nvg__expandStroke(ctx, strokeWidth*0.5f, 0.0f, state->lineCap, state->lineJoin, state->miterLimit);
ctx->params.renderStroke(ctx->params.userPtr, &strokePaint, state->compositeOperation, &state->scissor, ctx->fringeWidth,
strokeWidth, ctx->cache->paths, ctx->cache->npaths);
@@ -2426,12 +2441,12 @@ float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char*
while (fonsTextIterNext(ctx->fs, &iter, &q)) {
float c[4*2];
if (iter.prevGlyphIndex == -1) { // can not retrieve glyph?
- if (!nvg__allocTextAtlas(ctx))
- break; // no memory :(
if (nverts != 0) {
nvg__renderText(ctx, verts, nverts);
nverts = 0;
}
+ if (!nvg__allocTextAtlas(ctx))
+ break; // no memory :(
iter = prevIter;
fonsTextIterNext(ctx->fs, &iter, &q); // try again
if (iter.prevGlyphIndex == -1) // still can not find glyph?