| /* | |
| * 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 "SkDrawLooper.h" | |
| #include "SkCanvas.h" | |
| #include "SkMatrix.h" | |
| #include "SkPaint.h" | |
| #include "SkRect.h" | |
| #include "SkSmallAllocator.h" | |
| bool SkDrawLooper::canComputeFastBounds(const SkPaint& paint) const { | |
| SkCanvas canvas; | |
| SkSmallAllocator<1, 32> allocator; | |
| void* buffer = allocator.reserveT<SkDrawLooper::Context>(this->contextSize()); | |
| SkDrawLooper::Context* context = this->createContext(&canvas, buffer); | |
| for (;;) { | |
| SkPaint p(paint); | |
| if (context->next(&canvas, &p)) { | |
| p.setLooper(NULL); | |
| if (!p.canComputeFastBounds()) { | |
| return false; | |
| } | |
| } else { | |
| break; | |
| } | |
| } | |
| return true; | |
| } | |
| void SkDrawLooper::computeFastBounds(const SkPaint& paint, const SkRect& src, | |
| SkRect* dst) const { | |
| SkCanvas canvas; | |
| SkSmallAllocator<1, 32> allocator; | |
| void* buffer = allocator.reserveT<SkDrawLooper::Context>(this->contextSize()); | |
| *dst = src; // catch case where there are no loops | |
| SkDrawLooper::Context* context = this->createContext(&canvas, buffer); | |
| for (bool firstTime = true;; firstTime = false) { | |
| SkPaint p(paint); | |
| if (context->next(&canvas, &p)) { | |
| SkRect r(src); | |
| p.setLooper(NULL); | |
| 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; | |
| } |