From 096074af2c6fcbf622f0a42b2f7c56d0c66fbd80 Mon Sep 17 00:00:00 2001 From: Brian Salomon Date: Fri, 1 Dec 2017 13:49:50 -0500 Subject: 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 Reviewed-by: Robert Phillips --- gm/drrect_small_inner.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 gm/drrect_small_inner.cpp (limited to 'gm/drrect_small_inner.cpp') 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(); +} -- cgit v1.2.3