RecordedOp.h revision aafb01d8ade0def3f51b74ae3bbc610c4ab33044
19439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/* 28949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta * Copyright (C) 2015 The Android Open Source Project 39439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 49439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 59439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * you may not use this file except in compliance with the License. 69439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * You may obtain a copy of the License at 79439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 89439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * http://www.apache.org/licenses/LICENSE-2.0 99439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Unless required by applicable law or agreed to in writing, software 119439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * See the License for the specific language governing permissions and 149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * limitations under the License. 159439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */ 169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 179439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#ifndef ANDROID_HWUI_RECORDED_OP_H 189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define ANDROID_HWUI_RECORDED_OP_H 199439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "RecordedOp.h" 219439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "font/FontUtil.h" 229439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "Matrix.h" 239439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "Rect.h" 249439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "RenderNode.h" 259439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "TessellationCache.h" 269439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "utils/LinearAllocator.h" 279439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include "Vector.h" 289439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 299439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include <androidfw/ResourceTypes.h> 309439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#include <SkXfermode.h> 319439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 329439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellyclass SkBitmap; 339439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellyclass SkPaint; 349439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 359439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellynamespace android { 362e0da96e757a977154063f980d3f4e1abd41cf09Nick Pellynamespace uirenderer { 372e0da96e757a977154063f980d3f4e1abd41cf09Nick Pelly 382e0da96e757a977154063f980d3f4e1abd41cf09Nick Pellystruct ClipBase; 3925f2c4cd953764008d04147a14d990c06a8154e5Oscar Montemayorclass OffscreenBuffer; 409439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellyclass RenderNode; 419439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct Vertex; 429439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 43238e0f934f1f47263b384bc745ae0678c777130dCasper Bondenamespace VectorDrawable { 442e0da96e757a977154063f980d3f4e1abd41cf09Nick Pellyclass Tree; 459439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly} 469439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 479439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/** 489439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Authoritative op list, used for generating the op ID enum, ID based LUTS, and 4905ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * the functions to which they dispatch. Parameter macros are executed for each op, 5005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * in order, based on the op's type. 519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 529439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * There are 4 types of op, which defines dispatch/LUT capability: 539439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 549439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * | DisplayList | Render | Merge | 559439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * -------------|-------------|-------------|-------------| 569439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * PRE RENDER | Yes | | | 5705ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * RENDER ONLY | | Yes | | 589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * UNMERGEABLE | Yes | Yes | | 599439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * MERGEABLE | Yes | Yes | Yes | 609439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 619439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * PRE RENDER - These ops are recorded into DisplayLists, but can't be directly rendered. This 629439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * may be because they need to be transformed into other op types (e.g. CirclePropsOp), 639439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * be traversed to access multiple renderable ops within (e.g. RenderNodeOp), or because they 6405ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * modify renderbuffer lifecycle, instead of directly rendering content (the various LayerOps). 659439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 669439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * RENDER ONLY - These ops cannot be recorded into DisplayLists, and are instead implicitly 679439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * constructed from other commands/RenderNode properties. They cannot be merged. 689439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 699439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * UNMERGEABLE - These ops can be recorded into DisplayLists and rendered directly, but do not 709439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * support merged rendering. 719439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 7205ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * MERGEABLE - These ops can be recorded into DisplayLists and rendered individually, or merged 739439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * under certain circumstances. 749439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */ 759439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define MAP_OPS_BASED_ON_TYPE(PRE_RENDER_OP_FN, RENDER_ONLY_OP_FN, UNMERGEABLE_OP_FN, MERGEABLE_OP_FN) \ 769439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly PRE_RENDER_OP_FN(RenderNodeOp) \ 779439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly PRE_RENDER_OP_FN(CirclePropsOp) \ 789439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly PRE_RENDER_OP_FN(RoundRectPropsOp) \ 799439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly PRE_RENDER_OP_FN(BeginLayerOp) \ 8005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun PRE_RENDER_OP_FN(EndLayerOp) \ 8105ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun PRE_RENDER_OP_FN(BeginUnclippedLayerOp) \ 829439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly PRE_RENDER_OP_FN(EndUnclippedLayerOp) \ 839439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly PRE_RENDER_OP_FN(VectorDrawableOp) \ 849439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly \ 859439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly RENDER_ONLY_OP_FN(ShadowOp) \ 869439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly RENDER_ONLY_OP_FN(LayerOp) \ 879439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly RENDER_ONLY_OP_FN(CopyToLayerOp) \ 8805ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun RENDER_ONLY_OP_FN(CopyFromLayerOp) \ 8905ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun \ 9005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun UNMERGEABLE_OP_FN(ArcOp) \ 919439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(BitmapMeshOp) \ 929439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(BitmapRectOp) \ 939439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(ColorOp) \ 949439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(FunctorOp) \ 959439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(LinesOp) \ 969439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(OvalOp) \ 9705ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun UNMERGEABLE_OP_FN(PathOp) \ 9805ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun UNMERGEABLE_OP_FN(PointsOp) \ 999439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(RectOp) \ 1009439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(RoundRectOp) \ 1019439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(SimpleRectsOp) \ 1029439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(TextOnPathOp) \ 1039439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly UNMERGEABLE_OP_FN(TextureLayerOp) \ 1049439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly \ 10505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun MERGEABLE_OP_FN(BitmapOp) \ 1069439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly MERGEABLE_OP_FN(PatchOp) \ 1079439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly MERGEABLE_OP_FN(TextOp) 1089439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 1099439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/** 1109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * LUT generators, which will insert nullptr for unsupported ops 1119439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */ 1129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define NULLPTR_OP_FN(Type) nullptr, 11305ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun 1149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BUILD_DEFERRABLE_OP_LUT(OP_FN) \ 1159439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly { MAP_OPS_BASED_ON_TYPE(OP_FN, NULLPTR_OP_FN, OP_FN, OP_FN) } 1169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 1179439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BUILD_MERGEABLE_OP_LUT(OP_FN) \ 1189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, NULLPTR_OP_FN, NULLPTR_OP_FN, OP_FN) } 1199439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 1209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BUILD_RENDERABLE_OP_LUT(OP_FN) \ 1213998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun { MAP_OPS_BASED_ON_TYPE(NULLPTR_OP_FN, OP_FN, OP_FN, OP_FN) } 1223998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 1233998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun#define BUILD_FULL_OP_LUT(OP_FN) \ 1243998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun { MAP_OPS_BASED_ON_TYPE(OP_FN, OP_FN, OP_FN, OP_FN) } 1253998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 1263998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun/** 1273998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * Op mapping functions, which skip unsupported ops. 1283998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * 1293998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * Note: Do not use for LUTS, since these do not preserve ID order. 1303998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun */ 1313998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun#define NULL_OP_FN(Type) 1323998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 1333998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun#define MAP_DEFERRABLE_OPS(OP_FN) \ 1343998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun MAP_OPS_BASED_ON_TYPE(OP_FN, NULL_OP_FN, OP_FN, OP_FN) 13505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun 1369439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define MAP_MERGEABLE_OPS(OP_FN) \ 1379439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, NULL_OP_FN, NULL_OP_FN, OP_FN) 1389439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 1399439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define MAP_RENDERABLE_OPS(OP_FN) \ 1409439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly MAP_OPS_BASED_ON_TYPE(NULL_OP_FN, OP_FN, OP_FN, OP_FN) 1419439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 1429439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly// Generate OpId enum 1433998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun#define IDENTITY_FN(Type) Type, 1443998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunnamespace RecordedOpId { 1459439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly enum { 1463998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun MAP_OPS_BASED_ON_TYPE(IDENTITY_FN, IDENTITY_FN, IDENTITY_FN, IDENTITY_FN) 1479439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly Count, 1483998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun }; 1493998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun} 1509439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystatic_assert(RecordedOpId::RenderNodeOp == 0, 1519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly "First index must be zero for LUTs to work"); 15205ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun 1539439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint 1549439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const ClipBase* localClip 1559439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, paint) 1569439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClip, nullptr) 1579439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 1589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct RecordedOp { 1593998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun /* ID from RecordedOpId - generally used for jumping into function tables */ 1603998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const int opId; 1613998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 1623998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */ 1633998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const Rect unmappedBounds; 1643998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 1653998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun /* transform in recording space (vs DisplayList origin) */ 1663998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const Matrix4 localMatrix; 1673998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 1683998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun /* clip in recording space - nullptr if not clipped */ 1693998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const ClipBase* localClip; 1703998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 1713998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun /* optional paint, stored in base object to simplify merging logic */ 1723998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const SkPaint* paint; 1733998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunprotected: 17405ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun RecordedOp(unsigned int opId, BASE_PARAMS) 17505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun : opId(opId) 1763998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , unmappedBounds(unmappedBounds) 1773998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , localMatrix(localMatrix) 1783998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , localClip(localClip) 1793998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , paint(paint) {} 1803998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun}; 181238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde 182238e0f934f1f47263b384bc745ae0678c777130dCasper Bondestruct RenderNodeOp : RecordedOp { 183238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode) 184238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde : SUPER_PAINTLESS(RenderNodeOp) 185238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde , renderNode(renderNode) {} 186238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde RenderNode * renderNode; // not const, since drawing modifies it 187238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde 188238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde /** 189238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * Holds the transformation between the projection surface ViewGroup and this RenderNode 190238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * drawing instance. Represents any translations / transformations done within the drawing of 191238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this 192238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * DisplayList draw instance. 193238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * 194238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * Note: doesn't include transformation within the RenderNode, or its properties. 195238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde */ 196238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde Matrix4 transformFromCompositingAncestor; 1973998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun bool skipInOrderDraw = false; 1989439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 1993998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 2009439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly//////////////////////////////////////////////////////////////////////////////////////////////////// 2018949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta// Standard Ops 2028949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta//////////////////////////////////////////////////////////////////////////////////////////////////// 2033998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 2049439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct ArcOp : RecordedOp { 2053998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter) 2069439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(ArcOp) 2073998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , startAngle(startAngle) 2089439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , sweepAngle(sweepAngle) 2093998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , useCenter(useCenter) {} 2109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float startAngle; 2113998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const float sweepAngle; 2129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const bool useCenter; 2133998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun}; 2149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 2153998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunstruct BitmapOp : RecordedOp { 2169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly BitmapOp(BASE_PARAMS, const SkBitmap* bitmap) 2173998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun : SUPER(BitmapOp) 2189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , bitmap(bitmap) {} 2193998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const SkBitmap* bitmap; 2209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly // TODO: asset atlas/texture id lookup? 2213998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun}; 2229439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 223238e0f934f1f47263b384bc745ae0678c777130dCasper Bondestruct BitmapMeshOp : RecordedOp { 2249439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight, 2253998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const float* vertices, const int* colors) 2269439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(BitmapMeshOp) 2273998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , bitmap(bitmap) 2289439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , meshWidth(meshWidth) 2293998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , meshHeight(meshHeight) 2309439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , vertices(vertices) 231238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde , colors(colors) {} 232238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde const SkBitmap* bitmap; 233238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde const int meshWidth; 234238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde const int meshHeight; 235238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde const float* vertices; 236238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde const int* colors; 2379439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 23805ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun 2399439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct BitmapRectOp : RecordedOp { 24005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src) 24105ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun : SUPER(BitmapRectOp) 24205ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun , bitmap(bitmap) 24305ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun , src(src) {} 24405ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun const SkBitmap* bitmap; 24505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun const Rect src; 24605ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun}; 2479439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 2489439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct CirclePropsOp : RecordedOp { 2499439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly CirclePropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 2509439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly float* x, float* y, float* radius) 2519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClip, paint) 2529439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , x(x) 2533998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , y(y) 2543998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , radius(radius) {} 2553998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const float* x; 2563998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const float* y; 2579439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float* radius; 2589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 2599439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 2609439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct ColorOp : RecordedOp { 2618949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta // Note: unbounded op that will fillclip, so no bounds/matrix needed 2628949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta ColorOp(const ClipBase* localClip, int color, SkXfermode::Mode mode) 2638949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta : RecordedOp(RecordedOpId::ColorOp, Rect(), Matrix4::identity(), localClip, nullptr) 2648949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta , color(color) 2658949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta , mode(mode) {} 2668949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta const int color; 2678949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta const SkXfermode::Mode mode; 2688949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta}; 2698949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta 2708949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Guptastruct FunctorOp : RecordedOp { 2718949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta // Note: undefined record-time bounds, since this op fills the clip 2728949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta // TODO: explicitly define bounds 2738949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta FunctorOp(const Matrix4& localMatrix, const ClipBase* localClip, Functor* functor) 2748949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta : RecordedOp(RecordedOpId::FunctorOp, Rect(), localMatrix, localClip, nullptr) 2758949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta , functor(functor) {} 2768949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta Functor* functor; 2778949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta}; 2788949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta 2798949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Guptastruct LinesOp : RecordedOp { 28005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun LinesOp(BASE_PARAMS, const float* points, const int floatCount) 2819439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(LinesOp) 28205ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun , points(points) 2839439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , floatCount(floatCount) {} 2849439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float* points; 2859439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const int floatCount; 2869439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 28705ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun 28805ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejunstruct OvalOp : RecordedOp { 28905ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun OvalOp(BASE_PARAMS) 29005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun : SUPER(OvalOp) {} 2919439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 2929439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 2939439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct PatchOp : RecordedOp { 2949439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch) 2959439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(PatchOp) 2969439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , bitmap(bitmap) 2979439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , patch(patch) {} 2989439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const SkBitmap* bitmap; 2993998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const Res_png_9patch* patch; 3009439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 3019439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 3029439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct PathOp : RecordedOp { 3039439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly PathOp(BASE_PARAMS, const SkPath* path) 3049439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(PathOp) 3059439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , path(path) {} 3069439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const SkPath* path; 3079439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 3083998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 3099439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct PointsOp : RecordedOp { 3109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly PointsOp(BASE_PARAMS, const float* points, const int floatCount) 3119439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(PointsOp) 3129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , points(points) 3139439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , floatCount(floatCount) {} 3148949bfb90c415629dbd0e30d25003fb3e0375fb5Hemant Gupta const float* points; 3153998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const int floatCount; 3169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 3179439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 3189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct RectOp : RecordedOp { 3199439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly RectOp(BASE_PARAMS) 3209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(RectOp) {} 3213998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun}; 3229439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 3239439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct RoundRectOp : RecordedOp { 3249439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly RoundRectOp(BASE_PARAMS, float rx, float ry) 3259439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(RoundRectOp) 3263998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , rx(rx) 3279439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , ry(ry) {} 3289439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float rx; 3299439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float ry; 3309439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 3319439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 3329439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct RoundRectPropsOp : RecordedOp { 3339439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly RoundRectPropsOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 3349439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly float* left, float* top, float* right, float* bottom, float *rx, float *ry) 3353998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClip, paint) 3369439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , left(left) 3379439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , top(top) 3389439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , right(right) 3399439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , bottom(bottom) 3409439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , rx(rx) 3413998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , ry(ry) {} 3429439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float* left; 3439439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float* top; 3449439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float* right; 3459439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float* bottom; 3469439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float* rx; 3473998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const float* ry; 3489439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 3499439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 3509439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct VectorDrawableOp : RecordedOp { 3519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly VectorDrawableOp(VectorDrawable::Tree* tree, BASE_PARAMS_PAINTLESS) 3529439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER_PAINTLESS(VectorDrawableOp) 3533998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , vectorDrawable(tree) {} 3549439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly VectorDrawable::Tree* vectorDrawable; 3559439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 3569439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 3573998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun/** 3589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Real-time, dynamic-lit shadow. 3599439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 3609439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time, 3619439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * and are resolved dynamically, and transform isn't needed. 3623998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * 3633998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * State construction handles these properties specially, ignoring matrix/bounds. 3649439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */ 3659439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct ShadowOp : RecordedOp { 3669439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly ShadowOp(sp<TessellationCache::ShadowTask>& shadowTask, float casterAlpha) 3679439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), nullptr, nullptr) 3689439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , shadowTask(shadowTask) 3693998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , casterAlpha(casterAlpha) { 3709439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly }; 3719439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly sp<TessellationCache::ShadowTask> shadowTask; 3729439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float casterAlpha; 3739439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 3743998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 3753998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?) 3769439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount) 3779439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(SimpleRectsOp) 3789439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , vertices(vertices) 3799439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , vertexCount(vertexCount) {} 3809439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly Vertex* vertices; 3813998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const size_t vertexCount; 3829439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 3839439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 3849439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct TextOp : RecordedOp { 3859439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, 3863998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun float x, float y) 3873998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun : SUPER(TextOp) 3889439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , glyphs(glyphs) 3899439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , positions(positions) 3909439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , glyphCount(glyphCount) 3919439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , x(x) 3929439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , y(y) {} 3933998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const glyph_t* glyphs; 3949439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float* positions; 3959439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const int glyphCount; 3969439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float x; 3979439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float y; 3983998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun}; 3993998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 4009439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct TextOnPathOp : RecordedOp { 4019439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly // TODO: explicitly define bounds 4029439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly TextOnPathOp(const Matrix4& localMatrix, const ClipBase* localClip, const SkPaint* paint, 4039439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const glyph_t* glyphs, int glyphCount, const SkPath* path, float hOffset, float vOffset) 4049439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : RecordedOp(RecordedOpId::TextOnPathOp, Rect(), localMatrix, localClip, paint) 4053998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , glyphs(glyphs) 4069439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , glyphCount(glyphCount) 4079439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , path(path) 4089439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , hOffset(hOffset) 4099439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , vOffset(vOffset) {} 4109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const glyph_t* glyphs; 4113998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const int glyphCount; 4123998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 4139439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const SkPath* path; 4149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float hOffset; 4159439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float vOffset; 416238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde}; 417238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde 418238e0f934f1f47263b384bc745ae0678c777130dCasper Bondestruct TextureLayerOp : RecordedOp { 419238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde TextureLayerOp(BASE_PARAMS_PAINTLESS, Layer* layer) 420238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde : SUPER_PAINTLESS(TextureLayerOp) 421238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde , layer(layer) {} 422238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde 423238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde // Copy an existing TextureLayerOp, replacing the underlying matrix 424238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde TextureLayerOp(const TextureLayerOp& op, const Matrix4& replacementMatrix) 425238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde : RecordedOp(RecordedOpId::TextureLayerOp, op.unmappedBounds, replacementMatrix, 426238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde op.localClip, op.paint) 427238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde , layer(op.layer) { 428238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde 429238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde } 430238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde Layer* layer; 431238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde}; 432238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde 433238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde//////////////////////////////////////////////////////////////////////////////////////////////////// 434238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde// Layers 435238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde//////////////////////////////////////////////////////////////////////////////////////////////////// 436238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde 437238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde/** 438238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * Stateful operation! denotes the creation of an off-screen layer, 439238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * and that commands following will render into it. 4409439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */ 4419439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct BeginLayerOp : RecordedOp { 4429439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly BeginLayerOp(BASE_PARAMS) 4439439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(BeginLayerOp) {} 4449439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 4459439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 4469439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/** 4473998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun * Stateful operation! Denotes end of off-screen layer, and that 4489439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * commands since last BeginLayerOp should be drawn into parent FBO. 4499439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 4509439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * State in this op is empty, it just serves to signal that a layer has been finished. 4519439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */ 4529439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct EndLayerOp : RecordedOp { 4539439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly EndLayerOp() 4549439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : RecordedOp(RecordedOpId::EndLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 4553998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun}; 4569439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 4579439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct BeginUnclippedLayerOp : RecordedOp { 4589439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly BeginUnclippedLayerOp(BASE_PARAMS) 4599439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : SUPER(BeginUnclippedLayerOp) {} 4609439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 4613998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 4623998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejunstruct EndUnclippedLayerOp : RecordedOp { 4633998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun EndUnclippedLayerOp() 4649439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : RecordedOp(RecordedOpId::EndUnclippedLayerOp, Rect(), Matrix4::identity(), nullptr, nullptr) {} 4659439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 4669439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 4679439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct CopyToLayerOp : RecordedOp { 4689439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly CopyToLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 4699439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : RecordedOp(RecordedOpId::CopyToLayerOp, 4709439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly op.unmappedBounds, 4719439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly op.localMatrix, 4729439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly nullptr, // clip intentionally ignored 4733998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun op.paint) 4749439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , layerHandle(layerHandle) {} 4759439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 4769439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly // Records a handle to the Layer object, since the Layer itself won't be 4779439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly // constructed until after this operation is constructed. 4789439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly OffscreenBuffer** layerHandle; 4799439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 4809439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 4819439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 4823998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun// draw the parameter layer underneath 4839439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct CopyFromLayerOp : RecordedOp { 4849439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly CopyFromLayerOp(const RecordedOp& op, OffscreenBuffer** layerHandle) 4859439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : RecordedOp(RecordedOpId::CopyFromLayerOp, 4869439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly op.unmappedBounds, 4879439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly op.localMatrix, 4889439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly nullptr, // clip intentionally ignored 4899439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly op.paint) 4909439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , layerHandle(layerHandle) {} 4919439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 4923998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun // Records a handle to the Layer object, since the Layer itself won't be 4939439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly // constructed until after this operation is constructed. 4949439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly OffscreenBuffer** layerHandle; 4959439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; 4969439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 4979439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly/** 4989439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * Draws an OffscreenBuffer. 4999439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * 50005ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated, 5019439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly * when creating/tracking a SkPaint* during defer isn't worth the bother. 5029439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly */ 5039439a7fe517b858bc5e5c654b459315e4722feb2Nick Pellystruct LayerOp : RecordedOp { 50405ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed. 50505ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle) 50605ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun : SUPER_PAINTLESS(LayerOp) 50705ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun , layerHandle(layerHandle) 5082e0da96e757a977154063f980d3f4e1abd41cf09Nick Pelly , alpha(paint ? paint->getAlpha() / 255.0f : 1.0f) 50905ff98bbefda39b9ff26f8bca132cfd0248745c6Tao Liejun , mode(PaintUtils::getXfermodeDirect(paint)) 5109439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , colorFilter(paint ? paint->getColorFilter() : nullptr) 5119439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , destroy(true) {} 5129439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 5139439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly LayerOp(RenderNode& node) 5149439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), nullptr, nullptr) 5153998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , layerHandle(node.getLayerHandle()) 5169439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , alpha(node.properties().layerProperties().alpha() / 255.0f) 5173998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , mode(node.properties().layerProperties().xferMode()) 5189439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly , colorFilter(node.properties().layerProperties().colorFilter()) 5193998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun , destroy(false) {} 5209439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 5213998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun // Records a handle to the Layer object, since the Layer itself won't be 5229439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly // constructed until after this operation is constructed. 5233998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun OffscreenBuffer** layerHandle; 5249439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const float alpha; 5253998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun const SkXfermode::Mode mode; 5269439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 5273998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun // pointer to object owned by either LayerProperties, or a recorded Paint object in a 5289439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. 5293998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun SkColorFilter* colorFilter; 5309439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly 5313998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun // whether to destroy the layer, once rendered 5329439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly const bool destroy; 5333998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun}; 534fe3807a5b23f54f6539436d71aa0cd931a2b76f0Matthew Xie 535fe3807a5b23f54f6539436d71aa0cd931a2b76f0Matthew Xie}; // namespace uirenderer 5369439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly}; // namespace android 5373998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun 5389439a7fe517b858bc5e5c654b459315e4722feb2Nick Pelly#endif // ANDROID_HWUI_RECORDED_OP_H 5393998bf009acaf8cde4d7f837f8b8e41ae0a65141Tao Liejun