| Index: src/pdf/SkPDFDevice.cpp
|
| diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
|
| index 4181defc5ddc62a47542ba5ab9ca88490a5644f2..6972f8b01f46e255f2ed5bc995948462bbdd04cb 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,
|
| @@ -835,7 +835,7 @@ static sk_sp<SkPDFDict> create_link_annotation(const SkRect& translatedRect) {
|
| }
|
|
|
| static sk_sp<SkPDFDict> create_link_to_url(const SkData* urlData, const SkRect& r) {
|
| - auto annotation = create_link_annotation(r);
|
| + sk_sp<SkPDFDict> annotation = create_link_annotation(r);
|
| SkString url(static_cast<const char *>(urlData->data()),
|
| urlData->size() - 1);
|
| auto action = sk_make_sp<SkPDFDict>("Action");
|
| @@ -847,7 +847,7 @@ static sk_sp<SkPDFDict> create_link_to_url(const SkData* urlData, const SkRect&
|
|
|
| static sk_sp<SkPDFDict> create_link_named_dest(const SkData* nameData,
|
| const SkRect& r) {
|
| - auto annotation = create_link_annotation(r);
|
| + sk_sp<SkPDFDict> annotation = create_link_annotation(r);
|
| SkString name(static_cast<const char *>(nameData->data()),
|
| nameData->size() - 1);
|
| annotation->insertName("Dest", name);
|
| @@ -1394,7 +1394,7 @@ void SkPDFDevice::drawDevice(const SkDraw& d, SkBaseDevice* device,
|
| return;
|
| }
|
|
|
| - auto xObject = sk_make_sp<SkPDFFormXObject>(pdfDevice);
|
| + sk_sp<SkPDFObject> xObject = pdfDevice->makeFormXObjectFromDevice();
|
| SkPDFUtils::DrawFormXObject(this->addXObjectResource(xObject.get()),
|
| &content.entry()->fContent);
|
| }
|
| @@ -1610,18 +1610,20 @@ void SkPDFDevice::appendDestinations(SkPDFDict* dict, SkPDFObject* page) const {
|
| }
|
| }
|
|
|
| -SkPDFFormXObject* SkPDFDevice::createFormXObjectFromDevice() {
|
| - SkPDFFormXObject* xobject = new SkPDFFormXObject(this);
|
| +sk_sp<SkPDFObject> SkPDFDevice::makeFormXObjectFromDevice() {
|
| + sk_sp<SkPDFObject> xobject =
|
| + SkPDFMakeFormXObject(this->content(), this->copyMediaBox(),
|
| + this->makeResourceDict(), nullptr);
|
| // 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.
|
| - cleanUp(); // Reset this device to have no content.
|
| - init();
|
| + this->cleanUp(); // Reset this device to have no content.
|
| + this->init();
|
| return xobject;
|
| }
|
|
|
| void SkPDFDevice::drawFormXObjectWithMask(int xObjectIndex,
|
| - SkPDFFormXObject* mask,
|
| + SkPDFObject* mask,
|
| const SkClipStack* clipStack,
|
| const SkRegion& clipRegion,
|
| SkXfermode::Mode mode,
|
| @@ -1630,7 +1632,7 @@ void SkPDFDevice::drawFormXObjectWithMask(int xObjectIndex,
|
| return;
|
| }
|
|
|
| - auto sMaskGS = SkPDFGraphicState::GetSMaskGraphicState(
|
| + sk_sp<SkPDFDict> sMaskGS = SkPDFGraphicState::GetSMaskGraphicState(
|
| mask, invertClip, SkPDFGraphicState::kAlpha_SMaskMode, fDocument->canon());
|
|
|
| SkMatrix identity;
|
| @@ -1658,7 +1660,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 +1701,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();
|
| SkASSERT(isContentEmpty());
|
| } else if (xfermode != SkXfermode::kSrc_Mode &&
|
| xfermode != SkXfermode::kSrcOut_Mode) {
|
| @@ -1730,7 +1733,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 +1778,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 +1798,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 +1812,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 +1826,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,
|
| @@ -2184,7 +2187,7 @@ void SkPDFDevice::internalDrawImage(const SkMatrix& origMatrix,
|
| SkBitmapKey key = imageBitmap.getKey();
|
| sk_sp<SkPDFObject> pdfimage = fDocument->canon()->findPDFBitmap(key);
|
| if (!pdfimage) {
|
| - auto img = imageBitmap.makeImage();
|
| + sk_sp<SkImage> img = imageBitmap.makeImage();
|
| if (!img) {
|
| return;
|
| }
|
|
|