RecordedOp.h revision aafb01d8ade0def3f51b74ae3bbc610c4ab33044
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) \ 93a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik UNMERGEABLE_OP_FN(ColorOp) \ 947cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(FunctorOp) \ 957cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(LinesOp) \ 967cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(OvalOp) \ 977cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(PathOp) \ 987cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(PointsOp) \ 997cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(RectOp) \ 1007cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(RoundRectOp) \ 1017cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(SimpleRectsOp) \ 1027cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(TextOnPathOp) \ 1037cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(TextureLayerOp) \ 1047cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik \ 1057cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MERGEABLE_OP_FN(BitmapOp) \ 1067cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MERGEABLE_OP_FN(PatchOp) \ 1077cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MERGEABLE_OP_FN(TextOp) 10815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 10915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/** 1107cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * LUT generators, which will insert nullptr for unsupported ops 11115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */ 1127cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define NULLPTR_OP_FN(Type) nullptr, 1137cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1147cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_DEFERRABLE_OP_LUT(OP_FN) \ 1157cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik { MAP_OPS_BASED_ON_TYPE(OP_FN, NULLPTR_OP_FN, OP_FN, OP_FN) } 1167cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1177cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_MERGEABLE_OP_LUT(OP_FN) \ 1187cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, NULLPTR_OP_FN, NULLPTR_OP_FN, OP_FN) } 11915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 1207cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_RENDERABLE_OP_LUT(OP_FN) \ 1217cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, OP_FN, OP_FN, OP_FN) } 1227cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 12391eff22b5d7f8fe551bae01331948858ce932a96Chris Craik#define BUILD_FULL_OP_LUT(OP_FN) \ 12491eff22b5d7f8fe551bae01331948858ce932a96Chris Craik { MAP_OPS_BASED_ON_TYPE(OP_FN, OP_FN, OP_FN, OP_FN) } 12591eff22b5d7f8fe551bae01331948858ce932a96Chris Craik 1267cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik/** 1277cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Op mapping functions, which skip unsupported ops. 1287cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * 1297cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Note: Do not use for LUTS, since these do not preserve ID order. 1307cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik */ 13115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type) 13215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 133b87eadda1818034ce03d85f30388384d1ac65916Chris Craik#define MAP_DEFERRABLE_OPS(OP_FN) \ 134b87eadda1818034ce03d85f30388384d1ac65916Chris Craik MAP_OPS_BASED_ON_TYPE(OP_FN, NULL_OP_FN, OP_FN, OP_FN) 135b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 1367cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_MERGEABLE_OPS(OP_FN) \ 1377cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, NULL_OP_FN, NULL_OP_FN, OP_FN) 1387cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1397cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_RENDERABLE_OPS(OP_FN) \ 1407cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, OP_FN, OP_FN, OP_FN) 1417cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 142b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum 143b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type, 144b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId { 145b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik enum { 1467cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik MAP_OPS_BASED_ON_TYPE(IDENTITY_FN, IDENTITY_FN, IDENTITY_FN, IDENTITY_FN) 147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Count, 148b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik }; 149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 1507cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craikstatic_assert(RecordedOpId::RenderNodeOp == 0, 151b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik "First index must be zero for LUTs to work"); 152b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 153e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint 154e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip 155e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint) 156e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr) 157b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 158b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp { 159b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* ID from RecordedOpId - generally used for jumping into function tables */ 160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const int opId; 161b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 162386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */ 163b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect unmappedBounds; 164b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 165b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* transform in recording space (vs DisplayList origin) */ 166b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Matrix4 localMatrix; 167b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 168e4db79de127cfe961195f52907af8451026eaa20Chris Craik /* clip in recording space - nullptr if not clipped */ 169e4db79de127cfe961195f52907af8451026eaa20Chris Craik const ClipBase* localClip; 170b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 171b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* optional paint, stored in base object to simplify merging logic */ 172b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkPaint* paint; 173b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected: 174b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RecordedOp(unsigned int opId, BASE_PARAMS) 175b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : opId(opId) 176b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , unmappedBounds(unmappedBounds) 177b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localMatrix(localMatrix) 178e4db79de127cfe961195f52907af8451026eaa20Chris Craik , localClip(localClip) 179b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , paint(paint) {} 180b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 181b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 182b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp { 183b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode) 184b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER_PAINTLESS(RenderNodeOp) 185b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , renderNode(renderNode) {} 1868d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik RenderNode * renderNode; // not const, since drawing modifies it 1878d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik 1888d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik /** 1898d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Holds the transformation between the projection surface ViewGroup and this RenderNode 1908d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * drawing instance. Represents any translations / transformations done within the drawing of 1918d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this 1928d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * DisplayList draw instance. 1938d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * 1948d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Note: doesn't include transformation within the RenderNode, or its properties. 1958d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik */ 1968d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik Matrix4 transformFromCompositingAncestor; 197161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik bool skipInOrderDraw = false; 198b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 199b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 200a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 201a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops 202a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 203a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 204386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp { 205386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter) 206386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(ArcOp) 207386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , startAngle(startAngle) 208386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , sweepAngle(sweepAngle) 209386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , useCenter(useCenter) {} 210386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float startAngle; 211386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float sweepAngle; 212386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const bool useCenter; 213386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 214386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 215b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp { 216b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik BitmapOp(BASE_PARAMS, const SkBitmap* bitmap) 217b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(BitmapOp) 218b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , bitmap(bitmap) {} 219b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkBitmap* bitmap; 220b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // TODO: asset atlas/texture id lookup? 221b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 222b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 223f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp { 224f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight, 225f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices, const int* colors) 226f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapMeshOp) 227f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 228f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshWidth(meshWidth) 229f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshHeight(meshHeight) 230f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , vertices(vertices) 231f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , colors(colors) {} 232f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 233f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshWidth; 234f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshHeight; 235f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices; 236f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int* colors; 237f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 238f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 239f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp { 240f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src) 241f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapRectOp) 242f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 243f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , src(src) {} 244f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 245f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Rect src; 246f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 247f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 248268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct CirclePropsOp : RecordedOp { 249e4db79de127cfe961195f52907af8451026eaa20Chris Craik CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 250268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* x, float* y, float* radius) 251e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint) 252268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , x(x) 253268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , y(y) 254268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , radius(radius) {} 255268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* x; 256268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* y; 257268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* radius; 258268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 259268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 260a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craikstruct ColorOp : RecordedOp { 261a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik // Note: unbounded op that will fillclip, so no bounds/matrix needed 262a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik ColorOp(const ClipBase* localClip, int color, SkXfermode::Mode mode) 263a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik : RecordedOp(RecordedOpId::ColorOp, Rect(), Matrix4::identity(), localClip, nullptr) 264a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik , color(color) 265a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik , mode(mode) {} 266a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik const int color; 267a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik const SkXfermode::Mode mode; 268a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik}; 269a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik 270e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craikstruct FunctorOp : RecordedOp { 2714c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik // Note: undefined record-time bounds, since this op fills the clip 2724c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik // TODO: explicitly define bounds 2734c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik FunctorOp(const Matrix4& localMatrix, const ClipBase* localClip, Functor* functor) 2744c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik : RecordedOp(RecordedOpId::FunctorOp, Rect(), localMatrix, localClip, nullptr) 275e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik , functor(functor) {} 276e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik Functor* functor; 277e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik}; 278e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik 279a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp { 280a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik LinesOp(BASE_PARAMS, const float* points, const int floatCount) 281a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(LinesOp) 282a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , points(points) 283a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , floatCount(floatCount) {} 284a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* points; 285a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int floatCount; 286a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 287a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 288386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp { 289386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik OvalOp(BASE_PARAMS) 290386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(OvalOp) {} 291386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 292386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 293f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp { 294f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch) 295f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(PatchOp) 296f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 297f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , patch(patch) {} 298f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 299f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Res_png_9patch* patch; 300f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 301f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 302386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp { 303386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PathOp(BASE_PARAMS, const SkPath* path) 304386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PathOp) 305386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , path(path) {} 306386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const SkPath* path; 307386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 308386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 309386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp { 310386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PointsOp(BASE_PARAMS, const float* points, const int floatCount) 311386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PointsOp) 312386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , points(points) 313386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , floatCount(floatCount) {} 314386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float* points; 315386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const int floatCount; 316386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 317386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 318b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp { 319b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RectOp(BASE_PARAMS) 320b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(RectOp) {} 321b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 322b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 323386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp { 324386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik RoundRectOp(BASE_PARAMS, float rx, float ry) 325386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(RoundRectOp) 326386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , rx(rx) 327386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , ry(ry) {} 328386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float rx; 329386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float ry; 330386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 331386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 332268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct RoundRectPropsOp : RecordedOp { 333e4db79de127cfe961195f52907af8451026eaa20Chris Craik RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 334268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* left, float* top, float* right, float* bottom, float *rx, float *ry) 335e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint) 336268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , left(left) 337268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , top(top) 338268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , right(right) 339268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , bottom(bottom) 340268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , rx(rx) 341268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , ry(ry) {} 342268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* left; 343268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* top; 344268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* right; 345268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* bottom; 346268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* rx; 347268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* ry; 348268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 349268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 350766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustruct VectorDrawableOp : RecordedOp { 351766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu VectorDrawableOp(VectorDrawable::Tree* tree, BASE_PARAMS_PAINTLESS) 352766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu : SUPER_PAINTLESS(VectorDrawableOp) 353766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu , vectorDrawable(tree) {} 354766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu VectorDrawable::Tree* vectorDrawable; 355766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}; 356766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 357d3daa3198e2212c985c634821682d5819346b653Chris Craik/** 358d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow. 359d3daa3198e2212c985c634821682d5819346b653Chris Craik * 360d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time, 361d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed. 362d3daa3198e2212c985c634821682d5819346b653Chris Craik * 36398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds. 364d3daa3198e2212c985c634821682d5819346b653Chris Craik */ 365d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp { 3666e068c0182f6f85bccb855a647510724d1c65a13Chris Craik ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha) 367e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr) 3686e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , shadowTask(shadowTask) 3696e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , casterAlpha(casterAlpha) { 370d3daa3198e2212c985c634821682d5819346b653Chris Craik }; 3716e068c0182f6f85bccb855a647510724d1c65a13Chris Craik sp<TessellationCache::ShadowTask> shadowTask; 372d3daa3198e2212c985c634821682d5819346b653Chris Craik const float casterAlpha; 373d3daa3198e2212c985c634821682d5819346b653Chris Craik}; 374d3daa3198e2212c985c634821682d5819346b653Chris Craik 375b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?) 376b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount) 377b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(SimpleRectsOp) 378b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertices(vertices) 379b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertexCount(vertexCount) {} 380b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Vertex* vertices; 381b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const size_t vertexCount; 382b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 383b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 384a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp { 385a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, 386a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik float x, float y) 387a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(TextOp) 388a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphs(glyphs) 389a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , positions(positions) 390a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphCount(glyphCount) 391a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , x(x) 392a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , y(y) {} 393a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const glyph_t* glyphs; 394a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* positions; 395a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int glyphCount; 396a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float x; 397a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float y; 398a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 399a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 400d7448e65e243754f31890baef29dff187dc2e5e5Chris Craikstruct TextOnPathOp : RecordedOp { 4014c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik // TODO: explicitly define bounds 4024c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik TextOnPathOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 4034c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik const glyph_t* glyphs, int glyphCount, const SkPath* path, float hOffset, float vOffset) 4044c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik : RecordedOp(RecordedOpId::TextOnPathOp, Rect(), localMatrix, localClip, paint) 405d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphs(glyphs) 406d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphCount(glyphCount) 407d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , path(path) 408d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , hOffset(hOffset) 409d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , vOffset(vOffset) {} 410d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const glyph_t* glyphs; 411d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const int glyphCount; 412d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 413d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const SkPath* path; 414d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float hOffset; 415d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float vOffset; 416d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik}; 417d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 418d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craikstruct TextureLayerOp : RecordedOp { 419d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik TextureLayerOp(BASE_PARAMS_PAINTLESS, Layer* layer) 420d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik : SUPER_PAINTLESS(TextureLayerOp) 421d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik , layer(layer) {} 422aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik 423aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik // Copy an existing TextureLayerOp, replacing the underlying matrix 424aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik TextureLayerOp(const TextureLayerOp& op, const Matrix4& replacementMatrix) 425aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik : RecordedOp(RecordedOpId::TextureLayerOp, op.unmappedBounds, replacementMatrix, 426aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik op.localClip, op.paint) 427aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik , layer(op.layer) { 428aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik 429aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik } 430d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik Layer* layer; 431d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik}; 432d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik 433a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 434a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers 435a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 436a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 4376fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4386fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer, 4396fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it. 4406fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4416fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp { 4426fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik BeginLayerOp(BASE_PARAMS) 4436fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : SUPER(BeginLayerOp) {} 4446fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4456fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 4466fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4476fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that 4486fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO. 4496fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * 4506fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished. 4516fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4526fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp { 4536fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik EndLayerOp() 454e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 4556fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4566fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 457b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct BeginUnclippedLayerOp : RecordedOp { 458b87eadda1818034ce03d85f30388384d1ac65916Chris Craik BeginUnclippedLayerOp(BASE_PARAMS) 459b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : SUPER(BeginUnclippedLayerOp) {} 460b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 461b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 462b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct EndUnclippedLayerOp : RecordedOp { 463b87eadda1818034ce03d85f30388384d1ac65916Chris Craik EndUnclippedLayerOp() 464b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 465b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 466b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 467b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyToLayerOp : RecordedOp { 468b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 469b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::CopyToLayerOp, 470b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.unmappedBounds, 471b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.localMatrix, 472b87eadda1818034ce03d85f30388384d1ac65916Chris Craik nullptr, // clip intentionally ignored 473b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.paint) 474b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(layerHandle) {} 475b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 476b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // Records a handle to the Layer object, since the Layer itself won't be 477b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // constructed until after this operation is constructed. 478b87eadda1818034ce03d85f30388384d1ac65916Chris Craik OffscreenBuffer** layerHandle; 479b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 480b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 481b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 482b87eadda1818034ce03d85f30388384d1ac65916Chris Craik// draw the parameter layer underneath 483b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyFromLayerOp : RecordedOp { 484b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 485b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::CopyFromLayerOp, 486b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.unmappedBounds, 487b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.localMatrix, 488b87eadda1818034ce03d85f30388384d1ac65916Chris Craik nullptr, // clip intentionally ignored 489b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.paint) 490b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(layerHandle) {} 491b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 492b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // Records a handle to the Layer object, since the Layer itself won't be 493b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // constructed until after this operation is constructed. 494b87eadda1818034ce03d85f30388384d1ac65916Chris Craik OffscreenBuffer** layerHandle; 495b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 496b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 4970b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/** 4980b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer. 4990b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * 5000b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated, 5010b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother. 5020b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */ 5036fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp { 5040b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed. 5055854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle) 5060b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : SUPER_PAINTLESS(LayerOp) 5070b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(layerHandle) 508e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f) 5090b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , mode(PaintUtils::getXfermodeDirect(paint)) 510e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik , colorFilter(paint ? paint->getColorFilter() : nullptr) 5110b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , destroy(true) {} 5120b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 5130b7e8245db728d127ada698be63d78b33fc6e4daChris Craik LayerOp(RenderNode& node) 514b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), nullptr, nullptr) 515b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(node.getLayerHandle()) 516b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , alpha(node.properties().layerProperties().alpha() / 255.0f) 517b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , mode(node.properties().layerProperties().xferMode()) 518b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , colorFilter(node.properties().layerProperties().colorFilter()) 519b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , destroy(false) {} 5200b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 521818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Records a handle to the Layer object, since the Layer itself won't be 522818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // constructed until after this operation is constructed. 5235854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer** layerHandle; 5240b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const float alpha; 5250b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const SkXfermode::Mode mode; 5260b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 5270b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // pointer to object owned by either LayerProperties, or a recorded Paint object in a 5280b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. 5290b7e8245db728d127ada698be63d78b33fc6e4daChris Craik SkColorFilter* colorFilter; 5300b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 5310b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // whether to destroy the layer, once rendered 5320b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const bool destroy; 5336fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 5346fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 535b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 536b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 537b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 538b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H 539