RecordedOp.h revision aafb01d8ade0def3f51b74ae3bbc610c4ab33044
19439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/*
28949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta * Copyright (C) 2015 The Android Open Source Project
39439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
49439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
59439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * you may not use this file except in compliance with the License.
69439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * You may obtain a copy of the License at
79439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
89439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
99439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Unless required by applicable law or agreed to in writing, software
119439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * See the License for the specific language governing permissions and
149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * limitations under the License.
159439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */
169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
179439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#ifndef ANDROID_HWUI_RECORDED_OP_H
189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define ANDROID_HWUI_RECORDED_OP_H
199439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "RecordedOp.h"
219439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "font/FontUtil.h"
229439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "Matrix.h"
239439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "Rect.h"
249439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "RenderNode.h"
259439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "TessellationCache.h"
269439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "utils/LinearAllocator.h"
279439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "Vector.h"
289439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
299439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include <androidfw/ResourceTypes.h>
309439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include <SkXfermode.h>
319439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
329439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellyclass SkBitmap;
339439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellyclass SkPaint;
349439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
359439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellynamespace android {
362e0da96e757a977154063f980d3f4e1abd41cf09Nick Pellynamespace uirenderer {
372e0da96e757a977154063f980d3f4e1abd41cf09Nick Pelly
382e0da96e757a977154063f980d3f4e1abd41cf09Nick Pellystruct ClipBase;
3925f2c4cd953764008d04147a14d990c06a8154e5Oscar Montemayorclass OffscreenBuffer;
409439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellyclass RenderNode;
419439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct Vertex;
429439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
43238e0f934f1f47263b384bc745ae0678c777130dCasper Bondenamespace VectorDrawable {
442e0da96e757a977154063f980d3f4e1abd41cf09Nick Pellyclass Tree;
459439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}
469439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
479439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/**
489439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Authoritative op list, used for generating the op ID enum, ID based LUTS, and
4905ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * the functions to which they dispatch. Parameter macros are executed for each op,
5005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * in order, based on the op's type.
519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
529439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * There are 4 types of op, which defines dispatch/LUT capability:
539439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
549439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *              | DisplayList |   Render    |    Merge    |
559439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * -------------|-------------|-------------|-------------|
569439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * PRE RENDER   |     Yes     |             |             |
5705ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * RENDER ONLY  |             |     Yes     |             |
589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * UNMERGEABLE  |     Yes     |     Yes     |             |
599439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * MERGEABLE    |     Yes     |     Yes     |     Yes     |
609439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
619439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * PRE RENDER - These ops are recorded into DisplayLists, but can't be directly rendered. This
629439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *      may be because they need to be transformed into other op types (e.g. CirclePropsOp),
639439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *      be traversed to access multiple renderable ops within (e.g. RenderNodeOp), or because they
6405ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun *      modify renderbuffer lifecycle, instead of directly rendering content (the various LayerOps).
659439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
669439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * RENDER ONLY - These ops cannot be recorded into DisplayLists, and are instead implicitly
679439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *      constructed from other commands/RenderNode properties. They cannot be merged.
689439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
699439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * UNMERGEABLE - These ops can be recorded into DisplayLists and rendered directly, but do not
709439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *      support merged rendering.
719439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
7205ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * MERGEABLE - These ops can be recorded into DisplayLists and rendered individually, or merged
739439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *      under certain circumstances.
749439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */
759439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define MAP_OPS_BASED_ON_TYPE(PRE_RENDER_OP_FN, RENDER_ONLY_OP_FN, UNMERGEABLE_OP_FN, MERGEABLE_OP_FN) \
769439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        PRE_RENDER_OP_FN(RenderNodeOp) \
779439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        PRE_RENDER_OP_FN(CirclePropsOp) \
789439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        PRE_RENDER_OP_FN(RoundRectPropsOp) \
799439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        PRE_RENDER_OP_FN(BeginLayerOp) \
8005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun        PRE_RENDER_OP_FN(EndLayerOp) \
8105ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun        PRE_RENDER_OP_FN(BeginUnclippedLayerOp) \
829439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        PRE_RENDER_OP_FN(EndUnclippedLayerOp) \
839439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        PRE_RENDER_OP_FN(VectorDrawableOp) \
849439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        \
859439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        RENDER_ONLY_OP_FN(ShadowOp) \
869439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        RENDER_ONLY_OP_FN(LayerOp) \
879439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        RENDER_ONLY_OP_FN(CopyToLayerOp) \
8805ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun        RENDER_ONLY_OP_FN(CopyFromLayerOp) \
8905ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun        \
9005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun        UNMERGEABLE_OP_FN(ArcOp) \
919439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(BitmapMeshOp) \
929439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(BitmapRectOp) \
939439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(ColorOp) \
949439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(FunctorOp) \
959439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(LinesOp) \
969439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(OvalOp) \
9705ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun        UNMERGEABLE_OP_FN(PathOp) \
9805ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun        UNMERGEABLE_OP_FN(PointsOp) \
999439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(RectOp) \
1009439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(RoundRectOp) \
1019439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(SimpleRectsOp) \
1029439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(TextOnPathOp) \
1039439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        UNMERGEABLE_OP_FN(TextureLayerOp) \
1049439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        \
10505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun        MERGEABLE_OP_FN(BitmapOp) \
1069439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        MERGEABLE_OP_FN(PatchOp) \
1079439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        MERGEABLE_OP_FN(TextOp)
1089439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
1099439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/**
1109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * LUT generators, which will insert nullptr for unsupported ops
1119439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */
1129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define NULLPTR_OP_FN(Type) nullptr,
11305ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun
1149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BUILD_DEFERRABLE_OP_LUT(OP_FN) \
1159439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        { MAP_OPS_BASED_ON_TYPE(OP_FN, NULLPTR_OP_FN, OP_FN, OP_FN) }
1169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
1179439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BUILD_MERGEABLE_OP_LUT(OP_FN) \
1189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, NULLPTR_OP_FN, NULLPTR_OP_FN, OP_FN) }
1199439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
1209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BUILD_RENDERABLE_OP_LUT(OP_FN) \
1213998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun        { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, OP_FN, OP_FN, OP_FN) }
1223998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
1233998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun#define BUILD_FULL_OP_LUT(OP_FN) \
1243998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun        { MAP_OPS_BASED_ON_TYPE(OP_FN, OP_FN, OP_FN, OP_FN) }
1253998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
1263998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun/**
1273998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * Op mapping functions, which skip unsupported ops.
1283998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun *
1293998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * Note: Do not use for LUTS, since these do not preserve ID order.
1303998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun */
1313998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun#define NULL_OP_FN(Type)
1323998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
1333998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun#define MAP_DEFERRABLE_OPS(OP_FN) \
1343998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun        MAP_OPS_BASED_ON_TYPE(OP_FN, NULL_OP_FN, OP_FN, OP_FN)
13505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun
1369439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define MAP_MERGEABLE_OPS(OP_FN) \
1379439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, NULL_OP_FN, NULL_OP_FN, OP_FN)
1389439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
1399439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define MAP_RENDERABLE_OPS(OP_FN) \
1409439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, OP_FN, OP_FN, OP_FN)
1419439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
1429439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly// Generate OpId enum
1433998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun#define IDENTITY_FN(Type) Type,
1443998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunnamespace RecordedOpId {
1459439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    enum {
1463998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun        MAP_OPS_BASED_ON_TYPE(IDENTITY_FN, IDENTITY_FN, IDENTITY_FN, IDENTITY_FN)
1479439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        Count,
1483998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    };
1493998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun}
1509439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystatic_assert(RecordedOpId::RenderNodeOp == 0,
1519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly        "First index must be zero for LUTs to work");
15205ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun
1539439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint
1549439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip
1559439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint)
1569439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr)
1579439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
1589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct RecordedOp {
1593998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    /* ID from RecordedOpId - generally used for jumping into function tables */
1603998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const int opId;
1613998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
1623998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */
1633998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const Rect unmappedBounds;
1643998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
1653998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    /* transform in recording space (vs DisplayList origin) */
1663998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const Matrix4 localMatrix;
1673998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
1683998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    /* clip in recording space - nullptr if not clipped */
1693998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const ClipBase* localClip;
1703998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
1713998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    /* optional paint, stored in base object to simplify merging logic */
1723998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const SkPaint* paint;
1733998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunprotected:
17405ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun    RecordedOp(unsigned int opId, BASE_PARAMS)
17505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun            : opId(opId)
1763998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , unmappedBounds(unmappedBounds)
1773998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , localMatrix(localMatrix)
1783998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , localClip(localClip)
1793998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , paint(paint) {}
1803998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun};
181238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
182238e0f934f1f47263b384bc745ae0678c777130dCasper Bondestruct RenderNodeOp : RecordedOp {
183238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode)
184238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            : SUPER_PAINTLESS(RenderNodeOp)
185238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            , renderNode(renderNode) {}
186238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    RenderNode * renderNode; // not const, since drawing modifies it
187238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
188238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    /**
189238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * Holds the transformation between the projection surface ViewGroup and this RenderNode
190238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * drawing instance. Represents any translations / transformations done within the drawing of
191238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this
192238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * DisplayList draw instance.
193238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     *
194238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * Note: doesn't include transformation within the RenderNode, or its properties.
195238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     */
196238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    Matrix4 transformFromCompositingAncestor;
1973998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    bool skipInOrderDraw = false;
1989439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
1993998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
2009439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly////////////////////////////////////////////////////////////////////////////////////////////////////
2018949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta// Standard Ops
2028949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta////////////////////////////////////////////////////////////////////////////////////////////////////
2033998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
2049439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct ArcOp : RecordedOp {
2053998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter)
2069439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(ArcOp)
2073998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , startAngle(startAngle)
2089439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , sweepAngle(sweepAngle)
2093998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , useCenter(useCenter) {}
2109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float startAngle;
2113998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const float sweepAngle;
2129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const bool useCenter;
2133998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun};
2149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
2153998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunstruct BitmapOp : RecordedOp {
2169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    BitmapOp(BASE_PARAMS, const SkBitmap* bitmap)
2173998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            : SUPER(BitmapOp)
2189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , bitmap(bitmap) {}
2193998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const SkBitmap* bitmap;
2209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    // TODO: asset atlas/texture id lookup?
2213998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun};
2229439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
223238e0f934f1f47263b384bc745ae0678c777130dCasper Bondestruct BitmapMeshOp : RecordedOp {
2249439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight,
2253998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            const float* vertices, const int* colors)
2269439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(BitmapMeshOp)
2273998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , bitmap(bitmap)
2289439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , meshWidth(meshWidth)
2293998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , meshHeight(meshHeight)
2309439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , vertices(vertices)
231238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            , colors(colors) {}
232238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    const SkBitmap* bitmap;
233238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    const int meshWidth;
234238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    const int meshHeight;
235238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    const float* vertices;
236238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    const int* colors;
2379439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
23805ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun
2399439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct BitmapRectOp : RecordedOp {
24005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun    BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src)
24105ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun            : SUPER(BitmapRectOp)
24205ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun            , bitmap(bitmap)
24305ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun            , src(src) {}
24405ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun    const SkBitmap* bitmap;
24505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun    const Rect src;
24605ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun};
2479439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
2489439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct CirclePropsOp : RecordedOp {
2499439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
2509439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            float* x, float* y, float* radius)
2519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint)
2529439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , x(x)
2533998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , y(y)
2543998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , radius(radius) {}
2553998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const float* x;
2563998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const float* y;
2579439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float* radius;
2589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
2599439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
2609439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct ColorOp : RecordedOp {
2618949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta    // Note: unbounded op that will fillclip, so no bounds/matrix needed
2628949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta    ColorOp(const ClipBase* localClip, int color, SkXfermode::Mode mode)
2638949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta            : RecordedOp(RecordedOpId::ColorOp, Rect(), Matrix4::identity(), localClip, nullptr)
2648949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta            , color(color)
2658949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta            , mode(mode) {}
2668949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta    const int color;
2678949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta    const SkXfermode::Mode mode;
2688949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta};
2698949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta
2708949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Guptastruct FunctorOp : RecordedOp {
2718949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta    // Note: undefined record-time bounds, since this op fills the clip
2728949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta    // TODO: explicitly define bounds
2738949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta    FunctorOp(const Matrix4& localMatrix, const ClipBase* localClip, Functor* functor)
2748949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta            : RecordedOp(RecordedOpId::FunctorOp, Rect(), localMatrix, localClip, nullptr)
2758949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta            , functor(functor) {}
2768949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta    Functor* functor;
2778949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta};
2788949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta
2798949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Guptastruct LinesOp : RecordedOp {
28005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun    LinesOp(BASE_PARAMS, const float* points, const int floatCount)
2819439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(LinesOp)
28205ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun            , points(points)
2839439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , floatCount(floatCount) {}
2849439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float* points;
2859439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const int floatCount;
2869439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
28705ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun
28805ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejunstruct OvalOp : RecordedOp {
28905ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun    OvalOp(BASE_PARAMS)
29005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun            : SUPER(OvalOp) {}
2919439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
2929439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
2939439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct PatchOp : RecordedOp {
2949439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch)
2959439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(PatchOp)
2969439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , bitmap(bitmap)
2979439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , patch(patch) {}
2989439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const SkBitmap* bitmap;
2993998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const Res_png_9patch* patch;
3009439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
3019439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
3029439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct PathOp : RecordedOp {
3039439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    PathOp(BASE_PARAMS, const SkPath* path)
3049439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(PathOp)
3059439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , path(path) {}
3069439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const SkPath* path;
3079439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
3083998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
3099439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct PointsOp : RecordedOp {
3109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    PointsOp(BASE_PARAMS, const float* points, const int floatCount)
3119439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(PointsOp)
3129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , points(points)
3139439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , floatCount(floatCount) {}
3148949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta    const float* points;
3153998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const int floatCount;
3169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
3179439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
3189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct RectOp : RecordedOp {
3199439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    RectOp(BASE_PARAMS)
3209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(RectOp) {}
3213998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun};
3229439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
3239439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct RoundRectOp : RecordedOp {
3249439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    RoundRectOp(BASE_PARAMS, float rx, float ry)
3259439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(RoundRectOp)
3263998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , rx(rx)
3279439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , ry(ry) {}
3289439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float rx;
3299439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float ry;
3309439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
3319439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
3329439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct RoundRectPropsOp : RecordedOp {
3339439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
3349439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            float* left, float* top, float* right, float* bottom, float *rx, float *ry)
3353998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint)
3369439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , left(left)
3379439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , top(top)
3389439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , right(right)
3399439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , bottom(bottom)
3409439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , rx(rx)
3413998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , ry(ry) {}
3429439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float* left;
3439439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float* top;
3449439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float* right;
3459439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float* bottom;
3469439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float* rx;
3473998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const float* ry;
3489439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
3499439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
3509439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct VectorDrawableOp : RecordedOp {
3519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    VectorDrawableOp(VectorDrawable::Tree* tree, BASE_PARAMS_PAINTLESS)
3529439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER_PAINTLESS(VectorDrawableOp)
3533998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , vectorDrawable(tree) {}
3549439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    VectorDrawable::Tree* vectorDrawable;
3559439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
3569439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
3573998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun/**
3589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Real-time, dynamic-lit shadow.
3599439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
3609439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time,
3619439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * and are resolved dynamically, and transform isn't needed.
3623998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun *
3633998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * State construction handles these properties specially, ignoring matrix/bounds.
3649439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */
3659439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct ShadowOp : RecordedOp {
3669439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha)
3679439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr)
3689439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , shadowTask(shadowTask)
3693998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , casterAlpha(casterAlpha) {
3709439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    };
3719439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    sp<TessellationCache::ShadowTask> shadowTask;
3729439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float casterAlpha;
3739439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
3743998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
3753998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?)
3769439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount)
3779439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(SimpleRectsOp)
3789439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , vertices(vertices)
3799439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , vertexCount(vertexCount) {}
3809439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    Vertex* vertices;
3813998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const size_t vertexCount;
3829439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
3839439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
3849439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct TextOp : RecordedOp {
3859439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount,
3863998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            float x, float y)
3873998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            : SUPER(TextOp)
3889439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , glyphs(glyphs)
3899439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , positions(positions)
3909439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , glyphCount(glyphCount)
3919439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , x(x)
3929439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , y(y) {}
3933998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const glyph_t* glyphs;
3949439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float* positions;
3959439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const int glyphCount;
3969439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float x;
3979439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float y;
3983998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun};
3993998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
4009439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct TextOnPathOp : RecordedOp {
4019439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    // TODO: explicitly define bounds
4029439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    TextOnPathOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
4039439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            const glyph_t* glyphs, int glyphCount, const SkPath* path, float hOffset, float vOffset)
4049439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : RecordedOp(RecordedOpId::TextOnPathOp, Rect(), localMatrix, localClip, paint)
4053998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , glyphs(glyphs)
4069439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , glyphCount(glyphCount)
4079439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , path(path)
4089439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , hOffset(hOffset)
4099439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , vOffset(vOffset) {}
4109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const glyph_t* glyphs;
4113998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const int glyphCount;
4123998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
4139439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const SkPath* path;
4149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float hOffset;
4159439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float vOffset;
416238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde};
417238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
418238e0f934f1f47263b384bc745ae0678c777130dCasper Bondestruct TextureLayerOp : RecordedOp {
419238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    TextureLayerOp(BASE_PARAMS_PAINTLESS, Layer* layer)
420238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            : SUPER_PAINTLESS(TextureLayerOp)
421238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            , layer(layer) {}
422238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
423238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    // Copy an existing TextureLayerOp, replacing the underlying matrix
424238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    TextureLayerOp(const TextureLayerOp& op, const Matrix4& replacementMatrix)
425238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            : RecordedOp(RecordedOpId::TextureLayerOp, op.unmappedBounds, replacementMatrix,
426238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde                    op.localClip, op.paint)
427238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            , layer(op.layer) {
428238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
429238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    }
430238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    Layer* layer;
431238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde};
432238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
433238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde////////////////////////////////////////////////////////////////////////////////////////////////////
434238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde// Layers
435238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde////////////////////////////////////////////////////////////////////////////////////////////////////
436238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
437238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde/**
438238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * Stateful operation! denotes the creation of an off-screen layer,
439238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * and that commands following will render into it.
4409439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */
4419439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct BeginLayerOp : RecordedOp {
4429439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    BeginLayerOp(BASE_PARAMS)
4439439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(BeginLayerOp) {}
4449439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
4459439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
4469439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/**
4473998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * Stateful operation! Denotes end of off-screen layer, and that
4489439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * commands since last BeginLayerOp should be drawn into parent FBO.
4499439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
4509439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * State in this op is empty, it just serves to signal that a layer has been finished.
4519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */
4529439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct EndLayerOp : RecordedOp {
4539439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    EndLayerOp()
4549439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {}
4553998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun};
4569439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
4579439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct BeginUnclippedLayerOp : RecordedOp {
4589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    BeginUnclippedLayerOp(BASE_PARAMS)
4599439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : SUPER(BeginUnclippedLayerOp) {}
4609439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
4613998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
4623998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunstruct EndUnclippedLayerOp : RecordedOp {
4633998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    EndUnclippedLayerOp()
4649439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {}
4659439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
4669439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
4679439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct CopyToLayerOp : RecordedOp {
4689439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle)
4699439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : RecordedOp(RecordedOpId::CopyToLayerOp,
4709439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly                    op.unmappedBounds,
4719439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly                    op.localMatrix,
4729439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly                    nullptr, // clip intentionally ignored
4733998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun                    op.paint)
4749439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , layerHandle(layerHandle) {}
4759439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
4769439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    // Records a handle to the Layer object, since the Layer itself won't be
4779439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    // constructed until after this operation is constructed.
4789439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    OffscreenBuffer** layerHandle;
4799439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
4809439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
4819439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
4823998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun// draw the parameter layer underneath
4839439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct CopyFromLayerOp : RecordedOp {
4849439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle)
4859439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : RecordedOp(RecordedOpId::CopyFromLayerOp,
4869439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly                    op.unmappedBounds,
4879439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly                    op.localMatrix,
4889439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly                    nullptr, // clip intentionally ignored
4899439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly                    op.paint)
4909439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , layerHandle(layerHandle) {}
4919439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
4923998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    // Records a handle to the Layer object, since the Layer itself won't be
4939439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    // constructed until after this operation is constructed.
4949439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    OffscreenBuffer** layerHandle;
4959439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly};
4969439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
4979439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/**
4989439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Draws an OffscreenBuffer.
4999439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly *
50005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated,
5019439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * when creating/tracking a SkPaint* during defer isn't worth the bother.
5029439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */
5039439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct LayerOp : RecordedOp {
50405ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun    // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed.
50505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun    LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle)
50605ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun            : SUPER_PAINTLESS(LayerOp)
50705ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun            , layerHandle(layerHandle)
5082e0da96e757a977154063f980d3f4e1abd41cf09Nick Pelly            , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f)
50905ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun            , mode(PaintUtils::getXfermodeDirect(paint))
5109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , colorFilter(paint ? paint->getColorFilter() : nullptr)
5119439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , destroy(true) {}
5129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
5139439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    LayerOp(RenderNode& node)
5149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), nullptr, nullptr)
5153998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , layerHandle(node.getLayerHandle())
5169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , alpha(node.properties().layerProperties().alpha() / 255.0f)
5173998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , mode(node.properties().layerProperties().xferMode())
5189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly            , colorFilter(node.properties().layerProperties().colorFilter())
5193998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun            , destroy(false) {}
5209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
5213998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    // Records a handle to the Layer object, since the Layer itself won't be
5229439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    // constructed until after this operation is constructed.
5233998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    OffscreenBuffer** layerHandle;
5249439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const float alpha;
5253998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    const SkXfermode::Mode mode;
5269439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
5273998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    // pointer to object owned by either LayerProperties, or a recorded Paint object in a
5289439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used.
5293998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    SkColorFilter* colorFilter;
5309439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly
5313998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun    // whether to destroy the layer, once rendered
5329439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly    const bool destroy;
5333998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun};
534fe3807a5b23f54f6539436d71aa0cd931a2b76f0Matthew Xie
535fe3807a5b23f54f6539436d71aa0cd931a2b76f0Matthew Xie}; // namespace uirenderer
5369439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; // namespace android
5373998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun
5389439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#endif // ANDROID_HWUI_RECORDED_OP_H
5393998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun