diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-06-11 17:30:33 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-06-11 17:30:33 +0000 |
commit | 5ee6491b7a1e7c177abc0186c2749ebe1f71fcf7 (patch) | |
tree | f58ac55a0761c18f843905ecfd9637d1120a66bf /src | |
parent | db15a420c3f1c8f16d009ff5638475ec481337f0 (diff) |
Better fix for rev. 4214 (inverse-fill and clipping). This fix avoids changing
the actual clipping bounds, which caused tiny differences in the scan converter.
Also adding a gm (which I should have the first time.)
Review URL: https://codereview.appspot.com/6297073
git-svn-id: http://skia.googlecode.com/svn/trunk@4227 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkScanPriv.h | 3 | ||||
-rw-r--r-- | src/core/SkScan_Path.cpp | 16 |
2 files changed, 8 insertions, 11 deletions
diff --git a/src/core/SkScanPriv.h b/src/core/SkScanPriv.h index 96ed5ab8fb..82402a7454 100644 --- a/src/core/SkScanPriv.h +++ b/src/core/SkScanPriv.h @@ -15,7 +15,8 @@ class SkScanClipper { public: - SkScanClipper(SkBlitter* blitter, const SkRegion* clip, const SkIRect& bounds); + SkScanClipper(SkBlitter* blitter, const SkRegion* clip, const SkIRect& bounds, + bool skipRejectTest = false); SkBlitter* getBlitter() const { return fBlitter; } const SkIRect* getClipRect() const { return fClipRect; } diff --git a/src/core/SkScan_Path.cpp b/src/core/SkScan_Path.cpp index 8973397760..a04a2f3c93 100644 --- a/src/core/SkScan_Path.cpp +++ b/src/core/SkScan_Path.cpp @@ -540,22 +540,19 @@ void sk_blit_below(SkBlitter* blitter, const SkIRect& ir, const SkRegion& clip) /////////////////////////////////////////////////////////////////////////////// -static const SkIRect gHugeIRect = { - SK_MinS32, SK_MinS32, SK_MaxS32, SK_MaxS32 -}; - /** - * If the caller is drawing an inverse-fill path, then it shouldn't pass a - * huge rect for ir, since the path draws "everywhere". + * If the caller is drawing an inverse-fill path, then it pass true for + * skipRejectTest, so we don't abort drawing just because the src bounds (ir) + * is outside of the clip. */ SkScanClipper::SkScanClipper(SkBlitter* blitter, const SkRegion* clip, - const SkIRect& ir) { + const SkIRect& ir, bool skipRejectTest) { fBlitter = NULL; // null means blit nothing fClipRect = NULL; if (clip) { fClipRect = &clip->getBounds(); - if (!SkIRect::Intersects(*fClipRect, ir)) { // completely clipped out + if (!skipRejectTest && !SkIRect::Intersects(*fClipRect, ir)) { // completely clipped out return; } @@ -618,8 +615,7 @@ void SkScan::FillPath(const SkPath& path, const SkRegion& origClip, return; } - SkScanClipper clipper(blitter, clipPtr, - path.isInverseFillType() ? gHugeIRect : ir); + SkScanClipper clipper(blitter, clipPtr, ir, path.isInverseFillType()); blitter = clipper.getBlitter(); if (blitter) { |