RecordedOp.h revision aafb01d8ade0def3f51b74ae3bbc610c4ab33044
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
20766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "RecordedOp.h"
21a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik#include "font/FontUtil.h"
22b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h"
2398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Rect.h"
240b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#include "RenderNode.h"
256e068c0182f6f85bccb855a647510724d1c65a13Chris Craik#include "TessellationCache.h"
2698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "utils/LinearAllocator.h"
2798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Vector.h"
28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
29f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <androidfw/ResourceTypes.h>
30f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <SkXfermode.h>
31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap;
33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint;
34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
35b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android {
36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer {
37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
38e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipBase;
395854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer;
40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode;
41b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex;
42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
43766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace VectorDrawable {
44766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass Tree;
45766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
46766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
47b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/**
487cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Authoritative op list, used for generating the op ID enum, ID based LUTS, and
497cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * the functions to which they dispatch. Parameter macros are executed for each op,
507cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * in order, based on the op's type.
51b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
52b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * There are 4 types of op, which defines dispatch/LUT capability:
537cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik *
54b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *              | DisplayList |   Render    |    Merge    |
55b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * -------------|-------------|-------------|-------------|
56b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER   |     Yes     |             |             |
57b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY  |             |     Yes     |             |
58b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE  |     Yes     |     Yes     |             |
59b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE    |     Yes     |     Yes     |     Yes     |
60b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *
61b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER - These ops are recorded into DisplayLists, but can't be directly rendered. This
62b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      may be because they need to be transformed into other op types (e.g. CirclePropsOp),
63b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      be traversed to access multiple renderable ops within (e.g. RenderNodeOp), or because they
64b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      modify renderbuffer lifecycle, instead of directly rendering content (the various LayerOps).
65b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *
66b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY - These ops cannot be recorded into DisplayLists, and are instead implicitly
67b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      constructed from other commands/RenderNode properties. They cannot be merged.
68b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *
69b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE - These ops can be recorded into DisplayLists and rendered directly, but do not
70b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      support merged rendering.
71b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *
72b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE - These ops can be recorded into DisplayLists and rendered individually, or merged
73b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      under certain circumstances.
74b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */
757cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_OPS_BASED_ON_TYPE(PRE_RENDER_OP_FN, RENDER_ONLY_OP_FN, UNMERGEABLE_OP_FN, MERGEABLE_OP_FN) \
767cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        PRE_RENDER_OP_FN(RenderNodeOp) \
777cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        PRE_RENDER_OP_FN(CirclePropsOp) \
787cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        PRE_RENDER_OP_FN(RoundRectPropsOp) \
797cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        PRE_RENDER_OP_FN(BeginLayerOp) \
807cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        PRE_RENDER_OP_FN(EndLayerOp) \
81b87eadda1818034ce03d85f30388384d1ac65916Chris Craik        PRE_RENDER_OP_FN(BeginUnclippedLayerOp) \
82b87eadda1818034ce03d85f30388384d1ac65916Chris Craik        PRE_RENDER_OP_FN(EndUnclippedLayerOp) \
83766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu        PRE_RENDER_OP_FN(VectorDrawableOp) \
847cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        \
857cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        RENDER_ONLY_OP_FN(ShadowOp) \
867cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        RENDER_ONLY_OP_FN(LayerOp) \
87b87eadda1818034ce03d85f30388384d1ac65916Chris Craik        RENDER_ONLY_OP_FN(CopyToLayerOp) \
88b87eadda1818034ce03d85f30388384d1ac65916Chris Craik        RENDER_ONLY_OP_FN(CopyFromLayerOp) \
897cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        \
907cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(ArcOp) \
917cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(BitmapMeshOp) \
927cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(BitmapRectOp) \
93a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik        UNMERGEABLE_OP_FN(ColorOp) \
947cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(FunctorOp) \
957cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(LinesOp) \
967cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(OvalOp) \
977cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(PathOp) \
987cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(PointsOp) \
997cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(RectOp) \
1007cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(RoundRectOp) \
1017cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(SimpleRectsOp) \
1027cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(TextOnPathOp) \
1037cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        UNMERGEABLE_OP_FN(TextureLayerOp) \
1047cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        \
1057cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        MERGEABLE_OP_FN(BitmapOp) \
1067cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        MERGEABLE_OP_FN(PatchOp) \
1077cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        MERGEABLE_OP_FN(TextOp)
10815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
10915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/**
1107cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * LUT generators, which will insert nullptr for unsupported ops
11115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */
1127cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define NULLPTR_OP_FN(Type) nullptr,
1137cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
1147cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_DEFERRABLE_OP_LUT(OP_FN) \
1157cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        { MAP_OPS_BASED_ON_TYPE(OP_FN, NULLPTR_OP_FN, OP_FN, OP_FN) }
1167cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
1177cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_MERGEABLE_OP_LUT(OP_FN) \
1187cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, NULLPTR_OP_FN, NULLPTR_OP_FN, OP_FN) }
11915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
1207cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_RENDERABLE_OP_LUT(OP_FN) \
1217cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, OP_FN, OP_FN, OP_FN) }
1227cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
12391eff22b5d7f8fe551bae01331948858ce932a96Chris Craik#define BUILD_FULL_OP_LUT(OP_FN) \
12491eff22b5d7f8fe551bae01331948858ce932a96Chris Craik        { MAP_OPS_BASED_ON_TYPE(OP_FN, OP_FN, OP_FN, OP_FN) }
12591eff22b5d7f8fe551bae01331948858ce932a96Chris Craik
1267cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik/**
1277cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Op mapping functions, which skip unsupported ops.
1287cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik *
1297cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Note: Do not use for LUTS, since these do not preserve ID order.
1307cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik */
13115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type)
13215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
133b87eadda1818034ce03d85f30388384d1ac65916Chris Craik#define MAP_DEFERRABLE_OPS(OP_FN) \
134b87eadda1818034ce03d85f30388384d1ac65916Chris Craik        MAP_OPS_BASED_ON_TYPE(OP_FN, NULL_OP_FN, OP_FN, OP_FN)
135b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
1367cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_MERGEABLE_OPS(OP_FN) \
1377cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, NULL_OP_FN, NULL_OP_FN, OP_FN)
1387cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
1397cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_RENDERABLE_OPS(OP_FN) \
1407cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, OP_FN, OP_FN, OP_FN)
1417cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
142b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum
143b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type,
144b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId {
145b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    enum {
1467cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik        MAP_OPS_BASED_ON_TYPE(IDENTITY_FN, IDENTITY_FN, IDENTITY_FN, IDENTITY_FN)
147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        Count,
148b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    };
149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}
1507cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craikstatic_assert(RecordedOpId::RenderNodeOp == 0,
151b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        "First index must be zero for LUTs to work");
152b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
153e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint
154e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip
155e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint)
156e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr)
157b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
158b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp {
159b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* ID from RecordedOpId - generally used for jumping into function tables */
160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const int opId;
161b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
162386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */
163b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Rect unmappedBounds;
164b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
165b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* transform in recording space (vs DisplayList origin) */
166b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Matrix4 localMatrix;
167b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
168e4db79de127cfe961195f52907af8451026eaa20Chris Craik    /* clip in recording space - nullptr if not clipped */
169e4db79de127cfe961195f52907af8451026eaa20Chris Craik    const ClipBase* localClip;
170b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
171b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* optional paint, stored in base object to simplify merging logic */
172b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkPaint* paint;
173b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected:
174b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RecordedOp(unsigned int opId, BASE_PARAMS)
175b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : opId(opId)
176b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , unmappedBounds(unmappedBounds)
177b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , localMatrix(localMatrix)
178e4db79de127cfe961195f52907af8451026eaa20Chris Craik            , localClip(localClip)
179b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , paint(paint) {}
180b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
181b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
182b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp {
183b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode)
184b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER_PAINTLESS(RenderNodeOp)
185b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , renderNode(renderNode) {}
1868d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    RenderNode * renderNode; // not const, since drawing modifies it
1878d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik
1888d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    /**
1898d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * Holds the transformation between the projection surface ViewGroup and this RenderNode
1908d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * drawing instance. Represents any translations / transformations done within the drawing of
1918d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this
1928d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * DisplayList draw instance.
1938d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     *
1948d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * Note: doesn't include transformation within the RenderNode, or its properties.
1958d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     */
1968d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    Matrix4 transformFromCompositingAncestor;
197161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik    bool skipInOrderDraw = false;
198b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
199b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
200a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
201a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops
202a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
203a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
204386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp {
205386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter)
206386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(ArcOp)
207386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , startAngle(startAngle)
208386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , sweepAngle(sweepAngle)
209386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , useCenter(useCenter) {}
210386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float startAngle;
211386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float sweepAngle;
212386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const bool useCenter;
213386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
214386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
215b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp {
216b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    BitmapOp(BASE_PARAMS, const SkBitmap* bitmap)
217b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(BitmapOp)
218b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , bitmap(bitmap) {}
219b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkBitmap* bitmap;
220b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    // TODO: asset atlas/texture id lookup?
221b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
222b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
223f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp {
224f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight,
225f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            const float* vertices, const int* colors)
226f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            : SUPER(BitmapMeshOp)
227f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , bitmap(bitmap)
228f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , meshWidth(meshWidth)
229f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , meshHeight(meshHeight)
230f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , vertices(vertices)
231f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , colors(colors) {}
232f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const SkBitmap* bitmap;
233f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const int meshWidth;
234f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const int meshHeight;
235f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const float* vertices;
236f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const int* colors;
237f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik};
238f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik
239f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp {
240f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src)
241f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            : SUPER(BitmapRectOp)
242f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , bitmap(bitmap)
243f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , src(src) {}
244f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const SkBitmap* bitmap;
245f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const Rect src;
246f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik};
247f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik
248268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct CirclePropsOp : RecordedOp {
249e4db79de127cfe961195f52907af8451026eaa20Chris Craik    CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
250268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            float* x, float* y, float* radius)
251e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint)
252268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , x(x)
253268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , y(y)
254268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , radius(radius) {}
255268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* x;
256268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* y;
257268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* radius;
258268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik};
259268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik
260a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craikstruct ColorOp : RecordedOp {
261a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik    // Note: unbounded op that will fillclip, so no bounds/matrix needed
262a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik    ColorOp(const ClipBase* localClip, int color, SkXfermode::Mode mode)
263a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik            : RecordedOp(RecordedOpId::ColorOp, Rect(), Matrix4::identity(), localClip, nullptr)
264a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik            , color(color)
265a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik            , mode(mode) {}
266a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik    const int color;
267a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik    const SkXfermode::Mode mode;
268a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik};
269a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik
270e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craikstruct FunctorOp : RecordedOp {
2714c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    // Note: undefined record-time bounds, since this op fills the clip
2724c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    // TODO: explicitly define bounds
2734c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    FunctorOp(const Matrix4& localMatrix, const ClipBase* localClip, Functor* functor)
2744c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik            : RecordedOp(RecordedOpId::FunctorOp, Rect(), localMatrix, localClip, nullptr)
275e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik            , functor(functor) {}
276e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik    Functor* functor;
277e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik};
278e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik
279a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp {
280a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    LinesOp(BASE_PARAMS, const float* points, const int floatCount)
281a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            : SUPER(LinesOp)
282a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , points(points)
283a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , floatCount(floatCount) {}
284a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float* points;
285a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const int floatCount;
286a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik};
287a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
288386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp {
289386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    OvalOp(BASE_PARAMS)
290386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(OvalOp) {}
291386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
292386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
293f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp {
294f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch)
295f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            : SUPER(PatchOp)
296f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , bitmap(bitmap)
297f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , patch(patch) {}
298f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const SkBitmap* bitmap;
299f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const Res_png_9patch* patch;
300f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik};
301f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik
302386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp {
303386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    PathOp(BASE_PARAMS, const SkPath* path)
304386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(PathOp)
305386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , path(path) {}
306386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const SkPath* path;
307386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
308386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
309386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp {
310386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    PointsOp(BASE_PARAMS, const float* points, const int floatCount)
311386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(PointsOp)
312386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , points(points)
313386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , floatCount(floatCount) {}
314386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float* points;
315386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const int floatCount;
316386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
317386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
318b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp {
319b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RectOp(BASE_PARAMS)
320b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(RectOp) {}
321b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
322b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
323386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp {
324386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    RoundRectOp(BASE_PARAMS, float rx, float ry)
325386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            : SUPER(RoundRectOp)
326386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , rx(rx)
327386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik            , ry(ry) {}
328386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float rx;
329386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float ry;
330386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
331386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
332268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct RoundRectPropsOp : RecordedOp {
333e4db79de127cfe961195f52907af8451026eaa20Chris Craik    RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
334268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            float* left, float* top, float* right, float* bottom, float *rx, float *ry)
335e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint)
336268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , left(left)
337268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , top(top)
338268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , right(right)
339268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , bottom(bottom)
340268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , rx(rx)
341268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , ry(ry) {}
342268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* left;
343268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* top;
344268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* right;
345268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* bottom;
346268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* rx;
347268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* ry;
348268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik};
349268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik
350766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustruct VectorDrawableOp : RecordedOp {
351766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    VectorDrawableOp(VectorDrawable::Tree* tree, BASE_PARAMS_PAINTLESS)
352766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            : SUPER_PAINTLESS(VectorDrawableOp)
353766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu            , vectorDrawable(tree) {}
354766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    VectorDrawable::Tree* vectorDrawable;
355766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
356766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
357d3daa3198e2212c985c634821682d5819346b653Chris Craik/**
358d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow.
359d3daa3198e2212c985c634821682d5819346b653Chris Craik *
360d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time,
361d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed.
362d3daa3198e2212c985c634821682d5819346b653Chris Craik *
36398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds.
364d3daa3198e2212c985c634821682d5819346b653Chris Craik */
365d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp {
3666e068c0182f6f85bccb855a647510724d1c65a13Chris Craik    ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha)
367e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr)
3686e068c0182f6f85bccb855a647510724d1c65a13Chris Craik            , shadowTask(shadowTask)
3696e068c0182f6f85bccb855a647510724d1c65a13Chris Craik            , casterAlpha(casterAlpha) {
370d3daa3198e2212c985c634821682d5819346b653Chris Craik    };
3716e068c0182f6f85bccb855a647510724d1c65a13Chris Craik    sp<TessellationCache::ShadowTask> shadowTask;
372d3daa3198e2212c985c634821682d5819346b653Chris Craik    const float casterAlpha;
373d3daa3198e2212c985c634821682d5819346b653Chris Craik};
374d3daa3198e2212c985c634821682d5819346b653Chris Craik
375b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?)
376b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount)
377b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(SimpleRectsOp)
378b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertices(vertices)
379b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertexCount(vertexCount) {}
380b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    Vertex* vertices;
381b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const size_t vertexCount;
382b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
383b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
384a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp {
385a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount,
386a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            float x, float y)
387a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            : SUPER(TextOp)
388a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , glyphs(glyphs)
389a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , positions(positions)
390a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , glyphCount(glyphCount)
391a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , x(x)
392a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , y(y) {}
393a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const glyph_t* glyphs;
394a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float* positions;
395a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const int glyphCount;
396a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float x;
397a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float y;
398a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik};
399a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
400d7448e65e243754f31890baef29dff187dc2e5e5Chris Craikstruct TextOnPathOp : RecordedOp {
4014c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    // TODO: explicitly define bounds
4024c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    TextOnPathOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
4034c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik            const glyph_t* glyphs, int glyphCount, const SkPath* path, float hOffset, float vOffset)
4044c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik            : RecordedOp(RecordedOpId::TextOnPathOp, Rect(), localMatrix, localClip, paint)
405d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , glyphs(glyphs)
406d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , glyphCount(glyphCount)
407d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , path(path)
408d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , hOffset(hOffset)
409d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , vOffset(vOffset) {}
410d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const glyph_t* glyphs;
411d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const int glyphCount;
412d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik
413d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const SkPath* path;
414d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const float hOffset;
415d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const float vOffset;
416d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik};
417d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik
418d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craikstruct TextureLayerOp : RecordedOp {
419d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik    TextureLayerOp(BASE_PARAMS_PAINTLESS, Layer* layer)
420d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik            : SUPER_PAINTLESS(TextureLayerOp)
421d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik            , layer(layer) {}
422aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik
423aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik    // Copy an existing TextureLayerOp, replacing the underlying matrix
424aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik    TextureLayerOp(const TextureLayerOp& op, const Matrix4& replacementMatrix)
425aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik            : RecordedOp(RecordedOpId::TextureLayerOp, op.unmappedBounds, replacementMatrix,
426aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik                    op.localClip, op.paint)
427aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik            , layer(op.layer) {
428aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik
429aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik    }
430d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik    Layer* layer;
431d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik};
432d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik
433a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
434a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers
435a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
436a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
4376fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
4386fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer,
4396fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it.
4406fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
4416fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp {
4426fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    BeginLayerOp(BASE_PARAMS)
4436fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik            : SUPER(BeginLayerOp) {}
4446fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
4456fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
4466fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
4476fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that
4486fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO.
4496fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik *
4506fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished.
4516fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
4526fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp {
4536fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    EndLayerOp()
454e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {}
4556fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
4566fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
457b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct BeginUnclippedLayerOp : RecordedOp {
458b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    BeginUnclippedLayerOp(BASE_PARAMS)
459b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            : SUPER(BeginUnclippedLayerOp) {}
460b87eadda1818034ce03d85f30388384d1ac65916Chris Craik};
461b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
462b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct EndUnclippedLayerOp : RecordedOp {
463b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    EndUnclippedLayerOp()
464b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {}
465b87eadda1818034ce03d85f30388384d1ac65916Chris Craik};
466b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
467b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyToLayerOp : RecordedOp {
468b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle)
469b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            : RecordedOp(RecordedOpId::CopyToLayerOp,
470b87eadda1818034ce03d85f30388384d1ac65916Chris Craik                    op.unmappedBounds,
471b87eadda1818034ce03d85f30388384d1ac65916Chris Craik                    op.localMatrix,
472b87eadda1818034ce03d85f30388384d1ac65916Chris Craik                    nullptr, // clip intentionally ignored
473b87eadda1818034ce03d85f30388384d1ac65916Chris Craik                    op.paint)
474b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , layerHandle(layerHandle) {}
475b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
476b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    // Records a handle to the Layer object, since the Layer itself won't be
477b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    // constructed until after this operation is constructed.
478b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    OffscreenBuffer** layerHandle;
479b87eadda1818034ce03d85f30388384d1ac65916Chris Craik};
480b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
481b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
482b87eadda1818034ce03d85f30388384d1ac65916Chris Craik// draw the parameter layer underneath
483b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyFromLayerOp : RecordedOp {
484b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle)
485b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            : RecordedOp(RecordedOpId::CopyFromLayerOp,
486b87eadda1818034ce03d85f30388384d1ac65916Chris Craik                    op.unmappedBounds,
487b87eadda1818034ce03d85f30388384d1ac65916Chris Craik                    op.localMatrix,
488b87eadda1818034ce03d85f30388384d1ac65916Chris Craik                    nullptr, // clip intentionally ignored
489b87eadda1818034ce03d85f30388384d1ac65916Chris Craik                    op.paint)
490b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , layerHandle(layerHandle) {}
491b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
492b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    // Records a handle to the Layer object, since the Layer itself won't be
493b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    // constructed until after this operation is constructed.
494b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    OffscreenBuffer** layerHandle;
495b87eadda1818034ce03d85f30388384d1ac65916Chris Craik};
496b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
4970b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/**
4980b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer.
4990b7e8245db728d127ada698be63d78b33fc6e4daChris Craik *
5000b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated,
5010b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother.
5020b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */
5036fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp {
5040b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed.
5055854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle)
5060b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            : SUPER_PAINTLESS(LayerOp)
5070b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , layerHandle(layerHandle)
508e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik            , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f)
5090b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , mode(PaintUtils::getXfermodeDirect(paint))
510e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik            , colorFilter(paint ? paint->getColorFilter() : nullptr)
5110b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , destroy(true) {}
5120b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
5130b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    LayerOp(RenderNode& node)
514b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), nullptr, nullptr)
515b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , layerHandle(node.getLayerHandle())
516b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , alpha(node.properties().layerProperties().alpha() / 255.0f)
517b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , mode(node.properties().layerProperties().xferMode())
518b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , colorFilter(node.properties().layerProperties().colorFilter())
519b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , destroy(false) {}
5200b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
521818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // Records a handle to the Layer object, since the Layer itself won't be
522818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // constructed until after this operation is constructed.
5235854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    OffscreenBuffer** layerHandle;
5240b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const float alpha;
5250b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const SkXfermode::Mode mode;
5260b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
5270b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // pointer to object owned by either LayerProperties, or a recorded Paint object in a
5280b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used.
5290b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    SkColorFilter* colorFilter;
5300b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
5310b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // whether to destroy the layer, once rendered
5320b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const bool destroy;
5336fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
5346fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
535b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer
536b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android
537b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
538b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H
539