Chromium Code Reviews| Index: src/pdf/SkPDFDevice.cpp |
| diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp |
| index cdfec330f0888330d7ae6ff1e055019fa597e851..6625a8e701c10c7db14558d4b2a2bee321f0e40f 100644 |
| --- a/src/pdf/SkPDFDevice.cpp |
| +++ b/src/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, |
|
vandebo (ex-Chrome)
2013/12/17 23:11:03
This was dead code - inShapeContentEntry is not us
|
| - fExistingClipRegion, identity, |
| - stockPaint); |
| - if (!inShapeContentEntry.entry()) { |
|
vandebo (ex-Chrome)
2013/12/17 23:11:03
This can't be true because fExistingClipRegion is
|
| - 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); |
| } |
| } |