| Index: src/pdf/SkPDFDevice.cpp
|
| diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
|
| index f13b4bc1f678c46ef2e39df6ee38eaf8f0ba6f91..217dd3f2b6741d86e845f97af51d9bf095bd70d2 100644
|
| --- a/src/pdf/SkPDFDevice.cpp
|
| +++ b/src/pdf/SkPDFDevice.cpp
|
| @@ -47,12 +47,11 @@
|
|
|
| // Utility functions
|
|
|
| -// If the paint will definitely draw opaquely, replace kSrc_Mode with
|
| -// kSrcOver_Mode. http://crbug.com/473572
|
| +// If the paint will definitely draw opaquely, replace kSrc with
|
| +// kSrcOver. http://crbug.com/473572
|
| static void replace_srcmode_on_opaque_paint(SkPaint* paint) {
|
| - if (kSrcOver_SkXfermodeInterpretation
|
| - == SkInterpretXfermode(*paint, false)) {
|
| - paint->setXfermode(nullptr);
|
| + if (kSrcOver_SkXfermodeInterpretation == SkInterpretXfermode(*paint, false)) {
|
| + paint->setBlendMode(SkBlendMode::kSrcOver);
|
| }
|
| }
|
|
|
| @@ -392,7 +391,7 @@ public:
|
| const SkPaint& paint, bool hasText = false)
|
| : fDevice(device),
|
| fContentEntry(nullptr),
|
| - fXfermode(SkXfermode::kSrcOver_Mode),
|
| + fBlendMode(SkBlendMode::kSrcOver),
|
| fDstFormXObject(nullptr) {
|
| init(draw.fClipStack, draw.fRC->bwRgn(), *draw.fMatrix, paint, hasText);
|
| }
|
| @@ -401,7 +400,7 @@ public:
|
| const SkPaint& paint, bool hasText = false)
|
| : fDevice(device),
|
| fContentEntry(nullptr),
|
| - fXfermode(SkXfermode::kSrcOver_Mode),
|
| + fBlendMode(SkBlendMode::kSrcOver),
|
| fDstFormXObject(nullptr) {
|
| init(clipStack, clipRegion, matrix, paint, hasText);
|
| }
|
| @@ -412,7 +411,7 @@ public:
|
| if (shape->isEmpty()) {
|
| shape = nullptr;
|
| }
|
| - fDevice->finishContentEntry(fXfermode, std::move(fDstFormXObject), shape);
|
| + fDevice->finishContentEntry(fBlendMode, std::move(fDstFormXObject), shape);
|
| }
|
| }
|
|
|
| @@ -420,16 +419,16 @@ public:
|
|
|
| /* Returns true when we explicitly need the shape of the drawing. */
|
| bool needShape() {
|
| - switch (fXfermode) {
|
| - case SkXfermode::kClear_Mode:
|
| - case SkXfermode::kSrc_Mode:
|
| - case SkXfermode::kSrcIn_Mode:
|
| - case SkXfermode::kSrcOut_Mode:
|
| - case SkXfermode::kDstIn_Mode:
|
| - case SkXfermode::kDstOut_Mode:
|
| - case SkXfermode::kSrcATop_Mode:
|
| - case SkXfermode::kDstATop_Mode:
|
| - case SkXfermode::kModulate_Mode:
|
| + switch (fBlendMode) {
|
| + case SkBlendMode::kClear:
|
| + case SkBlendMode::kSrc:
|
| + case SkBlendMode::kSrcIn:
|
| + case SkBlendMode::kSrcOut:
|
| + case SkBlendMode::kDstIn:
|
| + case SkBlendMode::kDstOut:
|
| + case SkBlendMode::kSrcATop:
|
| + case SkBlendMode::kDstATop:
|
| + case SkBlendMode::kModulate:
|
| return true;
|
| default:
|
| return false;
|
| @@ -438,7 +437,7 @@ public:
|
|
|
| /* Returns true unless we only need the shape of the drawing. */
|
| bool needSource() {
|
| - if (fXfermode == SkXfermode::kClear_Mode) {
|
| + if (fBlendMode == SkBlendMode::kClear) {
|
| return false;
|
| }
|
| return true;
|
| @@ -455,7 +454,7 @@ public:
|
| private:
|
| SkPDFDevice* fDevice;
|
| SkPDFDevice::ContentEntry* fContentEntry;
|
| - SkXfermode::Mode fXfermode;
|
| + SkBlendMode fBlendMode;
|
| sk_sp<SkPDFObject> fDstFormXObject;
|
| SkPath fShape;
|
|
|
| @@ -466,9 +465,7 @@ private:
|
| NOT_IMPLEMENTED(!matrix.hasPerspective(), false);
|
| return;
|
| }
|
| - if (paint.getXfermode()) {
|
| - paint.getXfermode()->asMode(&fXfermode);
|
| - }
|
| + fBlendMode = paint.getBlendMode();
|
| fContentEntry = fDevice->setUpContentEntry(clipStack, clipRegion,
|
| matrix, paint, hasText,
|
| &fDstFormXObject);
|
| @@ -1707,7 +1704,7 @@ void SkPDFDevice::drawFormXObjectWithMask(int xObjectIndex,
|
| sk_sp<SkPDFObject> mask,
|
| const SkClipStack* clipStack,
|
| const SkRegion& clipRegion,
|
| - SkXfermode::Mode mode,
|
| + SkBlendMode mode,
|
| bool invertClip) {
|
| if (clipRegion.isEmpty() && !invertClip) {
|
| return;
|
| @@ -1720,7 +1717,7 @@ void SkPDFDevice::drawFormXObjectWithMask(int xObjectIndex,
|
| SkMatrix identity;
|
| identity.reset();
|
| SkPaint paint;
|
| - paint.setXfermodeMode(mode);
|
| + paint.setBlendMode(mode);
|
| ScopedContentEntry content(this, clipStack, clipRegion, identity, paint);
|
| if (!content.entry()) {
|
| return;
|
| @@ -1765,27 +1762,24 @@ SkPDFDevice::ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* cli
|
| }
|
| }
|
|
|
| - SkXfermode::Mode xfermode = SkXfermode::kSrcOver_Mode;
|
| - if (paint.getXfermode()) {
|
| - paint.getXfermode()->asMode(&xfermode);
|
| - }
|
| + SkBlendMode blendMode = paint.getBlendMode();
|
|
|
| // For the following modes, we want to handle source and destination
|
| // separately, so make an object of what's already there.
|
| - if (xfermode == SkXfermode::kClear_Mode ||
|
| - xfermode == SkXfermode::kSrc_Mode ||
|
| - xfermode == SkXfermode::kSrcIn_Mode ||
|
| - xfermode == SkXfermode::kDstIn_Mode ||
|
| - xfermode == SkXfermode::kSrcOut_Mode ||
|
| - xfermode == SkXfermode::kDstOut_Mode ||
|
| - xfermode == SkXfermode::kSrcATop_Mode ||
|
| - xfermode == SkXfermode::kDstATop_Mode ||
|
| - xfermode == SkXfermode::kModulate_Mode) {
|
| + if (blendMode == SkBlendMode::kClear ||
|
| + blendMode == SkBlendMode::kSrc ||
|
| + blendMode == SkBlendMode::kSrcIn ||
|
| + blendMode == SkBlendMode::kDstIn ||
|
| + blendMode == SkBlendMode::kSrcOut ||
|
| + blendMode == SkBlendMode::kDstOut ||
|
| + blendMode == SkBlendMode::kSrcATop ||
|
| + blendMode == SkBlendMode::kDstATop ||
|
| + blendMode == SkBlendMode::kModulate) {
|
| if (!isContentEmpty()) {
|
| *dst = this->makeFormXObjectFromDevice();
|
| SkASSERT(isContentEmpty());
|
| - } else if (xfermode != SkXfermode::kSrc_Mode &&
|
| - xfermode != SkXfermode::kSrcOut_Mode) {
|
| + } else if (blendMode != SkBlendMode::kSrc &&
|
| + blendMode != SkBlendMode::kSrcOut) {
|
| // Except for Src and SrcOut, if there isn't anything already there,
|
| // then we're done.
|
| return nullptr;
|
| @@ -1795,14 +1789,14 @@ SkPDFDevice::ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* cli
|
| // Xor, Plus.
|
|
|
| // Dst xfer mode doesn't draw source at all.
|
| - if (xfermode == SkXfermode::kDst_Mode) {
|
| + if (blendMode == SkBlendMode::kDst) {
|
| return nullptr;
|
| }
|
|
|
| SkPDFDevice::ContentEntry* entry;
|
| if (fContentEntries.back() && fContentEntries.back()->fContent.getOffset() == 0) {
|
| entry = fContentEntries.back();
|
| - } else if (xfermode != SkXfermode::kDstOver_Mode) {
|
| + } else if (blendMode != SkBlendMode::kDstOver) {
|
| entry = fContentEntries.emplace_back();
|
| } else {
|
| entry = fContentEntries.emplace_front();
|
| @@ -1812,23 +1806,23 @@ SkPDFDevice::ContentEntry* SkPDFDevice::setUpContentEntry(const SkClipStack* cli
|
| return entry;
|
| }
|
|
|
| -void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
| +void SkPDFDevice::finishContentEntry(SkBlendMode blendMode,
|
| sk_sp<SkPDFObject> dst,
|
| SkPath* shape) {
|
| - if (xfermode != SkXfermode::kClear_Mode &&
|
| - xfermode != SkXfermode::kSrc_Mode &&
|
| - xfermode != SkXfermode::kDstOver_Mode &&
|
| - xfermode != SkXfermode::kSrcIn_Mode &&
|
| - xfermode != SkXfermode::kDstIn_Mode &&
|
| - xfermode != SkXfermode::kSrcOut_Mode &&
|
| - xfermode != SkXfermode::kDstOut_Mode &&
|
| - xfermode != SkXfermode::kSrcATop_Mode &&
|
| - xfermode != SkXfermode::kDstATop_Mode &&
|
| - xfermode != SkXfermode::kModulate_Mode) {
|
| + if (blendMode != SkBlendMode::kClear &&
|
| + blendMode != SkBlendMode::kSrc &&
|
| + blendMode != SkBlendMode::kDstOver &&
|
| + blendMode != SkBlendMode::kSrcIn &&
|
| + blendMode != SkBlendMode::kDstIn &&
|
| + blendMode != SkBlendMode::kSrcOut &&
|
| + blendMode != SkBlendMode::kDstOut &&
|
| + blendMode != SkBlendMode::kSrcATop &&
|
| + blendMode != SkBlendMode::kDstATop &&
|
| + blendMode != SkBlendMode::kModulate) {
|
| SkASSERT(!dst);
|
| return;
|
| }
|
| - if (xfermode == SkXfermode::kDstOver_Mode) {
|
| + if (blendMode == SkBlendMode::kDstOver) {
|
| SkASSERT(!dst);
|
| if (fContentEntries.front()->fContent.getOffset() == 0) {
|
| // For DstOver, an empty content entry was inserted before the rest
|
| @@ -1839,8 +1833,8 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
| return;
|
| }
|
| if (!dst) {
|
| - SkASSERT(xfermode == SkXfermode::kSrc_Mode ||
|
| - xfermode == SkXfermode::kSrcOut_Mode);
|
| + SkASSERT(blendMode == SkBlendMode::kSrc ||
|
| + blendMode == SkBlendMode::kSrcOut);
|
| return;
|
| }
|
|
|
| @@ -1865,8 +1859,8 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
| // If there is shape, then an empty source with Src, SrcIn, SrcOut,
|
| // DstIn, DstAtop or Modulate reduces to Clear and DstOut or SrcAtop
|
| // reduces to Dst.
|
| - if (shape == nullptr || xfermode == SkXfermode::kDstOut_Mode ||
|
| - xfermode == SkXfermode::kSrcATop_Mode) {
|
| + if (shape == nullptr || blendMode == SkBlendMode::kDstOut ||
|
| + blendMode == SkBlendMode::kSrcATop) {
|
| ScopedContentEntry content(this, &fExistingClipStack,
|
| fExistingClipRegion, identity,
|
| stockPaint);
|
| @@ -1875,7 +1869,7 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
| &content.entry()->fContent);
|
| return;
|
| } else {
|
| - xfermode = SkXfermode::kClear_Mode;
|
| + blendMode = SkBlendMode::kClear;
|
| }
|
| } else {
|
| SkASSERT(fContentEntries.count() == 1);
|
| @@ -1884,14 +1878,14 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
|
|
| // TODO(vandebo) srcFormXObject may contain alpha, but here we want it
|
| // without alpha.
|
| - if (xfermode == SkXfermode::kSrcATop_Mode) {
|
| + if (blendMode == SkBlendMode::kSrcATop) {
|
| // TODO(vandebo): In order to properly support SrcATop we have to track
|
| // the shape of what's been drawn at all times. It's the intersection of
|
| // the non-transparent parts of the device and the outlines (shape) of
|
| // all images and devices drawn.
|
| drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()), dst,
|
| &fExistingClipStack, fExistingClipRegion,
|
| - SkXfermode::kSrcOver_Mode, true);
|
| + SkBlendMode::kSrcOver, true);
|
| } else {
|
| if (shape != nullptr) {
|
| // Draw shape into a form-xobject.
|
| @@ -1907,19 +1901,19 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
| drawFormXObjectWithMask(addXObjectResource(dst.get()),
|
| this->makeFormXObjectFromDevice(),
|
| &fExistingClipStack, fExistingClipRegion,
|
| - SkXfermode::kSrcOver_Mode, true);
|
| + SkBlendMode::kSrcOver, true);
|
|
|
| } else {
|
| drawFormXObjectWithMask(addXObjectResource(dst.get()), srcFormXObject,
|
| &fExistingClipStack, fExistingClipRegion,
|
| - SkXfermode::kSrcOver_Mode, true);
|
| + SkBlendMode::kSrcOver, true);
|
| }
|
| }
|
|
|
| - if (xfermode == SkXfermode::kClear_Mode) {
|
| + if (blendMode == SkBlendMode::kClear) {
|
| return;
|
| - } else if (xfermode == SkXfermode::kSrc_Mode ||
|
| - xfermode == SkXfermode::kDstATop_Mode) {
|
| + } else if (blendMode == SkBlendMode::kSrc ||
|
| + blendMode == SkBlendMode::kDstATop) {
|
| ScopedContentEntry content(this, &fExistingClipStack,
|
| fExistingClipRegion, identity, stockPaint);
|
| if (content.entry()) {
|
| @@ -1927,10 +1921,10 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
| this->addXObjectResource(srcFormXObject.get()),
|
| &content.entry()->fContent);
|
| }
|
| - if (xfermode == SkXfermode::kSrc_Mode) {
|
| + if (blendMode == SkBlendMode::kSrc) {
|
| return;
|
| }
|
| - } else if (xfermode == SkXfermode::kSrcATop_Mode) {
|
| + } else if (blendMode == SkBlendMode::kSrcATop) {
|
| ScopedContentEntry content(this, &fExistingClipStack,
|
| fExistingClipRegion, identity, stockPaint);
|
| if (content.entry()) {
|
| @@ -1939,36 +1933,36 @@ void SkPDFDevice::finishContentEntry(SkXfermode::Mode xfermode,
|
| }
|
| }
|
|
|
| - SkASSERT(xfermode == SkXfermode::kSrcIn_Mode ||
|
| - xfermode == SkXfermode::kDstIn_Mode ||
|
| - xfermode == SkXfermode::kSrcOut_Mode ||
|
| - xfermode == SkXfermode::kDstOut_Mode ||
|
| - xfermode == SkXfermode::kSrcATop_Mode ||
|
| - xfermode == SkXfermode::kDstATop_Mode ||
|
| - xfermode == SkXfermode::kModulate_Mode);
|
| + SkASSERT(blendMode == SkBlendMode::kSrcIn ||
|
| + blendMode == SkBlendMode::kDstIn ||
|
| + blendMode == SkBlendMode::kSrcOut ||
|
| + blendMode == SkBlendMode::kDstOut ||
|
| + blendMode == SkBlendMode::kSrcATop ||
|
| + blendMode == SkBlendMode::kDstATop ||
|
| + blendMode == SkBlendMode::kModulate);
|
|
|
| - if (xfermode == SkXfermode::kSrcIn_Mode ||
|
| - xfermode == SkXfermode::kSrcOut_Mode ||
|
| - xfermode == SkXfermode::kSrcATop_Mode) {
|
| + if (blendMode == SkBlendMode::kSrcIn ||
|
| + blendMode == SkBlendMode::kSrcOut ||
|
| + blendMode == SkBlendMode::kSrcATop) {
|
| drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()),
|
| std::move(dst),
|
| &fExistingClipStack, fExistingClipRegion,
|
| - SkXfermode::kSrcOver_Mode,
|
| - xfermode == SkXfermode::kSrcOut_Mode);
|
| + SkBlendMode::kSrcOver,
|
| + blendMode == SkBlendMode::kSrcOut);
|
| return;
|
| } else {
|
| - SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode;
|
| + SkBlendMode mode = SkBlendMode::kSrcOver;
|
| int resourceID = addXObjectResource(dst.get());
|
| - if (xfermode == SkXfermode::kModulate_Mode) {
|
| + if (blendMode == SkBlendMode::kModulate) {
|
| drawFormXObjectWithMask(addXObjectResource(srcFormXObject.get()),
|
| std::move(dst), &fExistingClipStack,
|
| fExistingClipRegion,
|
| - SkXfermode::kSrcOver_Mode, false);
|
| - mode = SkXfermode::kMultiply_Mode;
|
| + SkBlendMode::kSrcOver, false);
|
| + mode = SkBlendMode::kMultiply;
|
| }
|
| drawFormXObjectWithMask(resourceID, std::move(srcFormXObject),
|
| &fExistingClipStack, fExistingClipRegion, mode,
|
| - xfermode == SkXfermode::kDstOut_Mode);
|
| + blendMode == SkBlendMode::kDstOut);
|
| return;
|
| }
|
| }
|
|
|