RecordedOp.h revision 6e068c0182f6f85bccb855a647510724d1c65a13
1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/* 2b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Copyright (C) 2015 The Android Open Source Project 3b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 4b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * you may not use this file except in compliance with the License. 6b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * You may obtain a copy of the License at 7b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 8b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 10b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Unless required by applicable law or agreed to in writing, software 11b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * See the License for the specific language governing permissions and 14b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * limitations under the License. 15b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 16b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 17b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#ifndef ANDROID_HWUI_RECORDED_OP_H 18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define ANDROID_HWUI_RECORDED_OP_H 19b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 20a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik#include "font/FontUtil.h" 21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h" 2298787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Rect.h" 230b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#include "RenderNode.h" 246e068c0182f6f85bccb855a647510724d1c65a13Chris Craik#include "TessellationCache.h" 2598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "utils/LinearAllocator.h" 2698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Vector.h" 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 28f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <androidfw/ResourceTypes.h> 29f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <SkXfermode.h> 30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap; 32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint; 33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 35b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 37e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipBase; 385854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer; 39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode; 40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex; 41b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/** 437cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Authoritative op list, used for generating the op ID enum, ID based LUTS, and 447cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * the functions to which they dispatch. Parameter macros are executed for each op, 457cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * in order, based on the op's type. 46b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 47b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * There are 4 types of op, which defines dispatch/LUT capability: 487cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * 49b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * | DisplayList | Render | Merge | 50b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * -------------|-------------|-------------|-------------| 51b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER | Yes | | | 52b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY | | Yes | | 53b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE | Yes | Yes | | 54b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE | Yes | Yes | Yes | 55b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 56b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER - These ops are recorded into DisplayLists, but can't be directly rendered. This 57b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * may be because they need to be transformed into other op types (e.g. CirclePropsOp), 58b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * be traversed to access multiple renderable ops within (e.g. RenderNodeOp), or because they 59b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * modify renderbuffer lifecycle, instead of directly rendering content (the various LayerOps). 60b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 61b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY - These ops cannot be recorded into DisplayLists, and are instead implicitly 62b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * constructed from other commands/RenderNode properties. They cannot be merged. 63b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 64b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE - These ops can be recorded into DisplayLists and rendered directly, but do not 65b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * support merged rendering. 66b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 67b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE - These ops can be recorded into DisplayLists and rendered individually, or merged 68b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * under certain circumstances. 69b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 707cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_OPS_BASED_ON_TYPE(PRE_RENDER_OP_FN, RENDER_ONLY_OP_FN, UNMERGEABLE_OP_FN, MERGEABLE_OP_FN) \ 717cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(RenderNodeOp) \ 727cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(CirclePropsOp) \ 737cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(RoundRectPropsOp) \ 747cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(BeginLayerOp) \ 757cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(EndLayerOp) \ 76b87eadda1818034ce03d85f30388384d1ac65916Chris Craik PRE_RENDER_OP_FN(BeginUnclippedLayerOp) \ 77b87eadda1818034ce03d85f30388384d1ac65916Chris Craik PRE_RENDER_OP_FN(EndUnclippedLayerOp) \ 787cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik \ 797cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik RENDER_ONLY_OP_FN(ShadowOp) \ 807cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik RENDER_ONLY_OP_FN(LayerOp) \ 81b87eadda1818034ce03d85f30388384d1ac65916Chris Craik RENDER_ONLY_OP_FN(CopyToLayerOp) \ 82b87eadda1818034ce03d85f30388384d1ac65916Chris Craik RENDER_ONLY_OP_FN(CopyFromLayerOp) \ 837cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik \ 847cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(ArcOp) \ 857cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(BitmapMeshOp) \ 867cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(BitmapRectOp) \ 877cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(FunctorOp) \ 887cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(LinesOp) \ 897cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(OvalOp) \ 907cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(PathOp) \ 917cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(PointsOp) \ 927cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(RectOp) \ 937cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(RoundRectOp) \ 947cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(SimpleRectsOp) \ 957cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(TextOnPathOp) \ 967cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(TextureLayerOp) \ 977cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik \ 987cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MERGEABLE_OP_FN(BitmapOp) \ 997cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MERGEABLE_OP_FN(PatchOp) \ 1007cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MERGEABLE_OP_FN(TextOp) 10115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 10215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/** 1037cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * LUT generators, which will insert nullptr for unsupported ops 10415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */ 1057cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define NULLPTR_OP_FN(Type) nullptr, 1067cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1077cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_DEFERRABLE_OP_LUT(OP_FN) \ 1087cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik { MAP_OPS_BASED_ON_TYPE(OP_FN, NULLPTR_OP_FN, OP_FN, OP_FN) } 1097cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1107cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_MERGEABLE_OP_LUT(OP_FN) \ 1117cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, NULLPTR_OP_FN, NULLPTR_OP_FN, OP_FN) } 11215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 1137cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_RENDERABLE_OP_LUT(OP_FN) \ 1147cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, OP_FN, OP_FN, OP_FN) } 1157cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1167cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik/** 1177cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Op mapping functions, which skip unsupported ops. 1187cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * 1197cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Note: Do not use for LUTS, since these do not preserve ID order. 1207cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik */ 12115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type) 12215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 123b87eadda1818034ce03d85f30388384d1ac65916Chris Craik#define MAP_DEFERRABLE_OPS(OP_FN) \ 124b87eadda1818034ce03d85f30388384d1ac65916Chris Craik MAP_OPS_BASED_ON_TYPE(OP_FN, NULL_OP_FN, OP_FN, OP_FN) 125b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 1267cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_MERGEABLE_OPS(OP_FN) \ 1277cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, NULL_OP_FN, NULL_OP_FN, OP_FN) 1287cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1297cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_RENDERABLE_OPS(OP_FN) \ 1307cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, OP_FN, OP_FN, OP_FN) 1317cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 132b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum 133b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type, 134b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId { 135b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik enum { 1367cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_OPS_BASED_ON_TYPE(IDENTITY_FN, IDENTITY_FN, IDENTITY_FN, IDENTITY_FN) 137b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Count, 138b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik }; 139b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 1407cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craikstatic_assert(RecordedOpId::RenderNodeOp == 0, 141b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik "First index must be zero for LUTs to work"); 142b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 143e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint 144e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip 145e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint) 146e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr) 147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 148b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp { 149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* ID from RecordedOpId - generally used for jumping into function tables */ 150b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const int opId; 151b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 152386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */ 153b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect unmappedBounds; 154b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 155b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* transform in recording space (vs DisplayList origin) */ 156b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Matrix4 localMatrix; 157b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 158e4db79de127cfe961195f52907af8451026eaa20Chris Craik /* clip in recording space - nullptr if not clipped */ 159e4db79de127cfe961195f52907af8451026eaa20Chris Craik const ClipBase* localClip; 160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 161b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* optional paint, stored in base object to simplify merging logic */ 162b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkPaint* paint; 163b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected: 164b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RecordedOp(unsigned int opId, BASE_PARAMS) 165b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : opId(opId) 166b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , unmappedBounds(unmappedBounds) 167b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localMatrix(localMatrix) 168e4db79de127cfe961195f52907af8451026eaa20Chris Craik , localClip(localClip) 169b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , paint(paint) {} 170b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 171b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 172b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp { 173b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode) 174b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER_PAINTLESS(RenderNodeOp) 175b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , renderNode(renderNode) {} 1768d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik RenderNode * renderNode; // not const, since drawing modifies it 1778d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik 1788d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik /** 1798d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Holds the transformation between the projection surface ViewGroup and this RenderNode 1808d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * drawing instance. Represents any translations / transformations done within the drawing of 1818d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this 1828d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * DisplayList draw instance. 1838d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * 1848d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Note: doesn't include transformation within the RenderNode, or its properties. 1858d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik */ 1868d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik Matrix4 transformFromCompositingAncestor; 187161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik bool skipInOrderDraw = false; 188b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 189b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 190a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 191a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops 192a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 193a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 194386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp { 195386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter) 196386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(ArcOp) 197386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , startAngle(startAngle) 198386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , sweepAngle(sweepAngle) 199386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , useCenter(useCenter) {} 200386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float startAngle; 201386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float sweepAngle; 202386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const bool useCenter; 203386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 204386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 205b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp { 206b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik BitmapOp(BASE_PARAMS, const SkBitmap* bitmap) 207b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(BitmapOp) 208b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , bitmap(bitmap) {} 209b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkBitmap* bitmap; 210b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // TODO: asset atlas/texture id lookup? 211b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 212b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 213f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp { 214f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight, 215f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices, const int* colors) 216f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapMeshOp) 217f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 218f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshWidth(meshWidth) 219f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshHeight(meshHeight) 220f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , vertices(vertices) 221f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , colors(colors) {} 222f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 223f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshWidth; 224f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshHeight; 225f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices; 226f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int* colors; 227f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 228f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 229f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp { 230f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src) 231f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapRectOp) 232f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 233f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , src(src) {} 234f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 235f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Rect src; 236f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 237f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 238268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct CirclePropsOp : RecordedOp { 239e4db79de127cfe961195f52907af8451026eaa20Chris Craik CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 240268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* x, float* y, float* radius) 241e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint) 242268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , x(x) 243268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , y(y) 244268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , radius(radius) {} 245268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* x; 246268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* y; 247268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* radius; 248268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 249268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 250e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craikstruct FunctorOp : RecordedOp { 251e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik FunctorOp(BASE_PARAMS_PAINTLESS, Functor* functor) 252e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik : SUPER_PAINTLESS(FunctorOp) 253e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik , functor(functor) {} 254e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik Functor* functor; 255e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik}; 256e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik 257a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp { 258a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik LinesOp(BASE_PARAMS, const float* points, const int floatCount) 259a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(LinesOp) 260a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , points(points) 261a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , floatCount(floatCount) {} 262a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* points; 263a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int floatCount; 264a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 265a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 266386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp { 267386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik OvalOp(BASE_PARAMS) 268386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(OvalOp) {} 269386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 270386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 271f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp { 272f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch) 273f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(PatchOp) 274f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 275f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , patch(patch) {} 276f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 277f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Res_png_9patch* patch; 278f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 279f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 280386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp { 281386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PathOp(BASE_PARAMS, const SkPath* path) 282386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PathOp) 283386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , path(path) {} 284386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const SkPath* path; 285386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 286386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 287386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp { 288386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PointsOp(BASE_PARAMS, const float* points, const int floatCount) 289386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PointsOp) 290386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , points(points) 291386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , floatCount(floatCount) {} 292386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float* points; 293386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const int floatCount; 294386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 295386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 296b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp { 297b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RectOp(BASE_PARAMS) 298b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(RectOp) {} 299b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 300b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 301386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp { 302386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik RoundRectOp(BASE_PARAMS, float rx, float ry) 303386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(RoundRectOp) 304386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , rx(rx) 305386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , ry(ry) {} 306386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float rx; 307386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float ry; 308386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 309386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 310268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct RoundRectPropsOp : RecordedOp { 311e4db79de127cfe961195f52907af8451026eaa20Chris Craik RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 312268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* left, float* top, float* right, float* bottom, float *rx, float *ry) 313e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint) 314268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , left(left) 315268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , top(top) 316268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , right(right) 317268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , bottom(bottom) 318268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , rx(rx) 319268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , ry(ry) {} 320268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* left; 321268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* top; 322268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* right; 323268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* bottom; 324268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* rx; 325268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* ry; 326268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 327268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 328d3daa3198e2212c985c634821682d5819346b653Chris Craik/** 329d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow. 330d3daa3198e2212c985c634821682d5819346b653Chris Craik * 331d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time, 332d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed. 333d3daa3198e2212c985c634821682d5819346b653Chris Craik * 33498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds. 335d3daa3198e2212c985c634821682d5819346b653Chris Craik */ 336d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp { 3376e068c0182f6f85bccb855a647510724d1c65a13Chris Craik ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha) 338e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr) 3396e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , shadowTask(shadowTask) 3406e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , casterAlpha(casterAlpha) { 341d3daa3198e2212c985c634821682d5819346b653Chris Craik }; 3426e068c0182f6f85bccb855a647510724d1c65a13Chris Craik sp<TessellationCache::ShadowTask> shadowTask; 343d3daa3198e2212c985c634821682d5819346b653Chris Craik const float casterAlpha; 344d3daa3198e2212c985c634821682d5819346b653Chris Craik}; 345d3daa3198e2212c985c634821682d5819346b653Chris Craik 346b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?) 347b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount) 348b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(SimpleRectsOp) 349b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertices(vertices) 350b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertexCount(vertexCount) {} 351b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Vertex* vertices; 352b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const size_t vertexCount; 353b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 354b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 355a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp { 356a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, 357a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik float x, float y) 358a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(TextOp) 359a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphs(glyphs) 360a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , positions(positions) 361a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphCount(glyphCount) 362a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , x(x) 363a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , y(y) {} 364a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const glyph_t* glyphs; 365a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* positions; 366a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int glyphCount; 367a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float x; 368a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float y; 369a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 370a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 371d7448e65e243754f31890baef29dff187dc2e5e5Chris Craikstruct TextOnPathOp : RecordedOp { 372d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik TextOnPathOp(BASE_PARAMS, const glyph_t* glyphs, int glyphCount, 373d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const SkPath* path, float hOffset, float vOffset) 374d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik : SUPER(TextOnPathOp) 375d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphs(glyphs) 376d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphCount(glyphCount) 377d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , path(path) 378d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , hOffset(hOffset) 379d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , vOffset(vOffset) {} 380d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const glyph_t* glyphs; 381d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const int glyphCount; 382d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 383d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const SkPath* path; 384d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float hOffset; 385d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float vOffset; 386d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik}; 387d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 388d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craikstruct TextureLayerOp : RecordedOp { 389d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik TextureLayerOp(BASE_PARAMS_PAINTLESS, Layer* layer) 390d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik : SUPER_PAINTLESS(TextureLayerOp) 391d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik , layer(layer) {} 392d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik Layer* layer; 393d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik}; 394d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik 395a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 396a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers 397a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 398a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 3996fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4006fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer, 4016fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it. 4026fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4036fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp { 4046fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik BeginLayerOp(BASE_PARAMS) 4056fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : SUPER(BeginLayerOp) {} 4066fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4076fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 4086fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4096fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that 4106fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO. 4116fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * 4126fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished. 4136fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4146fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp { 4156fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik EndLayerOp() 416e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 4176fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4186fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 419b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct BeginUnclippedLayerOp : RecordedOp { 420b87eadda1818034ce03d85f30388384d1ac65916Chris Craik BeginUnclippedLayerOp(BASE_PARAMS) 421b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : SUPER(BeginUnclippedLayerOp) {} 422b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 423b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 424b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct EndUnclippedLayerOp : RecordedOp { 425b87eadda1818034ce03d85f30388384d1ac65916Chris Craik EndUnclippedLayerOp() 426b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 427b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 428b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 429b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyToLayerOp : RecordedOp { 430b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 431b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::CopyToLayerOp, 432b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.unmappedBounds, 433b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.localMatrix, 434b87eadda1818034ce03d85f30388384d1ac65916Chris Craik nullptr, // clip intentionally ignored 435b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.paint) 436b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(layerHandle) {} 437b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 438b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // Records a handle to the Layer object, since the Layer itself won't be 439b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // constructed until after this operation is constructed. 440b87eadda1818034ce03d85f30388384d1ac65916Chris Craik OffscreenBuffer** layerHandle; 441b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 442b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 443b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 444b87eadda1818034ce03d85f30388384d1ac65916Chris Craik// draw the parameter layer underneath 445b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyFromLayerOp : RecordedOp { 446b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 447b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::CopyFromLayerOp, 448b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.unmappedBounds, 449b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.localMatrix, 450b87eadda1818034ce03d85f30388384d1ac65916Chris Craik nullptr, // clip intentionally ignored 451b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.paint) 452b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(layerHandle) {} 453b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 454b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // Records a handle to the Layer object, since the Layer itself won't be 455b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // constructed until after this operation is constructed. 456b87eadda1818034ce03d85f30388384d1ac65916Chris Craik OffscreenBuffer** layerHandle; 457b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 458b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 4590b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/** 4600b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer. 4610b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * 4620b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated, 4630b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother. 4640b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */ 4656fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp { 4660b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed. 4675854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle) 4680b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : SUPER_PAINTLESS(LayerOp) 4690b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(layerHandle) 470e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f) 4710b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , mode(PaintUtils::getXfermodeDirect(paint)) 472e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik , colorFilter(paint ? paint->getColorFilter() : nullptr) 4730b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , destroy(true) {} 4740b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 4750b7e8245db728d127ada698be63d78b33fc6e4daChris Craik LayerOp(RenderNode& node) 476b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), nullptr, nullptr) 477b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(node.getLayerHandle()) 478b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , alpha(node.properties().layerProperties().alpha() / 255.0f) 479b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , mode(node.properties().layerProperties().xferMode()) 480b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , colorFilter(node.properties().layerProperties().colorFilter()) 481b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , destroy(false) {} 4820b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 483818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Records a handle to the Layer object, since the Layer itself won't be 484818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // constructed until after this operation is constructed. 4855854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer** layerHandle; 4860b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const float alpha; 4870b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const SkXfermode::Mode mode; 4880b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 4890b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // pointer to object owned by either LayerProperties, or a recorded Paint object in a 4900b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. 4910b7e8245db728d127ada698be63d78b33fc6e4daChris Craik SkColorFilter* colorFilter; 4920b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 4930b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // whether to destroy the layer, once rendered 4940b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const bool destroy; 4956fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4966fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 497b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 498b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 499b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 500b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H 501