Chromium Code Reviews| Index: src/pdf/SkPDFDevice.cpp |
| diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp |
| index 3b0d6f72ae5a1fdeaf51e41f7e2c536486c61084..d4cee9f464f33b3d44ec078a8a2b97dd2f78008e 100644 |
| --- a/src/pdf/SkPDFDevice.cpp |
| +++ b/src/pdf/SkPDFDevice.cpp |
| @@ -37,6 +37,19 @@ |
| // Utility functions |
| +static void fix_paint_xfermode(SkPaint* paint) { |
|
reed1
2015/05/26 16:28:23
"fix" is not very descriptive, if I'm trying to un
hal.canary
2015/05/26 18:24:19
Done.
|
| + SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode; |
| + if (paint->getXfermode() && paint->getXfermode()->asMode(&mode)) { |
| + if (mode == SkXfermode::kSrc_Mode && |
| + paint->getAlpha() == SK_AlphaOPAQUE && !paint->getColorFilter() && |
| + !paint->getPathEffect() && !paint->getMaskFilter() && |
| + !paint->getRasterizer() && !paint->getImageFilter() && |
| + !paint->getLooper()) { |
| + paint->setXfermodeMode(SkXfermode::kSrcOver_Mode); |
| + } |
| + } |
| +} |
| + |
| static void emit_pdf_color(SkColor color, SkWStream* result) { |
| SkASSERT(SkColorGetA(color) == 0xFF); // We handle alpha elsewhere. |
| SkScalar colorScale = SkScalarInvert(0xFF); |
| @@ -756,6 +769,8 @@ void SkPDFDevice::cleanUp(bool clearFontUsage) { |
| void SkPDFDevice::drawPaint(const SkDraw& d, const SkPaint& paint) { |
| SkPaint newPaint = paint; |
| + fix_paint_xfermode(&newPaint); |
| + |
| newPaint.setStyle(SkPaint::kFill_Style); |
| ScopedContentEntry content(this, d, newPaint); |
| internalDrawPaint(newPaint, content.entry()); |
| @@ -779,9 +794,14 @@ void SkPDFDevice::internalDrawPaint(const SkPaint& paint, |
| &contentEntry->fContent); |
| } |
| -void SkPDFDevice::drawPoints(const SkDraw& d, SkCanvas::PointMode mode, |
| - size_t count, const SkPoint* points, |
| - const SkPaint& passedPaint) { |
| +void SkPDFDevice::drawPoints(const SkDraw& d, |
| + SkCanvas::PointMode mode, |
| + size_t count, |
| + const SkPoint* points, |
| + const SkPaint& srcPaint) { |
| + SkPaint passedPaint = srcPaint; |
| + fix_paint_xfermode(&passedPaint); |
| + |
| if (count == 0) { |
| return; |
| } |
| @@ -866,8 +886,11 @@ void SkPDFDevice::drawPoints(const SkDraw& d, SkCanvas::PointMode mode, |
| } |
| } |
| -void SkPDFDevice::drawRect(const SkDraw& d, const SkRect& rect, |
| - const SkPaint& paint) { |
| +void SkPDFDevice::drawRect(const SkDraw& d, |
| + const SkRect& rect, |
| + const SkPaint& srcPaint) { |
| + SkPaint paint = srcPaint; |
| + fix_paint_xfermode(&paint); |
| SkRect r = rect; |
| r.sort(); |
| @@ -894,21 +917,33 @@ void SkPDFDevice::drawRect(const SkDraw& d, const SkRect& rect, |
| &content.entry()->fContent); |
| } |
| -void SkPDFDevice::drawRRect(const SkDraw& draw, const SkRRect& rrect, const SkPaint& paint) { |
| +void SkPDFDevice::drawRRect(const SkDraw& draw, |
| + const SkRRect& rrect, |
| + const SkPaint& srcPaint) { |
| + SkPaint paint = srcPaint; |
| + fix_paint_xfermode(&paint); |
| SkPath path; |
| path.addRRect(rrect); |
| this->drawPath(draw, path, paint, NULL, true); |
| } |
| -void SkPDFDevice::drawOval(const SkDraw& draw, const SkRect& oval, const SkPaint& paint) { |
| +void SkPDFDevice::drawOval(const SkDraw& draw, |
| + const SkRect& oval, |
| + const SkPaint& srcPaint) { |
| + SkPaint paint = srcPaint; |
| + fix_paint_xfermode(&paint); |
| SkPath path; |
| path.addOval(oval); |
| this->drawPath(draw, path, paint, NULL, true); |
| } |
| -void SkPDFDevice::drawPath(const SkDraw& d, const SkPath& origPath, |
| - const SkPaint& paint, const SkMatrix* prePathMatrix, |
| +void SkPDFDevice::drawPath(const SkDraw& d, |
| + const SkPath& origPath, |
| + const SkPaint& srcPaint, |
| + const SkMatrix* prePathMatrix, |
| bool pathIsMutable) { |
| + SkPaint paint = srcPaint; |
| + fix_paint_xfermode(&paint); |
| SkPath modifiedPath; |
| SkPath* pathPtr = const_cast<SkPath*>(&origPath); |
| @@ -967,8 +1002,13 @@ void SkPDFDevice::drawPath(const SkDraw& d, const SkPath& origPath, |
| void SkPDFDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, |
| const SkRect* src, const SkRect& dst, |
| - const SkPaint& paint, |
| + const SkPaint& srcPaint, |
| SkCanvas::DrawBitmapRectFlags flags) { |
| + SkPaint paint = srcPaint; |
| + if (bitmap.isOpaque()) { |
| + fix_paint_xfermode(&paint); |
| + } |
| + |
| // TODO: this code path must be updated to respect the flags parameter |
| SkMatrix matrix; |
| SkRect bitmapBounds, tmpSrc, tmpDst; |
| @@ -1023,7 +1063,12 @@ void SkPDFDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, |
| } |
| void SkPDFDevice::drawBitmap(const SkDraw& d, const SkBitmap& bitmap, |
| - const SkMatrix& matrix, const SkPaint& paint) { |
| + const SkMatrix& matrix, const SkPaint& srcPaint) { |
| + SkPaint paint = srcPaint; |
| + if (bitmap.isOpaque()) { |
| + fix_paint_xfermode(&paint); |
| + } |
| + |
| if (d.fClip->isEmpty()) { |
| return; |
| } |
| @@ -1035,7 +1080,12 @@ void SkPDFDevice::drawBitmap(const SkDraw& d, const SkBitmap& bitmap, |
| } |
| void SkPDFDevice::drawSprite(const SkDraw& d, const SkBitmap& bitmap, |
| - int x, int y, const SkPaint& paint) { |
| + int x, int y, const SkPaint& srcPaint) { |
| + SkPaint paint = srcPaint; |
| + if (bitmap.isOpaque()) { |
| + fix_paint_xfermode(&paint); |
| + } |
| + |
| if (d.fClip->isEmpty()) { |
| return; |
| } |
| @@ -1082,7 +1132,10 @@ static SkString format_wide_string(const uint16_t* input, |
| } |
| void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, |
| - SkScalar x, SkScalar y, const SkPaint& paint) { |
| + SkScalar x, SkScalar y, const SkPaint& srcPaint) { |
| + SkPaint paint = srcPaint; |
| + fix_paint_xfermode(&paint); |
| + |
| NOT_IMPLEMENTED(paint.getMaskFilter() != NULL, false); |
| if (paint.getMaskFilter() != NULL) { |
| // Don't pretend we support drawing MaskFilters, it makes for artifacts |
| @@ -1131,7 +1184,10 @@ void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, |
| void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, |
| const SkScalar pos[], int scalarsPerPos, |
| - const SkPoint& offset, const SkPaint& paint) { |
| + const SkPoint& offset, const SkPaint& srcPaint) { |
| + SkPaint paint = srcPaint; |
| + fix_paint_xfermode(&paint); |
| + |
| NOT_IMPLEMENTED(paint.getMaskFilter() != NULL, false); |
| if (paint.getMaskFilter() != NULL) { |
| // Don't pretend we support drawing MaskFilters, it makes for artifacts |