diff options
author | vandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-01-06 23:40:00 +0000 |
---|---|---|
committer | vandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-01-06 23:40:00 +0000 |
commit | ccee6133be215c521bc15c5d834f1e18e883ebd9 (patch) | |
tree | 326b35b6866d3ec88a87da405b99314568bfbd62 | |
parent | d84044aec0956cf2ea92f1a666116e47a7a23bfd (diff) | |
download | src-ccee6133be215c521bc15c5d834f1e18e883ebd9.tar.gz |
Merge 12729 "[PDF] Fix clipping in xfermode improvement."
> [PDF] Fix clipping in xfermode improvement.
>
> In some cases, the wrong clip (src clip instead of initial clip) was used.
> Switch almost exclusively to initial clip because it is safe and generates a smaller result.
>
> BUG=chromium:328009
> R=reed@google.com, bungeman@google.com
>
> Author: vandebo@chromium.org
>
> Review URL: https://codereview.chromium.org/116423004
TBR=vandebo@chromium.org
Review URL: https://codereview.chromium.org/125293004
git-svn-id: http://skia.googlecode.com/svn/branches/chrome/m33_1750/src@12934 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | pdf/SkPDFDevice.cpp | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/pdf/SkPDFDevice.cpp b/pdf/SkPDFDevice.cpp index cdfec330..6625a8e7 100644 --- a/pdf/SkPDFDevice.cpp +++ b/pdf/SkPDFDevice.cpp @@ -1912,8 +1912,10 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, ContentEntry* contentEntries = getContentEntries()->get(); SkASSERT(dst); SkASSERT(!contentEntries->fNext.get()); - // We have to make a copy of these here because changing the current - // content into a form-xobject will destroy them. + // Changing the current content into a form-xobject will destroy the clip + // objects which is fine since the xobject will already be clipped. However + // if source has shape, we need to clip it too, so a copy of the clip is + // saved. SkClipStack clipStack = contentEntries->fState.fClipStack; SkRegion clipRegion = contentEntries->fState.fClipRegion; @@ -1930,7 +1932,8 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, // reduces to Dst. if (shape == NULL || xfermode == SkXfermode::kDstOut_Mode || xfermode == SkXfermode::kSrcATop_Mode) { - ScopedContentEntry content(this, &clipStack, clipRegion, identity, + ScopedContentEntry content(this, &fExistingClipStack, + fExistingClipRegion, identity, stockPaint); SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), &content.entry()->fContent); @@ -1951,7 +1954,7 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, // the non-transparent parts of the device and the outlines (shape) of // all images and devices drawn. drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), dst, - &clipStack, clipRegion, + &fExistingClipStack, fExistingClipRegion, SkXfermode::kSrcOver_Mode, true); } else { SkAutoTUnref<SkPDFFormXObject> dstMaskStorage; @@ -1970,16 +1973,17 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, dstMaskStorage.reset(createFormXObjectFromDevice()); dstMask = dstMaskStorage.get(); } - drawFormXObjectWithMask(addXObjectResource(dst), dstMask, &clipStack, - clipRegion, SkXfermode::kSrcOver_Mode, true); + drawFormXObjectWithMask(addXObjectResource(dst), dstMask, + &fExistingClipStack, fExistingClipRegion, + SkXfermode::kSrcOver_Mode, true); } if (xfermode == SkXfermode::kClear_Mode) { return; } else if (xfermode == SkXfermode::kSrc_Mode || xfermode == SkXfermode::kDstATop_Mode) { - ScopedContentEntry content(this, &clipStack, clipRegion, identity, - stockPaint); + ScopedContentEntry content(this, &fExistingClipStack, + fExistingClipRegion, identity, stockPaint); if (content.entry()) { SkPDFUtils::DrawFormXObject( this->addXObjectResource(srcFormXObject.get()), @@ -1989,8 +1993,8 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, return; } } else if (xfermode == SkXfermode::kSrcATop_Mode) { - ScopedContentEntry content(this, &clipStack, clipRegion, identity, - stockPaint); + ScopedContentEntry content(this, &fExistingClipStack, + fExistingClipRegion, identity, stockPaint); if (content.entry()) { SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), &content.entry()->fContent); @@ -2005,30 +2009,24 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, xfermode == SkXfermode::kDstATop_Mode || xfermode == SkXfermode::kModulate_Mode); - ScopedContentEntry inShapeContentEntry(this, &fExistingClipStack, - fExistingClipRegion, identity, - stockPaint); - if (!inShapeContentEntry.entry()) { - return; - } - if (xfermode == SkXfermode::kSrcIn_Mode || xfermode == SkXfermode::kSrcOut_Mode || xfermode == SkXfermode::kSrcATop_Mode) { drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), dst, - &clipStack, clipRegion, + &fExistingClipStack, fExistingClipRegion, SkXfermode::kSrcOver_Mode, xfermode == SkXfermode::kSrcOut_Mode); } else { SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode; if (xfermode == SkXfermode::kModulate_Mode) { drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), - dst, &clipStack, clipRegion, + dst, &fExistingClipStack, + fExistingClipRegion, SkXfermode::kSrcOver_Mode, false); mode = SkXfermode::kMultiply_Mode; } drawFormXObjectWithMask(addXObjectResource(dst), srcFormXObject.get(), - &clipStack, clipRegion, mode, + &fExistingClipStack, fExistingClipRegion, mode, xfermode == SkXfermode::kDstOut_Mode); } } |