#pragma once #include "util/math.hpp" #include "nanovg.h" namespace rack { inline NVGcolor colorClip(NVGcolor a) { for (int i = 0; i < 4; i++) a.rgba[i] = clamp(a.rgba[i], 0.f, 1.f); return a; } inline NVGcolor colorMinus(NVGcolor a, NVGcolor b) { for (int i = 0; i < 3; i++) a.rgba[i] -= b.rgba[i]; return a; } inline NVGcolor colorPlus(NVGcolor a, NVGcolor b) { for (int i = 0; i < 3; i++) a.rgba[i] += b.rgba[i]; return a; } inline NVGcolor colorMult(NVGcolor a, NVGcolor b) { for (int i = 0; i < 3; i++) a.rgba[i] *= b.rgba[i]; return a; } inline NVGcolor colorMult(NVGcolor a, float x) { for (int i = 0; i < 3; i++) a.rgba[i] *= x; return a; } /** Screen blending with alpha compositing */ inline NVGcolor colorScreen(NVGcolor a, NVGcolor b) { if (a.a == 0.0) return b; if (b.a == 0.0) return a; a = colorMult(a, a.a); b = colorMult(b, b.a); NVGcolor c = colorMinus(colorPlus(a, b), colorMult(a, b)); c.a = a.a + b.a - a.a * b.a; c = colorMult(c, 1.f / c.a); c = colorClip(c); return c; } } // namespace rack