diff options
author | Brian Salomon <bsalomon@google.com> | 2017-12-01 13:49:50 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-01 20:00:09 +0000 |
commit | 096074af2c6fcbf622f0a42b2f7c56d0c66fbd80 (patch) | |
tree | c8162aad746f18fee6344567a6cf63ae11dc7dec /gm | |
parent | b826a3ab7247fea323eb8b06372a678fbc6c3dbe (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.cpp | 42 |
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(); +} |