| /* | |
| * Copyright 2013 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "SkArenaAlloc.h" | |
| #include "SkDrawLooper.h" | |
| #include "SkCanvas.h" | |
| #include "SkMatrix.h" | |
| #include "SkPaint.h" | |
| #include "SkRect.h" | |
| bool SkDrawLooper::canComputeFastBounds(const SkPaint& paint) const { | |
| SkCanvas canvas; | |
| SkSTArenaAlloc<48> alloc; | |
| SkDrawLooper::Context* context = this->makeContext(&canvas, &alloc); | |
| for (;;) { | |
| SkPaint p(paint); | |
| if (context->next(&canvas, &p)) { | |
| p.setLooper(nullptr); | |
| if (!p.canComputeFastBounds()) { | |
| return false; | |
| } | |
| } else { | |
| break; | |
| } | |
| } | |
| return true; | |
| } | |
| void SkDrawLooper::computeFastBounds(const SkPaint& paint, const SkRect& s, | |
| SkRect* dst) const { | |
| // src and dst rects may alias and we need to keep the original src, so copy it. | |
| const SkRect src = s; | |
| SkCanvas canvas; | |
| SkSTArenaAlloc<48> alloc; | |
| *dst = src; // catch case where there are no loops | |
| SkDrawLooper::Context* context = this->makeContext(&canvas, &alloc); | |
| for (bool firstTime = true;; firstTime = false) { | |
| SkPaint p(paint); | |
| if (context->next(&canvas, &p)) { | |
| SkRect r(src); | |
| p.setLooper(nullptr); | |
| p.computeFastBounds(r, &r); | |
| canvas.getTotalMatrix().mapRect(&r); | |
| if (firstTime) { | |
| *dst = r; | |
| } else { | |
| dst->join(r); | |
| } | |
| } else { | |
| break; | |
| } | |
| } | |
| } | |
| bool SkDrawLooper::asABlurShadow(BlurShadowRec*) const { | |
| return false; | |
| } |