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