diff options
author | rmistry <rmistry@google.com> | 2015-04-01 04:19:44 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-01 04:19:45 -0700 |
commit | 7c0273f107d571a2147e4b2ad3f36c917bb12b22 (patch) | |
tree | a2a7b15ea279814f2b187ac3338c9abca7dc6f5f /gm/lighting.cpp | |
parent | 4a9426f0fa812c0f1bffa84f0dae0926607a9543 (diff) |
Revert of Implement approx-match support in image filter saveLayer() offscreen. (patchset #27 id:510001 of https://codereview.chromium.org/1034733002/)
Reason for revert:
Looks like this change is causing layout test failures which is blocking Skia's DEPS roll into Chromium:
https://codereview.chromium.org/1050563002/
https://codereview.chromium.org/1043133005/
https://codereview.chromium.org/1048273002/
Reverting to see if this fixes the DEPS roll.
Original issue's description:
> Implement approx-match support in image filter saveLayer() offscreen.
>
> Currently, the GPU-side image filter implementation creates
> exact-match textures for the offscreen backing stores for
> saveLayer(). This is because several filters have GPU
> implementations which depend on the texture coordinates
> being 0..1.
>
> The fix is three-fold:
>
> 1) Store the actual requested size in the SkGpuDevice, so
> that when wrapping it in an SkBitmap for passing to
> filterImage(), we can give it the original size.
> 2) Fix the filters (SkMagnifierImageFilter,
> SkLightingImageFilter) whose GPU implementation depends on
> 0..1 texture coordinates.
> 3) Remove the exception for GPU-side image filters in
> SkCanvas::internalSaveLayer().
>
> For the lighting filters, there were two bugs which were
> cancelling each other out: the sobel filter matrix was
> being computed upside down, but then we'd negate the
> resulting normal. This worked fine in the exact-match case,
> but in the approx-match case we'd sample garbage along
> the edge pixels. Also, we never implemented the edge pixels
> according to spec in the GPU case. It requires a
> different fragment shader for each edge of the nine-patch,
> which meant we couldn't use asFragmentProcessor(), and had
> to implement the drawing via a filterImageGPU() override.
> In order to avoid polluting the public API, I inserted a
> new base class, SkLightingImageFilterInternal above
> Sk[Diffuse|Specular]LightingImageFilter to handle the
> implementation.
>
> N.B.: this change will cause some minor pixel diffs in the
> GPU results of the following GMs (and possibly more):
> matriximagefilter, matrixconvolution, imagefiltersscaled,
> lighting, imagemagnifier, filterfastbounds,
> complexclip_aa_Layer_invert, complexclip_aa_layer,
> complexclip_bw_layer_invert, complexclip_bw_layer.
>
> BUG=skia:3532
>
> Committed: https://skia.googlesource.com/skia/+/b97dafefe63ea0a1bbce8e8b209f4920983fb8b9
>
> Committed: https://skia.googlesource.com/skia/+/f5f8518fe0bbd2703e4ffc1b11ad7b4312ff7641
TBR=bsalomon@google.com,reed@chromium.org,senorblanco@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:3532
Review URL: https://codereview.chromium.org/1057443003
Diffstat (limited to 'gm/lighting.cpp')
-rw-r--r-- | gm/lighting.cpp | 61 |
1 files changed, 9 insertions, 52 deletions
diff --git a/gm/lighting.cpp b/gm/lighting.cpp index 0bfbb47a95..36c8ba0e45 100644 --- a/gm/lighting.cpp +++ b/gm/lighting.cpp @@ -7,10 +7,9 @@ #include "gm.h" #include "SkLightingImageFilter.h" -#include "SkOffsetImageFilter.h" #define WIDTH 330 -#define HEIGHT 660 +#define HEIGHT 440 namespace skiagm { @@ -87,70 +86,28 @@ protected: SkPaint paint; SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 10, 60, 65)); - SkImageFilter::CropRect fullSizeCropRect(SkRect::MakeXYWH(0, 0, 100, 100)); - SkAutoTUnref<SkImageFilter> noopCropped(SkOffsetImageFilter::Create(0, 0, NULL, &cropRect)); int y = 0; - for (int i = 0; i < 3; i++) { - const SkImageFilter::CropRect* cr = (i == 1) ? &cropRect : (i == 2) ? &fullSizeCropRect : NULL; - SkImageFilter* input = (i == 2) ? noopCropped.get() : NULL; - paint.setImageFilter(SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, - white, - surfaceScale, - kd, - input, - cr))->unref(); + for (int i = 0; i < 2; i++) { + const SkImageFilter::CropRect* cr = (i == 0) ? NULL : &cropRect; + paint.setImageFilter(SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, white, surfaceScale, kd, NULL, cr))->unref(); drawClippedBitmap(canvas, paint, 0, y); - paint.setImageFilter(SkLightingImageFilter::CreateDistantLitDiffuse(distantDirection, - white, - surfaceScale, - kd, - input, - cr))->unref(); + paint.setImageFilter(SkLightingImageFilter::CreateDistantLitDiffuse(distantDirection, white, surfaceScale, kd, NULL, cr))->unref(); drawClippedBitmap(canvas, paint, 110, y); - paint.setImageFilter(SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, - spotTarget, - spotExponent, - cutoffAngle, - white, - surfaceScale, - kd, - input, - cr))->unref(); + paint.setImageFilter(SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, spotTarget, spotExponent, cutoffAngle, white, surfaceScale, kd, NULL, cr))->unref(); drawClippedBitmap(canvas, paint, 220, y); y += 110; - paint.setImageFilter(SkLightingImageFilter::CreatePointLitSpecular(pointLocation, - white, - surfaceScale, - ks, - shininess, - input, - cr))->unref(); + paint.setImageFilter(SkLightingImageFilter::CreatePointLitSpecular(pointLocation, white, surfaceScale, ks, shininess, NULL, cr))->unref(); drawClippedBitmap(canvas, paint, 0, y); - paint.setImageFilter(SkLightingImageFilter::CreateDistantLitSpecular(distantDirection, - white, - surfaceScale, - ks, - shininess, - input, - cr))->unref(); + paint.setImageFilter(SkLightingImageFilter::CreateDistantLitSpecular(distantDirection, white, surfaceScale, ks, shininess, NULL, cr))->unref(); drawClippedBitmap(canvas, paint, 110, y); - paint.setImageFilter(SkLightingImageFilter::CreateSpotLitSpecular(spotLocation, - spotTarget, - spotExponent, - cutoffAngle, - white, - surfaceScale, - ks, - shininess, - input, - cr))->unref(); + paint.setImageFilter(SkLightingImageFilter::CreateSpotLitSpecular(spotLocation, spotTarget, spotExponent, cutoffAngle, white, surfaceScale, ks, shininess, NULL, cr))->unref(); drawClippedBitmap(canvas, paint, 220, y); y += 110; |