RecordedOp.h revision e5b50197e870aa6d22c3893f5d25f4279f06e5c3
15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2015 The Android Open Source Project
35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License.
65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at
75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software
115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and
145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License.
155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#ifndef ANDROID_HWUI_RECORDED_OP_H
185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define ANDROID_HWUI_RECORDED_OP_H
195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include "font/FontUtil.h"
215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include "Matrix.h"
225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include "Rect.h"
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include "RenderNode.h"
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include "utils/LinearAllocator.h"
25d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright#include "Vector.h"
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <androidfw/ResourceTypes.h>
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <SkXfermode.h>
29d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright
30d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wrightclass SkBitmap;
31834ac204ce52d874cdd7ae921e5a4d85c5e42c52Nick Kralevichclass SkPaint;
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace uirenderer {
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct ClipBase;
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass OffscreenBuffer;
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass RenderNode;
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct Vertex;
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * On of the provided macros is executed for each op type in order. The first will be used for ops
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * that cannot merge, and the second for those that can.
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * This serves as the authoritative list of ops, used for generating ID enum, and ID based LUTs.
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define MAP_OPS_BASED_ON_MERGEABILITY(U_OP_FN, M_OP_FN) \
48cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(ArcOp) \
49cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        M_OP_FN(BitmapOp) \
50cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(BitmapMeshOp) \
51cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(BitmapRectOp) \
52cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(CirclePropsOp) \
53cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(FunctorOp) \
54cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(LinesOp) \
55cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(OvalOp) \
56cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        M_OP_FN(PatchOp) \
57cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(PathOp) \
58cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(PointsOp) \
59cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(RectOp) \
60cdcd8f2b25a4bf32bb7506fc98ba541d274c9a31Michael Wright        U_OP_FN(RenderNodeOp) \
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        U_OP_FN(RoundRectOp) \
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        U_OP_FN(RoundRectPropsOp) \
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        U_OP_FN(ShadowOp) \
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        U_OP_FN(SimpleRectsOp) \
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        M_OP_FN(TextOp) \
665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        U_OP_FN(TextOnPathOp) \
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        U_OP_FN(TextureLayerOp) \
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        U_OP_FN(BeginLayerOp) \
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        U_OP_FN(EndLayerOp) \
705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        U_OP_FN(LayerOp)
715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * The provided macro is executed for each op type in order. This is used in cases where
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * merge-ability of ops doesn't matter.
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define MAP_OPS(OP_FN) \
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        MAP_OPS_BASED_ON_MERGEABILITY(OP_FN, OP_FN)
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define NULL_OP_FN(Type)
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define MAP_MERGED_OPS(OP_FN) \
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        MAP_OPS_BASED_ON_MERGEABILITY(NULL_OP_FN, OP_FN)
83962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright
84962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright// Generate OpId enum
85962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright#define IDENTITY_FN(Type) Type,
86962a108856767d6f5c17cf2854b13fef0315f8caMichael Wrightnamespace RecordedOpId {
87962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    enum {
88872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright        MAP_OPS(IDENTITY_FN)
89962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright        Count,
90962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    };
91962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright}
92962a108856767d6f5c17cf2854b13fef0315f8caMichael Wrightstatic_assert(RecordedOpId::ArcOp == 0,
93962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright        "First index must be zero for LUTs to work");
94962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright
95962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint
96962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip
97962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint)
98962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr)
99962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright
100962a108856767d6f5c17cf2854b13fef0315f8caMichael Wrightstruct RecordedOp {
101962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    /* ID from RecordedOpId - generally used for jumping into function tables */
102962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    const int opId;
103962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright
104962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */
105962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    const Rect unmappedBounds;
106962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright
107962a108856767d6f5c17cf2854b13fef0315f8caMichael Wright    /* transform in recording space (vs DisplayList origin) */
1089b04f860f23481d39c3b45379a324d3630966825Michael Wright    const Matrix4 localMatrix;
1099b04f860f23481d39c3b45379a324d3630966825Michael Wright
1109b04f860f23481d39c3b45379a324d3630966825Michael Wright    /* clip in recording space - nullptr if not clipped */
1115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const ClipBase* localClip;
1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* optional paint, stored in base object to simplify merging logic */
1145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const SkPaint* paint;
1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    RecordedOp(unsigned int opId, BASE_PARAMS)
1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : opId(opId)
1185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , unmappedBounds(unmappedBounds)
1195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , localMatrix(localMatrix)
1205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , localClip(localClip)
1215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , paint(paint) {}
1225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct RenderNodeOp : RecordedOp {
1255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode)
1265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER_PAINTLESS(RenderNodeOp)
1275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , renderNode(renderNode) {}
128552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker    RenderNode * renderNode; // not const, since drawing modifies it
129552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker
130552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker    /**
131552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker     * Holds the transformation between the projection surface ViewGroup and this RenderNode
132552a8a5d8df32f659b8d11311a244cdc6d3b7733Flanker     * drawing instance. Represents any translations / transformations done within the drawing of
1335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this
1345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * DisplayList draw instance.
1355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     *
1365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * Note: doesn't include transformation within the RenderNode, or its properties.
1375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     */
1385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Matrix4 transformFromCompositingAncestor;
1395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool skipInOrderDraw = false;
1405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown////////////////////////////////////////////////////////////////////////////////////////////////////
1435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// Standard Ops
1445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown////////////////////////////////////////////////////////////////////////////////////////////////////
1455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct ArcOp : RecordedOp {
1475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter)
1485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(ArcOp)
1495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , startAngle(startAngle)
1505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , sweepAngle(sweepAngle)
1515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , useCenter(useCenter) {}
1525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float startAngle;
1535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float sweepAngle;
1545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const bool useCenter;
1555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1566071da7ef84c60645572654504813d492b8b21d5Elliott Hughes
1575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct BitmapOp : RecordedOp {
1585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    BitmapOp(BASE_PARAMS, const SkBitmap* bitmap)
1595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(BitmapOp)
1605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , bitmap(bitmap) {}
1615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const SkBitmap* bitmap;
1625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // TODO: asset atlas/texture id lookup?
1635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct BitmapMeshOp : RecordedOp {
1665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight,
1675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const float* vertices, const int* colors)
168872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright            : SUPER(BitmapMeshOp)
169872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright            , bitmap(bitmap)
1705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , meshWidth(meshWidth)
171c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown            , meshHeight(meshHeight)
1725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , vertices(vertices)
173c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown            , colors(colors) {}
174c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    const SkBitmap* bitmap;
175c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    const int meshWidth;
176c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    const int meshHeight;
177c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    const float* vertices;
178872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright    const int* colors;
179c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown};
180c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown
181872db4f11e407accccba9d37c335ef7e3597eba4Michael Wrightstruct BitmapRectOp : RecordedOp {
1825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src)
183c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown            : SUPER(BitmapRectOp)
184c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown            , bitmap(bitmap)
185c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown            , src(src) {}
186c9aa628d065eb08d6fa30f0ac21c6eca4cfbab75Jeff Brown    const SkBitmap* bitmap;
1875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const Rect src;
1885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
1895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct CirclePropsOp : RecordedOp {
1915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
1925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            float* x, float* y, float* radius)
1935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint)
1945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , x(x)
1955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , y(y)
1965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , radius(radius) {}
1975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* x;
1985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* y;
1995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* radius;
2005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct FunctorOp : RecordedOp {
2035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    FunctorOp(BASE_PARAMS_PAINTLESS, Functor* functor)
2045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER_PAINTLESS(FunctorOp)
2055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , functor(functor) {}
206db19e463fe5a4e00a0214c564527ba67f31e1afbJeff Brown    Functor* functor;
207db19e463fe5a4e00a0214c564527ba67f31e1afbJeff Brown};
208db19e463fe5a4e00a0214c564527ba67f31e1afbJeff Brown
2095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct LinesOp : RecordedOp {
2105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    LinesOp(BASE_PARAMS, const float* points, const int floatCount)
2115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(LinesOp)
2125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , points(points)
2135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , floatCount(floatCount) {}
2145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* points;
2155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int floatCount;
2165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct OvalOp : RecordedOp {
2195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    OvalOp(BASE_PARAMS)
2208f6710fdeb96a3482adf1a6a2d46d67b0ce8e9dbMichael Wright            : SUPER(OvalOp) {}
2215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
22383e0e425c61c4e03f61114a88f117db1553cd44cFengwei Yinstruct PatchOp : RecordedOp {
2245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch)
2255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(PatchOp)
2265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , bitmap(bitmap)
2275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , patch(patch) {}
2285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const SkBitmap* bitmap;
2295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const Res_png_9patch* patch;
230d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright};
231d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright
232d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wrightstruct PathOp : RecordedOp {
233d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright    PathOp(BASE_PARAMS, const SkPath* path)
234d0bd3911462f42487944dbaf85d87d569e2f9633Michael Wright            : SUPER(PathOp)
2355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , path(path) {}
2365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const SkPath* path;
2375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct PointsOp : RecordedOp {
2405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointsOp(BASE_PARAMS, const float* points, const int floatCount)
241ed4d28dd70448b13eb74a3166ec8d1c1a530e2d4Jeff Brown            : SUPER(PointsOp)
2425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , points(points)
2435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , floatCount(floatCount) {}
2445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* points;
2455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int floatCount;
2465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct RectOp : RecordedOp {
2495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    RectOp(BASE_PARAMS)
2505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(RectOp) {}
2516071da7ef84c60645572654504813d492b8b21d5Elliott Hughes};
2525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct RoundRectOp : RecordedOp {
2545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    RoundRectOp(BASE_PARAMS, float rx, float ry)
2555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(RoundRectOp)
2565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , rx(rx)
2575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , ry(ry) {}
2585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float rx;
2595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float ry;
2605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct RoundRectPropsOp : RecordedOp {
2635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint,
2645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            float* left, float* top, float* right, float* bottom, float *rx, float *ry)
2655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint)
2665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , left(left)
2675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , top(top)
2685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , right(right)
2695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , bottom(bottom)
2705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , rx(rx)
2715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , ry(ry) {}
2725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* left;
2735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* top;
2745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* right;
2755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* bottom;
2765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* rx;
2775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* ry;
2785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
2815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Real-time, dynamic-lit shadow.
2825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
2835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time,
2845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * and are resolved dynamically, and transform isn't needed.
2855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
2865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * State construction handles these properties specially, ignoring matrix/bounds.
2875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
2885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct ShadowOp : RecordedOp {
2895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ShadowOp(const RenderNodeOp& casterOp, float casterAlpha, const SkPath* casterPath,
2905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const Rect& localClipRect, const Vector3& lightCenter)
2915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr)
2925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , shadowMatrixXY(casterOp.localMatrix)
2935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , shadowMatrixZ(casterOp.localMatrix)
2945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , casterAlpha(casterAlpha)
2955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , casterPath(casterPath)
2965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , localClipRect(localClipRect)
2975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , lightCenter(lightCenter) {
2985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        const RenderNode& node = *casterOp.renderNode;
2995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        node.applyViewPropertyTransforms(shadowMatrixXY, false);
3005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        node.applyViewPropertyTransforms(shadowMatrixZ, true);
3015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
3025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Matrix4 shadowMatrixXY;
3035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Matrix4 shadowMatrixZ;
3045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float casterAlpha;
3055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const SkPath* casterPath;
3065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const Rect localClipRect;
3075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const Vector3 lightCenter;
3085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
3095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?)
3115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount)
3125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(SimpleRectsOp)
3135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , vertices(vertices)
3145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , vertexCount(vertexCount) {}
3155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Vertex* vertices;
3165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const size_t vertexCount;
3175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
3185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct TextOp : RecordedOp {
3205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount,
3215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            float x, float y)
3225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(TextOp)
3235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , glyphs(glyphs)
3245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , positions(positions)
3255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , glyphCount(glyphCount)
3265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , x(x)
3275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , y(y) {}
3285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const glyph_t* glyphs;
3295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float* positions;
3305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int glyphCount;
3315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float x;
3325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float y;
3335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
3345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct TextOnPathOp : RecordedOp {
3365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    TextOnPathOp(BASE_PARAMS, const glyph_t* glyphs, int glyphCount,
3375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const SkPath* path, float hOffset, float vOffset)
3385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(TextOnPathOp)
3395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , glyphs(glyphs)
340872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright            , glyphCount(glyphCount)
341872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright            , path(path)
3425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , hOffset(hOffset)
3435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , vOffset(vOffset) {}
3445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const glyph_t* glyphs;
3455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int glyphCount;
3465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const SkPath* path;
3485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float hOffset;
3495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float vOffset;
3505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
3515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct TextureLayerOp : RecordedOp {
3535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    TextureLayerOp(BASE_PARAMS_PAINTLESS, Layer* layer)
3545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER_PAINTLESS(TextureLayerOp)
3555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , layer(layer) {}
3565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    Layer* layer;
3575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
3585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown////////////////////////////////////////////////////////////////////////////////////////////////////
3605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown// Layers
3615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown////////////////////////////////////////////////////////////////////////////////////////////////////
3625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
3645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Stateful operation! denotes the creation of an off-screen layer,
3655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * and that commands following will render into it.
3665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
3675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct BeginLayerOp : RecordedOp {
3685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    BeginLayerOp(BASE_PARAMS)
3695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER(BeginLayerOp) {}
3705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
3715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
3735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Stateful operation! Denotes end of off-screen layer, and that
3745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * commands since last BeginLayerOp should be drawn into parent FBO.
3755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
3765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * State in this op is empty, it just serves to signal that a layer has been finished.
3775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
3785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct EndLayerOp : RecordedOp {
3795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EndLayerOp()
3805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {}
3815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
3825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
3845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Draws an OffscreenBuffer.
3855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
3865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated,
3875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * when creating/tracking a SkPaint* during defer isn't worth the bother.
3885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
3895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct LayerOp : RecordedOp {
3905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed.
3915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle)
3925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            : SUPER_PAINTLESS(LayerOp)
3935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , layerHandle(layerHandle)
3945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f)
3955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , mode(PaintUtils::getXfermodeDirect(paint))
3965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , colorFilter(paint ? paint->getColorFilter() : nullptr)
3975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            , destroy(true) {}
3985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
3995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    LayerOp(RenderNode& node)
4005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), nullptr, nullptr)
4017b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        , layerHandle(node.getLayerHandle())
4027b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        , alpha(node.properties().layerProperties().alpha() / 255.0f)
4037b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        , mode(node.properties().layerProperties().xferMode())
4047b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright        , colorFilter(node.properties().layerProperties().colorFilter())
40521957b9c6d731dc67067e702c644dc7f4c4ff48dMichael Wright        , destroy(false) {}
40621957b9c6d731dc67067e702c644dc7f4c4ff48dMichael Wright
4075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Records a handle to the Layer object, since the Layer itself won't be
4085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // constructed until after this operation is constructed.
4095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    OffscreenBuffer** layerHandle;
4105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float alpha;
4115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const SkXfermode::Mode mode;
4125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // pointer to object owned by either LayerProperties, or a recorded Paint object in a
4145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used.
4155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    SkColorFilter* colorFilter;
4165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // whether to destroy the layer, once rendered
4185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const bool destroy;
4195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
4205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; // namespace uirenderer
4225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; // namespace android
4235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
4245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // ANDROID_HWUI_RECORDED_OP_H
4255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown