1487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk/*
2487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * Copyright (C) 2015 The Android Open Source Project
3487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk *
4487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * Licensed under the Apache License, Version 2.0 (the "License");
5487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * you may not use this file except in compliance with the License.
6487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * You may obtain a copy of the License at
7487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk *
8487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk *      http://www.apache.org/licenses/LICENSE-2.0
9487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk *
10487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * Unless required by applicable law or agreed to in writing, software
11487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * distributed under the License is distributed on an "AS IS" BASIS,
12487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * See the License for the specific language governing permissions and
14487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk * limitations under the License.
15487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk */
16487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#ifndef CLIPAREA_H
17487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#define CLIPAREA_H
18487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
19487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include "Matrix.h"
20487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include "Rect.h"
21487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#include "utils/Pair.h"
22487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
23e4db79de127cfe961195f52907af8451026eaa20Chris Craik#include <SkRegion.h>
24e4db79de127cfe961195f52907af8451026eaa20Chris Craik
25487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuknamespace android {
26487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuknamespace uirenderer {
27487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
28e4db79de127cfe961195f52907af8451026eaa20Chris Craikclass LinearAllocator;
29e4db79de127cfe961195f52907af8451026eaa20Chris Craik
30487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob TsukRect transformAndCalculateBounds(const Rect& r, const Matrix4& transform);
31487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
32487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsukclass TransformedRectangle {
33487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsukpublic:
34487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    TransformedRectangle();
35487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    TransformedRectangle(const Rect& bounds, const Matrix4& transform);
36487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
37487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    bool canSimplyIntersectWith(const TransformedRectangle& other) const;
38ac02eb9035a13a3d09c2def9ed63d04225eb2509Chris Craik    void intersectWith(const TransformedRectangle& other);
39487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
40487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    bool isEmpty() const;
41487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
42487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    const Rect& getBounds() const {
43487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        return mBounds;
44487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
45487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
46487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    Rect transformedBounds() const {
47487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        Rect transformedBounds(transformAndCalculateBounds(mBounds, mTransform));
48487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        return transformedBounds;
49487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
50487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
51487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    const Matrix4& getTransform() const {
52487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        return mTransform;
53487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
54487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
55e4db79de127cfe961195f52907af8451026eaa20Chris Craik    void transform(const Matrix4& transform) {
56e4db79de127cfe961195f52907af8451026eaa20Chris Craik        Matrix4 t;
57e4db79de127cfe961195f52907af8451026eaa20Chris Craik        t.loadMultiply(transform, mTransform);
58e4db79de127cfe961195f52907af8451026eaa20Chris Craik        mTransform = t;
59e4db79de127cfe961195f52907af8451026eaa20Chris Craik    }
60e4db79de127cfe961195f52907af8451026eaa20Chris Craik
61487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsukprivate:
62487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    Rect mBounds;
63487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    Matrix4 mTransform;
64487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk};
65487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
66487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsukclass RectangleList {
67487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsukpublic:
68487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    RectangleList();
69487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
70487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    bool isEmpty() const;
71487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    int getTransformedRectanglesCount() const;
72487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    const TransformedRectangle& getTransformedRectangle(int i) const;
73487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
74487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void setEmpty();
75487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void set(const Rect& bounds, const Matrix4& transform);
76487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    bool intersectWith(const Rect& bounds, const Matrix4& transform);
77e4db79de127cfe961195f52907af8451026eaa20Chris Craik    void transform(const Matrix4& transform);
78487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
79487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    SkRegion convertToRegion(const SkRegion& clip) const;
80487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    Rect calculateBounds() const;
81487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
82487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    enum {
83487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        kMaxTransformedRectangles = 5
84487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    };
85487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
86e4db79de127cfe961195f52907af8451026eaa20Chris Craikprivate:
87487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    int mTransformedRectanglesCount;
88487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    TransformedRectangle mTransformedRectangles[kMaxTransformedRectangles];
89487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk};
90487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
91e4db79de127cfe961195f52907af8451026eaa20Chris Craikenum class ClipMode {
92e4db79de127cfe961195f52907af8451026eaa20Chris Craik    Rectangle,
93e4db79de127cfe961195f52907af8451026eaa20Chris Craik    RectangleList,
944d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik
95e4db79de127cfe961195f52907af8451026eaa20Chris Craik    // region and path - intersected. if either is empty, don't use
96e4db79de127cfe961195f52907af8451026eaa20Chris Craik    Region
97e4db79de127cfe961195f52907af8451026eaa20Chris Craik};
98e4db79de127cfe961195f52907af8451026eaa20Chris Craik
99e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipBase {
100a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh    explicit ClipBase(ClipMode mode)
101e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : mode(mode) {}
102a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh    explicit ClipBase(const Rect& rect)
103e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : mode(ClipMode::Rectangle)
104e4db79de127cfe961195f52907af8451026eaa20Chris Craik            , rect(rect) {}
105e4db79de127cfe961195f52907af8451026eaa20Chris Craik    const ClipMode mode;
10604d46eb69fb4f4c4c332c36c6ae845da3b2ae848Chris Craik    bool intersectWithRoot = false;
107e4db79de127cfe961195f52907af8451026eaa20Chris Craik    // Bounds of the clipping area, used to define the scissor, and define which
108e4db79de127cfe961195f52907af8451026eaa20Chris Craik    // portion of the stencil is updated/used
109e4db79de127cfe961195f52907af8451026eaa20Chris Craik    Rect rect;
11002806288d1c56475413888a934c796e6e4eb11c5Chris Craik
11102806288d1c56475413888a934c796e6e4eb11c5Chris Craik    void dump() const;
112e4db79de127cfe961195f52907af8451026eaa20Chris Craik};
113e4db79de127cfe961195f52907af8451026eaa20Chris Craik
114e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipRect : ClipBase {
115a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh    explicit ClipRect(const Rect& rect)
116e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : ClipBase(rect) {}
117e4db79de127cfe961195f52907af8451026eaa20Chris Craik};
118e4db79de127cfe961195f52907af8451026eaa20Chris Craik
119e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipRectList : ClipBase {
120a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh    explicit ClipRectList(const RectangleList& rectList)
121e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : ClipBase(ClipMode::RectangleList)
122e4db79de127cfe961195f52907af8451026eaa20Chris Craik            , rectList(rectList) {}
123e4db79de127cfe961195f52907af8451026eaa20Chris Craik    RectangleList rectList;
124e4db79de127cfe961195f52907af8451026eaa20Chris Craik};
125e4db79de127cfe961195f52907af8451026eaa20Chris Craik
126e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipRegion : ClipBase {
127a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh    explicit ClipRegion(const SkRegion& region)
128e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : ClipBase(ClipMode::Region)
129e4db79de127cfe961195f52907af8451026eaa20Chris Craik            , region(region) {}
130e4db79de127cfe961195f52907af8451026eaa20Chris Craik    ClipRegion()
131e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : ClipBase(ClipMode::Region) {}
132e4db79de127cfe961195f52907af8451026eaa20Chris Craik    SkRegion region;
133e4db79de127cfe961195f52907af8451026eaa20Chris Craik};
134e4db79de127cfe961195f52907af8451026eaa20Chris Craik
135e4db79de127cfe961195f52907af8451026eaa20Chris Craikclass ClipArea {
136487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsukpublic:
137487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    ClipArea();
138487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
139487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void setViewportDimensions(int width, int height);
140487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
141487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    bool isEmpty() const {
142487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        return mClipRect.isEmpty();
143487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
144487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
145487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void setEmpty();
146487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void setClip(float left, float top, float right, float bottom);
1474d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik    void clipRectWithTransform(const Rect& r, const mat4* transform,
1484d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik            SkRegion::Op op);
1494d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik    void clipPathWithTransform(const SkPath& path, const mat4* transform,
150487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk            SkRegion::Op op);
151487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
152487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    const Rect& getClipRect() const {
153487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        return mClipRect;
154487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
155487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
156487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    const SkRegion& getClipRegion() const {
157487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        return mClipRegion;
158487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
159487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
160487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    const RectangleList& getRectangleList() const {
161487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        return mRectangleList;
162487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
163487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
164487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    bool isRegion() const {
165e4db79de127cfe961195f52907af8451026eaa20Chris Craik        return ClipMode::Region == mMode;
166487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
167487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
168487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    bool isSimple() const {
169e4db79de127cfe961195f52907af8451026eaa20Chris Craik        return mMode == ClipMode::Rectangle;
170487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
171487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
172487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    bool isRectangleList() const {
173e4db79de127cfe961195f52907af8451026eaa20Chris Craik        return mMode == ClipMode::RectangleList;
174487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
175487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
17604d46eb69fb4f4c4c332c36c6ae845da3b2ae848Chris Craik    WARN_UNUSED_RESULT const ClipBase* serializeClip(LinearAllocator& allocator);
17704d46eb69fb4f4c4c332c36c6ae845da3b2ae848Chris Craik    WARN_UNUSED_RESULT const ClipBase* serializeIntersectedClip(LinearAllocator& allocator,
178e4db79de127cfe961195f52907af8451026eaa20Chris Craik            const ClipBase* recordedClip, const Matrix4& recordedClipTransform);
179e4db79de127cfe961195f52907af8451026eaa20Chris Craik    void applyClip(const ClipBase* recordedClip, const Matrix4& recordedClipTransform);
180e4db79de127cfe961195f52907af8451026eaa20Chris Craik
18182457c51176855b9be0b441010870093a6feb414Chris Craik    static void applyTransformToRegion(const Matrix4& transform, SkRegion* region);
18282457c51176855b9be0b441010870093a6feb414Chris Craik
183487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsukprivate:
184487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void enterRectangleMode();
1854d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik    void rectangleModeClipRectWithTransform(const Rect& r, const mat4* transform, SkRegion::Op op);
186487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
187487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void enterRectangleListMode();
1884d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik    void rectangleListModeClipRectWithTransform(const Rect& r,
189487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk            const mat4* transform, SkRegion::Op op);
190487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
191487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void enterRegionModeFromRectangleMode();
192487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void enterRegionModeFromRectangleListMode();
193487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void enterRegionMode();
1944d3e704b04c6abd7995df640d12662b0271f6c7bChris Craik    void regionModeClipRectWithTransform(const Rect& r, const mat4* transform,
195487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk            SkRegion::Op op);
196487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
197b29b16e5423fe7deab8ebf3da512c6d2192f19b5Derek Sollenberger    void clipRegion(const SkRegion& region, SkRegion::Op op);
198487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void ensureClipRegion();
199e30b53cec5eb6eaa5d24231feb3207b917c1baabTom Hudson    void onClipRegionUpdated();
200487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
201e4db79de127cfe961195f52907af8451026eaa20Chris Craik    // Called by every state modifying public method.
202e4db79de127cfe961195f52907af8451026eaa20Chris Craik    void onClipUpdated() {
203e4db79de127cfe961195f52907af8451026eaa20Chris Craik        mPostViewportClipObserved = true;
204e4db79de127cfe961195f52907af8451026eaa20Chris Craik        mLastSerialization = nullptr;
205e4db79de127cfe961195f52907af8451026eaa20Chris Craik        mLastResolutionResult = nullptr;
206e4db79de127cfe961195f52907af8451026eaa20Chris Craik    }
207e4db79de127cfe961195f52907af8451026eaa20Chris Craik
208487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    SkRegion createViewportRegion() {
209487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        return SkRegion(mViewportBounds.toSkIRect());
210487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
211487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
212487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    void regionFromPath(const SkPath& path, SkRegion& pathAsRegion) {
2138ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris Craik        // TODO: this should not mask every path to the viewport - this makes it impossible to use
2148ce8f3f4d68a7750bc02b5254ebbd8658281e675Chris Craik        // paths to clip to larger areas (which is valid e.g. with SkRegion::kReplace_Op)
215487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk        pathAsRegion.setPath(path, createViewportRegion());
216487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    }
217487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
218e4db79de127cfe961195f52907af8451026eaa20Chris Craik    ClipMode mMode;
219e4db79de127cfe961195f52907af8451026eaa20Chris Craik    bool mPostViewportClipObserved = false;
22004d46eb69fb4f4c4c332c36c6ae845da3b2ae848Chris Craik    bool mReplaceOpObserved = false;
221e4db79de127cfe961195f52907af8451026eaa20Chris Craik
222e4db79de127cfe961195f52907af8451026eaa20Chris Craik    /**
223e4db79de127cfe961195f52907af8451026eaa20Chris Craik     * If mLastSerialization is non-null, it represents an already serialized copy
224e4db79de127cfe961195f52907af8451026eaa20Chris Craik     * of the current clip state. If null, it has not been computed.
225e4db79de127cfe961195f52907af8451026eaa20Chris Craik     */
226e4db79de127cfe961195f52907af8451026eaa20Chris Craik    const ClipBase* mLastSerialization = nullptr;
227e4db79de127cfe961195f52907af8451026eaa20Chris Craik
228e4db79de127cfe961195f52907af8451026eaa20Chris Craik    /**
229e4db79de127cfe961195f52907af8451026eaa20Chris Craik     * This pair of pointers is a single entry cache of most recently seen
230e4db79de127cfe961195f52907af8451026eaa20Chris Craik     */
231e4db79de127cfe961195f52907af8451026eaa20Chris Craik    const ClipBase* mLastResolutionResult = nullptr;
232e4db79de127cfe961195f52907af8451026eaa20Chris Craik    const ClipBase* mLastResolutionClip = nullptr;
233e4db79de127cfe961195f52907af8451026eaa20Chris Craik    Matrix4 mLastResolutionTransform;
234e4db79de127cfe961195f52907af8451026eaa20Chris Craik
235487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    Rect mViewportBounds;
236487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    Rect mClipRect;
237487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    SkRegion mClipRegion;
238487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk    RectangleList mRectangleList;
239487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk};
240487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
241487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk} /* namespace uirenderer */
242487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk} /* namespace android */
243487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk
244487a92caef2eb90a62e8f8d7a6fe6315f1c1d8d8Rob Tsuk#endif /* CLIPAREA_H_ */
245