SkDrawLooper.cpp revision 2dd76d7668d8175ea1ab8f7ad27a1bfd5b917a84
14a10645c70199c8d8567fbc46312158c419720abChris Lattner/*
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman * Copyright 2013 Google Inc.
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell *
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell * Use of this source code is governed by a BSD-style license that can be
521c62da287237d39d0d95004881ea4baae3be6daChris Lattner * found in the LICENSE file.
621c62da287237d39d0d95004881ea4baae3be6daChris Lattner */
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell#include "SkDrawLooper.h"
94a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "SkCanvas.h"
104a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "SkMatrix.h"
118ff70c2635bfd4e02c0140a5dc9ca909fffba35aGabor Greif#include "SkPaint.h"
124a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "SkRect.h"
134a10645c70199c8d8567fbc46312158c419720abChris Lattner
144a10645c70199c8d8567fbc46312158c419720abChris LattnerSK_DEFINE_INST_COUNT(SkDrawLooper)
154a10645c70199c8d8567fbc46312158c419720abChris Lattner
16f1b20d8620b05abaa52f40ac6d21f839b265fb00Chris Lattnerbool SkDrawLooper::canComputeFastBounds(const SkPaint& paint) {
17551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer    SkCanvas canvas;
18551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer
19551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer    this->init(&canvas);
20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer    for (;;) {
2174382b7c699120fbec5cb5603c9cf4212eb37f06Chris Lattner        SkPaint p(paint);
224a10645c70199c8d8567fbc46312158c419720abChris Lattner        if (this->next(&canvas, &p)) {
2351ab5c8862466bbddcd5c4369779c472978ed309Reid Spencer            p.setLooper(NULL);
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke            if (!p.canComputeFastBounds()) {
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke                return false;
264a10645c70199c8d8567fbc46312158c419720abChris Lattner            }
274a10645c70199c8d8567fbc46312158c419720abChris Lattner        } else {
284a10645c70199c8d8567fbc46312158c419720abChris Lattner            break;
294a10645c70199c8d8567fbc46312158c419720abChris Lattner        }
304a10645c70199c8d8567fbc46312158c419720abChris Lattner    }
3150010429a7c3285dab15ede68acae7231fade367Chris Lattner    return true;
324a10645c70199c8d8567fbc46312158c419720abChris Lattner}
334148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman
34a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattnervoid SkDrawLooper::computeFastBounds(const SkPaint& paint, const SkRect& src,
35a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner                                     SkRect* dst) {
36a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner    SkCanvas canvas;
37a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner
38a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner    *dst = src;
39a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner    this->init(&canvas);
40a328c51bb99666ee0c045a57ea6d6ce2b0198f9bChris Lattner    for (bool firstTime = true;; firstTime = false) {
414a10645c70199c8d8567fbc46312158c419720abChris Lattner        SkPaint p(paint);
4270ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman        if (this->next(&canvas, &p)) {
43b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke            SkRect r(src);
44b687d82b029ba448b978e2c9ed424ee5d1f9f093Misha Brukman
45b687d82b029ba448b978e2c9ed424ee5d1f9f093Misha Brukman            p.setLooper(NULL);
465073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman            p.computeFastBounds(r, &r);
475073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman            canvas.getTotalMatrix().mapRect(&r);
4850010429a7c3285dab15ede68acae7231fade367Chris Lattner
4950010429a7c3285dab15ede68acae7231fade367Chris Lattner            if (firstTime) {
505073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                *dst = r;
51c600f3c337f18c62116ac58b701e4f7ae6d2fb1aChris Lattner            } else {
52cd6f46e2ac4c1d64067237c0b28eccfae22bd9f4Chris Lattner                dst->join(r);
539ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov            }
549ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov        } else {
559ef7425a4d44ff129495da2357c98c67162fbeffAnton Korobeynikov            break;
564d143ee01988e1b52e106ffccbb313937ca5e886Chris Lattner        }
57b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    }
583c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner}
5970ef449741da8b1ef035e04a55958652a0200ba1Dan Gohman