RecordedOp.h revision e4db79de127cfe961195f52907af8451026eaa20
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
27f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <androidfw/ResourceTypes.h>
28f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <SkXfermode.h>
29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap;
31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint;
32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android {
34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer {
35b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
36e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipBase;
375854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer;
38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode;
39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex;
40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
41b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/**
4215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * On of the provided macros is executed for each op type in order. The first will be used for ops
4315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * that cannot merge, and the second for those that can.
44b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
45b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * This serves as the authoritative list of ops, used for generating ID enum, and ID based LUTs.
46b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */
4715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define MAP_OPS_BASED_ON_MERGEABILITY(U_OP_FN, M_OP_FN) \
48386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(ArcOp) \
4915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        M_OP_FN(BitmapOp) \
50f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik        U_OP_FN(BitmapMeshOp) \
51f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik        U_OP_FN(BitmapRectOp) \
52268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik        U_OP_FN(CirclePropsOp) \
53e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik        U_OP_FN(FunctorOp) \
5415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(LinesOp) \
55386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(OvalOp) \
56f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik        M_OP_FN(PatchOp) \
57386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(PathOp) \
58386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(PointsOp) \
5915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(RectOp) \
6015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(RenderNodeOp) \
61386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik        U_OP_FN(RoundRectOp) \
62268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik        U_OP_FN(RoundRectPropsOp) \
6315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(ShadowOp) \
6415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(SimpleRectsOp) \
6515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        M_OP_FN(TextOp) \
66d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik        U_OP_FN(TextOnPathOp) \
67d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik        U_OP_FN(TextureLayerOp) \
6815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(BeginLayerOp) \
6915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(EndLayerOp) \
7015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        U_OP_FN(LayerOp)
7115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
7215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/**
7315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * The provided macro is executed for each op type in order. This is used in cases where
7415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * merge-ability of ops doesn't matter.
7515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */
76b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define MAP_OPS(OP_FN) \
7715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        MAP_OPS_BASED_ON_MERGEABILITY(OP_FN, OP_FN)
7815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
7915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type)
8015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
8115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define MAP_MERGED_OPS(OP_FN) \
8215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik        MAP_OPS_BASED_ON_MERGEABILITY(NULL_OP_FN, OP_FN)
83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum
85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type,
86b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId {
87b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    enum {
88b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        MAP_OPS(IDENTITY_FN)
89b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        Count,
90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    };
91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}
92386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstatic_assert(RecordedOpId::ArcOp == 0,
93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        "First index must be zero for LUTs to work");
94b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
95e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint
96e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip
97e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint)
98e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr)
99b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
100b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp {
101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* ID from RecordedOpId - generally used for jumping into function tables */
102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const int opId;
103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
104386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */
105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Rect unmappedBounds;
106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* transform in recording space (vs DisplayList origin) */
108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Matrix4 localMatrix;
109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
110e4db79de127cfe961195f52907af8451026eaa20Chris Craik    /* clip in recording space - nullptr if not clipped */
111e4db79de127cfe961195f52907af8451026eaa20Chris Craik    const ClipBase* localClip;
112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
113b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* optional paint, stored in base object to simplify merging logic */
114b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkPaint* paint;
115b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected:
116b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RecordedOp(unsigned int opId, BASE_PARAMS)
117b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : opId(opId)
118b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , unmappedBounds(unmappedBounds)
119b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , localMatrix(localMatrix)
120e4db79de127cfe961195f52907af8451026eaa20Chris Craik            , localClip(localClip)
121b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , paint(paint) {}
122b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
123b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
124b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp {
125b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode)
126b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER_PAINTLESS(RenderNodeOp)
127b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , renderNode(renderNode) {}
1288d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    RenderNode * renderNode; // not const, since drawing modifies it
1298d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik
1308d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    /**
1318d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * Holds the transformation between the projection surface ViewGroup and this RenderNode
1328d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * drawing instance. Represents any translations / transformations done within the drawing of
1338d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this
1348d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * DisplayList draw instance.
1358d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     *
1368d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * Note: doesn't include transformation within the RenderNode, or its properties.
1378d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     */
1388d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    Matrix4 transformFromCompositingAncestor;
139161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik    bool skipInOrderDraw = false;
140b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
141b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
142a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
143a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops
144a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
145a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
146386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp {
147386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter)
148386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(ArcOp)
149386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , startAngle(startAngle)
150386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , sweepAngle(sweepAngle)
151386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , useCenter(useCenter) {}
152386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float startAngle;
153386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float sweepAngle;
154386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const bool useCenter;
155386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
156386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
157b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp {
158b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    BitmapOp(BASE_PARAMS, const SkBitmap* bitmap)
159b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(BitmapOp)
160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , bitmap(bitmap) {}
161b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkBitmap* bitmap;
162b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    // TODO: asset atlas/texture id lookup?
163b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
164b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
165f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp {
166f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight,
167f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            const float* vertices, const int* colors)
168f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            : SUPER(BitmapMeshOp)
169f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , bitmap(bitmap)
170f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , meshWidth(meshWidth)
171f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , meshHeight(meshHeight)
172f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , vertices(vertices)
173f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , colors(colors) {}
174f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const SkBitmap* bitmap;
175f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const int meshWidth;
176f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const int meshHeight;
177f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const float* vertices;
178f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const int* colors;
179f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik};
180f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik
181f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp {
182f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src)
183f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            : SUPER(BitmapRectOp)
184f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , bitmap(bitmap)
185f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , src(src) {}
186f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const SkBitmap* bitmap;
187f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const Rect src;
188f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik};
189f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik
190268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct CirclePropsOp : RecordedOp {
191e4db79de127cfe961195f52907af8451026eaa20Chris Craik    CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
192268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            float* x, float* y, float* radius)
193e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint)
194268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , x(x)
195268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , y(y)
196268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , radius(radius) {}
197268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* x;
198268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* y;
199268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* radius;
200268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik};
201268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik
202e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craikstruct FunctorOp : RecordedOp {
203e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik    FunctorOp(BASE_PARAMS_PAINTLESS, Functor* functor)
204e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik            : SUPER_PAINTLESS(FunctorOp)
205e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik            , functor(functor) {}
206e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik    Functor* functor;
207e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik};
208e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik
209a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp {
210a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    LinesOp(BASE_PARAMS, const float* points, const int floatCount)
211a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            : SUPER(LinesOp)
212a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , points(points)
213a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , floatCount(floatCount) {}
214a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float* points;
215a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const int floatCount;
216a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik};
217a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
218386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp {
219386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    OvalOp(BASE_PARAMS)
220386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(OvalOp) {}
221386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
222386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
223f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp {
224f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch)
225f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            : SUPER(PatchOp)
226f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , bitmap(bitmap)
227f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , patch(patch) {}
228f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const SkBitmap* bitmap;
229f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const Res_png_9patch* patch;
230f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik};
231f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik
232386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp {
233386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    PathOp(BASE_PARAMS, const SkPath* path)
234386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(PathOp)
235386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , path(path) {}
236386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const SkPath* path;
237386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
238386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
239386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp {
240386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    PointsOp(BASE_PARAMS, const float* points, const int floatCount)
241386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(PointsOp)
242386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , points(points)
243386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , floatCount(floatCount) {}
244386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float* points;
245386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const int floatCount;
246386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
247386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
248b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp {
249b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RectOp(BASE_PARAMS)
250b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(RectOp) {}
251b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
252b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
253386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp {
254386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    RoundRectOp(BASE_PARAMS, float rx, float ry)
255386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(RoundRectOp)
256386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , rx(rx)
257386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , ry(ry) {}
258386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float rx;
259386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float ry;
260386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
261386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
262268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct RoundRectPropsOp : RecordedOp {
263e4db79de127cfe961195f52907af8451026eaa20Chris Craik    RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
264268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            float* left, float* top, float* right, float* bottom, float *rx, float *ry)
265e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint)
266268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , left(left)
267268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , top(top)
268268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , right(right)
269268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , bottom(bottom)
270268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , rx(rx)
271268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , ry(ry) {}
272268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* left;
273268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* top;
274268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* right;
275268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* bottom;
276268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* rx;
277268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* ry;
278268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik};
279268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik
280d3daa3198e2212c985c634821682d5819346b653Chris Craik/**
281d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow.
282d3daa3198e2212c985c634821682d5819346b653Chris Craik *
283d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time,
284d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed.
285d3daa3198e2212c985c634821682d5819346b653Chris Craik *
28698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds.
287d3daa3198e2212c985c634821682d5819346b653Chris Craik */
288d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp {
28998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    ShadowOp(const RenderNodeOp& casterOp, float casterAlpha, const SkPath* casterPath,
290e4db79de127cfe961195f52907af8451026eaa20Chris Craik            const Rect& localClipRect, const Vector3& lightCenter)
291e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr)
292d3daa3198e2212c985c634821682d5819346b653Chris Craik            , shadowMatrixXY(casterOp.localMatrix)
293d3daa3198e2212c985c634821682d5819346b653Chris Craik            , shadowMatrixZ(casterOp.localMatrix)
294d3daa3198e2212c985c634821682d5819346b653Chris Craik            , casterAlpha(casterAlpha)
29598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik            , casterPath(casterPath)
296e4db79de127cfe961195f52907af8451026eaa20Chris Craik            , localClipRect(localClipRect)
29798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik            , lightCenter(lightCenter) {
298d3daa3198e2212c985c634821682d5819346b653Chris Craik        const RenderNode& node = *casterOp.renderNode;
299d3daa3198e2212c985c634821682d5819346b653Chris Craik        node.applyViewPropertyTransforms(shadowMatrixXY, false);
300d3daa3198e2212c985c634821682d5819346b653Chris Craik        node.applyViewPropertyTransforms(shadowMatrixZ, true);
301d3daa3198e2212c985c634821682d5819346b653Chris Craik    };
302d3daa3198e2212c985c634821682d5819346b653Chris Craik    Matrix4 shadowMatrixXY;
303d3daa3198e2212c985c634821682d5819346b653Chris Craik    Matrix4 shadowMatrixZ;
304d3daa3198e2212c985c634821682d5819346b653Chris Craik    const float casterAlpha;
305d3daa3198e2212c985c634821682d5819346b653Chris Craik    const SkPath* casterPath;
306e4db79de127cfe961195f52907af8451026eaa20Chris Craik    const Rect localClipRect;
30798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik    const Vector3 lightCenter;
308d3daa3198e2212c985c634821682d5819346b653Chris Craik};
309d3daa3198e2212c985c634821682d5819346b653Chris Craik
310b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?)
311b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount)
312b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(SimpleRectsOp)
313b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertices(vertices)
314b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertexCount(vertexCount) {}
315b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    Vertex* vertices;
316b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const size_t vertexCount;
317b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
318b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
319a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp {
320a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount,
321a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            float x, float y)
322a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            : SUPER(TextOp)
323a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , glyphs(glyphs)
324a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , positions(positions)
325a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , glyphCount(glyphCount)
326a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , x(x)
327a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , y(y) {}
328a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const glyph_t* glyphs;
329a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float* positions;
330a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const int glyphCount;
331a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float x;
332a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float y;
333a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik};
334a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
335d7448e65e243754f31890baef29dff187dc2e5e5Chris Craikstruct TextOnPathOp : RecordedOp {
336d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    TextOnPathOp(BASE_PARAMS, const glyph_t* glyphs, int glyphCount,
337d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            const SkPath* path, float hOffset, float vOffset)
338d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            : SUPER(TextOnPathOp)
339d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , glyphs(glyphs)
340d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , glyphCount(glyphCount)
341d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , path(path)
342d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , hOffset(hOffset)
343d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , vOffset(vOffset) {}
344d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const glyph_t* glyphs;
345d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const int glyphCount;
346d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik
347d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const SkPath* path;
348d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const float hOffset;
349d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const float vOffset;
350d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik};
351d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik
352d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craikstruct TextureLayerOp : RecordedOp {
353d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik    TextureLayerOp(BASE_PARAMS_PAINTLESS, Layer* layer)
354d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik            : SUPER_PAINTLESS(TextureLayerOp)
355d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik            , layer(layer) {}
356d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik    Layer* layer;
357d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik};
358d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik
359a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
360a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers
361a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
362a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
3636fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
3646fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer,
3656fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it.
3666fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
3676fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp {
3686fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    BeginLayerOp(BASE_PARAMS)
3696fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik            : SUPER(BeginLayerOp) {}
3706fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
3716fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
3726fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
3736fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that
3746fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO.
3756fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik *
3766fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished.
3776fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
3786fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp {
3796fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    EndLayerOp()
380e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {}
3816fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
3826fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
3830b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/**
3840b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer.
3850b7e8245db728d127ada698be63d78b33fc6e4daChris Craik *
3860b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated,
3870b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother.
3880b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */
3896fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp {
3900b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed.
3915854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle)
3920b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            : SUPER_PAINTLESS(LayerOp)
3930b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , layerHandle(layerHandle)
3940b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , alpha(paint->getAlpha() / 255.0f)
3950b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , mode(PaintUtils::getXfermodeDirect(paint))
3960b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , colorFilter(paint->getColorFilter())
3970b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , destroy(true) {}
3980b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
3990b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    LayerOp(RenderNode& node)
400e4db79de127cfe961195f52907af8451026eaa20Chris Craik        : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), nullptr, nullptr)
4010b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , layerHandle(node.getLayerHandle())
4020b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , alpha(node.properties().layerProperties().alpha() / 255.0f)
4030b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , mode(node.properties().layerProperties().xferMode())
4040b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , colorFilter(node.properties().layerProperties().colorFilter())
4050b7e8245db728d127ada698be63d78b33fc6e4daChris Craik        , destroy(false) {}
4060b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
407818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // Records a handle to the Layer object, since the Layer itself won't be
408818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // constructed until after this operation is constructed.
4095854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    OffscreenBuffer** layerHandle;
4100b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const float alpha;
4110b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const SkXfermode::Mode mode;
4120b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
4130b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // pointer to object owned by either LayerProperties, or a recorded Paint object in a
4140b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used.
4150b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    SkColorFilter* colorFilter;
4160b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
4170b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // whether to destroy the layer, once rendered
4180b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const bool destroy;
4196fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
4206fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
421b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer
422b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android
423b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
424b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H
425