Chromium Code Reviews| Index: src/pdf/SkPDFDevice.cpp |
| diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp |
| index 211ce50b3dc22ca8c10f2ea45d931b5243570d44..7d025780a6fae8f2df4b39cdcaa3d8c4d56cdfaf 100644 |
| --- a/src/pdf/SkPDFDevice.cpp |
| +++ b/src/pdf/SkPDFDevice.cpp |
| @@ -564,9 +564,8 @@ public: |
| if (shape->isEmpty()) { |
| shape = nullptr; |
| } |
| - fDevice->finishContentEntry(fXfermode, fDstFormXObject, shape); |
| + fDevice->finishContentEntry(fXfermode, std::move(fDstFormXObject), shape); |
| } |
| - SkSafeUnref(fDstFormXObject); |
| } |
| SkPDFDevice::ContentEntry* entry() { return fContentEntry; } |
| @@ -609,7 +608,7 @@ private: |
| SkPDFDevice* fDevice; |
| SkPDFDevice::ContentEntry* fContentEntry; |
| SkXfermode::Mode fXfermode; |
| - SkPDFObject* fDstFormXObject; |
| + sk_sp<SkPDFObject> fDstFormXObject; |
| SkPath fShape; |
| void init(const SkClipStack* clipStack, const SkRegion& clipRegion, |
| @@ -1606,7 +1605,7 @@ sk_sp<SkPDFObject> SkPDFDevice::makeFormXObjectFromDevice() { |
| } |
| void SkPDFDevice::drawFormXObjectWithMask(int xObjectIndex, |
| - SkPDFObject* mask, |
| + sk_sp<SkPDFObject> mask, |
| const SkClipStack* clipStack, |
| const SkRegion& clipRegion, |
| SkXfermode::Mode mode, |
| @@ -1616,7 +1615,8 @@ void SkPDFDevice::drawFormXObjectWithMask(int xObjectIndex, |
| } |
| sk_sp<SkPDFDict> sMaskGS = SkPDFGraphicState::GetSMaskGraphicState( |
| - mask, invertClip, SkPDFGraphicState::kAlpha_SMaskMode, fDocument->canon()); |
| + std::move(mask), invertClip, |
| + SkPDFGraphicState::kAlpha_SMaskMode, fDocument->canon()); |
| SkMatrix identity; |
| identity.reset(); |
| @@ -1643,7 +1643,7 @@ SkPDFDevice::ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* cli |
| const SkMatrix& matrix, |
| const SkPaint& paint, |
| bool hasText, |
| - SkPDFObject** dst) { |
| + sk_sp<SkPDFObject>* dst) { |
| *dst = nullptr; |
| if (clipRegion.isEmpty()) { |
| return nullptr; |
| @@ -1684,8 +1684,7 @@ SkPDFDevice::ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* cli |
| xfermode == SkXfermode::kDstATop_Mode || |
| xfermode == SkXfermode::kModulate_Mode) { |
| if (!isContentEmpty()) { |
| - // TODO(halcanary): make this safer. |
| - *dst = this->makeFormXObjectFromDevice().release(); |
| + *dst = this->makeFormXObjectFromDevice(); |
| SkASSERT(isContentEmpty()); |
| } else if (xfermode != SkXfermode::kSrc_Mode && |
| xfermode != SkXfermode::kSrcOut_Mode) { |
| @@ -1716,7 +1715,7 @@ SkPDFDevice::ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* cli |
| } |
| void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| - SkPDFObject* dst, |
| + sk_sp<SkPDFObject> dst, |
| SkPath* shape) { |
| if (xfermode != SkXfermode::kClear_Mode && |
| xfermode != SkXfermode::kSrc_Mode && |
| @@ -1773,7 +1772,8 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| ScopedContentEntry content(this, &fExistingClipStack, |
| fExistingClipRegion, identity, |
| stockPaint); |
| - SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), |
| + // TODO: addXObjectResource take sk_sp |
| + SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst.get()), |
| &content.entry()->fContent); |
| return; |
| } else { |
| @@ -1795,8 +1795,6 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| &fExistingClipStack, fExistingClipRegion, |
| SkXfermode::kSrcOver_Mode, true); |
| } else { |
| - sk_sp<SkPDFObject> dstMaskStorage; |
| - SkPDFObject* dstMask = srcFormXObject.get(); |
| if (shape != nullptr) { |
| // Draw shape into a form-xobject. |
| SkRasterClip rc(clipRegion); |
| @@ -1808,13 +1806,16 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| filledPaint.setColor(SK_ColorBLACK); |
| filledPaint.setStyle(SkPaint::kFill_Style); |
| this->drawPath(d, *shape, filledPaint, nullptr, true); |
| + drawFormXObjectWithMask(addXObjectResource(dst.get()), |
| + this->makeFormXObjectFromDevice(), |
| + &fExistingClipStack, fExistingClipRegion, |
| + SkXfermode::kSrcOver_Mode, true); |
| - dstMaskStorage = this->makeFormXObjectFromDevice(); |
| - dstMask = dstMaskStorage.get(); |
| + } else { |
| + drawFormXObjectWithMask(addXObjectResource(dst.get()), srcFormXObject, |
| + &fExistingClipStack, fExistingClipRegion, |
| + SkXfermode::kSrcOver_Mode, true); |
|
tomhudson
2016/08/02 20:59:12
eh, I guess this is a wash in terms of intelligibi
|
| } |
| - drawFormXObjectWithMask(addXObjectResource(dst), dstMask, |
| - &fExistingClipStack, fExistingClipRegion, |
| - SkXfermode::kSrcOver_Mode, true); |
| } |
| if (xfermode == SkXfermode::kClear_Mode) { |
| @@ -1835,7 +1836,7 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| ScopedContentEntry content(this, &fExistingClipStack, |
| fExistingClipRegion, identity, stockPaint); |
| if (content.entry()) { |
| - SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst), |
| + SkPDFUtils::DrawFormXObject(this->addXObjectResource(dst.get()), |
| &content.entry()->fContent); |
| } |
| } |
| @@ -1851,22 +1852,26 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| if (xfermode == SkXfermode::kSrcIn_Mode || |
| xfermode == SkXfermode::kSrcOut_Mode || |
| xfermode == SkXfermode::kSrcATop_Mode) { |
| - drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), dst, |
| + drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), |
| + std::move(dst), |
| &fExistingClipStack, fExistingClipRegion, |
| SkXfermode::kSrcOver_Mode, |
| xfermode == SkXfermode::kSrcOut_Mode); |
| + return; |
| } else { |
| SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode; |
| + int resourceID = addXObjectResource(dst.get()); |
| if (xfermode == SkXfermode::kModulate_Mode) { |
| drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), |
| - dst, &fExistingClipStack, |
| + std::move(dst), &fExistingClipStack, |
| fExistingClipRegion, |
| SkXfermode::kSrcOver_Mode, false); |
| mode = SkXfermode::kMultiply_Mode; |
| } |
| - drawFormXObjectWithMask(addXObjectResource(dst), srcFormXObject.get(), |
| + drawFormXObjectWithMask(resourceID, std::move(srcFormXObject), |
| &fExistingClipStack, fExistingClipRegion, mode, |
| xfermode == SkXfermode::kDstOut_Mode); |
| + return; |
| } |
| } |
| @@ -1918,8 +1923,8 @@ void SkPDFDevice::populateGraphicStateEntryFromPaint( |
| SkScalar rasterScale = |
| SkIntToScalar(fRasterDpi) / DPI_FOR_RASTER_SCALE_ONE; |
| - pdfShader.reset(SkPDFShader::GetPDFShader( |
| - fDocument, fRasterDpi, shader, transform, bounds, rasterScale)); |
| + pdfShader = SkPDFShader::GetPDFShader( |
| + fDocument, fRasterDpi, shader, transform, bounds, rasterScale); |
| if (pdfShader.get()) { |
| // pdfShader has been canonicalized so we can directly compare |
| @@ -1981,13 +1986,13 @@ int SkPDFDevice::addGraphicStateResource(SkPDFObject* gs) { |
| } |
| int SkPDFDevice::addXObjectResource(SkPDFObject* xObject) { |
| + // TODO(halcanary): make this take a sk_sp<SkPDFObject> |
| // Assumes that xobject has been canonicalized (so we can directly compare |
| // pointers). |
| int result = fXObjectResources.find(xObject); |
| if (result < 0) { |
| result = fXObjectResources.count(); |
| - fXObjectResources.push(xObject); |
| - xObject->ref(); |
| + fXObjectResources.push(SkRef(xObject)); |
| } |
| return result; |
| } |