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