SkDrawLooper.cpp revision 135ece137b471219eea06a652069b86a3b6ec349
1/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkDrawLooper.h"
9#include "SkCanvas.h"
10#include "SkMatrix.h"
11#include "SkPaint.h"
12#include "SkRect.h"
13
14SK_DEFINE_INST_COUNT(SkDrawLooper)
15
16bool SkDrawLooper::canComputeFastBounds(const SkPaint& paint) {
17    SkCanvas canvas;
18
19    this->init(&canvas);
20    for (;;) {
21        SkPaint p(paint);
22        if (this->next(&canvas, &p)) {
23            p.setLooper(NULL);
24            if (!p.canComputeFastBounds()) {
25                return false;
26            }
27        } else {
28            break;
29        }
30    }
31    return true;
32}
33
34void SkDrawLooper::computeFastBounds(const SkPaint& paint, const SkRect& src,
35                                     SkRect* dst) {
36    SkCanvas canvas;
37
38    *dst = src;   // catch case where there are no loops
39    this->init(&canvas);
40    for (bool firstTime = true;; firstTime = false) {
41        SkPaint p(paint);
42        if (this->next(&canvas, &p)) {
43            SkRect r(src);
44
45            p.setLooper(NULL);
46            p.computeFastBounds(r, &r);
47            canvas.getTotalMatrix().mapRect(&r);
48
49            if (firstTime) {
50                *dst = r;
51            } else {
52                dst->join(r);
53            }
54        } else {
55            break;
56        }
57    }
58}
59