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 198cd3edfa15cc9cdbffa935d19ab894426b08d174Greg Daniel#include "GlLayer.h" 20b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h" 2198787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Rect.h" 220b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#include "RenderNode.h" 236e068c0182f6f85bccb855a647510724d1c65a13Chris Craik#include "TessellationCache.h" 241bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include "Vector.h" 251bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#include "font/FontUtil.h" 2698787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "utils/LinearAllocator.h" 275e00c7ce063116c11315639f0035aca8ad73e8ccChris Craik#include "utils/PaintUtils.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; 403e9999bd866fac71c72e6b484a9836c87c328a08sergeyvclass DeferredLayerUpdater; 413e9999bd866fac71c72e6b484a9836c87c328a08sergeyv 42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex; 43b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 44766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liunamespace VectorDrawable { 45766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liuclass Tree; 46766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu} 47766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 48b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/** 497cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Authoritative op list, used for generating the op ID enum, ID based LUTS, and 507cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * the functions to which they dispatch. Parameter macros are executed for each op, 517cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * in order, based on the op's type. 52b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 53b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * There are 4 types of op, which defines dispatch/LUT capability: 547cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * 55b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * | DisplayList | Render | Merge | 56b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * -------------|-------------|-------------|-------------| 57b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER | Yes | | | 58b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY | | Yes | | 59b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE | Yes | Yes | | 60b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE | Yes | Yes | Yes | 61b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 62b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * PRE RENDER - These ops are recorded into DisplayLists, but can't be directly rendered. This 63b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * may be because they need to be transformed into other op types (e.g. CirclePropsOp), 64b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * be traversed to access multiple renderable ops within (e.g. RenderNodeOp), or because they 65b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * modify renderbuffer lifecycle, instead of directly rendering content (the various LayerOps). 66b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 67b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * RENDER ONLY - These ops cannot be recorded into DisplayLists, and are instead implicitly 68b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * constructed from other commands/RenderNode properties. They cannot be merged. 69b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 70b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * UNMERGEABLE - These ops can be recorded into DisplayLists and rendered directly, but do not 71b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * support merged rendering. 72b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * 73b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * MERGEABLE - These ops can be recorded into DisplayLists and rendered individually, or merged 74b87eadda1818034ce03d85f30388384d1ac65916Chris Craik * under certain circumstances. 75b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 761bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define MAP_OPS_BASED_ON_TYPE(PRE_RENDER_OP_FN, RENDER_ONLY_OP_FN, UNMERGEABLE_OP_FN, \ 771bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck MERGEABLE_OP_FN) \ 781bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck PRE_RENDER_OP_FN(RenderNodeOp) \ 791bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck PRE_RENDER_OP_FN(CirclePropsOp) \ 801bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck PRE_RENDER_OP_FN(RoundRectPropsOp) \ 811bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck PRE_RENDER_OP_FN(BeginLayerOp) \ 821bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck PRE_RENDER_OP_FN(EndLayerOp) \ 831bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck PRE_RENDER_OP_FN(BeginUnclippedLayerOp) \ 841bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck PRE_RENDER_OP_FN(EndUnclippedLayerOp) \ 851bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck PRE_RENDER_OP_FN(VectorDrawableOp) \ 861bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck \ 871bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck RENDER_ONLY_OP_FN(ShadowOp) \ 881bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck RENDER_ONLY_OP_FN(LayerOp) \ 891bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck RENDER_ONLY_OP_FN(CopyToLayerOp) \ 901bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck RENDER_ONLY_OP_FN(CopyFromLayerOp) \ 911bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck \ 921bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(ArcOp) \ 931bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(BitmapMeshOp) \ 941bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(BitmapRectOp) \ 951bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(ColorOp) \ 961bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(FunctorOp) \ 971bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(LinesOp) \ 981bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(OvalOp) \ 991bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(PathOp) \ 1001bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(PointsOp) \ 1011bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(RectOp) \ 1021bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(RoundRectOp) \ 1031bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(SimpleRectsOp) \ 1041bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(TextOnPathOp) \ 1051bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck UNMERGEABLE_OP_FN(TextureLayerOp) \ 1061bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck \ 1071bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck MERGEABLE_OP_FN(BitmapOp) \ 1081bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck MERGEABLE_OP_FN(PatchOp) \ 1091bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck MERGEABLE_OP_FN(TextOp) 11015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 11115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/** 1127cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * LUT generators, which will insert nullptr for unsupported ops 11315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */ 1147cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define NULLPTR_OP_FN(Type) nullptr, 1157cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1167cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_DEFERRABLE_OP_LUT(OP_FN) \ 1171bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck { MAP_OPS_BASED_ON_TYPE(OP_FN, NULLPTR_OP_FN, OP_FN, OP_FN) } 1187cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1197cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_MERGEABLE_OP_LUT(OP_FN) \ 1201bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, NULLPTR_OP_FN, NULLPTR_OP_FN, OP_FN) } 12115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 1227cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik#define BUILD_RENDERABLE_OP_LUT(OP_FN) \ 1231bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, OP_FN, OP_FN, OP_FN) } 1247cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 12591eff22b5d7f8fe551bae01331948858ce932a96Chris Craik#define BUILD_FULL_OP_LUT(OP_FN) \ 1261bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck { MAP_OPS_BASED_ON_TYPE(OP_FN, OP_FN, OP_FN, OP_FN) } 12791eff22b5d7f8fe551bae01331948858ce932a96Chris Craik 1287cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik/** 1297cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Op mapping functions, which skip unsupported ops. 1307cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * 1317cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik * Note: Do not use for LUTS, since these do not preserve ID order. 1327cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik */ 13315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type) 13415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 1351bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define MAP_DEFERRABLE_OPS(OP_FN) MAP_OPS_BASED_ON_TYPE(OP_FN, NULL_OP_FN, OP_FN, OP_FN) 136b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 1371bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define MAP_MERGEABLE_OPS(OP_FN) MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, NULL_OP_FN, NULL_OP_FN, OP_FN) 1387cbf63da4f29e5a6b131796eb3b67fd9ff1521b8Chris Craik 1391bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define MAP_RENDERABLE_OPS(OP_FN) 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 { 1441bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckenum { 1451bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck MAP_OPS_BASED_ON_TYPE(IDENTITY_FN, IDENTITY_FN, IDENTITY_FN, IDENTITY_FN) Count, 1461bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck}; 147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 1481bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstatic_assert(RecordedOpId::RenderNodeOp == 0, "First index must be zero for LUTs to work"); 149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 1501bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define BASE_PARAMS \ 1511bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck const Rect &unmappedBounds, const Matrix4 &localMatrix, const ClipBase *localClip, \ 1521bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck const SkPaint *paint 1531bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define BASE_PARAMS_PAINTLESS \ 1541bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck const Rect &unmappedBounds, const Matrix4 &localMatrix, const ClipBase *localClip 155e4db79de127cfe961195f52907af8451026eaa20Chris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint) 1561bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck#define SUPER_PAINTLESS(Type) \ 1571bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr) 158b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 159b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp { 160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* ID from RecordedOpId - generally used for jumping into function tables */ 161b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const int opId; 162b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 163386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */ 164b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect unmappedBounds; 165b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 166b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* transform in recording space (vs DisplayList origin) */ 167b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Matrix4 localMatrix; 168b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 169e4db79de127cfe961195f52907af8451026eaa20Chris Craik /* clip in recording space - nullptr if not clipped */ 170e4db79de127cfe961195f52907af8451026eaa20Chris Craik const ClipBase* localClip; 171b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 172b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* optional paint, stored in base object to simplify merging logic */ 173b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkPaint* paint; 1741bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck 175b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected: 176b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RecordedOp(unsigned int opId, BASE_PARAMS) 177b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : opId(opId) 178b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , unmappedBounds(unmappedBounds) 179b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localMatrix(localMatrix) 180e4db79de127cfe961195f52907af8451026eaa20Chris Craik , localClip(localClip) 181b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , paint(paint) {} 182b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 183b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 184b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp { 185b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode) 1861bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : SUPER_PAINTLESS(RenderNodeOp), renderNode(renderNode) {} 1871bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck RenderNode* renderNode; // not const, since drawing modifies it 1888d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik 1898d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik /** 1908d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Holds the transformation between the projection surface ViewGroup and this RenderNode 1918d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * drawing instance. Represents any translations / transformations done within the drawing of 1928d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this 1938d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * DisplayList draw instance. 1948d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * 1958d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Note: doesn't include transformation within the RenderNode, or its properties. 1968d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik */ 1978d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik Matrix4 transformFromCompositingAncestor; 198161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik bool skipInOrderDraw = false; 199b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 200b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 201a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 202a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops 203a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 204a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 205386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp { 206386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter) 2071bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : SUPER(ArcOp), startAngle(startAngle), sweepAngle(sweepAngle), useCenter(useCenter) {} 208386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float startAngle; 209386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float sweepAngle; 210386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const bool useCenter; 211386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 212386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 213b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp { 2141bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck BitmapOp(BASE_PARAMS, Bitmap* bitmap) : SUPER(BitmapOp), bitmap(bitmap) {} 215ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv Bitmap* bitmap; 216b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 217b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 218f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp { 2191bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck BitmapMeshOp(BASE_PARAMS, Bitmap* bitmap, int meshWidth, int meshHeight, const float* vertices, 2201bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck const int* colors) 221f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapMeshOp) 222f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 223f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshWidth(meshWidth) 224f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshHeight(meshHeight) 225f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , vertices(vertices) 226f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , colors(colors) {} 227ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv Bitmap* bitmap; 228f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshWidth; 229f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshHeight; 230f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices; 231f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int* colors; 232f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 233f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 234f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp { 235ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv BitmapRectOp(BASE_PARAMS, Bitmap* bitmap, const Rect& src) 2361bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : SUPER(BitmapRectOp), bitmap(bitmap), src(src) {} 237ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv Bitmap* bitmap; 238f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Rect src; 239f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 240f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 241268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct CirclePropsOp : RecordedOp { 242e4db79de127cfe961195f52907af8451026eaa20Chris Craik CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 2431bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck float* x, float* y, float* radius) 244e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint) 245268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , x(x) 246268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , y(y) 247268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , radius(radius) {} 248268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* x; 249268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* y; 250268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* radius; 251268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 252268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 253a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craikstruct ColorOp : RecordedOp { 254a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik // Note: unbounded op that will fillclip, so no bounds/matrix needed 255260ab726486317496bc12a57d599ea96dcde3284Mike Reed ColorOp(const ClipBase* localClip, int color, SkBlendMode mode) 256a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik : RecordedOp(RecordedOpId::ColorOp, Rect(), Matrix4::identity(), localClip, nullptr) 257a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik , color(color) 258a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik , mode(mode) {} 259a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik const int color; 260260ab726486317496bc12a57d599ea96dcde3284Mike Reed const SkBlendMode mode; 261a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik}; 262a204848b1dc63877a12e2d24108e9d8e1e691e28Chris Craik 263e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craikstruct FunctorOp : RecordedOp { 2644c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik // Note: undefined record-time bounds, since this op fills the clip 2654c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik // TODO: explicitly define bounds 2664c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik FunctorOp(const Matrix4& localMatrix, const ClipBase* localClip, Functor* functor) 2674c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik : RecordedOp(RecordedOpId::FunctorOp, Rect(), localMatrix, localClip, nullptr) 268e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik , functor(functor) {} 269e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik Functor* functor; 270e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik}; 271e29ce6f51d681af7649c0a7cddee97c471e43eb5Chris Craik 272a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp { 273a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik LinesOp(BASE_PARAMS, const float* points, const int floatCount) 2741bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : SUPER(LinesOp), points(points), floatCount(floatCount) {} 275a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* points; 276a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int floatCount; 277a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 278a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 279386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp { 2801bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck OvalOp(BASE_PARAMS) : SUPER(OvalOp) {} 281386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 282386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 283f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp { 284ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv PatchOp(BASE_PARAMS, Bitmap* bitmap, const Res_png_9patch* patch) 2851bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : SUPER(PatchOp), bitmap(bitmap), patch(patch) {} 286ec4a4b13eae2241d1613890c1c1c096bed891845sergeyv Bitmap* bitmap; 287f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Res_png_9patch* patch; 288f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 289f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 290386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp { 2911bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck PathOp(BASE_PARAMS, const SkPath* path) : SUPER(PathOp), path(path) {} 292386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const SkPath* path; 293386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 294386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 295386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp { 296386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PointsOp(BASE_PARAMS, const float* points, const int floatCount) 2971bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : SUPER(PointsOp), points(points), floatCount(floatCount) {} 298386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float* points; 299386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const int floatCount; 300386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 301386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 302b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp { 3031bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck RectOp(BASE_PARAMS) : SUPER(RectOp) {} 304b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 305b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 306386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp { 3071bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck RoundRectOp(BASE_PARAMS, float rx, float ry) : SUPER(RoundRectOp), rx(rx), ry(ry) {} 308386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float rx; 309386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float ry; 310386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 311386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 312268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct RoundRectPropsOp : RecordedOp { 313e4db79de127cfe961195f52907af8451026eaa20Chris Craik RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 3141bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck float* left, float* top, float* right, float* bottom, float* rx, float* ry) 315e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint) 316268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , left(left) 317268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , top(top) 318268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , right(right) 319268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , bottom(bottom) 320268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , rx(rx) 321268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , ry(ry) {} 322268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* left; 323268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* top; 324268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* right; 325268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* bottom; 326268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* rx; 327268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* ry; 328268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 329268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 330766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liustruct VectorDrawableOp : RecordedOp { 331766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu VectorDrawableOp(VectorDrawable::Tree* tree, BASE_PARAMS_PAINTLESS) 3321bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : SUPER_PAINTLESS(VectorDrawableOp), vectorDrawable(tree) {} 333766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu VectorDrawable::Tree* vectorDrawable; 334766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu}; 335766431aa57c16ece8842287a92b2e7208e3b8ac3Doris Liu 336d3daa3198e2212c985c634821682d5819346b653Chris Craik/** 337d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow. 338d3daa3198e2212c985c634821682d5819346b653Chris Craik * 339d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time, 340d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed. 341d3daa3198e2212c985c634821682d5819346b653Chris Craik * 34298787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds. 343d3daa3198e2212c985c634821682d5819346b653Chris Craik */ 344d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp { 3456e068c0182f6f85bccb855a647510724d1c65a13Chris Craik ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha) 346e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr) 3476e068c0182f6f85bccb855a647510724d1c65a13Chris Craik , shadowTask(shadowTask) 3481bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck , casterAlpha(casterAlpha){}; 3496e068c0182f6f85bccb855a647510724d1c65a13Chris Craik sp<TessellationCache::ShadowTask> shadowTask; 350d3daa3198e2212c985c634821682d5819346b653Chris Craik const float casterAlpha; 351d3daa3198e2212c985c634821682d5819346b653Chris Craik}; 352d3daa3198e2212c985c634821682d5819346b653Chris Craik 3531bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reckstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?) 354b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount) 3551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : SUPER(SimpleRectsOp), vertices(vertices), vertexCount(vertexCount) {} 356b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Vertex* vertices; 357b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const size_t vertexCount; 358b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 359b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 360a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp { 3611bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, float x, 3621bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck float y) 363a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(TextOp) 364a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphs(glyphs) 365a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , positions(positions) 366a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphCount(glyphCount) 367a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , x(x) 368a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , y(y) {} 369a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const glyph_t* glyphs; 370a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* positions; 371a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int glyphCount; 372a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float x; 373a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float y; 374a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 375a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 376d7448e65e243754f31890baef29dff187dc2e5e5Chris Craikstruct TextOnPathOp : RecordedOp { 3774c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik // TODO: explicitly define bounds 3784c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik TextOnPathOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 3791bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck const glyph_t* glyphs, int glyphCount, const SkPath* path, float hOffset, 3801bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck float vOffset) 3814c3980b6e43cc7c0541f54b8e7e2d9d6108be622Chris Craik : RecordedOp(RecordedOpId::TextOnPathOp, Rect(), localMatrix, localClip, paint) 382d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphs(glyphs) 383d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , glyphCount(glyphCount) 384d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , path(path) 385d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , hOffset(hOffset) 386d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik , vOffset(vOffset) {} 387d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const glyph_t* glyphs; 388d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const int glyphCount; 389d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 390d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const SkPath* path; 391d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float hOffset; 392d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik const float vOffset; 393d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik}; 394d7448e65e243754f31890baef29dff187dc2e5e5Chris Craik 395d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craikstruct TextureLayerOp : RecordedOp { 3963e9999bd866fac71c72e6b484a9836c87c328a08sergeyv TextureLayerOp(BASE_PARAMS_PAINTLESS, DeferredLayerUpdater* layer) 3971bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : SUPER_PAINTLESS(TextureLayerOp), layerHandle(layer) {} 398aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik 399aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik // Copy an existing TextureLayerOp, replacing the underlying matrix 400aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik TextureLayerOp(const TextureLayerOp& op, const Matrix4& replacementMatrix) 401aafb01d8ade0def3f51b74ae3bbc610c4ab33044Chris Craik : RecordedOp(RecordedOpId::TextureLayerOp, op.unmappedBounds, replacementMatrix, 4021bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck op.localClip, op.paint) 4031bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck , layerHandle(op.layerHandle) {} 4043e9999bd866fac71c72e6b484a9836c87c328a08sergeyv DeferredLayerUpdater* layerHandle; 405d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik}; 406d2dfd8f128b632ed99418ab2b32949c939a9a369Chris Craik 407a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 408a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers 409a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 410a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 4116fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4126fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer, 4136fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it. 4146fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4156fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp { 4161bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck BeginLayerOp(BASE_PARAMS) : SUPER(BeginLayerOp) {} 4176fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4186fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 4196fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 4206fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that 4216fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO. 4226fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * 4236fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished. 4246fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 4256fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp { 4266fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik EndLayerOp() 427e4db79de127cfe961195f52907af8451026eaa20Chris Craik : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 4286fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4296fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 430b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct BeginUnclippedLayerOp : RecordedOp { 4311bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck BeginUnclippedLayerOp(BASE_PARAMS) : SUPER(BeginUnclippedLayerOp) {} 432b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 433b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 434b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct EndUnclippedLayerOp : RecordedOp { 435b87eadda1818034ce03d85f30388384d1ac65916Chris Craik EndUnclippedLayerOp() 4361bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr, 4371bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck nullptr) {} 438b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 439b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 440b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyToLayerOp : RecordedOp { 441b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 4421bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : RecordedOp(RecordedOpId::CopyToLayerOp, op.unmappedBounds, op.localMatrix, 4431bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck nullptr, // clip intentionally ignored 4441bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck op.paint) 445b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(layerHandle) {} 446b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 447b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // Records a handle to the Layer object, since the Layer itself won't be 448b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // constructed until after this operation is constructed. 449b87eadda1818034ce03d85f30388384d1ac65916Chris Craik OffscreenBuffer** layerHandle; 450b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 451b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 452b87eadda1818034ce03d85f30388384d1ac65916Chris Craik// draw the parameter layer underneath 453b87eadda1818034ce03d85f30388384d1ac65916Chris Craikstruct CopyFromLayerOp : RecordedOp { 454b87eadda1818034ce03d85f30388384d1ac65916Chris Craik CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 4551bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : RecordedOp(RecordedOpId::CopyFromLayerOp, op.unmappedBounds, op.localMatrix, 4561bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck nullptr, // clip intentionally ignored 4571bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck op.paint) 458b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(layerHandle) {} 459b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 460b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // Records a handle to the Layer object, since the Layer itself won't be 461b87eadda1818034ce03d85f30388384d1ac65916Chris Craik // constructed until after this operation is constructed. 462b87eadda1818034ce03d85f30388384d1ac65916Chris Craik OffscreenBuffer** layerHandle; 463b87eadda1818034ce03d85f30388384d1ac65916Chris Craik}; 464b87eadda1818034ce03d85f30388384d1ac65916Chris Craik 4650b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/** 4660b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer. 4670b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * 4680b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated, 4690b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother. 4700b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */ 4716fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp { 47274af6e282f8a8f75928a071e8200039517cf5c12Chris Craik // Records a one-use (saveLayer) layer for drawing. 4735854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle) 4740b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : SUPER_PAINTLESS(LayerOp) 4750b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(layerHandle) 476e5b50197e870aa6d22c3893f5d25f4279f06e5c3Chris Craik , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f) 477260ab726486317496bc12a57d599ea96dcde3284Mike Reed , mode(PaintUtils::getBlendModeDirect(paint)) 47874af6e282f8a8f75928a071e8200039517cf5c12Chris Craik , colorFilter(paint ? paint->getColorFilter() : nullptr) {} 4790b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 480a619ec70cf765d9166f0862e74653711b87307b3Chih-Hung Hsieh explicit LayerOp(RenderNode& node) 4811bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), 4821bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck Matrix4::identity(), nullptr, nullptr) 483b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , layerHandle(node.getLayerHandle()) 484b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , alpha(node.properties().layerProperties().alpha() / 255.0f) 485b87eadda1818034ce03d85f30388384d1ac65916Chris Craik , mode(node.properties().layerProperties().xferMode()) 48674af6e282f8a8f75928a071e8200039517cf5c12Chris Craik , colorFilter(node.properties().layerProperties().colorFilter()) {} 4870b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 488818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Records a handle to the Layer object, since the Layer itself won't be 489818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // constructed until after this operation is constructed. 4905854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer** layerHandle; 4910b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const float alpha; 492260ab726486317496bc12a57d599ea96dcde3284Mike Reed const SkBlendMode mode; 4930b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 4940b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // pointer to object owned by either LayerProperties, or a recorded Paint object in a 4950b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. 4960b7e8245db728d127ada698be63d78b33fc6e4daChris Craik SkColorFilter* colorFilter; 4976fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 4986fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 4991bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck}; // namespace uirenderer 5001bcacfdcab0eaa0cee92bd7f5a1b5e271dd68e52John Reck}; // namespace android 501