RecordedOp.h revision 386aa031793bb037ec43b6cdbd8908c343cc86cb
1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/*
2b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Copyright (C) 2015 The Android Open Source Project
3b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
4b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Licensed under the Apache License, Version 2.0 (the "License");
5b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * you may not use this file except in compliance with the License.
6b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * You may obtain a copy of the License at
7b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
8b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *      http://www.apache.org/licenses/LICENSE-2.0
9b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
10b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Unless required by applicable law or agreed to in writing, software
11b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * distributed under the License is distributed on an "AS IS" BASIS,
12b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * See the License for the specific language governing permissions and
14b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * limitations under the License.
15b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */
16b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
17b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#ifndef ANDROID_HWUI_RECORDED_OP_H
18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define ANDROID_HWUI_RECORDED_OP_H
19b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
20a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik#include "font/FontUtil.h"
21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h"
2298787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Rect.h"
230b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#include "RenderNode.h"
2498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "utils/LinearAllocator.h"
2598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Vector.h"
26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "SkXfermode.h"
28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap;
30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint;
31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android {
33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer {
34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
355854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer;
36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode;
37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex;
38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/**
4015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * On of the provided macros is executed for each op type in order. The first will be used for ops
4115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * that cannot merge, and the second for those that can.
42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
43b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * This serves as the authoritative list of ops, used for generating ID enum, and ID based LUTs.
44b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */
4515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define MAP_OPS_BASED_ON_MERGEABILITY(U_OP_FN, M_OP_FN) \
46386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(ArcOp) \
4715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        M_OP_FN(BitmapOp) \
4815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(LinesOp) \
49386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(OvalOp) \
50386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(PathOp) \
51386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(PointsOp) \
5215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(RectOp) \
5315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(RenderNodeOp) \
54386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(RoundRectOp) \
5515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(ShadowOp) \
5615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(SimpleRectsOp) \
5715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        M_OP_FN(TextOp) \
5815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(BeginLayerOp) \
5915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(EndLayerOp) \
6015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(LayerOp)
6115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
6215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/**
6315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * The provided macro is executed for each op type in order. This is used in cases where
6415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * merge-ability of ops doesn't matter.
6515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */
66b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define MAP_OPS(OP_FN) \
6715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        MAP_OPS_BASED_ON_MERGEABILITY(OP_FN, OP_FN)
6815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
6915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type)
7015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
7115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define MAP_MERGED_OPS(OP_FN) \
7215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        MAP_OPS_BASED_ON_MERGEABILITY(NULL_OP_FN, OP_FN)
73b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
74b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum
75b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type,
76b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId {
77b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    enum {
78b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        MAP_OPS(IDENTITY_FN)
79b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        Count,
80b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    };
81b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}
82386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstatic_assert(RecordedOpId::ArcOp == 0,
83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        "First index must be zero for LUTs to work");
84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect, const SkPaint* paint
86b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect
87b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, paint)
88b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, nullptr)
89b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp {
91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* ID from RecordedOpId - generally used for jumping into function tables */
92b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const int opId;
93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
94386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */
95b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Rect unmappedBounds;
96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* transform in recording space (vs DisplayList origin) */
98b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Matrix4 localMatrix;
99b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
100b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* clip in recording space */
101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Rect localClipRect;
102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* optional paint, stored in base object to simplify merging logic */
104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkPaint* paint;
105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected:
106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RecordedOp(unsigned int opId, BASE_PARAMS)
107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : opId(opId)
108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , unmappedBounds(unmappedBounds)
109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , localMatrix(localMatrix)
110b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , localClipRect(localClipRect)
111b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , paint(paint) {}
112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
113b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
114b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp {
115b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode)
116b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER_PAINTLESS(RenderNodeOp)
117b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , renderNode(renderNode) {}
1188d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    RenderNode * renderNode; // not const, since drawing modifies it
1198d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik
1208d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    /**
1218d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * Holds the transformation between the projection surface ViewGroup and this RenderNode
1228d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * drawing instance. Represents any translations / transformations done within the drawing of
1238d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this
1248d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * DisplayList draw instance.
1258d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     *
1268d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * Note: doesn't include transformation within the RenderNode, or its properties.
1278d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     */
1288d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    Matrix4 transformFromCompositingAncestor;
129161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik    bool skipInOrderDraw = false;
130b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
131b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
132a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
133a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops
134a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
135a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
136386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp {
137386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter)
138386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(ArcOp)
139386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , startAngle(startAngle)
140386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , sweepAngle(sweepAngle)
141386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , useCenter(useCenter) {}
142386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float startAngle;
143386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float sweepAngle;
144386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const bool useCenter;
145386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
146386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp {
148b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    BitmapOp(BASE_PARAMS, const SkBitmap* bitmap)
149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(BitmapOp)
150b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , bitmap(bitmap) {}
151b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkBitmap* bitmap;
152b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    // TODO: asset atlas/texture id lookup?
153b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
154b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
155a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp {
156a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    LinesOp(BASE_PARAMS, const float* points, const int floatCount)
157a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            : SUPER(LinesOp)
158a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , points(points)
159a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , floatCount(floatCount) {}
160a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float* points;
161a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const int floatCount;
162a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik};
163a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
164386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp {
165386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    OvalOp(BASE_PARAMS)
166386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(OvalOp) {}
167386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
168386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
169386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp {
170386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    PathOp(BASE_PARAMS, const SkPath* path)
171386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(PathOp)
172386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , path(path) {}
173386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const SkPath* path;
174386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
175386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
176386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp {
177386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    PointsOp(BASE_PARAMS, const float* points, const int floatCount)
178386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(PointsOp)
179386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , points(points)
180386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , floatCount(floatCount) {}
181386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float* points;
182386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const int floatCount;
183386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
184386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
185b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp {
186b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RectOp(BASE_PARAMS)
187b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(RectOp) {}
188b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
189b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
190386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp {
191386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    RoundRectOp(BASE_PARAMS, float rx, float ry)
192386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(RoundRectOp)
193386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , rx(rx)
194386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , ry(ry) {}
195386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float rx;
196386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float ry;
197386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
198386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
199d3daa3198e2212c985c634821682d5819346b653Chris Craik/**
200d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow.
201d3daa3198e2212c985c634821682d5819346b653Chris Craik *
202d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time,
203d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed.
204d3daa3198e2212c985c634821682d5819346b653Chris Craik *
20598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds.
206d3daa3198e2212c985c634821682d5819346b653Chris Craik */
207d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp {
20898787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    ShadowOp(const RenderNodeOp& casterOp, float casterAlpha, const SkPath* casterPath,
20998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik            const Rect& clipRect, const Vector3& lightCenter)
210d3daa3198e2212c985c634821682d5819346b653Chris Craik            : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), clipRect, nullptr)
211d3daa3198e2212c985c634821682d5819346b653Chris Craik            , shadowMatrixXY(casterOp.localMatrix)
212d3daa3198e2212c985c634821682d5819346b653Chris Craik            , shadowMatrixZ(casterOp.localMatrix)
213d3daa3198e2212c985c634821682d5819346b653Chris Craik            , casterAlpha(casterAlpha)
21498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik            , casterPath(casterPath)
21598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik            , lightCenter(lightCenter) {
216d3daa3198e2212c985c634821682d5819346b653Chris Craik        const RenderNode& node = *casterOp.renderNode;
217d3daa3198e2212c985c634821682d5819346b653Chris Craik        node.applyViewPropertyTransforms(shadowMatrixXY, false);
218d3daa3198e2212c985c634821682d5819346b653Chris Craik        node.applyViewPropertyTransforms(shadowMatrixZ, true);
219d3daa3198e2212c985c634821682d5819346b653Chris Craik    };
220d3daa3198e2212c985c634821682d5819346b653Chris Craik    Matrix4 shadowMatrixXY;
221d3daa3198e2212c985c634821682d5819346b653Chris Craik    Matrix4 shadowMatrixZ;
222d3daa3198e2212c985c634821682d5819346b653Chris Craik    const float casterAlpha;
223d3daa3198e2212c985c634821682d5819346b653Chris Craik    const SkPath* casterPath;
22498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    const Vector3 lightCenter;
225d3daa3198e2212c985c634821682d5819346b653Chris Craik};
226d3daa3198e2212c985c634821682d5819346b653Chris Craik
227b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?)
228b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount)
229b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(SimpleRectsOp)
230b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertices(vertices)
231b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertexCount(vertexCount) {}
232b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    Vertex* vertices;
233b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const size_t vertexCount;
234b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
235b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
236a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp {
237a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount,
238a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            float x, float y)
239a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            : SUPER(TextOp)
240a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , glyphs(glyphs)
241a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , positions(positions)
242a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , glyphCount(glyphCount)
243a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , x(x)
244a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , y(y) {}
245a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const glyph_t* glyphs;
246a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float* positions;
247a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const int glyphCount;
248a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float x;
249a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float y;
250a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik};
251a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
252a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
253a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers
254a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
255a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
256a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
2576fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
2586fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer,
2596fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it.
2606fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
2616fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp {
2626fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    BeginLayerOp(BASE_PARAMS)
2636fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik            : SUPER(BeginLayerOp) {}
2646fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
2656fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
2666fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
2676fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that
2686fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO.
2696fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik *
2706fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished.
2716fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
2726fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp {
2736fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    EndLayerOp()
2746fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik            : RecordedOp(RecordedOpId::EndLayerOp, Rect(0, 0), Matrix4::identity(), Rect(0, 0), nullptr) {}
2756fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
2766fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
2770b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/**
2780b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer.
2790b7e8245db728d127ada698be63d78b33fc6e4daChris Craik *
2800b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated,
2810b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother.
2820b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */
2836fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp {
2840b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed.
2855854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle)
2860b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            : SUPER_PAINTLESS(LayerOp)
2870b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , layerHandle(layerHandle)
2880b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , alpha(paint->getAlpha() / 255.0f)
2890b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , mode(PaintUtils::getXfermodeDirect(paint))
2900b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , colorFilter(paint->getColorFilter())
2910b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , destroy(true) {}
2920b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
2930b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    LayerOp(RenderNode& node)
2940b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), Rect(node.getWidth(), node.getHeight()), nullptr)
2950b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , layerHandle(node.getLayerHandle())
2960b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , alpha(node.properties().layerProperties().alpha() / 255.0f)
2970b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , mode(node.properties().layerProperties().xferMode())
2980b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , colorFilter(node.properties().layerProperties().colorFilter())
2990b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , destroy(false) {}
3000b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
301818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // Records a handle to the Layer object, since the Layer itself won't be
302818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // constructed until after this operation is constructed.
3035854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    OffscreenBuffer** layerHandle;
3040b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const float alpha;
3050b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const SkXfermode::Mode mode;
3060b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
3070b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // pointer to object owned by either LayerProperties, or a recorded Paint object in a
3080b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used.
3090b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    SkColorFilter* colorFilter;
3100b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
3110b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // whether to destroy the layer, once rendered
3120b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const bool destroy;
3136fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
3146fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
315b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer
316b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android
317b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
318b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H
319