| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2008 The Android Open Source Project | 2 * Copyright 2008 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkBitmapDevice.h" | 8 #include "SkBitmapDevice.h" |
| 9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
| 10 #include "SkCanvasPriv.h" | 10 #include "SkCanvasPriv.h" |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 * Remove the imagefilter and the xfermode from the paint that
we (AutoDrawLooper) | 477 * Remove the imagefilter and the xfermode from the paint that
we (AutoDrawLooper) |
| 478 * return (fPaint). We then draw the primitive (using srcover)
into a cleared | 478 * return (fPaint). We then draw the primitive (using srcover)
into a cleared |
| 479 * buffer/surface. | 479 * buffer/surface. |
| 480 * 3. Restore the layer created in #1 | 480 * 3. Restore the layer created in #1 |
| 481 * The imagefilter is passed the buffer/surface from the layer
(now filled with the | 481 * The imagefilter is passed the buffer/surface from the layer
(now filled with the |
| 482 * src pixels of the primitive). It returns a new "filtered" bu
ffer, which we | 482 * src pixels of the primitive). It returns a new "filtered" bu
ffer, which we |
| 483 * draw onto the previous layer using the xfermode from the ori
ginal paint. | 483 * draw onto the previous layer using the xfermode from the ori
ginal paint. |
| 484 */ | 484 */ |
| 485 SkPaint tmp; | 485 SkPaint tmp; |
| 486 tmp.setImageFilter(fPaint->getImageFilter()); | 486 tmp.setImageFilter(fPaint->getImageFilter()); |
| 487 tmp.setXfermode(sk_ref_sp(fPaint->getXfermode())); | 487 tmp.setBlendMode(fPaint->getBlendMode()); |
| 488 SkRect storage; | 488 SkRect storage; |
| 489 if (rawBounds) { | 489 if (rawBounds) { |
| 490 // Make rawBounds include all paint outsets except for those due
to image filters. | 490 // Make rawBounds include all paint outsets except for those due
to image filters. |
| 491 rawBounds = &apply_paint_to_bounds_sans_imagefilter(*fPaint, *ra
wBounds, &storage); | 491 rawBounds = &apply_paint_to_bounds_sans_imagefilter(*fPaint, *ra
wBounds, &storage); |
| 492 } | 492 } |
| 493 (void)canvas->internalSaveLayer(SkCanvas::SaveLayerRec(rawBounds, &t
mp), | 493 (void)canvas->internalSaveLayer(SkCanvas::SaveLayerRec(rawBounds, &t
mp), |
| 494 SkCanvas::kFullLayer_SaveLayerStrate
gy); | 494 SkCanvas::kFullLayer_SaveLayerStrate
gy); |
| 495 fTempLayerForImageFilter = true; | 495 fTempLayerForImageFilter = true; |
| 496 // we remove the imagefilter/xfermode inside doNext() | 496 // we remove the imagefilter/xfermode inside doNext() |
| 497 } | 497 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { | 551 bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
| 552 fPaint = nullptr; | 552 fPaint = nullptr; |
| 553 SkASSERT(!fIsSimple); | 553 SkASSERT(!fIsSimple); |
| 554 SkASSERT(fLooperContext || fFilter || fTempLayerForImageFilter); | 554 SkASSERT(fLooperContext || fFilter || fTempLayerForImageFilter); |
| 555 | 555 |
| 556 SkPaint* paint = fLazyPaintPerLooper.set(fLazyPaintInit.isValid() ? | 556 SkPaint* paint = fLazyPaintPerLooper.set(fLazyPaintInit.isValid() ? |
| 557 *fLazyPaintInit.get() : fOrigPaint)
; | 557 *fLazyPaintInit.get() : fOrigPaint)
; |
| 558 | 558 |
| 559 if (fTempLayerForImageFilter) { | 559 if (fTempLayerForImageFilter) { |
| 560 paint->setImageFilter(nullptr); | 560 paint->setImageFilter(nullptr); |
| 561 paint->setXfermode(nullptr); | 561 paint->setBlendMode(SkBlendMode::kSrcOver); |
| 562 } | 562 } |
| 563 | 563 |
| 564 if (fLooperContext && !fLooperContext->next(fCanvas, paint)) { | 564 if (fLooperContext && !fLooperContext->next(fCanvas, paint)) { |
| 565 fDone = true; | 565 fDone = true; |
| 566 return false; | 566 return false; |
| 567 } | 567 } |
| 568 if (fFilter) { | 568 if (fFilter) { |
| 569 if (!fFilter->filter(paint, drawType)) { | 569 if (!fFilter->filter(paint, drawType)) { |
| 570 fDone = true; | 570 fDone = true; |
| 571 return false; | 571 return false; |
| (...skipping 2055 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2627 } | 2627 } |
| 2628 | 2628 |
| 2629 void SkCanvas::DrawTextDecorations(const SkDraw& draw, const SkPaint& paint, | 2629 void SkCanvas::DrawTextDecorations(const SkDraw& draw, const SkPaint& paint, |
| 2630 const char text[], size_t byteLength, | 2630 const char text[], size_t byteLength, |
| 2631 SkScalar x, SkScalar y) { | 2631 SkScalar x, SkScalar y) { |
| 2632 SkASSERT(byteLength == 0 || text != nullptr); | 2632 SkASSERT(byteLength == 0 || text != nullptr); |
| 2633 | 2633 |
| 2634 // nothing to draw | 2634 // nothing to draw |
| 2635 if (text == nullptr || byteLength == 0 || | 2635 if (text == nullptr || byteLength == 0 || |
| 2636 draw.fRC->isEmpty() || | 2636 draw.fRC->isEmpty() || |
| 2637 (paint.getAlpha() == 0 && paint.getXfermode() == nullptr)) { | 2637 (paint.getAlpha() == 0 && paint.isSrcOver())) { |
| 2638 return; | 2638 return; |
| 2639 } | 2639 } |
| 2640 | 2640 |
| 2641 SkScalar width = 0; | 2641 SkScalar width = 0; |
| 2642 SkPoint start; | 2642 SkPoint start; |
| 2643 | 2643 |
| 2644 start.set(0, 0); // to avoid warning | 2644 start.set(0, 0); // to avoid warning |
| 2645 if (paint.getFlags() & (SkPaint::kUnderlineText_Flag | | 2645 if (paint.getFlags() & (SkPaint::kUnderlineText_Flag | |
| 2646 SkPaint::kStrikeThruText_Flag)) { | 2646 SkPaint::kStrikeThruText_Flag)) { |
| 2647 width = paint.measureText(text, byteLength); | 2647 width = paint.measureText(text, byteLength); |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2931 iter.fDevice->drawAnnotation(iter, rect, key, value); | 2931 iter.fDevice->drawAnnotation(iter, rect, key, value); |
| 2932 } | 2932 } |
| 2933 LOOPER_END | 2933 LOOPER_END |
| 2934 } | 2934 } |
| 2935 | 2935 |
| 2936 ////////////////////////////////////////////////////////////////////////////// | 2936 ////////////////////////////////////////////////////////////////////////////// |
| 2937 // These methods are NOT virtual, and therefore must call back into virtual | 2937 // These methods are NOT virtual, and therefore must call back into virtual |
| 2938 // methods, rather than actually drawing themselves. | 2938 // methods, rather than actually drawing themselves. |
| 2939 ////////////////////////////////////////////////////////////////////////////// | 2939 ////////////////////////////////////////////////////////////////////////////// |
| 2940 | 2940 |
| 2941 void SkCanvas::drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, | 2941 void SkCanvas::drawARGB(U8CPU a, U8CPU r, U8CPU g, U8CPU b, SkBlendMode mode) { |
| 2942 SkXfermode::Mode mode) { | |
| 2943 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawARGB()"); | 2942 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawARGB()"); |
| 2944 SkPaint paint; | 2943 SkPaint paint; |
| 2945 | 2944 |
| 2946 paint.setARGB(a, r, g, b); | 2945 paint.setARGB(a, r, g, b); |
| 2947 if (SkXfermode::kSrcOver_Mode != mode) { | 2946 paint.setBlendMode(mode); |
| 2948 paint.setXfermodeMode(mode); | |
| 2949 } | |
| 2950 this->drawPaint(paint); | 2947 this->drawPaint(paint); |
| 2951 } | 2948 } |
| 2952 | 2949 |
| 2953 void SkCanvas::drawColor(SkColor c, SkXfermode::Mode mode) { | 2950 void SkCanvas::drawColor(SkColor c, SkBlendMode mode) { |
| 2954 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawColor()"); | 2951 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawColor()"); |
| 2955 SkPaint paint; | 2952 SkPaint paint; |
| 2956 | 2953 |
| 2957 paint.setColor(c); | 2954 paint.setColor(c); |
| 2958 if (SkXfermode::kSrcOver_Mode != mode) { | 2955 paint.setBlendMode(mode); |
| 2959 paint.setXfermodeMode(mode); | |
| 2960 } | |
| 2961 this->drawPaint(paint); | 2956 this->drawPaint(paint); |
| 2962 } | 2957 } |
| 2963 | 2958 |
| 2964 void SkCanvas::drawPoint(SkScalar x, SkScalar y, const SkPaint& paint) { | 2959 void SkCanvas::drawPoint(SkScalar x, SkScalar y, const SkPaint& paint) { |
| 2965 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPoint(SkPaint)"); | 2960 TRACE_EVENT0("disabled-by-default-skia", "SkCanvas::drawPoint(SkPaint)"); |
| 2966 SkPoint pt; | 2961 SkPoint pt; |
| 2967 | 2962 |
| 2968 pt.set(x, y); | 2963 pt.set(x, y); |
| 2969 this->drawPoints(kPoints_PointMode, 1, &pt, paint); | 2964 this->drawPoints(kPoints_PointMode, 1, &pt, paint); |
| 2970 } | 2965 } |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3400 const SkCanvas::ClipOp SkCanvas::kXOR_Op; | 3395 const SkCanvas::ClipOp SkCanvas::kXOR_Op; |
| 3401 const SkCanvas::ClipOp SkCanvas::kReverseDifference_Op; | 3396 const SkCanvas::ClipOp SkCanvas::kReverseDifference_Op; |
| 3402 const SkCanvas::ClipOp SkCanvas::kReplace_Op; | 3397 const SkCanvas::ClipOp SkCanvas::kReplace_Op; |
| 3403 | 3398 |
| 3404 static_assert((int)SkRegion::kDifference_Op == (int)kDifference_SkClipOp
, ""); | 3399 static_assert((int)SkRegion::kDifference_Op == (int)kDifference_SkClipOp
, ""); |
| 3405 static_assert((int)SkRegion::kIntersect_Op == (int)kIntersect_SkClipOp,
""); | 3400 static_assert((int)SkRegion::kIntersect_Op == (int)kIntersect_SkClipOp,
""); |
| 3406 static_assert((int)SkRegion::kUnion_Op == (int)kUnion_SkClipOp, "")
; | 3401 static_assert((int)SkRegion::kUnion_Op == (int)kUnion_SkClipOp, "")
; |
| 3407 static_assert((int)SkRegion::kXOR_Op == (int)kXOR_SkClipOp, ""); | 3402 static_assert((int)SkRegion::kXOR_Op == (int)kXOR_SkClipOp, ""); |
| 3408 static_assert((int)SkRegion::kReverseDifference_Op == (int)kReverseDifference_S
kClipOp, ""); | 3403 static_assert((int)SkRegion::kReverseDifference_Op == (int)kReverseDifference_S
kClipOp, ""); |
| 3409 static_assert((int)SkRegion::kReplace_Op == (int)kReplace_SkClipOp, "
"); | 3404 static_assert((int)SkRegion::kReplace_Op == (int)kReplace_SkClipOp, "
"); |
| OLD | NEW |