RecordedOp.h revision 91eff22b5d7f8fe551bae01331948858ce932a96
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 20766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu#include "RecordedOp.h" 21a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik#include "font/FontUtil.h" 22b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h" 2398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Rect.h" 240b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#include "RenderNode.h" 256e068c0182f6f85bccb855a647510724d1c65a13Chris Craik#include "TessellationCache.h" 2698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "utils/LinearAllocator.h" 2798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Vector.h" 28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 29f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <androidfw/ResourceTypes.h> 30f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <SkXfermode.h> 31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap; 33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint; 34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 35b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 38e4db79de127cfe961195f52907af8451026eaa20Chris Craikstruct ClipBase; 395854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer; 40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode; 41b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex; 42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 43766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace VectorDrawable { 44766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass Tree; 45766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 46766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 47b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/** 487cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Authoritative op list, used for generating the op ID enum, ID based LUTS, and 497cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * the functions to which they dispatch. Parameter macros are executed for each op, 507cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * in order, based on the op's type. 51b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 52b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * There are 4 types of op, which defines dispatch/LUT capability: 537cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * 54b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * | DisplayList | Render | Merge | 55b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * -------------|-------------|-------------|-------------| 56b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER | Yes | | | 57b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY | | Yes | | 58b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE | Yes | Yes | | 59b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE | Yes | Yes | Yes | 60b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 61b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER - These ops are recorded into DisplayLists, but can't be directly rendered. This 62b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * may be because they need to be transformed into other op types (e.g. CirclePropsOp), 63b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * be traversed to access multiple renderable ops within (e.g. RenderNodeOp), or because they 64b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * modify renderbuffer lifecycle, instead of directly rendering content (the various LayerOps). 65b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 66b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY - These ops cannot be recorded into DisplayLists, and are instead implicitly 67b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * constructed from other commands/RenderNode properties. They cannot be merged. 68b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 69b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE - These ops can be recorded into DisplayLists and rendered directly, but do not 70b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * support merged rendering. 71b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 72b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE - These ops can be recorded into DisplayLists and rendered individually, or merged 73b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * under certain circumstances. 74b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 757cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_OPS_BASED_ON_TYPE(PRE_RENDER_OP_FN, RENDER_ONLY_OP_FN, UNMERGEABLE_OP_FN, MERGEABLE_OP_FN) \ 767cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(RenderNodeOp) \ 777cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(CirclePropsOp) \ 787cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(RoundRectPropsOp) \ 797cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(BeginLayerOp) \ 807cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(EndLayerOp) \ 81b87eadda1818034ce03d85f30388384d1ac65916Chris Craik PRE_RENDER_OP_FN(BeginUnclippedLayerOp) \ 82b87eadda1818034ce03d85f30388384d1ac65916Chris Craik PRE_RENDER_OP_FN(EndUnclippedLayerOp) \ 83766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu PRE_RENDER_OP_FN(VectorDrawableOp) \ 847cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik \ 857cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik RENDER_ONLY_OP_FN(ShadowOp) \ 867cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik RENDER_ONLY_OP_FN(LayerOp) \ 87b87eadda1818034ce03d85f30388384d1ac65916Chris Craik RENDER_ONLY_OP_FN(CopyToLayerOp) \ 88b87eadda1818034ce03d85f30388384d1ac65916Chris Craik RENDER_ONLY_OP_FN(CopyFromLayerOp) \ 897cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik \ 907cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(ArcOp) \ 917cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(BitmapMeshOp) \ 927cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(BitmapRectOp) \ 937cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(FunctorOp) \ 947cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(LinesOp) \ 957cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(OvalOp) \ 967cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(PathOp) \ 977cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(PointsOp) \ 987cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(RectOp) \ 997cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(RoundRectOp) \ 1007cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(SimpleRectsOp) \ 1017cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(TextOnPathOp) \ 1027cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(TextureLayerOp) \ 1037cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik \ 1047cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MERGEABLE_OP_FN(BitmapOp) \ 1057cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MERGEABLE_OP_FN(PatchOp) \ 1067cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MERGEABLE_OP_FN(TextOp) 10715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 10815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/** 1097cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * LUT generators, which will insert nullptr for unsupported ops 11015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */ 1117cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define NULLPTR_OP_FN(Type) nullptr, 1127cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1137cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_DEFERRABLE_OP_LUT(OP_FN) \ 1147cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik { MAP_OPS_BASED_ON_TYPE(OP_FN, NULLPTR_OP_FN, OP_FN, OP_FN) } 1157cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1167cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_MERGEABLE_OP_LUT(OP_FN) \ 1177cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, NULLPTR_OP_FN, NULLPTR_OP_FN, OP_FN) } 11815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 1197cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_RENDERABLE_OP_LUT(OP_FN) \ 1207cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, OP_FN, OP_FN, OP_FN) } 1217cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 12291eff22b5d7f8fe551bae01331948858ce932a96Chris Craik#define BUILD_FULL_OP_LUT(OP_FN) \ 12391eff22b5d7f8fe551bae01331948858ce932a96Chris Craik { MAP_OPS_BASED_ON_TYPE(OP_FN, OP_FN, OP_FN, OP_FN) } 12491eff22b5d7f8fe551bae01331948858ce932a96Chris Craik 1257cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik/** 1267cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Op mapping functions, which skip unsupported ops. 1277cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * 1287cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Note: Do not use for LUTS, since these do not preserve ID order. 1297cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik */ 13015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type) 13115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 132b87eadda1818034ce03d85f30388384d1ac65916Chris Craik#define MAP_DEFERRABLE_OPS(OP_FN) \ 133b87eadda1818034ce03d85f30388384d1ac65916Chris Craik MAP_OPS_BASED_ON_TYPE(OP_FN, NULL_OP_FN, OP_FN, OP_FN) 134b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 1357cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_MERGEABLE_OPS(OP_FN) \ 1367cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, NULL_OP_FN, NULL_OP_FN, OP_FN) 1377cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1387cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_RENDERABLE_OPS(OP_FN) \ 1397cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, OP_FN, OP_FN, OP_FN) 1407cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 141b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum 142b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type, 143b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId { 144b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik enum { 1457cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_OPS_BASED_ON_TYPE(IDENTITY_FN, IDENTITY_FN, IDENTITY_FN, IDENTITY_FN) 146b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Count, 147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik }; 148b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 1497cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craikstatic_assert(RecordedOpId::RenderNodeOp == 0, 150b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik "First index must be zero for LUTs to work"); 151b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 152e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint 153e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip 154e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint) 155e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr) 156b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 157b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp { 158b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* ID from RecordedOpId - generally used for jumping into function tables */ 159b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const int opId; 160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 161386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */ 162b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect unmappedBounds; 163b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 164b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* transform in recording space (vs DisplayList origin) */ 165b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Matrix4 localMatrix; 166b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 167e4db79de127cfe961195f52907af8451026eaa20Chris Craik /* clip in recording space - nullptr if not clipped */ 168e4db79de127cfe961195f52907af8451026eaa20Chris Craik const ClipBase* localClip; 169b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 170b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* optional paint, stored in base object to simplify merging logic */ 171b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkPaint* paint; 172b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected: 173b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RecordedOp(unsigned int opId, BASE_PARAMS) 174b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : opId(opId) 175b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , unmappedBounds(unmappedBounds) 176b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localMatrix(localMatrix) 177e4db79de127cfe961195f52907af8451026eaa20Chris Craik , localClip(localClip) 178b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , paint(paint) {} 179b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 180b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 181b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp { 182b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode) 183b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER_PAINTLESS(RenderNodeOp) 184b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , renderNode(renderNode) {} 1858d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik RenderNode * renderNode; // not const, since drawing modifies it 1868d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik 1878d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik /** 1888d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Holds the transformation between the projection surface ViewGroup and this RenderNode 1898d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * drawing instance. Represents any translations / transformations done within the drawing of 1908d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this 1918d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * DisplayList draw instance. 1928d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * 1938d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Note: doesn't include transformation within the RenderNode, or its properties. 1948d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik */ 1958d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik Matrix4 transformFromCompositingAncestor; 196161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik bool skipInOrderDraw = false; 197b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 198b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 199a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 200a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops 201a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 202a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 203386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp { 204386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter) 205386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(ArcOp) 206386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , startAngle(startAngle) 207386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , sweepAngle(sweepAngle) 208386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , useCenter(useCenter) {} 209386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float startAngle; 210386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float sweepAngle; 211386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const bool useCenter; 212386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 213386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 214b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp { 215b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik BitmapOp(BASE_PARAMS, const SkBitmap* bitmap) 216b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(BitmapOp) 217b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , bitmap(bitmap) {} 218b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkBitmap* bitmap; 219b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // TODO: asset atlas/texture id lookup? 220b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 221b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 222f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp { 223f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight, 224f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices, const int* colors) 225f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapMeshOp) 226f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 227f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshWidth(meshWidth) 228f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshHeight(meshHeight) 229f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , vertices(vertices) 230f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , colors(colors) {} 231f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 232f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshWidth; 233f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshHeight; 234f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices; 235f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int* colors; 236f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 237f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 238f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp { 239f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src) 240f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapRectOp) 241f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 242f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , src(src) {} 243f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 244f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Rect src; 245f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 246f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 247268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct CirclePropsOp : RecordedOp { 248e4db79de127cfe961195f52907af8451026eaa20Chris Craik CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 249268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* x, float* y, float* radius) 250e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint) 251268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , x(x) 252268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , y(y) 253268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , radius(radius) {} 254268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* x; 255268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* y; 256268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* radius; 257268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 258268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 259e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craikstruct FunctorOp : RecordedOp { 260e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik FunctorOp(BASE_PARAMS_PAINTLESS, Functor* functor) 261e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik : SUPER_PAINTLESS(FunctorOp) 262e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik , functor(functor) {} 263e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik Functor* functor; 264e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik}; 265e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik 266a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp { 267a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik LinesOp(BASE_PARAMS, const float* points, const int floatCount) 268a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(LinesOp) 269a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , points(points) 270a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , floatCount(floatCount) {} 271a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* points; 272a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int floatCount; 273a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 274a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 275386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp { 276386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik OvalOp(BASE_PARAMS) 277386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(OvalOp) {} 278386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 279386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 280f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp { 281f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch) 282f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(PatchOp) 283f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 284f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , patch(patch) {} 285f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 286f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Res_png_9patch* patch; 287f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 288f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 289386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp { 290386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PathOp(BASE_PARAMS, const SkPath* path) 291386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PathOp) 292386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , path(path) {} 293386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const SkPath* path; 294386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 295386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 296386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp { 297386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PointsOp(BASE_PARAMS, const float* points, const int floatCount) 298386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PointsOp) 299386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , points(points) 300386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , floatCount(floatCount) {} 301386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float* points; 302386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const int floatCount; 303386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 304386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 305b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp { 306b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RectOp(BASE_PARAMS) 307b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(RectOp) {} 308b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 309b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 310386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp { 311386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik RoundRectOp(BASE_PARAMS, float rx, float ry) 312386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(RoundRectOp) 313386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , rx(rx) 314386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , ry(ry) {} 315386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float rx; 316386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float ry; 317386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 318386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 319268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct RoundRectPropsOp : RecordedOp { 320e4db79de127cfe961195f52907af8451026eaa20Chris Craik RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 321268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* left, float* top, float* right, float* bottom, float *rx, float *ry) 322e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint) 323268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , left(left) 324268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , top(top) 325268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , right(right) 326268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , bottom(bottom) 327268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , rx(rx) 328268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , ry(ry) {} 329268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* left; 330268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* top; 331268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* right; 332268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* bottom; 333268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* rx; 334268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* ry; 335268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 336268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 337766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustruct VectorDrawableOp : RecordedOp { 338766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu VectorDrawableOp(VectorDrawable::Tree* tree, BASE_PARAMS_PAINTLESS) 339766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu : SUPER_PAINTLESS(VectorDrawableOp) 340766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu , vectorDrawable(tree) {} 341766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu VectorDrawable::Tree* vectorDrawable; 342766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}; 343766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 344d3daa3198e2212c985c634821682d5819346b653Chris Craik/** 345d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow. 346d3daa3198e2212c985c634821682d5819346b653Chris Craik * 347d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time, 348d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed. 349d3daa3198e2212c985c634821682d5819346b653Chris Craik * 35098787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds. 351d3daa3198e2212c985c634821682d5819346b653Chris Craik */ 352d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp { 3536e068c0182f6f85bccb855a647510724d1c65a13Chris Craik ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha) 354e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr) 3556e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , shadowTask(shadowTask) 3566e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , casterAlpha(casterAlpha) { 357d3daa3198e2212c985c634821682d5819346b653Chris Craik }; 3586e068c0182f6f85bccb855a647510724d1c65a13Chris Craik sp<TessellationCache::ShadowTask> shadowTask; 359d3daa3198e2212c985c634821682d5819346b653Chris Craik const float casterAlpha; 360d3daa3198e2212c985c634821682d5819346b653Chris Craik}; 361d3daa3198e2212c985c634821682d5819346b653Chris Craik 362b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?) 363b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount) 364b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(SimpleRectsOp) 365b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertices(vertices) 366b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertexCount(vertexCount) {} 367b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Vertex* vertices; 368b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const size_t vertexCount; 369b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 370b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 371a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp { 372a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, 373a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik float x, float y) 374a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(TextOp) 375a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphs(glyphs) 376a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , positions(positions) 377a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphCount(glyphCount) 378a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , x(x) 379a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , y(y) {} 380a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const glyph_t* glyphs; 381a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* positions; 382a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int glyphCount; 383a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float x; 384a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float y; 385a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 386a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 387d7448e65e243754f31890baef29dff187dc2e5e5Chris Craikstruct TextOnPathOp : RecordedOp { 388d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik TextOnPathOp(BASE_PARAMS, const glyph_t* glyphs, int glyphCount, 389d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const SkPath* path, float hOffset, float vOffset) 390d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik : SUPER(TextOnPathOp) 391d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphs(glyphs) 392d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphCount(glyphCount) 393d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , path(path) 394d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , hOffset(hOffset) 395d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , vOffset(vOffset) {} 396d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const glyph_t* glyphs; 397d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const int glyphCount; 398d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 399d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const SkPath* path; 400d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float hOffset; 401d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float vOffset; 402d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik}; 403d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 404d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craikstruct TextureLayerOp : RecordedOp { 405d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik TextureLayerOp(BASE_PARAMS_PAINTLESS, Layer* layer) 406d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik : SUPER_PAINTLESS(TextureLayerOp) 407d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik , layer(layer) {} 408d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik Layer* layer; 409d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik}; 410d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik 411a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 412a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers 413a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 414a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 4156fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4166fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer, 4176fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it. 4186fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4196fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp { 4206fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik BeginLayerOp(BASE_PARAMS) 4216fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : SUPER(BeginLayerOp) {} 4226fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4236fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 4246fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4256fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that 4266fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO. 4276fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * 4286fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished. 4296fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4306fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp { 4316fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik EndLayerOp() 432e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 4336fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4346fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 435b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct BeginUnclippedLayerOp : RecordedOp { 436b87eadda1818034ce03d85f30388384d1ac65916Chris Craik BeginUnclippedLayerOp(BASE_PARAMS) 437b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : SUPER(BeginUnclippedLayerOp) {} 438b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 439b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 440b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct EndUnclippedLayerOp : RecordedOp { 441b87eadda1818034ce03d85f30388384d1ac65916Chris Craik EndUnclippedLayerOp() 442b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 443b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 444b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 445b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyToLayerOp : RecordedOp { 446b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 447b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::CopyToLayerOp, 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 459b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 460b87eadda1818034ce03d85f30388384d1ac65916Chris Craik// draw the parameter layer underneath 461b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyFromLayerOp : RecordedOp { 462b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 463b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::CopyFromLayerOp, 464b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.unmappedBounds, 465b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.localMatrix, 466b87eadda1818034ce03d85f30388384d1ac65916Chris Craik nullptr, // clip intentionally ignored 467b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.paint) 468b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(layerHandle) {} 469b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 470b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // Records a handle to the Layer object, since the Layer itself won't be 471b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // constructed until after this operation is constructed. 472b87eadda1818034ce03d85f30388384d1ac65916Chris Craik OffscreenBuffer** layerHandle; 473b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 474b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 4750b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/** 4760b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer. 4770b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * 4780b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated, 4790b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother. 4800b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */ 4816fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp { 4820b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed. 4835854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle) 4840b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : SUPER_PAINTLESS(LayerOp) 4850b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(layerHandle) 486e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f) 4870b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , mode(PaintUtils::getXfermodeDirect(paint)) 488e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik , colorFilter(paint ? paint->getColorFilter() : nullptr) 4890b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , destroy(true) {} 4900b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 4910b7e8245db728d127ada698be63d78b33fc6e4daChris Craik LayerOp(RenderNode& node) 492b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), nullptr, nullptr) 493b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(node.getLayerHandle()) 494b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , alpha(node.properties().layerProperties().alpha() / 255.0f) 495b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , mode(node.properties().layerProperties().xferMode()) 496b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , colorFilter(node.properties().layerProperties().colorFilter()) 497b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , destroy(false) {} 4980b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 499818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Records a handle to the Layer object, since the Layer itself won't be 500818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // constructed until after this operation is constructed. 5015854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer** layerHandle; 5020b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const float alpha; 5030b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const SkXfermode::Mode mode; 5040b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 5050b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // pointer to object owned by either LayerProperties, or a recorded Paint object in a 5060b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. 5070b7e8245db728d127ada698be63d78b33fc6e4daChris Craik SkColorFilter* colorFilter; 5080b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 5090b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // whether to destroy the layer, once rendered 5100b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const bool destroy; 5116fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 5126fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 513b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 514b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 515b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 516b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H 517