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
175e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#pragma once
18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
198cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "GlLayer.h"
20b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h"
2198787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Rect.h"
220b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#include "RenderNode.h"
236e068c0182f6f85bccb855a647510724d1c65a13Chris Craik#include "TessellationCache.h"
241bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include "Vector.h"
251bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include "font/FontUtil.h"
2698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "utils/LinearAllocator.h"
275e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#include "utils/PaintUtils.h"
28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
29f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <androidfw/ResourceTypes.h>
30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap;
32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint;
33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android {
35b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer {
36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
37e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipBase;
385854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer;
39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode;
403e9999bd866fac71c72e6b484a9836c87c328a08sergeyvclass DeferredLayerUpdater;
413e9999bd866fac71c72e6b484a9836c87c328a08sergeyv
42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex;
43b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
44766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace VectorDrawable {
45766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass Tree;
46766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}
47766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
48b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/**
497cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Authoritative op list, used for generating the op ID enum, ID based LUTS, and
507cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * the functions to which they dispatch. Parameter macros are executed for each op,
517cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * in order, based on the op's type.
52b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
53b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * There are 4 types of op, which defines dispatch/LUT capability:
547cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik *
55b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *              | DisplayList |   Render    |    Merge    |
56b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * -------------|-------------|-------------|-------------|
57b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER   |     Yes     |             |             |
58b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY  |             |     Yes     |             |
59b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE  |     Yes     |     Yes     |             |
60b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE    |     Yes     |     Yes     |     Yes     |
61b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *
62b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER - These ops are recorded into DisplayLists, but can't be directly rendered. This
63b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      may be because they need to be transformed into other op types (e.g. CirclePropsOp),
64b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      be traversed to access multiple renderable ops within (e.g. RenderNodeOp), or because they
65b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      modify renderbuffer lifecycle, instead of directly rendering content (the various LayerOps).
66b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *
67b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY - These ops cannot be recorded into DisplayLists, and are instead implicitly
68b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      constructed from other commands/RenderNode properties. They cannot be merged.
69b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *
70b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE - These ops can be recorded into DisplayLists and rendered directly, but do not
71b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      support merged rendering.
72b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *
73b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE - These ops can be recorded into DisplayLists and rendered individually, or merged
74b87eadda1818034ce03d85f30388384d1ac65916Chris Craik *      under certain circumstances.
75b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */
761bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define MAP_OPS_BASED_ON_TYPE(PRE_RENDER_OP_FN, RENDER_ONLY_OP_FN, UNMERGEABLE_OP_FN, \
771bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                              MERGEABLE_OP_FN)                                        \
781bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    PRE_RENDER_OP_FN(RenderNodeOp)                                                    \
791bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    PRE_RENDER_OP_FN(CirclePropsOp)                                                   \
801bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    PRE_RENDER_OP_FN(RoundRectPropsOp)                                                \
811bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    PRE_RENDER_OP_FN(BeginLayerOp)                                                    \
821bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    PRE_RENDER_OP_FN(EndLayerOp)                                                      \
831bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    PRE_RENDER_OP_FN(BeginUnclippedLayerOp)                                           \
841bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    PRE_RENDER_OP_FN(EndUnclippedLayerOp)                                             \
851bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    PRE_RENDER_OP_FN(VectorDrawableOp)                                                \
861bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                                                                      \
871bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    RENDER_ONLY_OP_FN(ShadowOp)                                                       \
881bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    RENDER_ONLY_OP_FN(LayerOp)                                                        \
891bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    RENDER_ONLY_OP_FN(CopyToLayerOp)                                                  \
901bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    RENDER_ONLY_OP_FN(CopyFromLayerOp)                                                \
911bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                                                                      \
921bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(ArcOp)                                                          \
931bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(BitmapMeshOp)                                                   \
941bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(BitmapRectOp)                                                   \
951bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(ColorOp)                                                        \
961bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(FunctorOp)                                                      \
971bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(LinesOp)                                                        \
981bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(OvalOp)                                                         \
991bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(PathOp)                                                         \
1001bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(PointsOp)                                                       \
1011bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(RectOp)                                                         \
1021bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(RoundRectOp)                                                    \
1031bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(SimpleRectsOp)                                                  \
1041bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(TextOnPathOp)                                                   \
1051bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    UNMERGEABLE_OP_FN(TextureLayerOp)                                                 \
1061bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                                                                                      \
1071bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    MERGEABLE_OP_FN(BitmapOp)                                                         \
1081bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    MERGEABLE_OP_FN(PatchOp)                                                          \
1091bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    MERGEABLE_OP_FN(TextOp)
11015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
11115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/**
1127cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * LUT generators, which will insert nullptr for unsupported ops
11315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */
1147cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define NULLPTR_OP_FN(Type) nullptr,
1157cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
1167cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_DEFERRABLE_OP_LUT(OP_FN) \
1171bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    { MAP_OPS_BASED_ON_TYPE(OP_FN, NULLPTR_OP_FN, OP_FN, OP_FN) }
1187cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
1197cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_MERGEABLE_OP_LUT(OP_FN) \
1201bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, NULLPTR_OP_FN, NULLPTR_OP_FN, OP_FN) }
12115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
1227cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_RENDERABLE_OP_LUT(OP_FN) \
1231bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, OP_FN, OP_FN, OP_FN) }
1247cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
12591eff22b5d7f8fe551bae01331948858ce932a96Chris Craik#define BUILD_FULL_OP_LUT(OP_FN) \
1261bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    { MAP_OPS_BASED_ON_TYPE(OP_FN, OP_FN, OP_FN, OP_FN) }
12791eff22b5d7f8fe551bae01331948858ce932a96Chris Craik
1287cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik/**
1297cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Op mapping functions, which skip unsupported ops.
1307cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik *
1317cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Note: Do not use for LUTS, since these do not preserve ID order.
1327cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik */
13315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type)
13415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik
1351bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define MAP_DEFERRABLE_OPS(OP_FN) MAP_OPS_BASED_ON_TYPE(OP_FN, NULL_OP_FN, OP_FN, OP_FN)
136b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
1371bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define MAP_MERGEABLE_OPS(OP_FN) MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, NULL_OP_FN, NULL_OP_FN, OP_FN)
1387cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
1391bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define MAP_RENDERABLE_OPS(OP_FN) MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, OP_FN, OP_FN, OP_FN)
1407cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik
141b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum
142b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type,
143b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId {
1441bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckenum {
1451bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    MAP_OPS_BASED_ON_TYPE(IDENTITY_FN, IDENTITY_FN, IDENTITY_FN, IDENTITY_FN) Count,
1461bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck};
147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}
1481bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic_assert(RecordedOpId::RenderNodeOp == 0, "First index must be zero for LUTs to work");
149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
1501bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define BASE_PARAMS                                                                    \
1511bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    const Rect &unmappedBounds, const Matrix4 &localMatrix, const ClipBase *localClip, \
1521bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            const SkPaint *paint
1531bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define BASE_PARAMS_PAINTLESS \
1541bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    const Rect &unmappedBounds, const Matrix4 &localMatrix, const ClipBase *localClip
155e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint)
1561bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define SUPER_PAINTLESS(Type) \
1571bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr)
158b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
159b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp {
160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* ID from RecordedOpId - generally used for jumping into function tables */
161b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const int opId;
162b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
163386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */
164b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Rect unmappedBounds;
165b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
166b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* transform in recording space (vs DisplayList origin) */
167b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Matrix4 localMatrix;
168b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
169e4db79de127cfe961195f52907af8451026eaa20Chris Craik    /* clip in recording space - nullptr if not clipped */
170e4db79de127cfe961195f52907af8451026eaa20Chris Craik    const ClipBase* localClip;
171b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
172b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* optional paint, stored in base object to simplify merging logic */
173b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkPaint* paint;
1741bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck
175b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected:
176b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RecordedOp(unsigned int opId, BASE_PARAMS)
177b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : opId(opId)
178b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , unmappedBounds(unmappedBounds)
179b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , localMatrix(localMatrix)
180e4db79de127cfe961195f52907af8451026eaa20Chris Craik            , localClip(localClip)
181b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , paint(paint) {}
182b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
183b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
184b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp {
185b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode)
1861bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : SUPER_PAINTLESS(RenderNodeOp), renderNode(renderNode) {}
1871bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    RenderNode* renderNode;  // not const, since drawing modifies it
1888d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik
1898d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    /**
1908d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * Holds the transformation between the projection surface ViewGroup and this RenderNode
1918d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * drawing instance. Represents any translations / transformations done within the drawing of
1928d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this
1938d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * DisplayList draw instance.
1948d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     *
1958d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     * Note: doesn't include transformation within the RenderNode, or its properties.
1968d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik     */
1978d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik    Matrix4 transformFromCompositingAncestor;
198161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik    bool skipInOrderDraw = false;
199b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
200b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
201a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
202a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops
203a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
204a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
205386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp {
206386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter)
2071bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : SUPER(ArcOp), startAngle(startAngle), sweepAngle(sweepAngle), useCenter(useCenter) {}
208386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float startAngle;
209386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float sweepAngle;
210386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const bool useCenter;
211386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
212386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
213b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp {
2141bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    BitmapOp(BASE_PARAMS, Bitmap* bitmap) : SUPER(BitmapOp), bitmap(bitmap) {}
215ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv    Bitmap* bitmap;
216b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
217b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
218f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp {
2191bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    BitmapMeshOp(BASE_PARAMS, Bitmap* bitmap, int meshWidth, int meshHeight, const float* vertices,
2201bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                 const int* colors)
221f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            : SUPER(BitmapMeshOp)
222f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , bitmap(bitmap)
223f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , meshWidth(meshWidth)
224f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , meshHeight(meshHeight)
225f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , vertices(vertices)
226f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik            , colors(colors) {}
227ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv    Bitmap* bitmap;
228f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const int meshWidth;
229f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const int meshHeight;
230f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const float* vertices;
231f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const int* colors;
232f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik};
233f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik
234f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp {
235ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv    BitmapRectOp(BASE_PARAMS, Bitmap* bitmap, const Rect& src)
2361bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : SUPER(BitmapRectOp), bitmap(bitmap), src(src) {}
237ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv    Bitmap* bitmap;
238f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const Rect src;
239f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik};
240f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik
241268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct CirclePropsOp : RecordedOp {
242e4db79de127cfe961195f52907af8451026eaa20Chris Craik    CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
2431bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                  float* x, float* y, float* radius)
244e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint)
245268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , x(x)
246268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , y(y)
247268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , radius(radius) {}
248268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* x;
249268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* y;
250268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* radius;
251268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik};
252268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik
253a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craikstruct ColorOp : RecordedOp {
254a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik    // Note: unbounded op that will fillclip, so no bounds/matrix needed
255260ab726486317496bc12a57d599ea96dcde3284Mike Reed    ColorOp(const ClipBase* localClip, int color, SkBlendMode mode)
256a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik            : RecordedOp(RecordedOpId::ColorOp, Rect(), Matrix4::identity(), localClip, nullptr)
257a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik            , color(color)
258a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik            , mode(mode) {}
259a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik    const int color;
260260ab726486317496bc12a57d599ea96dcde3284Mike Reed    const SkBlendMode mode;
261a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik};
262a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik
263e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craikstruct FunctorOp : RecordedOp {
2644c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    // Note: undefined record-time bounds, since this op fills the clip
2654c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    // TODO: explicitly define bounds
2664c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    FunctorOp(const Matrix4& localMatrix, const ClipBase* localClip, Functor* functor)
2674c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik            : RecordedOp(RecordedOpId::FunctorOp, Rect(), localMatrix, localClip, nullptr)
268e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik            , functor(functor) {}
269e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik    Functor* functor;
270e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik};
271e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik
272a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp {
273a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    LinesOp(BASE_PARAMS, const float* points, const int floatCount)
2741bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : SUPER(LinesOp), points(points), floatCount(floatCount) {}
275a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float* points;
276a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const int floatCount;
277a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik};
278a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
279386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp {
2801bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    OvalOp(BASE_PARAMS) : SUPER(OvalOp) {}
281386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
282386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
283f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp {
284ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv    PatchOp(BASE_PARAMS, Bitmap* bitmap, const Res_png_9patch* patch)
2851bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : SUPER(PatchOp), bitmap(bitmap), patch(patch) {}
286ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv    Bitmap* bitmap;
287f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik    const Res_png_9patch* patch;
288f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik};
289f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik
290386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp {
2911bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    PathOp(BASE_PARAMS, const SkPath* path) : SUPER(PathOp), path(path) {}
292386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const SkPath* path;
293386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
294386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
295386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp {
296386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    PointsOp(BASE_PARAMS, const float* points, const int floatCount)
2971bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : SUPER(PointsOp), points(points), floatCount(floatCount) {}
298386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float* points;
299386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const int floatCount;
300386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
301386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
302b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp {
3031bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    RectOp(BASE_PARAMS) : SUPER(RectOp) {}
304b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
305b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
306386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp {
3071bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    RoundRectOp(BASE_PARAMS, float rx, float ry) : SUPER(RoundRectOp), rx(rx), ry(ry) {}
308386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float rx;
309386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik    const float ry;
310386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik};
311386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik
312268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct RoundRectPropsOp : RecordedOp {
313e4db79de127cfe961195f52907af8451026eaa20Chris Craik    RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
3141bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                     float* left, float* top, float* right, float* bottom, float* rx, float* ry)
315e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint)
316268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , left(left)
317268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , top(top)
318268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , right(right)
319268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , bottom(bottom)
320268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , rx(rx)
321268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik            , ry(ry) {}
322268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* left;
323268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* top;
324268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* right;
325268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* bottom;
326268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* rx;
327268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik    const float* ry;
328268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik};
329268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik
330766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustruct VectorDrawableOp : RecordedOp {
331766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    VectorDrawableOp(VectorDrawable::Tree* tree, BASE_PARAMS_PAINTLESS)
3321bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : SUPER_PAINTLESS(VectorDrawableOp), vectorDrawable(tree) {}
333766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu    VectorDrawable::Tree* vectorDrawable;
334766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu};
335766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu
336d3daa3198e2212c985c634821682d5819346b653Chris Craik/**
337d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow.
338d3daa3198e2212c985c634821682d5819346b653Chris Craik *
339d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time,
340d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed.
341d3daa3198e2212c985c634821682d5819346b653Chris Craik *
34298787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds.
343d3daa3198e2212c985c634821682d5819346b653Chris Craik */
344d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp {
3456e068c0182f6f85bccb855a647510724d1c65a13Chris Craik    ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha)
346e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr)
3476e068c0182f6f85bccb855a647510724d1c65a13Chris Craik            , shadowTask(shadowTask)
3481bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            , casterAlpha(casterAlpha){};
3496e068c0182f6f85bccb855a647510724d1c65a13Chris Craik    sp<TessellationCache::ShadowTask> shadowTask;
350d3daa3198e2212c985c634821682d5819346b653Chris Craik    const float casterAlpha;
351d3daa3198e2212c985c634821682d5819346b653Chris Craik};
352d3daa3198e2212c985c634821682d5819346b653Chris Craik
3531bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstruct SimpleRectsOp : RecordedOp {  // Filled, no AA (TODO: better name?)
354b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount)
3551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : SUPER(SimpleRectsOp), vertices(vertices), vertexCount(vertexCount) {}
356b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    Vertex* vertices;
357b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const size_t vertexCount;
358b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
359b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
360a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp {
3611bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, float x,
3621bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck           float y)
363a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            : SUPER(TextOp)
364a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , glyphs(glyphs)
365a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , positions(positions)
366a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , glyphCount(glyphCount)
367a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , x(x)
368a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik            , y(y) {}
369a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const glyph_t* glyphs;
370a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float* positions;
371a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const int glyphCount;
372a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float x;
373a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik    const float y;
374a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik};
375a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
376d7448e65e243754f31890baef29dff187dc2e5e5Chris Craikstruct TextOnPathOp : RecordedOp {
3774c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    // TODO: explicitly define bounds
3784c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik    TextOnPathOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
3791bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                 const glyph_t* glyphs, int glyphCount, const SkPath* path, float hOffset,
3801bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                 float vOffset)
3814c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik            : RecordedOp(RecordedOpId::TextOnPathOp, Rect(), localMatrix, localClip, paint)
382d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , glyphs(glyphs)
383d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , glyphCount(glyphCount)
384d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , path(path)
385d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , hOffset(hOffset)
386d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik            , vOffset(vOffset) {}
387d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const glyph_t* glyphs;
388d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const int glyphCount;
389d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik
390d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const SkPath* path;
391d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const float hOffset;
392d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik    const float vOffset;
393d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik};
394d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik
395d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craikstruct TextureLayerOp : RecordedOp {
3963e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    TextureLayerOp(BASE_PARAMS_PAINTLESS, DeferredLayerUpdater* layer)
3971bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : SUPER_PAINTLESS(TextureLayerOp), layerHandle(layer) {}
398aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik
399aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik    // Copy an existing TextureLayerOp, replacing the underlying matrix
400aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik    TextureLayerOp(const TextureLayerOp& op, const Matrix4& replacementMatrix)
401aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik            : RecordedOp(RecordedOpId::TextureLayerOp, op.unmappedBounds, replacementMatrix,
4021bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                         op.localClip, op.paint)
4031bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            , layerHandle(op.layerHandle) {}
4043e9999bd866fac71c72e6b484a9836c87c328a08sergeyv    DeferredLayerUpdater* layerHandle;
405d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik};
406d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik
407a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
408a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers
409a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik////////////////////////////////////////////////////////////////////////////////////////////////////
410a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik
4116fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
4126fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer,
4136fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it.
4146fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
4156fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp {
4161bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    BeginLayerOp(BASE_PARAMS) : SUPER(BeginLayerOp) {}
4176fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
4186fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
4196fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/**
4206fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that
4216fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO.
4226fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik *
4236fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished.
4246fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */
4256fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp {
4266fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik    EndLayerOp()
427e4db79de127cfe961195f52907af8451026eaa20Chris Craik            : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {}
4286fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
4296fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
430b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct BeginUnclippedLayerOp : RecordedOp {
4311bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck    BeginUnclippedLayerOp(BASE_PARAMS) : SUPER(BeginUnclippedLayerOp) {}
432b87eadda1818034ce03d85f30388384d1ac65916Chris Craik};
433b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
434b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct EndUnclippedLayerOp : RecordedOp {
435b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    EndUnclippedLayerOp()
4361bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr,
4371bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                         nullptr) {}
438b87eadda1818034ce03d85f30388384d1ac65916Chris Craik};
439b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
440b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyToLayerOp : RecordedOp {
441b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle)
4421bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : RecordedOp(RecordedOpId::CopyToLayerOp, op.unmappedBounds, op.localMatrix,
4431bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                         nullptr,  // clip intentionally ignored
4441bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                         op.paint)
445b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , layerHandle(layerHandle) {}
446b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
447b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    // Records a handle to the Layer object, since the Layer itself won't be
448b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    // constructed until after this operation is constructed.
449b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    OffscreenBuffer** layerHandle;
450b87eadda1818034ce03d85f30388384d1ac65916Chris Craik};
451b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
452b87eadda1818034ce03d85f30388384d1ac65916Chris Craik// draw the parameter layer underneath
453b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyFromLayerOp : RecordedOp {
454b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle)
4551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : RecordedOp(RecordedOpId::CopyFromLayerOp, op.unmappedBounds, op.localMatrix,
4561bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                         nullptr,  // clip intentionally ignored
4571bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                         op.paint)
458b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , layerHandle(layerHandle) {}
459b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
460b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    // Records a handle to the Layer object, since the Layer itself won't be
461b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    // constructed until after this operation is constructed.
462b87eadda1818034ce03d85f30388384d1ac65916Chris Craik    OffscreenBuffer** layerHandle;
463b87eadda1818034ce03d85f30388384d1ac65916Chris Craik};
464b87eadda1818034ce03d85f30388384d1ac65916Chris Craik
4650b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/**
4660b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer.
4670b7e8245db728d127ada698be63d78b33fc6e4daChris Craik *
4680b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated,
4690b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother.
4700b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */
4716fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp {
47274af6e282f8a8f75928a071e8200039517cf5c12Chris Craik    // Records a one-use (saveLayer) layer for drawing.
4735854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle)
4740b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            : SUPER_PAINTLESS(LayerOp)
4750b7e8245db728d127ada698be63d78b33fc6e4daChris Craik            , layerHandle(layerHandle)
476e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik            , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f)
477260ab726486317496bc12a57d599ea96dcde3284Mike Reed            , mode(PaintUtils::getBlendModeDirect(paint))
47874af6e282f8a8f75928a071e8200039517cf5c12Chris Craik            , colorFilter(paint ? paint->getColorFilter() : nullptr) {}
4790b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
480a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh    explicit LayerOp(RenderNode& node)
4811bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck            : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()),
4821bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck                         Matrix4::identity(), nullptr, nullptr)
483b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , layerHandle(node.getLayerHandle())
484b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , alpha(node.properties().layerProperties().alpha() / 255.0f)
485b87eadda1818034ce03d85f30388384d1ac65916Chris Craik            , mode(node.properties().layerProperties().xferMode())
48674af6e282f8a8f75928a071e8200039517cf5c12Chris Craik            , colorFilter(node.properties().layerProperties().colorFilter()) {}
4870b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
488818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // Records a handle to the Layer object, since the Layer itself won't be
489818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik    // constructed until after this operation is constructed.
4905854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik    OffscreenBuffer** layerHandle;
4910b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    const float alpha;
492260ab726486317496bc12a57d599ea96dcde3284Mike Reed    const SkBlendMode mode;
4930b7e8245db728d127ada698be63d78b33fc6e4daChris Craik
4940b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // pointer to object owned by either LayerProperties, or a recorded Paint object in a
4950b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used.
4960b7e8245db728d127ada698be63d78b33fc6e4daChris Craik    SkColorFilter* colorFilter;
4976fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik};
4986fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik
4991bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck};  // namespace uirenderer
5001bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck};  // namespace android
501