1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "Region" 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1972b0ffe4c3776b33844bb00b9be5693bddd391f9Mathias Agopian#include <limits.h> 2072b0ffe4c3776b33844bb00b9be5693bddd391f9Mathias Agopian 2120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <utils/Log.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/String8.h> 23068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian#include <utils/CallStack.h> 2420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 2520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <ui/Rect.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h> 2720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <ui/Point.h> 2820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 2920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <private/ui/RegionHelper.h> 3020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 3120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 3220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#define VALIDATE_REGIONS (false) 3320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#define VALIDATE_WITH_CORECG (false) 3420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 3520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 3620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_WITH_CORECG 3720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <core/SkRegion.h> 3820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 4120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 4220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 4320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianenum { 4420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_nand = region_operator<Rect>::op_nand, 4520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_and = region_operator<Rect>::op_and, 4620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_or = region_operator<Rect>::op_or, 4720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_xor = region_operator<Rect>::op_xor 4820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian}; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 523ab68558fa5a4b8f792a54965a010f03385bd271Mathias AgopianRegion::Region() { 533ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian mStorage.add(Rect(0,0)); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const Region& rhs) 573ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian : mStorage(rhs.mStorage) 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 59d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian#if VALIDATE_REGIONS 60d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(rhs, "rhs copy-ctor"); 61d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian#endif 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 643ab68558fa5a4b8f792a54965a010f03385bd271Mathias AgopianRegion::Region(const Rect& rhs) { 653ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian mStorage.add(rhs); 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion::~Region() 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operator = (const Region& rhs) 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 7420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 75d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(*this, "this->operator="); 76d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(rhs, "rhs.operator="); 7720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 7820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage = rhs.mStorage; 7920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return *this; 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 829f96145725ff3f265712d607d19078fb91a5c8ecMathias AgopianRegion& Region::makeBoundsSelf() 839f96145725ff3f265712d607d19078fb91a5c8ecMathias Agopian{ 843ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian if (mStorage.size() >= 2) { 853ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian const Rect bounds(getBounds()); 863ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian mStorage.clear(); 873ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian mStorage.add(bounds); 883ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian } 899f96145725ff3f265712d607d19078fb91a5c8ecMathias Agopian return *this; 909f96145725ff3f265712d607d19078fb91a5c8ecMathias Agopian} 919f96145725ff3f265712d607d19078fb91a5c8ecMathias Agopian 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::clear() 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 9420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 953ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian mStorage.add(Rect(0,0)); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::set(const Rect& r) 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 10020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 1013ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian mStorage.add(r); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1040926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianvoid Region::set(uint32_t w, uint32_t h) 1050926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 10620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 1073ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian mStorage.add(Rect(w,h)); 1080926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 1090926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::addRectUnchecked(int l, int t, int r, int b) 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1143ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian Rect rect(l,t,r,b); 1153ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian size_t where = mStorage.size() - 1; 1163ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian mStorage.insertAt(rect, where, 1); 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 12020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 12120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::orSelf(const Rect& r) { 12220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(r, op_or); 12320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 124b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain GuyRegion& Region::xorSelf(const Rect& r) { 125b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operationSelf(r, op_xor); 126b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 12720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::andSelf(const Rect& r) { 12820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(r, op_and); 12920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 13020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::subtractSelf(const Rect& r) { 13120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(r, op_nand); 13220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 13320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operationSelf(const Rect& r, int op) { 13420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region lhs(*this); 13520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, *this, lhs, r); 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::orSelf(const Region& rhs) { 14220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, op_or); 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 144b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain GuyRegion& Region::xorSelf(const Region& rhs) { 145b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operationSelf(rhs, op_xor); 146b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::andSelf(const Region& rhs) { 14820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, op_and); 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::subtractSelf(const Region& rhs) { 15120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, op_nand); 15220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 15320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operationSelf(const Region& rhs, int op) { 15420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region lhs(*this); 15520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, *this, lhs, rhs); 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::translateSelf(int x, int y) { 16020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (x|y) translate(*this, x, y); 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 16420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 16520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 166bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::merge(const Rect& rhs) const { 16720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_or); 16820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 169b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guyconst Region Region::mergeExclusive(const Rect& rhs) const { 170b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operation(rhs, op_xor); 171b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 172bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::intersect(const Rect& rhs) const { 17320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_and); 17420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 175bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::subtract(const Rect& rhs) const { 17620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_nand); 17720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 178bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::operation(const Rect& rhs, int op) const { 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 18020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, result, *this, rhs); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 18520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 186bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::merge(const Region& rhs) const { 18720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_or); 18820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 189b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guyconst Region Region::mergeExclusive(const Region& rhs) const { 190b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operation(rhs, op_xor); 191b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 192bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::intersect(const Region& rhs) const { 19320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_and); 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 195bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::subtract(const Region& rhs) const { 19620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_nand); 19720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 198bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::operation(const Region& rhs, int op) const { 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 20020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, result, *this, rhs); 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::translate(int x, int y) const { 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 20620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian translate(result, *this, x, y); 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::orSelf(const Region& rhs, int dx, int dy) { 21320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, dx, dy, op_or); 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 215b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain GuyRegion& Region::xorSelf(const Region& rhs, int dx, int dy) { 216b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operationSelf(rhs, dx, dy, op_xor); 217b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::andSelf(const Region& rhs, int dx, int dy) { 21920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, dx, dy, op_and); 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::subtractSelf(const Region& rhs, int dx, int dy) { 22220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, dx, dy, op_nand); 22320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 22420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operationSelf(const Region& rhs, int dx, int dy, int op) { 22520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region lhs(*this); 22620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, *this, lhs, rhs, dx, dy); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 23120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 232bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::merge(const Region& rhs, int dx, int dy) const { 23320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, dx, dy, op_or); 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 235b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guyconst Region Region::mergeExclusive(const Region& rhs, int dx, int dy) const { 236b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operation(rhs, dx, dy, op_xor); 237b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 238bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::intersect(const Region& rhs, int dx, int dy) const { 23920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, dx, dy, op_and); 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 241bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::subtract(const Region& rhs, int dx, int dy) const { 24220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, dx, dy, op_nand); 24320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 244bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::operation(const Region& rhs, int dx, int dy, int op) const { 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 24620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, result, *this, rhs, dx, dy); 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// This is our region rasterizer, which merges rects and spans together 25320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// to obtain an optimal region. 25420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianclass Region::rasterizer : public region_operator<Rect>::region_rasterizer 25520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 2563ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian Rect bounds; 25720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Vector<Rect>& storage; 25820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* head; 25920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* tail; 26020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Vector<Rect> span; 26120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* cur; 26220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianpublic: 26320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rasterizer(Region& reg) 2643ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian : bounds(INT_MAX, 0, INT_MIN, 0), storage(reg.mStorage), head(), tail(), cur() { 26520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian storage.clear(); 26620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 26720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 26820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian ~rasterizer() { 26920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (span.size()) { 27020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian flushSpan(); 27120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 27220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (storage.size()) { 27320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.top = storage.itemAt(0).top; 27420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.bottom = storage.top().bottom; 27520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (storage.size() == 1) { 27620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian storage.clear(); 27720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 27820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else { 27920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.left = 0; 28020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.right = 0; 28120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 2823ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian storage.add(bounds); 28320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 28420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 28520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian virtual void operator()(const Rect& rect) { 2869d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block //ALOGD(">>> %3d, %3d, %3d, %3d", 28720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian // rect.left, rect.top, rect.right, rect.bottom); 28820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (span.size()) { 28920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (cur->top != rect.top) { 29020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian flushSpan(); 29120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else if (cur->right == rect.left) { 29220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian cur->right = rect.right; 29320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return; 29420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 29520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 29620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian span.add(rect); 29720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian cur = span.editArray() + (span.size() - 1); 29820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 29920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianprivate: 30020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian template<typename T> 30120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian static inline T min(T rhs, T lhs) { return rhs < lhs ? rhs : lhs; } 30220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian template<typename T> 30320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian static inline T max(T rhs, T lhs) { return rhs > lhs ? rhs : lhs; } 30420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian void flushSpan() { 30520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bool merge = false; 30620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (tail-head == ssize_t(span.size())) { 307b801624dc4f03c930ec35f406f07fa5fd8f65dd9Romain Guy Rect const* p = span.editArray(); 30820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const* q = head; 30920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (p->top == q->bottom) { 31020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian merge = true; 31120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (q != tail) { 31220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if ((p->left != q->left) || (p->right != q->right)) { 31320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian merge = false; 31420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian break; 31520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 31620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian p++, q++; 31720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 31820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 31920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 32020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (merge) { 32120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const int bottom = span[0].bottom; 32220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* r = head; 32320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (r != tail) { 32420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian r->bottom = bottom; 32520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian r++; 32620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 32720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else { 32820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.left = min(span.itemAt(0).left, bounds.left); 32920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.right = max(span.top().right, bounds.right); 33020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian storage.appendVector(span); 33120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian tail = storage.editArray() + storage.size(); 33220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head = tail - span.size(); 33320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 33420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian span.clear(); 33520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 33620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian}; 33720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 338068d47f29dfead847999a7b33b4217ee9514152bMathias Agopianbool Region::validate(const Region& reg, const char* name, bool silent) 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 34020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bool result = true; 34120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator cur = reg.begin(); 34220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const tail = reg.end(); 343068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian const_iterator prev = cur; 34420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect b(*prev); 34520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (cur != tail) { 346068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian if (cur->isValid() == false) { 347068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE_IF(!silent, "%s: region contains an invalid Rect", name); 348068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian result = false; 349068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian } 350068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian if (cur->right > region_operator<Rect>::max_value) { 351068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE_IF(!silent, "%s: rect->right > max_value", name); 352068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian result = false; 353068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian } 354068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian if (cur->bottom > region_operator<Rect>::max_value) { 355068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE_IF(!silent, "%s: rect->right > max_value", name); 356068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian result = false; 357068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian } 358068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian if (prev != cur) { 359068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian b.left = b.left < cur->left ? b.left : cur->left; 360068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian b.top = b.top < cur->top ? b.top : cur->top; 361068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian b.right = b.right > cur->right ? b.right : cur->right; 362068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian b.bottom = b.bottom > cur->bottom ? b.bottom : cur->bottom; 363068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian if ((*prev < *cur) == false) { 364068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE_IF(!silent, "%s: region's Rects not sorted", name); 36520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 366068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian } 367068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian if (cur->top == prev->top) { 368068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian if (cur->bottom != prev->bottom) { 369068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE_IF(!silent, "%s: invalid span %p", name, cur); 370068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian result = false; 371068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian } else if (cur->left < prev->right) { 372068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE_IF(!silent, 373068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian "%s: spans overlap horizontally prev=%p, cur=%p", 374068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian name, prev, cur); 375068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian result = false; 376068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian } 377068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian } else if (cur->top < prev->bottom) { 378068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE_IF(!silent, 379068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian "%s: spans overlap vertically prev=%p, cur=%p", 38020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian name, prev, cur); 38120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 38220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 383068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian prev = cur; 38420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 38520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian cur++; 38620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 38720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (b != reg.getBounds()) { 38820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 389068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE_IF(!silent, 390068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian "%s: invalid bounds [%d,%d,%d,%d] vs. [%d,%d,%d,%d]", name, 39120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.left, b.top, b.right, b.bottom, 39220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.getBounds().left, reg.getBounds().top, 39320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.getBounds().right, reg.getBounds().bottom); 39420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 3953ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian if (reg.mStorage.size() == 2) { 396068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian result = false; 397068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE_IF(!silent, "%s: mStorage size is 2, which is never valid", name); 3983ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian } 399068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian if (result == false && !silent) { 40020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.dump(name); 401068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian CallStack stack; 402068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian stack.update(); 403068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian stack.dump(""); 40420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 40520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return result; 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 40920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, 41020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& rhs, int dx, int dy) 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 412d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian#if VALIDATE_REGIONS 413d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(lhs, "boolean_operation (before): lhs"); 414d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(rhs, "boolean_operation (before): rhs"); 415d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(dst, "boolean_operation (before): dst"); 416d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian#endif 417d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian 41820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t lhs_count; 41920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const * const lhs_rects = lhs.getArray(&lhs_count); 42020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 42120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t rhs_count; 42220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const * const rhs_rects = rhs.getArray(&rhs_count); 42320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 42420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region lhs_region(lhs_rects, lhs_count); 42520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region rhs_region(rhs_rects, rhs_count, dx, dy); 42620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect> operation(op, lhs_region, rhs_region); 42720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian { // scope for rasterizer (dtor has side effects) 42820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rasterizer r(dst); 42920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian operation(r); 43020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 43120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 43220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 43320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(lhs, "boolean_operation: lhs"); 43420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(rhs, "boolean_operation: rhs"); 43520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(dst, "boolean_operation: dst"); 43620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 43720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 43820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_WITH_CORECG 43920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion sk_lhs; 44020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion sk_rhs; 44120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion sk_dst; 44220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 44320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian for (size_t i=0 ; i<lhs_count ; i++) 44420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian sk_lhs.op( 44520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].left + dx, 44620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].top + dy, 44720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].right + dx, 44820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].bottom + dy, 44920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::kUnion_Op); 45020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 45120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian for (size_t i=0 ; i<rhs_count ; i++) 45220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian sk_rhs.op( 45320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].left + dx, 45420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].top + dy, 45520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].right + dx, 45620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].bottom + dy, 45720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::kUnion_Op); 45820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 45920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const char* name = "---"; 46020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::Op sk_op; 46120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian switch (op) { 46220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian case op_or: sk_op = SkRegion::kUnion_Op; name="OR"; break; 463b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy case op_xor: sk_op = SkRegion::kUnion_XOR; name="XOR"; break; 46420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian case op_and: sk_op = SkRegion::kIntersect_Op; name="AND"; break; 46520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian case op_nand: sk_op = SkRegion::kDifference_Op; name="NAND"; break; 46620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 46720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian sk_dst.op(sk_lhs, sk_rhs, sk_op); 46820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 46920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (sk_dst.isEmpty() && dst.isEmpty()) 47020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return; 47120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 47220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bool same = true; 47320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator head = dst.begin(); 47420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const tail = dst.end(); 47520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::Iterator it(sk_dst); 47620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (!it.done()) { 47720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (head != tail) { 47820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if ( 47920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->left != it.rect().fLeft || 48020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->top != it.rect().fTop || 48120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->right != it.rect().fRight || 48220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->bottom != it.rect().fBottom 48320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian ) { 48420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian same = false; 48520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian break; 48620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 48720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else { 48820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian same = false; 48920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian break; 49020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 49120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head++; 49220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.next(); 49320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 49420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 49520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (head != tail) { 49620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian same = false; 49720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 49820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 49920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if(!same) { 5009d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("---\nregion boolean %s failed", name); 50120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs.dump("lhs"); 50220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs.dump("rhs"); 50320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian dst.dump("dst"); 5049d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("should be"); 50520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::Iterator it(sk_dst); 50620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (!it.done()) { 5079d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD(" [%3d, %3d, %3d, %3d]", 50820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fLeft, 50920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fTop, 51020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fRight, 51120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fBottom); 51220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.next(); 51320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 51420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 51520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 51920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, 52020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Rect& rhs, int dx, int dy) 52120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 5220450452e8c6ea48341d57d8bc51d56252e9806b8Mathias Agopian if (!rhs.isValid()) { 523e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("Region::boolean_operation(op=%d) invalid Rect={%d,%d,%d,%d}", 5240450452e8c6ea48341d57d8bc51d56252e9806b8Mathias Agopian op, rhs.left, rhs.top, rhs.right, rhs.bottom); 5250857c8f7f1905008b285a5473c906639fdd0288bMathias Agopian return; 5260450452e8c6ea48341d57d8bc51d56252e9806b8Mathias Agopian } 5270450452e8c6ea48341d57d8bc51d56252e9806b8Mathias Agopian 52820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_WITH_CORECG || VALIDATE_REGIONS 52920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, dst, lhs, Region(rhs), dx, dy); 53020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#else 53120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t lhs_count; 53220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const * const lhs_rects = lhs.getArray(&lhs_count); 53320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 53420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region lhs_region(lhs_rects, lhs_count); 53520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region rhs_region(&rhs, 1, dx, dy); 53620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect> operation(op, lhs_region, rhs_region); 53720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian { // scope for rasterizer (dtor has side effects) 53820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rasterizer r(dst); 53920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian operation(r); 54020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 54220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 54320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 54420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 54520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 54620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, const Region& rhs) 54720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 54820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, dst, lhs, rhs, 0, 0); 54920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 55020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 55120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 55220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, const Rect& rhs) 55320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 55420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, dst, lhs, rhs, 0, 0); 55520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 55620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 55720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::translate(Region& reg, int dx, int dy) 55820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 5594c0a170585d5c8a1f3508ac55f799ebaf86e91dbMathias Agopian if ((dx || dy) && !reg.isEmpty()) { 56020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 56120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(reg, "translate (before)"); 56220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 56320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t count = reg.mStorage.size(); 56420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* rects = reg.mStorage.editArray(); 56520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (count) { 56620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rects->translate(dx, dy); 56720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rects++; 56820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian count--; 56920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 57020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 57120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(reg, "translate (after)"); 57220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 57320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 57420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 57520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 57620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::translate(Region& dst, const Region& reg, int dx, int dy) 57720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 57820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian dst = reg; 57920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian translate(dst, dx, dy); 58020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 58120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 58220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5848683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopiansize_t Region::getSize() const { 5853ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian return mStorage.size() * sizeof(Rect); 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5888683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopianstatus_t Region::flatten(void* buffer) const { 589068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian#if VALIDATE_REGIONS 590068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian validate(*this, "Region::flatten"); 591068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian#endif 5928683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian Rect* rects = reinterpret_cast<Rect*>(buffer); 5938683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian memcpy(rects, mStorage.array(), mStorage.size() * sizeof(Rect)); 5948683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian return NO_ERROR; 595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5978683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopianstatus_t Region::unflatten(void const* buffer, size_t size) { 598068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian Region result; 5998683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian if (size >= sizeof(Rect)) { 6008683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian Rect const* rects = reinterpret_cast<Rect const*>(buffer); 6018683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian size_t count = size / sizeof(Rect); 6028683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian if (count > 0) { 603068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian result.mStorage.clear(); 604068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ssize_t err = result.mStorage.insertAt(0, count); 6058683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian if (err < 0) { 6068683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian return status_t(err); 6078683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian } 608068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian memcpy(result.mStorage.editArray(), rects, count*sizeof(Rect)); 6098683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian } 6108683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian } 6113ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian#if VALIDATE_REGIONS 612068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian validate(result, "Region::unflatten"); 6133ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian#endif 614068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian 615068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian if (!result.validate(result, "Region::unflatten", true)) { 616068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian ALOGE("Region::unflatten() failed, invalid region"); 617068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian return BAD_VALUE; 618068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian } 619068d47f29dfead847999a7b33b4217ee9514152bMathias Agopian mStorage = result.mStorage; 6208683fca395d01734ec7946e9f0595ec5d7b754c6Mathias Agopian return NO_ERROR; 62120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 62220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 62320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 62420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 62520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion::const_iterator Region::begin() const { 6263ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian return mStorage.array(); 62720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 62820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 62920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion::const_iterator Region::end() const { 6303ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian size_t numRects = isRect() ? 1 : mStorage.size() - 1; 6313ab68558fa5a4b8f792a54965a010f03385bd271Mathias Agopian return mStorage.array() + numRects; 63220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 63320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 63420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRect const* Region::getArray(size_t* count) const { 63520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const b(begin()); 63620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const e(end()); 63720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (count) *count = e-b; 63820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return b; 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6412401ead70099c982796ecc3ec63ec8a5570948fcMathias AgopianSharedBuffer const* Region::getSharedBuffer(size_t* count) const { 6422401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian // We can get to the SharedBuffer of a Vector<Rect> because Rect has 6432401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian // a trivial destructor. 6442401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian SharedBuffer const* sb = SharedBuffer::bufferFromData(mStorage.array()); 6452401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian if (count) { 6462401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian size_t numRects = isRect() ? 1 : mStorage.size() - 1; 6472401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian count[0] = numRects; 6482401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian } 6492401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian sb->acquire(); 6502401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian return sb; 6512401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian} 6522401ead70099c982796ecc3ec63ec8a5570948fcMathias Agopian 65320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 65420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::dump(String8& out, const char* what, uint32_t flags) const 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (void)flags; 65820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator head = begin(); 65920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const tail = end(); 66020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t SIZE = 256; 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project char buffer[SIZE]; 66320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 66420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian snprintf(buffer, SIZE, " Region %s (this=%p, count=%d)\n", 66520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian what, this, tail-head); 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.append(buffer); 66720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (head != tail) { 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project snprintf(buffer, SIZE, " [%3d, %3d, %3d, %3d]\n", 66920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->left, head->top, head->right, head->bottom); 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.append(buffer); 67120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head++; 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::dump(const char* what, uint32_t flags) const 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (void)flags; 67820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator head = begin(); 67920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const tail = end(); 6809d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD(" Region %s (this=%p, count=%d)\n", what, this, tail-head); 68120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (head != tail) { 6829d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD(" [%3d, %3d, %3d, %3d]\n", 68320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->left, head->top, head->right, head->bottom); 68420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head++; 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 691