commit 23f89562acbd637a23b9f0333877939ad26c0595
parent c4e1210897e804a19b3fa35d542765b3feb0236e
Author: falkTX <falktx@falktx.com>
Date: Thu, 7 Oct 2021 21:20:09 +0100
Import alpha/tint stuff from VCV
Diffstat:
3 files changed, 50 insertions(+), 13 deletions(-)
diff --git a/dgl/src/NanoVG.cpp b/dgl/src/NanoVG.cpp
@@ -83,6 +83,7 @@ DGL_EXT(PFNGLUNIFORMBLOCKBINDINGPROC, glUniformBlockBinding)
#endif
#include "nanovg/nanovg_gl.h"
+#include "nanovg/nanovg_gl_utils.h"
#if defined(NANOVG_GL2)
# define nvgCreateGL nvgCreateGL2
diff --git a/dgl/src/nanovg/nanovg.c b/dgl/src/nanovg/nanovg.c
@@ -74,7 +74,7 @@ struct NVGstate {
float miterLimit;
int lineJoin;
int lineCap;
- float alpha;
+ NVGcolor tint;
float xform[6];
NVGscissor scissor;
float fontSize;
@@ -651,7 +651,7 @@ void nvgReset(NVGcontext* ctx)
state->miterLimit = 10.0f;
state->lineCap = NVG_BUTT;
state->lineJoin = NVG_MITER;
- state->alpha = 1.0f;
+ state->tint = nvgRGBAf(1, 1, 1, 1);
nvgTransformIdentity(state->xform);
state->scissor.extent[0] = -1.0f;
@@ -698,8 +698,33 @@ void nvgLineJoin(NVGcontext* ctx, int join)
void nvgGlobalAlpha(NVGcontext* ctx, float alpha)
{
+ nvgGlobalTint(ctx, nvgRGBAf(1, 1, 1, alpha));
+}
+
+void nvgGlobalTint(NVGcontext* ctx, NVGcolor tint)
+{
+ NVGstate* state = nvg__getState(ctx);
+ state->tint = tint;
+}
+
+NVGcolor nvgGetGlobalTint(NVGcontext* ctx)
+{
+ NVGstate* state = nvg__getState(ctx);
+ return state->tint;
+}
+
+void nvgAlpha(NVGcontext* ctx, float alpha)
+{
+ NVGstate* state = nvg__getState(ctx);
+ state->tint.a *= alpha;
+}
+
+void nvgTint(NVGcontext* ctx, NVGcolor tint)
+{
NVGstate* state = nvg__getState(ctx);
- state->alpha = alpha;
+ int i;
+ for (i = 0; i < 4; i++)
+ state->tint.rgba[i] *= tint.rgba[i];
}
void nvgTransform(NVGcontext* ctx, float a, float b, float c, float d, float e, float f)
@@ -2234,9 +2259,11 @@ void nvgFill(NVGcontext* ctx)
else
nvg__expandFill(ctx, 0.0f, NVG_MITER, 2.4f);
- // Apply global alpha
- fillPaint.innerColor.a *= state->alpha;
- fillPaint.outerColor.a *= state->alpha;
+ // Apply global tint
+ for (i = 0; i < 4; i++) {
+ fillPaint.innerColor.rgba[i] *= state->tint.rgba[i];
+ fillPaint.outerColor.rgba[i] *= state->tint.rgba[i];
+ }
ctx->params.renderFill(ctx->params.userPtr, &fillPaint, state->compositeOperation, &state->scissor, ctx->fringeWidth,
ctx->cache->bounds, ctx->cache->paths, ctx->cache->npaths);
@@ -2269,9 +2296,11 @@ void nvgStroke(NVGcontext* ctx)
strokeWidth = ctx->fringeWidth;
}
- // Apply global alpha
- strokePaint.innerColor.a *= state->alpha;
- strokePaint.outerColor.a *= state->alpha;
+ // Apply global tint
+ for (i = 0; i < 4; i++) {
+ strokePaint.innerColor.rgba[i] *= state->tint.rgba[i];
+ strokePaint.outerColor.rgba[i] *= state->tint.rgba[i];
+ }
nvg__flattenPaths(ctx);
@@ -2438,15 +2467,18 @@ static int nvg__allocTextAtlas(NVGcontext* ctx)
static void nvg__renderText(NVGcontext* ctx, NVGvertex* verts, int nverts)
{
+ int i;
NVGstate* state = nvg__getState(ctx);
NVGpaint paint = state->fill;
// Render triangles.
paint.image = ctx->fontImages[ctx->fontImageIdx];
- // Apply global alpha
- paint.innerColor.a *= state->alpha;
- paint.outerColor.a *= state->alpha;
+ // Apply global tint
+ for (i = 0; i < 4; i++) {
+ paint.innerColor.rgba[i] *= state->tint.rgba[i];
+ paint.outerColor.rgba[i] *= state->tint.rgba[i];
+ }
ctx->params.renderTriangles(ctx->params.userPtr, &paint, state->compositeOperation, &state->scissor, verts, nverts, ctx->fringeWidth);
diff --git a/dgl/src/nanovg/nanovg.h b/dgl/src/nanovg/nanovg.h
@@ -279,6 +279,10 @@ void nvgLineJoin(NVGcontext* ctx, int join);
// Sets the transparency applied to all rendered shapes.
// Already transparent paths will get proportionally more transparent as well.
void nvgGlobalAlpha(NVGcontext* ctx, float alpha);
+void nvgGlobalTint(NVGcontext* ctx, NVGcolor tint);
+NVGcolor nvgGetGlobalTint(NVGcontext* ctx);
+void nvgAlpha(NVGcontext* ctx, float alpha);
+void nvgTint(NVGcontext* ctx, NVGcolor tint);
//
// Transforms
@@ -385,7 +389,7 @@ int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, unsigned char* data, int
// Creates image from specified image data and texture format.
// Returns handle to the image.
-int nvgCreateImageRaw(NVGcontext* ctx, int w, int h, int imageFlags, NVGtexture format, const unsigned char* data);
+int nvgCreateImageRaw(NVGcontext* ctx, int w, int h, int imageFlags, enum NVGtexture format, const unsigned char* data);
// Creates image from specified image data.
// Returns handle to the image.