diff options
author | Brian Salomon <bsalomon@google.com> | 2018-05-25 15:53:29 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-05-29 14:29:35 +0000 |
commit | ca439a0a0afca8ad20c724cc837ce7dbc67e1277 (patch) | |
tree | 7b6af0a339047095d2df466e001e01cc5c74a7fc /src/gpu/ops/GrTextureOp.cpp | |
parent | 457fa97bc84bd3dac1a3c0a5c3b66c168ced70da (diff) |
Make GrTextureOp disable coverage AA when rect falls on integers.
Change-Id: Iaf5e8d154cc9108adcd8294812cecae7b4f01a5d
Reviewed-on: https://skia-review.googlesource.com/130148
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'src/gpu/ops/GrTextureOp.cpp')
-rw-r--r-- | src/gpu/ops/GrTextureOp.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/gpu/ops/GrTextureOp.cpp b/src/gpu/ops/GrTextureOp.cpp index 5724050234..7c24ce5064 100644 --- a/src/gpu/ops/GrTextureOp.cpp +++ b/src/gpu/ops/GrTextureOp.cpp @@ -709,15 +709,26 @@ __attribute__((no_sanitize("float-cast-overflow"))) , fFinalized(0) , fAllowSRGBInputs(allowSRGBInputs ? 1 : 0) { SkASSERT(aaType != GrAAType::kMixedSamples); - - const Draw& draw = fDraws.emplace_back(srcRect, 0, GrPerspQuad(dstRect, viewMatrix), - constraint, color); fPerspective = viewMatrix.hasPerspective(); - fDomain = (bool)draw.domain(); - SkRect bounds; - bounds = draw.quad().bounds(); + auto quad = GrPerspQuad(dstRect, viewMatrix); + auto bounds = quad.bounds(); + if (GrAAType::kCoverage == this->aaType() && viewMatrix.rectStaysRect()) { + // Disable coverage AA when rect falls on integers in device space. + auto is_int = [](float f) { return f == sk_float_floor(f); }; + if (is_int(bounds.fLeft) && is_int(bounds.fTop) && is_int(bounds.fRight) && + is_int(bounds.fBottom)) { + fAAType = static_cast<unsigned>(GrAAType::kNone); + // We may have had a strict constraint with nearest filter soley due to possible AA + // bloat. In that case it's no longer necessary. + if (constraint == SkCanvas::kStrict_SrcRectConstraint && + filter == GrSamplerState::Filter::kNearest) { + constraint = SkCanvas::kFast_SrcRectConstraint; + } + } + } + const auto& draw = fDraws.emplace_back(srcRect, 0, quad, constraint, color); this->setBounds(bounds, HasAABloat::kNo, IsZeroArea::kNo); - + fDomain = static_cast<bool>(draw.domain()); fMaxApproxDstPixelArea = RectSizeAsSizeT(bounds); } |