Fix SkOffsetImageFilter to use a temporary for bounds computations.

SkOffsetImageFilter::onFilterBounds() was writing to *dst, and later
referring to src. These may be the same memory location, so the results
were incorrect.

Covered by the 5th test case in offsetimagefilter.

BUG=skia:

Review URL: https://codereview.chromium.org/195163004

git-svn-id: http://skia.googlecode.com/svn/trunk@13744 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
senorblanco@chromium.org 2014-03-11 18:29:42 +00:00
parent cdd0f92b1a
commit 06342a2666
2 changed files with 9 additions and 3 deletions

View File

@ -50,3 +50,8 @@ rrect_clip_aa
# I will likely just delete the GM. # I will likely just delete the GM.
canvas-layer-state canvas-layer-state
# Fixes correctness for offsetimagefilter; slight pixel diffs for imagefiltersclipped.
# https://codereview.chromium.org/195163004
# senorblanco will rebaseline.
offsetimagefilter
imagefiltersclipped

View File

@ -84,9 +84,10 @@ bool SkOffsetImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm
SkVector vec; SkVector vec;
ctm.mapVectors(&vec, &fOffset, 1); ctm.mapVectors(&vec, &fOffset, 1);
*dst = src; SkIRect bounds = src;
dst->offset(-SkScalarCeilToInt(vec.fX), -SkScalarCeilToInt(vec.fY)); bounds.offset(-SkScalarCeilToInt(vec.fX), -SkScalarCeilToInt(vec.fY));
dst->join(src); bounds.join(src);
*dst = bounds;
return true; return true;
} }