gl_engine: fix mistake in the calculation of stroke miter limit

* correct the stroke width and color calculation with scaling
* fix the miter limit calculation to make bevel join fallback correct
This commit is contained in:
tangruiwen.mmh1103 2024-08-23 11:21:36 +08:00 committed by Hermet Park
parent 34d0309fcc
commit a9d314985c
3 changed files with 13 additions and 5 deletions

View file

@ -27,7 +27,7 @@
#include "tvgGlCommon.h"
#include "tvgMath.h"
#define MIN_GL_STROKE_WIDTH 0.5f
#define MIN_GL_STROKE_WIDTH 1.0f
#define MVP_MATRIX(w, h) \
float mvp[4*4] = { \

View file

@ -140,7 +140,7 @@ void GlRenderer::drawPrimitive(GlShape& sdata, uint8_t r, uint8_t g, uint8_t b,
a = MULTIPLY(a, sdata.opacity);
if (flag & RenderUpdateFlag::Stroke) {
float strokeWidth = sdata.rshape->strokeWidth();
float strokeWidth = sdata.rshape->strokeWidth() * sdata.geometry->getTransformMatrix().e11;
if (strokeWidth < MIN_GL_STROKE_WIDTH) {
float alpha = strokeWidth / MIN_GL_STROKE_WIDTH;
a = MULTIPLY(a, static_cast<uint8_t>(alpha * 255));

View file

@ -1645,11 +1645,19 @@ Stroker::Stroker(Array<float> *points, Array<uint32_t> *indices, const Matrix& m
void Stroker::stroke(const RenderShape *rshape)
{
mMiterLimit = rshape->strokeMiterlimit() * 2.f;
mStrokeWidth = std::max(mStrokeWidth, rshape->strokeWidth());
mMiterLimit = rshape->strokeMiterlimit();
mStrokeCap = rshape->strokeCap();
mStrokeJoin = rshape->strokeJoin();
mStrokeWidth = rshape->strokeWidth();
if (isinf(mMatrix.e11)) {
float strokeWidth = rshape->strokeWidth() * mMatrix.e11;
if (strokeWidth <= MIN_GL_STROKE_WIDTH) strokeWidth = MIN_GL_STROKE_WIDTH;
mStrokeWidth = strokeWidth / mMatrix.e11;
}
auto cmds = rshape->path.cmds.data;
auto cmdCnt = rshape->path.cmds.count;
@ -1955,7 +1963,7 @@ void Stroker::strokeMiter(const GlPoint &prev, const GlPoint &curr, const GlPoin
auto pe = out * k;
if (detail::_pointLength(pe) >= mMiterLimit) {
if (detail::_pointLength(pe) >= mMiterLimit * strokeRadius()) {
this->strokeBevel(prev, curr, center);
return;
}