Region.cpp revision bed9dd128dfbdc7d9dbca005078536dadc0b9359
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 1920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <utils/Log.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/String8.h> 2120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 2220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <ui/Rect.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h> 2420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <ui/Point.h> 2520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 2620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <private/ui/RegionHelper.h> 2720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 2820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 2920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#define VALIDATE_REGIONS (false) 3020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#define VALIDATE_WITH_CORECG (false) 3120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 3220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 3320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_WITH_CORECG 3420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#include <core/SkRegion.h> 3520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 3820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 3920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 4020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianenum { 4120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_nand = region_operator<Rect>::op_nand, 4220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_and = region_operator<Rect>::op_and, 4320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_or = region_operator<Rect>::op_or, 4420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian op_xor = region_operator<Rect>::op_xor 4520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian}; 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region() 5020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian : mBounds(0,0) 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const Region& rhs) 5520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian : mBounds(rhs.mBounds), mStorage(rhs.mStorage) 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const Rect& rhs) 6020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian : mBounds(rhs) 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const Parcel& parcel) 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 6620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian status_t err = read(parcel); 6720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGE_IF(err<0, "error %s reading Region from parcel", strerror(err)); 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const void* buffer) 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 7220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian status_t err = read(buffer); 7320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGE_IF(err<0, "error %s reading Region from parcel", strerror(err)); 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion::~Region() 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 8020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operator = (const Region& rhs) 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 8220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 8320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(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 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::clear() 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 9220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mBounds.clear(); 9320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::set(const Rect& r) 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 9820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mBounds = r; 9920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1020926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianvoid Region::set(uint32_t w, uint32_t h) 1030926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{ 10420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mBounds = Rect(int(w), int(h)); 10520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 1060926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian} 1070926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::addRectUnchecked(int l, int t, int r, int b) 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 11220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.add(Rect(l,t,r,b)); 11320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 11420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(*this, "addRectUnchecked"); 11520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 11820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 11920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 12020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::orSelf(const Rect& r) { 12120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(r, op_or); 12220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 12320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::andSelf(const Rect& r) { 12420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(r, op_and); 12520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 12620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::subtractSelf(const Rect& r) { 12720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(r, op_nand); 12820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 12920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operationSelf(const Rect& r, int op) { 13020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region lhs(*this); 13120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, *this, lhs, r); 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::orSelf(const Region& rhs) { 13820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, op_or); 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::andSelf(const Region& rhs) { 14120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, op_and); 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::subtractSelf(const Region& rhs) { 14420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, op_nand); 14520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 14620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operationSelf(const Region& rhs, int op) { 14720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region lhs(*this); 14820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, *this, lhs, rhs); 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::translateSelf(int x, int y) { 15320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (x|y) translate(*this, x, y); 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 15720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 15820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 159bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::merge(const Rect& rhs) const { 16020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_or); 16120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 162bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::intersect(const Rect& rhs) const { 16320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_and); 16420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 165bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::subtract(const Rect& rhs) const { 16620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_nand); 16720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 168bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::operation(const Rect& rhs, int op) const { 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 17020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, result, *this, rhs); 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 17520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 176bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::merge(const Region& rhs) const { 17720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_or); 17820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 179bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::intersect(const Region& rhs) const { 18020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_and); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 182bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::subtract(const Region& rhs) const { 18320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, op_nand); 18420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 185bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::operation(const Region& rhs, int op) const { 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 18720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, result, *this, rhs); 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::translate(int x, int y) const { 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 19320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian translate(result, *this, x, y); 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::orSelf(const Region& rhs, int dx, int dy) { 20020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, dx, dy, op_or); 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::andSelf(const Region& rhs, int dx, int dy) { 20320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, dx, dy, op_and); 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::subtractSelf(const Region& rhs, int dx, int dy) { 20620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operationSelf(rhs, dx, dy, op_nand); 20720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 20820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion& Region::operationSelf(const Region& rhs, int dx, int dy, int op) { 20920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region lhs(*this); 21020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, *this, lhs, rhs, dx, dy); 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return *this; 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 21520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 216bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::merge(const Region& rhs, int dx, int dy) const { 21720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, dx, dy, op_or); 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 219bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::intersect(const Region& rhs, int dx, int dy) const { 22020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, dx, dy, op_and); 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 222bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::subtract(const Region& rhs, int dx, int dy) const { 22320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return operation(rhs, dx, dy, op_nand); 22420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 225bed9dd128dfbdc7d9dbca005078536dadc0b9359Mathias Agopianconst Region Region::operation(const Region& rhs, int dx, int dy, int op) const { 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region result; 22720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, result, *this, rhs, dx, dy); 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// This is our region rasterizer, which merges rects and spans together 23420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// to obtain an optimal region. 23520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianclass Region::rasterizer : public region_operator<Rect>::region_rasterizer 23620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 23720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect& bounds; 23820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Vector<Rect>& storage; 23920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* head; 24020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* tail; 24120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Vector<Rect> span; 24220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* cur; 24320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianpublic: 24420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rasterizer(Region& reg) 24520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian : bounds(reg.mBounds), storage(reg.mStorage), head(), tail(), cur() { 24620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.top = bounds.bottom = 0; 24720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.left = INT_MAX; 24820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.right = INT_MIN; 24920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian storage.clear(); 25020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 25120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 25220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian ~rasterizer() { 25320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (span.size()) { 25420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian flushSpan(); 25520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 25620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (storage.size()) { 25720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.top = storage.itemAt(0).top; 25820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.bottom = storage.top().bottom; 25920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (storage.size() == 1) { 26020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian storage.clear(); 26120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 26220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else { 26320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.left = 0; 26420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.right = 0; 26520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 26620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 26720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 26820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian virtual void operator()(const Rect& rect) { 26920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian //LOGD(">>> %3d, %3d, %3d, %3d", 27020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian // rect.left, rect.top, rect.right, rect.bottom); 27120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (span.size()) { 27220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (cur->top != rect.top) { 27320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian flushSpan(); 27420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else if (cur->right == rect.left) { 27520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian cur->right = rect.right; 27620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return; 27720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 27820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 27920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian span.add(rect); 28020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian cur = span.editArray() + (span.size() - 1); 28120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 28220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianprivate: 28320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian template<typename T> 28420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian static inline T min(T rhs, T lhs) { return rhs < lhs ? rhs : lhs; } 28520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian template<typename T> 28620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian static inline T max(T rhs, T lhs) { return rhs > lhs ? rhs : lhs; } 28720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian void flushSpan() { 28820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bool merge = false; 28920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (tail-head == ssize_t(span.size())) { 29020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const* p = cur; 29120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const* q = head; 29220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (p->top == q->bottom) { 29320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian merge = true; 29420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (q != tail) { 29520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if ((p->left != q->left) || (p->right != q->right)) { 29620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian merge = false; 29720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian break; 29820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 29920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian p++, q++; 30020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 30120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 30220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 30320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (merge) { 30420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const int bottom = span[0].bottom; 30520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* r = head; 30620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (r != tail) { 30720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian r->bottom = bottom; 30820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian r++; 30920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 31020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else { 31120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.left = min(span.itemAt(0).left, bounds.left); 31220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bounds.right = max(span.top().right, bounds.right); 31320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian storage.appendVector(span); 31420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian tail = storage.editArray() + storage.size(); 31520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head = tail - span.size(); 31620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 31720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian span.clear(); 31820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 31920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian}; 32020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 32120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianbool Region::validate(const Region& reg, const char* name) 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 32320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bool result = true; 32420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator cur = reg.begin(); 32520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const tail = reg.end(); 32620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator prev = cur++; 32720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect b(*prev); 32820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (cur != tail) { 32920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.left = b.left < cur->left ? b.left : cur->left; 33020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.top = b.top < cur->top ? b.top : cur->top; 33120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.right = b.right > cur->right ? b.right : cur->right; 33220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.bottom = b.bottom > cur->bottom ? b.bottom : cur->bottom; 33320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (cur->top == prev->top) { 33420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (cur->bottom != prev->bottom) { 33520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGE("%s: invalid span %p", name, cur); 33620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 33720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else if (cur->left < prev->right) { 33820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGE("%s: spans overlap horizontally prev=%p, cur=%p", 33920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian name, prev, cur); 34020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 34120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 34220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else if (cur->top < prev->bottom) { 34320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGE("%s: spans overlap vertically prev=%p, cur=%p", 34420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian name, prev, cur); 34520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 34620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 34720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian prev = cur; 34820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian cur++; 34920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 35020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (b != reg.getBounds()) { 35120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian result = false; 35220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGE("%s: invalid bounds [%d,%d,%d,%d] vs. [%d,%d,%d,%d]", name, 35320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian b.left, b.top, b.right, b.bottom, 35420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.getBounds().left, reg.getBounds().top, 35520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.getBounds().right, reg.getBounds().bottom); 35620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 35720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (result == false) { 35820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.dump(name); 35920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 36020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return result; 361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 36420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, 36520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& rhs, int dx, int dy) 366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 36720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t lhs_count; 36820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const * const lhs_rects = lhs.getArray(&lhs_count); 36920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 37020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t rhs_count; 37120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const * const rhs_rects = rhs.getArray(&rhs_count); 37220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 37320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region lhs_region(lhs_rects, lhs_count); 37420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region rhs_region(rhs_rects, rhs_count, dx, dy); 37520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect> operation(op, lhs_region, rhs_region); 37620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian { // scope for rasterizer (dtor has side effects) 37720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rasterizer r(dst); 37820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian operation(r); 37920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 38020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 38120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 38220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(lhs, "boolean_operation: lhs"); 38320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(rhs, "boolean_operation: rhs"); 38420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(dst, "boolean_operation: dst"); 38520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 38620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 38720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_WITH_CORECG 38820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion sk_lhs; 38920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion sk_rhs; 39020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion sk_dst; 39120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 39220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian for (size_t i=0 ; i<lhs_count ; i++) 39320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian sk_lhs.op( 39420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].left + dx, 39520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].top + dy, 39620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].right + dx, 39720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs_rects[i].bottom + dy, 39820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::kUnion_Op); 39920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 40020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian for (size_t i=0 ; i<rhs_count ; i++) 40120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian sk_rhs.op( 40220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].left + dx, 40320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].top + dy, 40420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].right + dx, 40520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs_rects[i].bottom + dy, 40620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::kUnion_Op); 40720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 40820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const char* name = "---"; 40920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::Op sk_op; 41020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian switch (op) { 41120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian case op_or: sk_op = SkRegion::kUnion_Op; name="OR"; break; 41220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian case op_and: sk_op = SkRegion::kIntersect_Op; name="AND"; break; 41320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian case op_nand: sk_op = SkRegion::kDifference_Op; name="NAND"; break; 41420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 41520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian sk_dst.op(sk_lhs, sk_rhs, sk_op); 41620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 41720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (sk_dst.isEmpty() && dst.isEmpty()) 41820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return; 41920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 42020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian bool same = true; 42120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator head = dst.begin(); 42220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Region::const_iterator const tail = dst.end(); 42320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::Iterator it(sk_dst); 42420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (!it.done()) { 42520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (head != tail) { 42620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if ( 42720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->left != it.rect().fLeft || 42820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->top != it.rect().fTop || 42920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->right != it.rect().fRight || 43020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->bottom != it.rect().fBottom 43120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian ) { 43220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian same = false; 43320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian break; 43420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 43520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } else { 43620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian same = false; 43720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian break; 43820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 43920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head++; 44020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.next(); 44120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 44220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 44320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (head != tail) { 44420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian same = false; 44520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 44620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 44720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if(!same) { 44820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGD("---\nregion boolean %s failed", name); 44920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian lhs.dump("lhs"); 45020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rhs.dump("rhs"); 45120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian dst.dump("dst"); 45220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGD("should be"); 45320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian SkRegion::Iterator it(sk_dst); 45420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (!it.done()) { 45520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGD(" [%3d, %3d, %3d, %3d]", 45620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fLeft, 45720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fTop, 45820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fRight, 45920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.rect().fBottom); 46020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian it.next(); 46120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 46220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 46320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 46720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, 46820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Rect& rhs, int dx, int dy) 46920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 47020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_WITH_CORECG || VALIDATE_REGIONS 47120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, dst, lhs, Region(rhs), dx, dy); 47220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#else 47320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t lhs_count; 47420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const * const lhs_rects = lhs.getArray(&lhs_count); 47520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 47620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region lhs_region(lhs_rects, lhs_count); 47720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect>::region rhs_region(&rhs, 1, dx, dy); 47820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian region_operator<Rect> operation(op, lhs_region, rhs_region); 47920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian { // scope for rasterizer (dtor has side effects) 48020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rasterizer r(dst); 48120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian operation(r); 48220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 48520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 48620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 48720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 48820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, const Region& rhs) 48920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 49020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, dst, lhs, rhs, 0, 0); 49120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 49220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 49320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::boolean_operation(int op, Region& dst, 49420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const Region& lhs, const Rect& rhs) 49520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 49620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian boolean_operation(op, dst, lhs, rhs, 0, 0); 49720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 49820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 49920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::translate(Region& reg, int dx, int dy) 50020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 50120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (!reg.isEmpty()) { 50220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 50320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(reg, "translate (before)"); 50420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 50520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian reg.mBounds.translate(dx, dy); 50620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian size_t count = reg.mStorage.size(); 50720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect* rects = reg.mStorage.editArray(); 50820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (count) { 50920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rects->translate(dx, dy); 51020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rects++; 51120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian count--; 51220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 51320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 51420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(reg, "translate (after)"); 51520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 51620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 51720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 51820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 51920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopianvoid Region::translate(Region& dst, const Region& reg, int dx, int dy) 52020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian{ 52120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian dst = reg; 52220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian translate(dst, dx, dy); 52320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 52420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 52520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Region::write(Parcel& parcel) const 528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 52920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 53020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(*this, "write(Parcel)"); 53120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 53220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian status_t err; 53320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t count = mStorage.size(); 53420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t sizeNeeded = sizeof(int32_t) + (1+count)*sizeof(Rect); 53520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian void* buffer = parcel.writeInplace(sizeNeeded); 53620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (!buffer) return NO_MEMORY; 53720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian ssize_t written = Region::write(buffer, sizeNeeded); 53820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (written < 0) return status_t(written); 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Region::read(const Parcel& parcel) 543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 54420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian void const* buffer = parcel.readInplace(sizeof(int32_t)); 54520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (!buffer) return NO_MEMORY; 54620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t count = *static_cast<int32_t const *>(buffer); 54720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian void const* dummy = parcel.readInplace((1+count)*sizeof(Rect)); 54820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (!dummy) return NO_MEMORY; 54920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t sizeNeeded = sizeof(int32_t) + (1+count)*sizeof(Rect); 55020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const ssize_t read = Region::read(buffer); 55120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (read < 0) return status_t(read); 55220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 55320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(*this, "read(Parcel)"); 55420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t Region::write(void* buffer, size_t size) const 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 56020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 56120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(*this, "write(buffer)"); 56220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 56320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t count = mStorage.size(); 56420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t sizeNeeded = sizeof(int32_t) + (1+count)*sizeof(Rect); 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (sizeNeeded > size) return NO_MEMORY; 56620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian int32_t* const p = static_cast<int32_t*>(buffer); 56720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian *p = count; 56820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian memcpy(p+1, &mBounds, sizeof(Rect)); 56920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (count) { 57020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian memcpy(p+5, mStorage.array(), count*sizeof(Rect)); 57120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 57220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return ssize_t(sizeNeeded); 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t Region::read(const void* buffer) 576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 57720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian int32_t const* const p = static_cast<int32_t const*>(buffer); 57820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t count = *p; 57920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian memcpy(&mBounds, p+1, sizeof(Rect)); 58020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.clear(); 58120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (count) { 58220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian mStorage.insertAt(0, count); 58320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian memcpy(mStorage.editArray(), p+5, count*sizeof(Rect)); 58420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian } 58520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#if VALIDATE_REGIONS 58620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian validate(*this, "read(buffer)"); 58720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian#endif 58820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return ssize_t(sizeof(int32_t) + (1+count)*sizeof(Rect)); 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t Region::writeEmpty(void* buffer, size_t size) 592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 59320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const size_t sizeNeeded = sizeof(int32_t) + sizeof(Rect); 59420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (sizeNeeded > size) return NO_MEMORY; 59520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian int32_t* const p = static_cast<int32_t*>(buffer); 59620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian memset(p, 0, sizeNeeded); 59720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return ssize_t(sizeNeeded); 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool Region::isEmpty(void* buffer) 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 60220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian int32_t const* const p = static_cast<int32_t const*>(buffer); 60320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian Rect const* const b = reinterpret_cast<Rect const *>(p+1); 60420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return b->isEmpty(); 60520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 60620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 60720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 60820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 60920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion::const_iterator Region::begin() const { 61020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return isRect() ? &mBounds : mStorage.array(); 61120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 61220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 61320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRegion::const_iterator Region::end() const { 61420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return isRect() ? ((&mBounds) + 1) : (mStorage.array() + mStorage.size()); 61520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian} 61620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 61720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias AgopianRect const* Region::getArray(size_t* count) const { 61820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const b(begin()); 61920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const e(end()); 62020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (count) *count = e-b; 62120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian return b; 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopiansize_t Region::getRects(Vector<Rect>& rectList) const 625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 62620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rectList = mStorage; 62720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian if (rectList.isEmpty()) { 62820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rectList.clear(); 62920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian rectList.add(mBounds); 630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return rectList.size(); 632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian// ---------------------------------------------------------------------------- 63520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::dump(String8& out, const char* what, uint32_t flags) const 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (void)flags; 63920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator head = begin(); 64020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const tail = end(); 64120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t SIZE = 256; 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project char buffer[SIZE]; 64420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian 64520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian snprintf(buffer, SIZE, " Region %s (this=%p, count=%d)\n", 64620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian what, this, tail-head); 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.append(buffer); 64820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (head != tail) { 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project snprintf(buffer, SIZE, " [%3d, %3d, %3d, %3d]\n", 65020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->left, head->top, head->right, head->bottom); 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.append(buffer); 65220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head++; 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::dump(const char* what, uint32_t flags) const 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (void)flags; 65920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator head = begin(); 66020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian const_iterator const tail = end(); 66120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian LOGD(" Region %s (this=%p, count=%d)\n", what, this, tail-head); 66220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian while (head != tail) { 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGD(" [%3d, %3d, %3d, %3d]\n", 66420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head->left, head->top, head->right, head->bottom); 66520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian head++; 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 672