Region.cpp revision 0926f50664c739eaee60341f8e8c694dc9a4f3eb
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
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Atomic.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Debug.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/String8.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region()
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const Region& rhs)
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mRegion(rhs.mRegion)
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const SkRegion& rhs)
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mRegion(rhs)
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::~Region()
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const Rect& rhs)
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    set(rhs);
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const Parcel& parcel)
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    read(parcel);
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::Region(const void* buffer)
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    read(buffer);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::operator = (const Region& rhs)
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion = rhs.mRegion;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst SkRegion& Region::toSkRegion() const
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mRegion;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect Region::bounds() const
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const SkIRect& b(mRegion.getBounds());
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return Rect(b.fLeft, b.fTop, b.fRight, b.fBottom);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::clear()
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.setEmpty();
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::set(const Rect& r)
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkIRect ir;
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ir.set(r.left, r.top, r.right, r.bottom);
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.setRect(ir);
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
910926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianvoid Region::set(uint32_t w, uint32_t h)
920926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian{
930926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    SkIRect ir;
940926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    ir.set(0, 0, w, h);
950926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian    mRegion.setRect(ir);
960926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian}
970926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::orSelf(const Rect& r)
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkIRect ir;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ir.set(r.left, r.top, r.right, r.bottom);
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.op(ir, SkRegion::kUnion_Op);
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::andSelf(const Rect& r)
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkIRect ir;
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ir.set(r.left, r.top, r.right, r.bottom);
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.op(ir, SkRegion::kIntersect_Op);
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::orSelf(const Region& rhs) {
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.op(rhs.mRegion, SkRegion::kUnion_Op);
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::andSelf(const Region& rhs) {
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.op(rhs.mRegion, SkRegion::kIntersect_Op);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::subtractSelf(const Region& rhs) {
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.op(rhs.mRegion, SkRegion::kDifference_Op);
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::translateSelf(int x, int y) {
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (x|y) mRegion.translate(x, y);
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Region::merge(const Region& rhs) const {
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region result;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    result.mRegion.op(mRegion, rhs.mRegion, SkRegion::kUnion_Op);
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Region::intersect(const Region& rhs) const {
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region result;
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    result.mRegion.op(mRegion, rhs.mRegion, SkRegion::kIntersect_Op);
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Region::subtract(const Region& rhs) const {
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region result;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    result.mRegion.op(mRegion, rhs.mRegion, SkRegion::kDifference_Op);
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Region::translate(int x, int y) const {
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region result;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.translate(x, y, &result.mRegion);
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::orSelf(const Region& rhs, int dx, int dy) {
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRegion r(rhs.mRegion);
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.translate(dx, dy);
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.op(r, SkRegion::kUnion_Op);
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::andSelf(const Region& rhs, int dx, int dy) {
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRegion r(rhs.mRegion);
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.translate(dx, dy);
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.op(r, SkRegion::kIntersect_Op);
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion& Region::subtractSelf(const Region& rhs, int dx, int dy) {
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRegion r(rhs.mRegion);
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.translate(dx, dy);
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.op(r, SkRegion::kDifference_Op);
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *this;
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Region::merge(const Region& rhs, int dx, int dy) const {
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region result;
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRegion r(rhs.mRegion);
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.translate(dx, dy);
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    result.mRegion.op(mRegion, r, SkRegion::kUnion_Op);
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Region::intersect(const Region& rhs, int dx, int dy) const {
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region result;
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRegion r(rhs.mRegion);
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.translate(dx, dy);
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    result.mRegion.op(mRegion, r, SkRegion::kIntersect_Op);
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion Region::subtract(const Region& rhs, int dx, int dy) const {
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region result;
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    SkRegion r(rhs.mRegion);
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    r.translate(dx, dy);
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    result.mRegion.op(mRegion, r, SkRegion::kDifference_Op);
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return result;
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRegion::iterator::iterator(const Region& r)
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mIt(r.mRegion)
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint Region::iterator::iterate(Rect* rect)
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mIt.done())
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return 0;
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const SkIRect& r(mIt.rect());
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    rect->left  = r.fLeft;
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    rect->top   = r.fTop;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    rect->right = r.fRight;
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    rect->bottom= r.fBottom;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mIt.next();
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 1;
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// we write a 4byte size ahead of the actual region, so we know how much we'll need for reading
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Region::write(Parcel& parcel) const
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t size = mRegion.flatten(NULL);
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    parcel.writeInt32(size);
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.flatten(parcel.writeInplace(size));
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t Region::read(const Parcel& parcel)
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t size = parcel.readInt32();
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mRegion.unflatten(parcel.readInplace(size));
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t Region::write(void* buffer, size_t size) const
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t sizeNeeded = mRegion.flatten(NULL);
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (sizeNeeded > size) return NO_MEMORY;
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mRegion.flatten(buffer);
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t Region::read(const void* buffer)
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mRegion.unflatten(buffer);
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t Region::writeEmpty(void* buffer, size_t size)
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (size < 4) return NO_MEMORY;
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this needs to stay in sync with SkRegion
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    *static_cast<int32_t*>(buffer) = -1;
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 4;
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool Region::isEmpty(void* buffer)
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this needs to stay in sync with SkRegion
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return *static_cast<int32_t*>(buffer) == -1;
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsize_t Region::rects(Vector<Rect>& rectList) const
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    rectList.clear();
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!isEmpty()) {
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        SkRegion::Iterator iterator(mRegion);
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while( !iterator.done() ) {
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const SkIRect& ir(iterator.rect());
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            rectList.push(Rect(ir.fLeft, ir.fTop, ir.fRight, ir.fBottom));
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            iterator.next();
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return rectList.size();
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::dump(String8& out, const char* what, uint32_t flags) const
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    (void)flags;
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Vector<Rect> r;
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    rects(r);
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    size_t SIZE = 256;
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    char buffer[SIZE];
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    snprintf(buffer, SIZE, "  Region %s (this=%p, count=%d)\n", what, this, r.size());
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    out.append(buffer);
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (size_t i=0 ; i<r.size() ; i++) {
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        snprintf(buffer, SIZE, "    [%3d, %3d, %3d, %3d]\n",
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            r[i].left, r[i].top,r[i].right,r[i].bottom);
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.append(buffer);
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid Region::dump(const char* what, uint32_t flags) const
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    (void)flags;
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Vector<Rect> r;
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    rects(r);
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGD("  Region %s (this=%p, count=%d)\n", what, this, r.size());
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    for (size_t i=0 ; i<r.size() ; i++) {
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        LOGD("    [%3d, %3d, %3d, %3d]\n",
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            r[i].left, r[i].top,r[i].right,r[i].bottom);
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
321