| @@ -125,30 +125,6 @@ static NVGcolor getNVGColor(uint32_t color) { | |||
| (color >> 24) & 0xff); | |||
| } | |||
| static NVGpaint getPaint(NVGcontext* vg, NSVGpaint* p) { | |||
| assert(p->type == NSVG_PAINT_LINEAR_GRADIENT || p->type == NSVG_PAINT_RADIAL_GRADIENT); | |||
| NSVGgradient* g = p->gradient; | |||
| assert(g->nstops >= 1); | |||
| NVGcolor icol = getNVGColor(g->stops[0].color); | |||
| NVGcolor ocol = getNVGColor(g->stops[g->nstops - 1].color); | |||
| float inverse[6]; | |||
| nvgTransformInverse(inverse, g->xform); | |||
| DEBUG_ONLY(printf(" inverse: %f %f %f %f %f %f\n", inverse[0], inverse[1], inverse[2], inverse[3], inverse[4], inverse[5]);) | |||
| math::Vec s, e; | |||
| DEBUG_ONLY(printf(" sx: %f sy: %f ex: %f ey: %f\n", s.x, s.y, e.x, e.y);) | |||
| // Is it always the case that the gradient should be transformed from (0, 0) to (0, 1)? | |||
| nvgTransformPoint(&s.x, &s.y, inverse, 0, 0); | |||
| nvgTransformPoint(&e.x, &e.y, inverse, 0, 1); | |||
| DEBUG_ONLY(printf(" sx: %f sy: %f ex: %f ey: %f\n", s.x, s.y, e.x, e.y);) | |||
| NVGpaint paint; | |||
| if (p->type == NSVG_PAINT_LINEAR_GRADIENT) | |||
| paint = nvgLinearGradient(vg, s.x, s.y, e.x, e.y, icol, ocol); | |||
| else | |||
| paint = nvgRadialGradient(vg, s.x, s.y, 0.0, 160, icol, ocol); | |||
| return paint; | |||
| } | |||
| /** Returns the parameterized value of the line p2--p3 where it intersects with p0--p1 */ | |||
| static float getLineCrossing(math::Vec p0, math::Vec p1, math::Vec p2, math::Vec p3) { | |||
| @@ -253,25 +229,39 @@ void svgDraw(NVGcontext* vg, NSVGimage* svg) { | |||
| } | |||
| // Fill shape | |||
| if (shape->fill.type) { | |||
| switch (shape->fill.type) { | |||
| case NSVG_PAINT_COLOR: { | |||
| NVGcolor color = getNVGColor(shape->fill.color); | |||
| nvgFillColor(vg, color); | |||
| DEBUG_ONLY(printf(" fill color (%g, %g, %g, %g)\n", color.r, color.g, color.b, color.a);) | |||
| } break; | |||
| case NSVG_PAINT_LINEAR_GRADIENT: | |||
| case NSVG_PAINT_RADIAL_GRADIENT: { | |||
| NSVGgradient* g = shape->fill.gradient; | |||
| (void)g; | |||
| DEBUG_ONLY(printf(" gradient: type: %s xform: %f %f %f %f %f %f spread: %d fx: %f fy: %f nstops: %d\n", (shape->fill.type == NSVG_PAINT_LINEAR_GRADIENT ? "linear" : "radial"), g->xform[0], g->xform[1], g->xform[2], g->xform[3], g->xform[4], g->xform[5], g->spread, g->fx, g->fy, g->nstops);) | |||
| for (int i = 0; i < g->nstops; i++) { | |||
| DEBUG_ONLY(printf(" stop: #%08x\t%f\n", g->stops[i].color, g->stops[i].offset);) | |||
| } | |||
| nvgFillPaint(vg, getPaint(vg, &shape->fill)); | |||
| } break; | |||
| if (shape->fill.type == NSVG_PAINT_COLOR) { | |||
| NVGcolor color = getNVGColor(shape->fill.color); | |||
| DEBUG_ONLY(printf(" fill color (%g, %g, %g, %g)\n", color.r, color.g, color.b, color.a);) | |||
| nvgFillColor(vg, color); | |||
| nvgFill(vg); | |||
| } | |||
| else if (shape->fill.type == NSVG_PAINT_LINEAR_GRADIENT || shape->fill.type == NSVG_PAINT_RADIAL_GRADIENT) { | |||
| nvgSave(vg); | |||
| const NSVGgradient* g = shape->fill.gradient; | |||
| DEBUG_ONLY(printf(" gradient: type: %s xform: %f %f %f %f %f %f spread: %d fx: %f fy: %f nstops: %d\n", shape->fill.type == NSVG_PAINT_LINEAR_GRADIENT ? "linear" : "radial", g->xform[0], g->xform[1], g->xform[2], g->xform[3], g->xform[4], g->xform[5], g->spread, g->fx, g->fy, g->nstops);) | |||
| for (int i = 0; i < g->nstops; i++) { | |||
| DEBUG_ONLY(printf(" stop: #%08x\t%f\n", g->stops[i].color, g->stops[i].offset);) | |||
| } | |||
| assert(g->nstops >= 1); | |||
| NVGcolor icol = getNVGColor(g->stops[0].color); | |||
| NVGcolor ocol = getNVGColor(g->stops[g->nstops - 1].color); | |||
| float t[6]; | |||
| nvgTransformInverse(t, g->xform); | |||
| DEBUG_ONLY(printf(" inverse: %f %f %f %f %f %f\n", t[0], t[1], t[2], t[3], t[4], t[5]);) | |||
| nvgTransform(vg, t[0], t[1], t[2], t[3], t[4], t[5]); | |||
| NVGpaint paint; | |||
| if (shape->fill.type == NSVG_PAINT_LINEAR_GRADIENT) { | |||
| paint = nvgLinearGradient(vg, 0.0, 0.0, 0.0, 1.0, icol, ocol); | |||
| } | |||
| else if (shape->fill.type == NSVG_PAINT_RADIAL_GRADIENT) { | |||
| paint = nvgRadialGradient(vg, 0.0, 0.0, 0.0, 1.0, icol, ocol); | |||
| } | |||
| nvgFillPaint(vg, paint); | |||
| nvgFill(vg); | |||
| nvgRestore(vg); | |||
| } | |||
| // Stroke shape | |||