| 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 | 
|---|