Chromium Code Reviews| Index: src/pdf/SkPDFDevice.cpp |
| diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp |
| index 4181defc5ddc62a47542ba5ab9ca88490a5644f2..80bc457ce1fadab3acabe0d3c3e1216a3b4de62d 100644 |
| --- a/src/pdf/SkPDFDevice.cpp |
| +++ b/src/pdf/SkPDFDevice.cpp |
| @@ -627,7 +627,7 @@ private: |
| SkPDFDevice* fDevice; |
| SkPDFDevice::ContentEntry* fContentEntry; |
| SkXfermode::Mode fXfermode; |
| - SkPDFFormXObject* fDstFormXObject; |
| + SkPDFObject* fDstFormXObject; |
| SkPath fShape; |
| void init(const SkClipStack* clipStack, const SkRegion& clipRegion, |
| @@ -1394,7 +1394,7 @@ void SkPDFDevice::drawDevice(const SkDraw& d, SkBaseDevice* device, |
| return; |
| } |
| - auto xObject = sk_make_sp<SkPDFFormXObject>(pdfDevice); |
| + auto xObject = pdfDevice->makeFormXObjectFromDevice(); |
| SkPDFUtils::DrawFormXObject(this->addXObjectResource(xObject.get()), |
| &content.entry()->fContent); |
| } |
| @@ -1610,8 +1610,11 @@ void SkPDFDevice::appendDestinations(SkPDFDict* dict, SkPDFObject* page) const { |
| } |
| } |
| -SkPDFFormXObject* SkPDFDevice::createFormXObjectFromDevice() { |
| - SkPDFFormXObject* xobject = new SkPDFFormXObject(this); |
| +sk_sp<SkPDFObject> SkPDFDevice::makeFormXObjectFromDevice() { |
| + auto xobject = SkPDFMakeFormXObject(this->content(), |
| + this->copyMediaBox(), |
| + this->makeResourceDict(), |
| + nullptr); |
|
tomhudson
2016/07/27 20:30:58
I don't like this because I have to read both forw
hal.canary
2016/07/27 20:41:11
Done.
|
| // We always draw the form xobjects that we create back into the device, so |
| // we simply preserve the font usage instead of pulling it out and merging |
| // it back in later. |
| @@ -1621,7 +1624,7 @@ SkPDFFormXObject* SkPDFDevice::createFormXObjectFromDevice() { |
| } |
| void SkPDFDevice::drawFormXObjectWithMask(int xObjectIndex, |
| - SkPDFFormXObject* mask, |
| + SkPDFObject* mask, |
| const SkClipStack* clipStack, |
| const SkRegion& clipRegion, |
| SkXfermode::Mode mode, |
| @@ -1658,7 +1661,7 @@ SkPDFDevice::ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* cli |
| const SkMatrix& matrix, |
| const SkPaint& paint, |
| bool hasText, |
| - SkPDFFormXObject** dst) { |
| + SkPDFObject** dst) { |
| *dst = nullptr; |
| if (clipRegion.isEmpty()) { |
| return nullptr; |
| @@ -1699,7 +1702,8 @@ SkPDFDevice::ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* cli |
| xfermode == SkXfermode::kDstATop_Mode || |
| xfermode == SkXfermode::kModulate_Mode) { |
| if (!isContentEmpty()) { |
| - *dst = createFormXObjectFromDevice(); |
| + // TODO(halcanary): make this safer. |
| + *dst = this->makeFormXObjectFromDevice().release(); |
|
tomhudson
2016/07/27 20:30:58
Note TODO
hal.canary
2016/07/27 20:41:11
Acknowledged.
|
| SkASSERT(isContentEmpty()); |
| } else if (xfermode != SkXfermode::kSrc_Mode && |
| xfermode != SkXfermode::kSrcOut_Mode) { |
| @@ -1730,7 +1734,7 @@ SkPDFDevice::ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* cli |
| } |
| void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| - SkPDFFormXObject* dst, |
| + SkPDFObject* dst, |
| SkPath* shape) { |
| if (xfermode != SkXfermode::kClear_Mode && |
| xfermode != SkXfermode::kSrc_Mode && |
| @@ -1775,7 +1779,7 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| identity.reset(); |
| SkPaint stockPaint; |
| - sk_sp<SkPDFFormXObject> srcFormXObject; |
| + sk_sp<SkPDFObject> srcFormXObject; |
| if (isContentEmpty()) { |
| // If nothing was drawn and there's no shape, then the draw was a |
| // no-op, but dst needs to be restored for that to be true. |
| @@ -1795,7 +1799,7 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| } |
| } else { |
| SkASSERT(fContentEntries.count() == 1); |
| - srcFormXObject.reset(createFormXObjectFromDevice()); |
| + srcFormXObject = this->makeFormXObjectFromDevice(); |
| } |
| // TODO(vandebo) srcFormXObject may contain alpha, but here we want it |
| @@ -1809,8 +1813,8 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| &fExistingClipStack, fExistingClipRegion, |
| SkXfermode::kSrcOver_Mode, true); |
| } else { |
| - sk_sp<SkPDFFormXObject> dstMaskStorage; |
| - SkPDFFormXObject* dstMask = srcFormXObject.get(); |
| + sk_sp<SkPDFObject> dstMaskStorage; |
| + SkPDFObject* dstMask = srcFormXObject.get(); |
| if (shape != nullptr) { |
| // Draw shape into a form-xobject. |
| SkRasterClip rc(clipRegion); |
| @@ -1823,7 +1827,7 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode, |
| filledPaint.setStyle(SkPaint::kFill_Style); |
| this->drawPath(d, *shape, filledPaint, nullptr, true); |
| - dstMaskStorage.reset(createFormXObjectFromDevice()); |
| + dstMaskStorage = this->makeFormXObjectFromDevice(); |
| dstMask = dstMaskStorage.get(); |
| } |
| drawFormXObjectWithMask(addXObjectResource(dst), dstMask, |