aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2017-12-01 13:49:50 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-12-01 20:00:09 +0000
commit096074af2c6fcbf622f0a42b2f7c56d0c66fbd80 (patch)
treec8162aad746f18fee6344567a6cf63ae11dc7dec /gm
parentb826a3ab7247fea323eb8b06372a678fbc6c3dbe (diff)
Fix rendering of drrects with small circular inner rrects.
Previously when the inner rrect was a circle with a radius of 1 we would cause a inf * 0 in the shader which would lead to the shape not rendering. This change also makes concentric circle drrects draw as stroked circles. bug: chromium:789262 Change-Id: I6efbe3fdde25d6c4e031c7412d83df009afe014a Reviewed-on: https://skia-review.googlesource.com/79141 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'gm')
-rw-r--r--gm/drrect_small_inner.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/gm/drrect_small_inner.cpp b/gm/drrect_small_inner.cpp
new file mode 100644
index 0000000000..1c7a7436ff
--- /dev/null
+++ b/gm/drrect_small_inner.cpp
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkCanvas.h"
+#include "SkPaint.h"
+#include "SkRRect.h"
+#include "gm.h"
+
+DEF_SIMPLE_GM(drrect_small_inner, canvas, 170, 610) {
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ static constexpr SkScalar kOuterRadius = 35.f;
+ auto outer = SkRRect::MakeOval(SkRect::MakeXYWH(0, 0, 2 * kOuterRadius, 2 * kOuterRadius));
+ canvas->translate(10.f, 10.f);
+ canvas->save();
+ for (bool offcenter : {false, true}) {
+ for (bool oval : {false, true}) {
+ for (SkScalar innerRadiusX : {1.f, 0.5f, 0.1f, .01f}) {
+ SkScalar innerRadiusY = innerRadiusX;
+ if (oval) {
+ innerRadiusY *= 0.95f;
+ }
+ SkScalar tx = kOuterRadius - innerRadiusX;
+ SkScalar ty = kOuterRadius - innerRadiusY;
+ if (offcenter) {
+ tx += 1.f;
+ }
+ auto inner = SkRRect::MakeOval(
+ SkRect::MakeXYWH(tx, ty, 2 * innerRadiusX, 2 * innerRadiusY));
+ canvas->drawDRRect(outer, inner, paint);
+ canvas->translate(0, 2 * kOuterRadius + 5);
+ }
+ }
+ canvas->restore();
+ canvas->translate(2 * kOuterRadius + 2, 0);
+ }
+ canvas->restore();
+}