Fix non-zero special-image subsets in magnifier filter
This will let us re-land https://skia-review.googlesource.com/c/skia/+/237127
which makes non-zero subsets much more common. Confirmed that this CL and
the linked CL will now pass the CC unittests that caught the original failure.
Change-Id: Ic0393a574b2c19d92421a5deece81ab2ed70fc97
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/237899
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/effects/imagefilters/SkMagnifierImageFilter.cpp b/src/effects/imagefilters/SkMagnifierImageFilter.cpp
index 5fde84d..8e36093 100644
--- a/src/effects/imagefilters/SkMagnifierImageFilter.cpp
+++ b/src/effects/imagefilters/SkMagnifierImageFilter.cpp
@@ -131,9 +131,15 @@
offset->fY = bounds.top();
bounds.offset(-inputOffset);
+ // Map bounds and srcRect into the proxy space. Due to the zoom effect,
+ // it's not just an offset for fSrcRect.
+ bounds.offset(input->subset().x(), input->subset().y());
+ SkRect srcRect = fSrcRect.makeOffset((1.f - invXZoom) * input->subset().x(),
+ (1.f - invYZoom) * input->subset().y());
+
auto fp = GrMagnifierEffect::Make(std::move(inputProxy),
bounds,
- fSrcRect,
+ srcRect,
invXZoom,
invYZoom,
bounds.width() * invInset,
diff --git a/src/gpu/effects/GrMagnifierEffect.fp b/src/gpu/effects/GrMagnifierEffect.fp
index ea40cd1..e6a9aa2 100644
--- a/src/gpu/effects/GrMagnifierEffect.fp
+++ b/src/gpu/effects/GrMagnifierEffect.fp
@@ -56,15 +56,17 @@
{
SkScalar y = bounds.y() * invH;
+ SkScalar hSign = 1.f;
if (srcProxy.origin() != kTopLeft_GrSurfaceOrigin) {
- y = 1.0f - bounds.height() * invH;
+ y = 1.0f - bounds.y() * invH;
+ hSign = -1.f;
}
pdman.set4f(boundsUniform,
bounds.x() * invW,
y,
SkIntToScalar(src.width()) / bounds.width(),
- SkIntToScalar(src.height()) / bounds.height());
+ hSign * SkIntToScalar(src.height()) / bounds.height());
}
}
diff --git a/src/gpu/effects/generated/GrMagnifierEffect.cpp b/src/gpu/effects/generated/GrMagnifierEffect.cpp
index 05f1602..0526e83 100644
--- a/src/gpu/effects/generated/GrMagnifierEffect.cpp
+++ b/src/gpu/effects/generated/GrMagnifierEffect.cpp
@@ -115,15 +115,17 @@
{
SkScalar y = bounds.y() * invH;
+ SkScalar hSign = 1.f;
if (srcProxy.origin() != kTopLeft_GrSurfaceOrigin) {
- y = 1.0f - bounds.height() * invH;
+ y = 1.0f - bounds.y() * invH;
+ hSign = -1.f;
}
pdman.set4f(boundsUniform,
bounds.x() * invW,
y,
SkIntToScalar(src.width()) / bounds.width(),
- SkIntToScalar(src.height()) / bounds.height());
+ hSign * SkIntToScalar(src.height()) / bounds.height());
}
}
UniformHandle boundsUniformVar;