RecordedOp.h revision 8cd3edfa15cc9cdbffa935d19ab894426b08d174
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 175e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#pragma once 18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 19a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik#include "font/FontUtil.h" 208cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "GlLayer.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" 265e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#include "utils/PaintUtils.h" 2798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Vector.h" 28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 29f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <androidfw/ResourceTypes.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 42766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace VectorDrawable { 43766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass Tree; 44766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 45766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 46b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/** 477cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Authoritative op list, used for generating the op ID enum, ID based LUTS, and 487cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * the functions to which they dispatch. Parameter macros are executed for each op, 497cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * in order, based on the op's type. 50b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 51b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * There are 4 types of op, which defines dispatch/LUT capability: 527cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * 53b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * | DisplayList | Render | Merge | 54b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * -------------|-------------|-------------|-------------| 55b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER | Yes | | | 56b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY | | Yes | | 57b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE | Yes | Yes | | 58b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE | Yes | Yes | Yes | 59b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 60b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER - These ops are recorded into DisplayLists, but can't be directly rendered. This 61b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * may be because they need to be transformed into other op types (e.g. CirclePropsOp), 62b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * be traversed to access multiple renderable ops within (e.g. RenderNodeOp), or because they 63b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * modify renderbuffer lifecycle, instead of directly rendering content (the various LayerOps). 64b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 65b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY - These ops cannot be recorded into DisplayLists, and are instead implicitly 66b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * constructed from other commands/RenderNode properties. They cannot be merged. 67b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 68b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE - These ops can be recorded into DisplayLists and rendered directly, but do not 69b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * support merged rendering. 70b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 71b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE - These ops can be recorded into DisplayLists and rendered individually, or merged 72b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * under certain circumstances. 73b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 747cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define MAP_OPS_BASED_ON_TYPE(PRE_RENDER_OP_FN, RENDER_ONLY_OP_FN, UNMERGEABLE_OP_FN, MERGEABLE_OP_FN) \ 757cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(RenderNodeOp) \ 767cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(CirclePropsOp) \ 777cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(RoundRectPropsOp) \ 787cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(BeginLayerOp) \ 797cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik PRE_RENDER_OP_FN(EndLayerOp) \ 80b87eadda1818034ce03d85f30388384d1ac65916Chris Craik PRE_RENDER_OP_FN(BeginUnclippedLayerOp) \ 81b87eadda1818034ce03d85f30388384d1ac65916Chris Craik PRE_RENDER_OP_FN(EndUnclippedLayerOp) \ 82766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu PRE_RENDER_OP_FN(VectorDrawableOp) \ 837cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik \ 847cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik RENDER_ONLY_OP_FN(ShadowOp) \ 857cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik RENDER_ONLY_OP_FN(LayerOp) \ 86b87eadda1818034ce03d85f30388384d1ac65916Chris Craik RENDER_ONLY_OP_FN(CopyToLayerOp) \ 87b87eadda1818034ce03d85f30388384d1ac65916Chris Craik RENDER_ONLY_OP_FN(CopyFromLayerOp) \ 887cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik \ 897cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(ArcOp) \ 907cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(BitmapMeshOp) \ 917cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik UNMERGEABLE_OP_FN(BitmapRectOp) \ 92a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik UNMERGEABLE_OP_FN(ColorOp) \ 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 { 215ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv BitmapOp(BASE_PARAMS, Bitmap* bitmap) 216b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(BitmapOp) 217b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , bitmap(bitmap) {} 218ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv Bitmap* bitmap; 219b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 220b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 221f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp { 222ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv BitmapMeshOp(BASE_PARAMS, Bitmap* bitmap, int meshWidth, int meshHeight, 223f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices, const int* colors) 224f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapMeshOp) 225f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 226f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshWidth(meshWidth) 227f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshHeight(meshHeight) 228f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , vertices(vertices) 229f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , colors(colors) {} 230ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv Bitmap* bitmap; 231f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshWidth; 232f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshHeight; 233f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices; 234f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int* colors; 235f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 236f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 237f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp { 238ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv BitmapRectOp(BASE_PARAMS, Bitmap* bitmap, const Rect& src) 239f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapRectOp) 240f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 241f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , src(src) {} 242ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv Bitmap* bitmap; 243f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Rect src; 244f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 245f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 246268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct CirclePropsOp : RecordedOp { 247e4db79de127cfe961195f52907af8451026eaa20Chris Craik CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 248268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* x, float* y, float* radius) 249e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint) 250268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , x(x) 251268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , y(y) 252268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , radius(radius) {} 253268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* x; 254268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* y; 255268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* radius; 256268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 257268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 258a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craikstruct ColorOp : RecordedOp { 259a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik // Note: unbounded op that will fillclip, so no bounds/matrix needed 260260ab726486317496bc12a57d599ea96dcde3284Mike Reed ColorOp(const ClipBase* localClip, int color, SkBlendMode mode) 261a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik : RecordedOp(RecordedOpId::ColorOp, Rect(), Matrix4::identity(), localClip, nullptr) 262a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik , color(color) 263a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik , mode(mode) {} 264a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik const int color; 265260ab726486317496bc12a57d599ea96dcde3284Mike Reed const SkBlendMode mode; 266a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik}; 267a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik 268e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craikstruct FunctorOp : RecordedOp { 2694c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik // Note: undefined record-time bounds, since this op fills the clip 2704c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik // TODO: explicitly define bounds 2714c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik FunctorOp(const Matrix4& localMatrix, const ClipBase* localClip, Functor* functor) 2724c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik : RecordedOp(RecordedOpId::FunctorOp, Rect(), localMatrix, localClip, nullptr) 273e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik , functor(functor) {} 274e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik Functor* functor; 275e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik}; 276e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik 277a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp { 278a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik LinesOp(BASE_PARAMS, const float* points, const int floatCount) 279a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(LinesOp) 280a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , points(points) 281a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , floatCount(floatCount) {} 282a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* points; 283a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int floatCount; 284a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 285a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 286386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp { 287386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik OvalOp(BASE_PARAMS) 288386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(OvalOp) {} 289386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 290386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 291f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp { 292ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv PatchOp(BASE_PARAMS, Bitmap* bitmap, const Res_png_9patch* patch) 293f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(PatchOp) 294f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 295f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , patch(patch) {} 296ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv Bitmap* bitmap; 297f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Res_png_9patch* patch; 298f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 299f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 300386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp { 301386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PathOp(BASE_PARAMS, const SkPath* path) 302386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PathOp) 303386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , path(path) {} 304386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const SkPath* path; 305386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 306386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 307386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp { 308386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PointsOp(BASE_PARAMS, const float* points, const int floatCount) 309386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PointsOp) 310386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , points(points) 311386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , floatCount(floatCount) {} 312386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float* points; 313386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const int floatCount; 314386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 315386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 316b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp { 317b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RectOp(BASE_PARAMS) 318b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(RectOp) {} 319b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 320b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 321386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp { 322386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik RoundRectOp(BASE_PARAMS, float rx, float ry) 323386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(RoundRectOp) 324386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , rx(rx) 325386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , ry(ry) {} 326386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float rx; 327386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float ry; 328386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 329386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 330268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct RoundRectPropsOp : RecordedOp { 331e4db79de127cfe961195f52907af8451026eaa20Chris Craik RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 332268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* left, float* top, float* right, float* bottom, float *rx, float *ry) 333e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint) 334268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , left(left) 335268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , top(top) 336268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , right(right) 337268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , bottom(bottom) 338268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , rx(rx) 339268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , ry(ry) {} 340268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* left; 341268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* top; 342268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* right; 343268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* bottom; 344268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* rx; 345268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* ry; 346268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 347268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 348766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustruct VectorDrawableOp : RecordedOp { 349766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu VectorDrawableOp(VectorDrawable::Tree* tree, BASE_PARAMS_PAINTLESS) 350766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu : SUPER_PAINTLESS(VectorDrawableOp) 351766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu , vectorDrawable(tree) {} 352766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu VectorDrawable::Tree* vectorDrawable; 353766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}; 354766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 355d3daa3198e2212c985c634821682d5819346b653Chris Craik/** 356d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow. 357d3daa3198e2212c985c634821682d5819346b653Chris Craik * 358d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time, 359d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed. 360d3daa3198e2212c985c634821682d5819346b653Chris Craik * 36198787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds. 362d3daa3198e2212c985c634821682d5819346b653Chris Craik */ 363d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp { 3646e068c0182f6f85bccb855a647510724d1c65a13Chris Craik ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha) 365e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr) 3666e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , shadowTask(shadowTask) 3676e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , casterAlpha(casterAlpha) { 368d3daa3198e2212c985c634821682d5819346b653Chris Craik }; 3696e068c0182f6f85bccb855a647510724d1c65a13Chris Craik sp<TessellationCache::ShadowTask> shadowTask; 370d3daa3198e2212c985c634821682d5819346b653Chris Craik const float casterAlpha; 371d3daa3198e2212c985c634821682d5819346b653Chris Craik}; 372d3daa3198e2212c985c634821682d5819346b653Chris Craik 373b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?) 374b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount) 375b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(SimpleRectsOp) 376b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertices(vertices) 377b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertexCount(vertexCount) {} 378b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Vertex* vertices; 379b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const size_t vertexCount; 380b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 381b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 382a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp { 383a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, 384a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik float x, float y) 385a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(TextOp) 386a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphs(glyphs) 387a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , positions(positions) 388a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphCount(glyphCount) 389a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , x(x) 390a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , y(y) {} 391a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const glyph_t* glyphs; 392a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* positions; 393a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int glyphCount; 394a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float x; 395a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float y; 396a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 397a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 398d7448e65e243754f31890baef29dff187dc2e5e5Chris Craikstruct TextOnPathOp : RecordedOp { 3994c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik // TODO: explicitly define bounds 4004c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik TextOnPathOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 4014c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik const glyph_t* glyphs, int glyphCount, const SkPath* path, float hOffset, float vOffset) 4024c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik : RecordedOp(RecordedOpId::TextOnPathOp, Rect(), localMatrix, localClip, paint) 403d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphs(glyphs) 404d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphCount(glyphCount) 405d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , path(path) 406d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , hOffset(hOffset) 407d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , vOffset(vOffset) {} 408d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const glyph_t* glyphs; 409d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const int glyphCount; 410d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 411d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const SkPath* path; 412d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float hOffset; 413d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float vOffset; 414d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik}; 415d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 416d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craikstruct TextureLayerOp : RecordedOp { 4178cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel TextureLayerOp(BASE_PARAMS_PAINTLESS, GlLayer* layer) 418d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik : SUPER_PAINTLESS(TextureLayerOp) 419d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik , layer(layer) {} 420aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik 421aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik // Copy an existing TextureLayerOp, replacing the underlying matrix 422aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik TextureLayerOp(const TextureLayerOp& op, const Matrix4& replacementMatrix) 423aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik : RecordedOp(RecordedOpId::TextureLayerOp, op.unmappedBounds, replacementMatrix, 424aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik op.localClip, op.paint) 425aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik , layer(op.layer) { 426aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik 427aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik } 4288cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel GlLayer* layer; 429d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik}; 430d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik 431a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 432a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers 433a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 434a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 4356fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4366fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer, 4376fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it. 4386fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4396fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp { 4406fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik BeginLayerOp(BASE_PARAMS) 4416fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : SUPER(BeginLayerOp) {} 4426fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4436fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 4446fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4456fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that 4466fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO. 4476fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * 4486fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished. 4496fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4506fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp { 4516fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik EndLayerOp() 452e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 4536fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4546fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 455b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct BeginUnclippedLayerOp : RecordedOp { 456b87eadda1818034ce03d85f30388384d1ac65916Chris Craik BeginUnclippedLayerOp(BASE_PARAMS) 457b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : SUPER(BeginUnclippedLayerOp) {} 458b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 459b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 460b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct EndUnclippedLayerOp : RecordedOp { 461b87eadda1818034ce03d85f30388384d1ac65916Chris Craik EndUnclippedLayerOp() 462b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 463b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 464b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 465b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyToLayerOp : RecordedOp { 466b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 467b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::CopyToLayerOp, 468b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.unmappedBounds, 469b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.localMatrix, 470b87eadda1818034ce03d85f30388384d1ac65916Chris Craik nullptr, // clip intentionally ignored 471b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.paint) 472b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(layerHandle) {} 473b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 474b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // Records a handle to the Layer object, since the Layer itself won't be 475b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // constructed until after this operation is constructed. 476b87eadda1818034ce03d85f30388384d1ac65916Chris Craik OffscreenBuffer** layerHandle; 477b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 478b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 479b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 480b87eadda1818034ce03d85f30388384d1ac65916Chris Craik// draw the parameter layer underneath 481b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyFromLayerOp : RecordedOp { 482b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 483b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::CopyFromLayerOp, 484b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.unmappedBounds, 485b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.localMatrix, 486b87eadda1818034ce03d85f30388384d1ac65916Chris Craik nullptr, // clip intentionally ignored 487b87eadda1818034ce03d85f30388384d1ac65916Chris Craik op.paint) 488b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(layerHandle) {} 489b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 490b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // Records a handle to the Layer object, since the Layer itself won't be 491b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // constructed until after this operation is constructed. 492b87eadda1818034ce03d85f30388384d1ac65916Chris Craik OffscreenBuffer** layerHandle; 493b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 494b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 4950b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/** 4960b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer. 4970b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * 4980b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated, 4990b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother. 5000b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */ 5016fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp { 50274af6e282f8a8f75928a071e8200039517cf5c12Chris Craik // Records a one-use (saveLayer) layer for drawing. 5035854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle) 5040b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : SUPER_PAINTLESS(LayerOp) 5050b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(layerHandle) 506e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f) 507260ab726486317496bc12a57d599ea96dcde3284Mike Reed , mode(PaintUtils::getBlendModeDirect(paint)) 50874af6e282f8a8f75928a071e8200039517cf5c12Chris Craik , colorFilter(paint ? paint->getColorFilter() : nullptr) {} 5090b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 510a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh explicit LayerOp(RenderNode& node) 511b87eadda1818034ce03d85f30388384d1ac65916Chris Craik : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), nullptr, nullptr) 512b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(node.getLayerHandle()) 513b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , alpha(node.properties().layerProperties().alpha() / 255.0f) 514b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , mode(node.properties().layerProperties().xferMode()) 51574af6e282f8a8f75928a071e8200039517cf5c12Chris Craik , colorFilter(node.properties().layerProperties().colorFilter()) {} 5160b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 517818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Records a handle to the Layer object, since the Layer itself won't be 518818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // constructed until after this operation is constructed. 5195854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer** layerHandle; 5200b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const float alpha; 521260ab726486317496bc12a57d599ea96dcde3284Mike Reed const SkBlendMode mode; 5220b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 5230b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // pointer to object owned by either LayerProperties, or a recorded Paint object in a 5240b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. 5250b7e8245db728d127ada698be63d78b33fc6e4daChris Craik SkColorFilter* colorFilter; 5266fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 5276fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 528b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 529b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 530