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> 2320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 2420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <ui/Rect.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h> 2620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <ui/Point.h> 2720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 2820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <private/ui/RegionHelper.h> 2920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 3020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 3120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#define VALIDATE_REGIONS (false) 3220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#define VALIDATE_WITH_CORECG (false) 3320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 3420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 3520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_WITH_CORECG 3620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <core/SkRegion.h> 3720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 4020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 4120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 4220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianenum { 4320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_nand = region_operator<Rect>::op_nand, 4420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_and = region_operator<Rect>::op_and, 4520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_or = region_operator<Rect>::op_or, 4620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_xor = region_operator<Rect>::op_xor 4720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian}; 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region() 5220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian : mBounds(0,0) 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const Region& rhs) 5720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian : mBounds(rhs.mBounds), 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 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const Rect& rhs) 6520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian : mBounds(rhs) 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const void* buffer) 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 7120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian status_t err = read(buffer); 72e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE_IF(err<0, "error %s reading Region from buffer", strerror(err)); 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion::~Region() 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operator = (const Region& rhs) 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 8120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 82d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(*this, "this->operator="); 83d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(rhs, "rhs.operator="); 8420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 8520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mBounds = rhs.mBounds; 8620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage = rhs.mStorage; 8720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return *this; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 909f96145725ff3f265712d607d19078fb91a5c8ecMathias AgopianRegion& Region::makeBoundsSelf() 919f96145725ff3f265712d607d19078fb91a5c8ecMathias Agopian{ 929f96145725ff3f265712d607d19078fb91a5c8ecMathias Agopian mStorage.clear(); 939f96145725ff3f265712d607d19078fb91a5c8ecMathias Agopian return *this; 949f96145725ff3f265712d607d19078fb91a5c8ecMathias Agopian} 959f96145725ff3f265712d607d19078fb91a5c8ecMathias Agopian 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::clear() 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 9820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mBounds.clear(); 9920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::set(const Rect& r) 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 10420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mBounds = r; 10520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1080926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianvoid Region::set(uint32_t w, uint32_t h) 1090926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 11020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mBounds = Rect(int(w), int(h)); 11120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 1120926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 1130926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::addRectUnchecked(int l, int t, int r, int b) 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 11820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.add(Rect(l,t,r,b)); 11920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 12020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(*this, "addRectUnchecked"); 12120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 12520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 12620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::orSelf(const Rect& r) { 12720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(r, op_or); 12820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 129b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain GuyRegion& Region::xorSelf(const Rect& r) { 130b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operationSelf(r, op_xor); 131b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 13220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::andSelf(const Rect& r) { 13320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(r, op_and); 13420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 13520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::subtractSelf(const Rect& r) { 13620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(r, op_nand); 13720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 13820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operationSelf(const Rect& r, int op) { 13920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region lhs(*this); 14020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, *this, lhs, r); 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::orSelf(const Region& rhs) { 14720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, op_or); 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 149b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain GuyRegion& Region::xorSelf(const Region& rhs) { 150b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operationSelf(rhs, op_xor); 151b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::andSelf(const Region& rhs) { 15320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, op_and); 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::subtractSelf(const Region& rhs) { 15620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, op_nand); 15720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 15820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operationSelf(const Region& rhs, int op) { 15920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region lhs(*this); 16020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, *this, lhs, rhs); 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::translateSelf(int x, int y) { 16520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (x|y) translate(*this, x, y); 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 16920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 17020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 171bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::merge(const Rect& rhs) const { 17220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_or); 17320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 174b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guyconst Region Region::mergeExclusive(const Rect& rhs) const { 175b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operation(rhs, op_xor); 176b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 177bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::intersect(const Rect& rhs) const { 17820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_and); 17920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 180bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::subtract(const Rect& rhs) const { 18120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_nand); 18220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 183bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::operation(const Rect& rhs, int op) const { 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 18520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, result, *this, rhs); 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 19020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 191bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::merge(const Region& rhs) const { 19220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_or); 19320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 194b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guyconst Region Region::mergeExclusive(const Region& rhs) const { 195b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operation(rhs, op_xor); 196b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 197bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::intersect(const Region& rhs) const { 19820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_and); 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 200bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::subtract(const Region& rhs) const { 20120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_nand); 20220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 203bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::operation(const Region& rhs, int op) const { 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 20520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, result, *this, rhs); 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 209bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::translate(int x, int y) const { 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 21120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian translate(result, *this, x, y); 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::orSelf(const Region& rhs, int dx, int dy) { 21820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, dx, dy, op_or); 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 220b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain GuyRegion& Region::xorSelf(const Region& rhs, int dx, int dy) { 221b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operationSelf(rhs, dx, dy, op_xor); 222b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::andSelf(const Region& rhs, int dx, int dy) { 22420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, dx, dy, op_and); 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::subtractSelf(const Region& rhs, int dx, int dy) { 22720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, dx, dy, op_nand); 22820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 22920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operationSelf(const Region& rhs, int dx, int dy, int op) { 23020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region lhs(*this); 23120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, *this, lhs, rhs, dx, dy); 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 23620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 237bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::merge(const Region& rhs, int dx, int dy) const { 23820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, dx, dy, op_or); 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 240b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guyconst Region Region::mergeExclusive(const Region& rhs, int dx, int dy) const { 241b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy return operation(rhs, dx, dy, op_xor); 242b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy} 243bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::intersect(const Region& rhs, int dx, int dy) const { 24420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, dx, dy, op_and); 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 246bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::subtract(const Region& rhs, int dx, int dy) const { 24720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, dx, dy, op_nand); 24820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 249bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::operation(const Region& rhs, int dx, int dy, int op) const { 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 25120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, result, *this, rhs, dx, dy); 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// This is our region rasterizer, which merges rects and spans together 25820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// to obtain an optimal region. 25920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianclass Region::rasterizer : public region_operator<Rect>::region_rasterizer 26020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 26120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect& bounds; 26220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Vector<Rect>& storage; 26320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* head; 26420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* tail; 26520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Vector<Rect> span; 26620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* cur; 26720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianpublic: 26820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rasterizer(Region& reg) 26920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian : bounds(reg.mBounds), storage(reg.mStorage), head(), tail(), cur() { 27020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.top = bounds.bottom = 0; 27120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.left = INT_MAX; 27220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.right = INT_MIN; 27320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian storage.clear(); 27420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 27520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 27620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian ~rasterizer() { 27720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (span.size()) { 27820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian flushSpan(); 27920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 28020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (storage.size()) { 28120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.top = storage.itemAt(0).top; 28220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.bottom = storage.top().bottom; 28320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (storage.size() == 1) { 28420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian storage.clear(); 28520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 28620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else { 28720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.left = 0; 28820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.right = 0; 28920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 29020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 29120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 29220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian virtual void operator()(const Rect& rect) { 2939d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block //ALOGD(">>> %3d, %3d, %3d, %3d", 29420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian // rect.left, rect.top, rect.right, rect.bottom); 29520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (span.size()) { 29620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (cur->top != rect.top) { 29720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian flushSpan(); 29820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else if (cur->right == rect.left) { 29920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian cur->right = rect.right; 30020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return; 30120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 30220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 30320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian span.add(rect); 30420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian cur = span.editArray() + (span.size() - 1); 30520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 30620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianprivate: 30720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian template<typename T> 30820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian static inline T min(T rhs, T lhs) { return rhs < lhs ? rhs : lhs; } 30920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian template<typename T> 31020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian static inline T max(T rhs, T lhs) { return rhs > lhs ? rhs : lhs; } 31120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian void flushSpan() { 31220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bool merge = false; 31320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (tail-head == ssize_t(span.size())) { 314b801624dc4f03c930ec35f406f07fa5fd8f65dd9Romain Guy Rect const* p = span.editArray(); 31520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const* q = head; 31620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (p->top == q->bottom) { 31720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian merge = true; 31820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (q != tail) { 31920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if ((p->left != q->left) || (p->right != q->right)) { 32020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian merge = false; 32120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian break; 32220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 32320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian p++, q++; 32420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 32520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 32620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 32720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (merge) { 32820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const int bottom = span[0].bottom; 32920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* r = head; 33020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (r != tail) { 33120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian r->bottom = bottom; 33220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian r++; 33320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 33420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else { 33520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.left = min(span.itemAt(0).left, bounds.left); 33620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.right = max(span.top().right, bounds.right); 33720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian storage.appendVector(span); 33820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian tail = storage.editArray() + storage.size(); 33920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head = tail - span.size(); 34020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 34120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian span.clear(); 34220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 34320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian}; 34420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 34520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianbool Region::validate(const Region& reg, const char* name) 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 34720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bool result = true; 34820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator cur = reg.begin(); 34920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const tail = reg.end(); 35020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator prev = cur++; 35120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect b(*prev); 35220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (cur != tail) { 35320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.left = b.left < cur->left ? b.left : cur->left; 35420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.top = b.top < cur->top ? b.top : cur->top; 35520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.right = b.right > cur->right ? b.right : cur->right; 35620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.bottom = b.bottom > cur->bottom ? b.bottom : cur->bottom; 35720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (cur->top == prev->top) { 35820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (cur->bottom != prev->bottom) { 359e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("%s: invalid span %p", name, cur); 36020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 36120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else if (cur->left < prev->right) { 362e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("%s: spans overlap horizontally prev=%p, cur=%p", 36320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian name, prev, cur); 36420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 36520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 36620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else if (cur->top < prev->bottom) { 367e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("%s: spans overlap vertically prev=%p, cur=%p", 36820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian name, prev, cur); 36920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 37020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 37120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian prev = cur; 37220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian cur++; 37320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 37420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (b != reg.getBounds()) { 37520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 376e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("%s: invalid bounds [%d,%d,%d,%d] vs. [%d,%d,%d,%d]", name, 37720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.left, b.top, b.right, b.bottom, 37820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.getBounds().left, reg.getBounds().top, 37920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.getBounds().right, reg.getBounds().bottom); 38020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 38120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (result == false) { 38220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.dump(name); 38320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 38420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return result; 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 38820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, 38920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& rhs, int dx, int dy) 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 391d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian#if VALIDATE_REGIONS 392d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(lhs, "boolean_operation (before): lhs"); 393d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(rhs, "boolean_operation (before): rhs"); 394d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian validate(dst, "boolean_operation (before): dst"); 395d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian#endif 396d0b55c011a311b677493ba72804bf1bc4df68224Mathias Agopian 39720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t lhs_count; 39820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const * const lhs_rects = lhs.getArray(&lhs_count); 39920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 40020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t rhs_count; 40120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const * const rhs_rects = rhs.getArray(&rhs_count); 40220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 40320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region lhs_region(lhs_rects, lhs_count); 40420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region rhs_region(rhs_rects, rhs_count, dx, dy); 40520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect> operation(op, lhs_region, rhs_region); 40620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian { // scope for rasterizer (dtor has side effects) 40720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rasterizer r(dst); 40820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian operation(r); 40920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 41020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 41120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 41220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(lhs, "boolean_operation: lhs"); 41320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(rhs, "boolean_operation: rhs"); 41420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(dst, "boolean_operation: dst"); 41520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 41620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 41720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_WITH_CORECG 41820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion sk_lhs; 41920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion sk_rhs; 42020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion sk_dst; 42120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 42220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian for (size_t i=0 ; i<lhs_count ; i++) 42320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian sk_lhs.op( 42420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].left + dx, 42520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].top + dy, 42620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].right + dx, 42720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].bottom + dy, 42820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::kUnion_Op); 42920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 43020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian for (size_t i=0 ; i<rhs_count ; i++) 43120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian sk_rhs.op( 43220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].left + dx, 43320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].top + dy, 43420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].right + dx, 43520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].bottom + dy, 43620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::kUnion_Op); 43720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 43820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const char* name = "---"; 43920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::Op sk_op; 44020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian switch (op) { 44120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian case op_or: sk_op = SkRegion::kUnion_Op; name="OR"; break; 442b8a2e98cd7edbe7513543670c94f6b5efa74462fRomain Guy case op_xor: sk_op = SkRegion::kUnion_XOR; name="XOR"; break; 44320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian case op_and: sk_op = SkRegion::kIntersect_Op; name="AND"; break; 44420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian case op_nand: sk_op = SkRegion::kDifference_Op; name="NAND"; break; 44520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 44620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian sk_dst.op(sk_lhs, sk_rhs, sk_op); 44720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 44820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (sk_dst.isEmpty() && dst.isEmpty()) 44920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return; 45020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 45120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bool same = true; 45220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator head = dst.begin(); 45320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const tail = dst.end(); 45420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::Iterator it(sk_dst); 45520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (!it.done()) { 45620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (head != tail) { 45720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if ( 45820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->left != it.rect().fLeft || 45920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->top != it.rect().fTop || 46020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->right != it.rect().fRight || 46120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->bottom != it.rect().fBottom 46220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian ) { 46320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian same = false; 46420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian break; 46520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 46620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else { 46720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian same = false; 46820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian break; 46920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 47020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head++; 47120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.next(); 47220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 47320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 47420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (head != tail) { 47520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian same = false; 47620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 47720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 47820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if(!same) { 4799d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("---\nregion boolean %s failed", name); 48020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs.dump("lhs"); 48120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs.dump("rhs"); 48220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian dst.dump("dst"); 4839d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD("should be"); 48420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::Iterator it(sk_dst); 48520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (!it.done()) { 4869d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD(" [%3d, %3d, %3d, %3d]", 48720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fLeft, 48820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fTop, 48920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fRight, 49020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fBottom); 49120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.next(); 49220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 49320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 49420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 49820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, 49920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Rect& rhs, int dx, int dy) 50020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 5010450452e8c6ea48341d57d8bc51d56252e9806b8Mathias Agopian if (!rhs.isValid()) { 502e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("Region::boolean_operation(op=%d) invalid Rect={%d,%d,%d,%d}", 5030450452e8c6ea48341d57d8bc51d56252e9806b8Mathias Agopian op, rhs.left, rhs.top, rhs.right, rhs.bottom); 5040857c8f7f1905008b285a5473c906639fdd0288bMathias Agopian return; 5050450452e8c6ea48341d57d8bc51d56252e9806b8Mathias Agopian } 5060450452e8c6ea48341d57d8bc51d56252e9806b8Mathias Agopian 50720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_WITH_CORECG || VALIDATE_REGIONS 50820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, dst, lhs, Region(rhs), dx, dy); 50920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#else 51020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t lhs_count; 51120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const * const lhs_rects = lhs.getArray(&lhs_count); 51220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 51320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region lhs_region(lhs_rects, lhs_count); 51420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region rhs_region(&rhs, 1, dx, dy); 51520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect> operation(op, lhs_region, rhs_region); 51620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian { // scope for rasterizer (dtor has side effects) 51720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rasterizer r(dst); 51820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian operation(r); 51920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 52220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 52320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 52420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 52520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, const Region& rhs) 52620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 52720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, dst, lhs, rhs, 0, 0); 52820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 52920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 53020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 53120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, const Rect& rhs) 53220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 53320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, dst, lhs, rhs, 0, 0); 53420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 53520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 53620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::translate(Region& reg, int dx, int dy) 53720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 53820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (!reg.isEmpty()) { 53920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 54020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(reg, "translate (before)"); 54120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 54220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.mBounds.translate(dx, dy); 54320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t count = reg.mStorage.size(); 54420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* rects = reg.mStorage.editArray(); 54520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (count) { 54620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rects->translate(dx, dy); 54720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rects++; 54820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian count--; 54920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 55020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 55120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(reg, "translate (after)"); 55220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 55320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 55420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 55520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 55620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::translate(Region& dst, const Region& reg, int dx, int dy) 55720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 55820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian dst = reg; 55920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian translate(dst, dx, dy); 56020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 56120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 56220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t Region::write(void* buffer, size_t size) const 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 56620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 56720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(*this, "write(buffer)"); 56820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 56920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t count = mStorage.size(); 57020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t sizeNeeded = sizeof(int32_t) + (1+count)*sizeof(Rect); 571b6121422ef641dc7317d1c3bf1d38b7d73922250Mathias Agopian if (buffer != NULL) { 572b6121422ef641dc7317d1c3bf1d38b7d73922250Mathias Agopian if (sizeNeeded > size) return NO_MEMORY; 573b6121422ef641dc7317d1c3bf1d38b7d73922250Mathias Agopian int32_t* const p = static_cast<int32_t*>(buffer); 574b6121422ef641dc7317d1c3bf1d38b7d73922250Mathias Agopian *p = count; 575b6121422ef641dc7317d1c3bf1d38b7d73922250Mathias Agopian memcpy(p+1, &mBounds, sizeof(Rect)); 576b6121422ef641dc7317d1c3bf1d38b7d73922250Mathias Agopian if (count) { 577b6121422ef641dc7317d1c3bf1d38b7d73922250Mathias Agopian memcpy(p+5, mStorage.array(), count*sizeof(Rect)); 578b6121422ef641dc7317d1c3bf1d38b7d73922250Mathias Agopian } 57920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 58020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return ssize_t(sizeNeeded); 581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t Region::read(const void* buffer) 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 58520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian int32_t const* const p = static_cast<int32_t const*>(buffer); 58620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t count = *p; 58720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian memcpy(&mBounds, p+1, sizeof(Rect)); 58820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 58920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (count) { 59020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.insertAt(0, count); 59120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian memcpy(mStorage.editArray(), p+5, count*sizeof(Rect)); 59220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 59320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 59420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(*this, "read(buffer)"); 59520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 59620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return ssize_t(sizeof(int32_t) + (1+count)*sizeof(Rect)); 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t Region::writeEmpty(void* buffer, size_t size) 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 60120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t sizeNeeded = sizeof(int32_t) + sizeof(Rect); 60220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (sizeNeeded > size) return NO_MEMORY; 60320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian int32_t* const p = static_cast<int32_t*>(buffer); 60420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian memset(p, 0, sizeNeeded); 60520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return ssize_t(sizeNeeded); 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool Region::isEmpty(void* buffer) 609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 61020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian int32_t const* const p = static_cast<int32_t const*>(buffer); 61120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const* const b = reinterpret_cast<Rect const *>(p+1); 61220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return b->isEmpty(); 61320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 61420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 61520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 61620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 61720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion::const_iterator Region::begin() const { 61820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return isRect() ? &mBounds : mStorage.array(); 61920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 62020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 62120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion::const_iterator Region::end() const { 6223aecbb0715cb6928e0530ff1e4caa9c0993cc371Mathias Agopian if (isRect()) { 6233aecbb0715cb6928e0530ff1e4caa9c0993cc371Mathias Agopian if (isEmpty()) { 6243aecbb0715cb6928e0530ff1e4caa9c0993cc371Mathias Agopian return &mBounds; 6253aecbb0715cb6928e0530ff1e4caa9c0993cc371Mathias Agopian } else { 6263aecbb0715cb6928e0530ff1e4caa9c0993cc371Mathias Agopian return &mBounds + 1; 6273aecbb0715cb6928e0530ff1e4caa9c0993cc371Mathias Agopian } 6283aecbb0715cb6928e0530ff1e4caa9c0993cc371Mathias Agopian } else { 6293aecbb0715cb6928e0530ff1e4caa9c0993cc371Mathias Agopian return mStorage.array() + mStorage.size(); 6303aecbb0715cb6928e0530ff1e4caa9c0993cc371Mathias Agopian } 63120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 63220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 63320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRect const* Region::getArray(size_t* count) const { 63420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const b(begin()); 63520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const e(end()); 63620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (count) *count = e-b; 63720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return b; 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopiansize_t Region::getRects(Vector<Rect>& rectList) const 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 64220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rectList = mStorage; 64320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (rectList.isEmpty()) { 64420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rectList.clear(); 64520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rectList.add(mBounds); 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return rectList.size(); 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 65120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::dump(String8& out, const char* what, uint32_t flags) const 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (void)flags; 65520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator head = begin(); 65620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const tail = end(); 65720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t SIZE = 256; 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project char buffer[SIZE]; 66020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 66120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian snprintf(buffer, SIZE, " Region %s (this=%p, count=%d)\n", 66220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian what, this, tail-head); 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.append(buffer); 66420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (head != tail) { 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project snprintf(buffer, SIZE, " [%3d, %3d, %3d, %3d]\n", 66620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->left, head->top, head->right, head->bottom); 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.append(buffer); 66820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head++; 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::dump(const char* what, uint32_t flags) const 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (void)flags; 67520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator head = begin(); 67620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const tail = end(); 6779d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD(" Region %s (this=%p, count=%d)\n", what, this, tail-head); 67820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (head != tail) { 6799d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD(" [%3d, %3d, %3d, %3d]\n", 68020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->left, head->top, head->right, head->bottom); 68120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head++; 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 688