aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects/GrCircleEffect.fp
diff options
context:
space:
mode:
authorGravatar Brian Salomon <bsalomon@google.com>2017-12-01 16:01:47 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-12-01 21:25:39 +0000
commit6574921253197338f879130ed99fb9ce483976de (patch)
tree786f7d99ecdd4efeab5c2ea68e02fd24b189d5a0 /src/gpu/effects/GrCircleEffect.fp
parent80654c16bd47ec800cacc9845c9129e203427914 (diff)
Revert "Revert "Fix rendering of drrects with small circular inner rrects.""
This reverts commit ec727c981dd7ed83e98c7713c2828c6ab144937b. Change-Id: Id3164619016d58b2bcc0b8af606215653f553fce Reviewed-on: https://skia-review.googlesource.com/79422 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/effects/GrCircleEffect.fp')
-rw-r--r--src/gpu/effects/GrCircleEffect.fp16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/gpu/effects/GrCircleEffect.fp b/src/gpu/effects/GrCircleEffect.fp
index fe959f8bc8..352e824b54 100644
--- a/src/gpu/effects/GrCircleEffect.fp
+++ b/src/gpu/effects/GrCircleEffect.fp
@@ -15,6 +15,18 @@ half prevRadius = -1;
// fills and (..., radius - 0.5, 1 / (radius - 0.5)) for inverse fills.
uniform half4 circle;
+@make {
+ static std::unique_ptr<GrFragmentProcessor> Make(GrClipEdgeType edgeType, SkPoint center,
+ float radius) {
+ // A radius below half causes the implicit insetting done by this processor to become
+ // inverted. We could handle this case by making the processor code more complicated.
+ if (radius < .5f) {
+ return nullptr;
+ }
+ return std::unique_ptr<GrFragmentProcessor>(new GrCircleEffect(edgeType, center, radius));
+ }
+}
+
@optimizationFlags { kCompatibleWithCoverageAsAlpha_OptimizationFlag }
@setData(pdman) {
@@ -22,6 +34,8 @@ uniform half4 circle;
SkScalar effectiveRadius = radius;
if (GrProcessorEdgeTypeIsInverseFill((GrClipEdgeType) edgeType)) {
effectiveRadius -= 0.5f;
+ // When the radius is 0.5 effectiveRadius is 0 which causes an inf * 0 in the shader.
+ effectiveRadius = SkTMax(0.001f, effectiveRadius);
} else {
effectiveRadius += 0.5f;
}
@@ -58,7 +72,7 @@ void main() {
SkPoint center;
center.fX = testData->fRandom->nextRangeScalar(0.f, 1000.f);
center.fY = testData->fRandom->nextRangeScalar(0.f, 1000.f);
- SkScalar radius = testData->fRandom->nextRangeF(0.f, 1000.f);
+ SkScalar radius = testData->fRandom->nextRangeF(1.f, 1000.f);
GrClipEdgeType et;
do {
et = (GrClipEdgeType) testData->fRandom->nextULessThan(kGrClipEdgeTypeCnt);