diff options
-rw-r--r-- | gm/ovals.cpp | 20 | ||||
-rw-r--r-- | src/gpu/ops/GrOvalOpFactory.cpp | 7 |
2 files changed, 24 insertions, 3 deletions
diff --git a/gm/ovals.cpp b/gm/ovals.cpp index ec9bd75d47..d6afdcbba7 100644 --- a/gm/ovals.cpp +++ b/gm/ovals.cpp @@ -268,6 +268,26 @@ protected: canvas->restore(); } + + // reflected oval + for (int i = 0; i < fPaints.count(); ++i) { + SkRect oval = SkRect::MakeLTRB(-30, -30, 30, 30); + canvas->save(); + // position the oval, and make it at off-integer coords. + canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4, + kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 + + SK_ScalarHalf * kYStep); + canvas->rotate(90); + canvas->scale(1, -1); + canvas->scale(1, 0.66f); + + SkColor color = genColor(&rand); + fPaints[i].setColor(color); + + canvas->drawRect(oval, rectPaint); + canvas->drawOval(oval, fPaints[i]); + canvas->restore(); + } } private: diff --git a/src/gpu/ops/GrOvalOpFactory.cpp b/src/gpu/ops/GrOvalOpFactory.cpp index e00ee0b24d..71f8bb089f 100644 --- a/src/gpu/ops/GrOvalOpFactory.cpp +++ b/src/gpu/ops/GrOvalOpFactory.cpp @@ -1172,8 +1172,8 @@ public: SkScalar ellipseXRadius = SkScalarHalf(ellipse.width()); SkScalar ellipseYRadius = SkScalarHalf(ellipse.height()); SkScalar xRadius = SkScalarAbs(viewMatrix[SkMatrix::kMScaleX] * ellipseXRadius + - viewMatrix[SkMatrix::kMSkewY] * ellipseYRadius); - SkScalar yRadius = SkScalarAbs(viewMatrix[SkMatrix::kMSkewX] * ellipseXRadius + + viewMatrix[SkMatrix::kMSkewX] * ellipseYRadius); + SkScalar yRadius = SkScalarAbs(viewMatrix[SkMatrix::kMSkewY] * ellipseXRadius + viewMatrix[SkMatrix::kMScaleY] * ellipseYRadius); // do (potentially) anisotropic mapping of stroke @@ -2385,7 +2385,8 @@ std::unique_ptr<GrLegacyMeshDrawOp> GrOvalOpFactory::MakeOvalOp(GrColor color, const GrShaderCaps* shaderCaps) { // we can draw circles SkScalar width = oval.width(); - if (SkScalarNearlyEqual(width, oval.height()) && circle_stays_circle(viewMatrix)) { + if (width > SK_ScalarNearlyZero && SkScalarNearlyEqual(width, oval.height()) && + circle_stays_circle(viewMatrix)) { SkPoint center = {oval.centerX(), oval.centerY()}; return CircleOp::Make(color, viewMatrix, center, width / 2.f, GrStyle(stroke, nullptr)); } |