RecordedOp.h revision 268a9c0f29c16a64d5819c7dbe8b0633baedab83
1b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/* 2b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Copyright (C) 2015 The Android Open Source Project 3b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 4b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * you may not use this file except in compliance with the License. 6b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * You may obtain a copy of the License at 7b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 8b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * http://www.apache.org/licenses/LICENSE-2.0 9b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 10b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * Unless required by applicable law or agreed to in writing, software 11b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * See the License for the specific language governing permissions and 14b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * limitations under the License. 15b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 16b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 17b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#ifndef ANDROID_HWUI_RECORDED_OP_H 18b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define ANDROID_HWUI_RECORDED_OP_H 19b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 20a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik#include "font/FontUtil.h" 21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h" 2298787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Rect.h" 230b7e8245db728d127ada698be63d78b33fc6e4daChris Craik#include "RenderNode.h" 2498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "utils/LinearAllocator.h" 2598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik#include "Vector.h" 26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 27f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <androidfw/ResourceTypes.h> 28f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik#include <SkXfermode.h> 29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap; 31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint; 32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 35b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 365854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer; 37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode; 38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex; 39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/** 4115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * On of the provided macros is executed for each op type in order. The first will be used for ops 4215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * that cannot merge, and the second for those that can. 43b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 44b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * This serves as the authoritative list of ops, used for generating ID enum, and ID based LUTs. 45b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 4615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define MAP_OPS_BASED_ON_MERGEABILITY(U_OP_FN, M_OP_FN) \ 47386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(ArcOp) \ 4815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik M_OP_FN(BitmapOp) \ 49f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik U_OP_FN(BitmapMeshOp) \ 50f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik U_OP_FN(BitmapRectOp) \ 51268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik U_OP_FN(CirclePropsOp) \ 5215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(LinesOp) \ 53386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(OvalOp) \ 54f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik M_OP_FN(PatchOp) \ 55386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(PathOp) \ 56386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(PointsOp) \ 5715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(RectOp) \ 5815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(RenderNodeOp) \ 59386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(RoundRectOp) \ 60268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik U_OP_FN(RoundRectPropsOp) \ 6115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(ShadowOp) \ 6215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(SimpleRectsOp) \ 6315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik M_OP_FN(TextOp) \ 6415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(BeginLayerOp) \ 6515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(EndLayerOp) \ 6615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(LayerOp) 6715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 6815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/** 6915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * The provided macro is executed for each op type in order. This is used in cases where 7015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * merge-ability of ops doesn't matter. 7115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */ 72b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define MAP_OPS(OP_FN) \ 7315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik MAP_OPS_BASED_ON_MERGEABILITY(OP_FN, OP_FN) 7415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 7515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type) 7615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 7715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define MAP_MERGED_OPS(OP_FN) \ 7815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik MAP_OPS_BASED_ON_MERGEABILITY(NULL_OP_FN, OP_FN) 79b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 80b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum 81b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type, 82b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId { 83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik enum { 84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik MAP_OPS(IDENTITY_FN) 85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Count, 86b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik }; 87b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 88386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstatic_assert(RecordedOpId::ArcOp == 0, 89b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik "First index must be zero for LUTs to work"); 90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect, const SkPaint* paint 92b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect 93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, paint) 94b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, nullptr) 95b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp { 97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* ID from RecordedOpId - generally used for jumping into function tables */ 98b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const int opId; 99b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 100386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */ 101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect unmappedBounds; 102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* transform in recording space (vs DisplayList origin) */ 104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Matrix4 localMatrix; 105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* clip in recording space */ 107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect localClipRect; 108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* optional paint, stored in base object to simplify merging logic */ 110b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkPaint* paint; 111b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected: 112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RecordedOp(unsigned int opId, BASE_PARAMS) 113b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : opId(opId) 114b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , unmappedBounds(unmappedBounds) 115b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localMatrix(localMatrix) 116b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localClipRect(localClipRect) 117b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , paint(paint) {} 118b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 119b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 120b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp { 121b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode) 122b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER_PAINTLESS(RenderNodeOp) 123b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , renderNode(renderNode) {} 1248d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik RenderNode * renderNode; // not const, since drawing modifies it 1258d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik 1268d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik /** 1278d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Holds the transformation between the projection surface ViewGroup and this RenderNode 1288d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * drawing instance. Represents any translations / transformations done within the drawing of 1298d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this 1308d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * DisplayList draw instance. 1318d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * 1328d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Note: doesn't include transformation within the RenderNode, or its properties. 1338d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik */ 1348d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik Matrix4 transformFromCompositingAncestor; 135161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik bool skipInOrderDraw = false; 136b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 137b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 138a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 139a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops 140a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 141a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 142386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp { 143386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter) 144386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(ArcOp) 145386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , startAngle(startAngle) 146386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , sweepAngle(sweepAngle) 147386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , useCenter(useCenter) {} 148386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float startAngle; 149386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float sweepAngle; 150386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const bool useCenter; 151386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 152386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 153b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp { 154b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik BitmapOp(BASE_PARAMS, const SkBitmap* bitmap) 155b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(BitmapOp) 156b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , bitmap(bitmap) {} 157b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkBitmap* bitmap; 158b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // TODO: asset atlas/texture id lookup? 159b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 160b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 161f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp { 162f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight, 163f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices, const int* colors) 164f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapMeshOp) 165f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 166f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshWidth(meshWidth) 167f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshHeight(meshHeight) 168f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , vertices(vertices) 169f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , colors(colors) {} 170f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 171f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshWidth; 172f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshHeight; 173f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices; 174f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int* colors; 175f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 176f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 177f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp { 178f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src) 179f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapRectOp) 180f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 181f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , src(src) {} 182f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 183f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Rect src; 184f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 185f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 186268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct CirclePropsOp : RecordedOp { 187268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik CirclePropsOp(const Matrix4& localMatrix, const Rect& localClipRect, const SkPaint* paint, 188268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* x, float* y, float* radius) 189268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik : RecordedOp(RecordedOpId::CirclePropsOp, Rect(), localMatrix, localClipRect, paint) 190268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , x(x) 191268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , y(y) 192268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , radius(radius) {} 193268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* x; 194268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* y; 195268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* radius; 196268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 197268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 198a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp { 199a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik LinesOp(BASE_PARAMS, const float* points, const int floatCount) 200a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(LinesOp) 201a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , points(points) 202a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , floatCount(floatCount) {} 203a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* points; 204a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int floatCount; 205a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 206a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 207386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp { 208386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik OvalOp(BASE_PARAMS) 209386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(OvalOp) {} 210386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 211386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 212f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp { 213f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch) 214f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(PatchOp) 215f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 216f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , patch(patch) {} 217f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 218f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Res_png_9patch* patch; 219f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 220f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 221386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp { 222386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PathOp(BASE_PARAMS, const SkPath* path) 223386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PathOp) 224386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , path(path) {} 225386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const SkPath* path; 226386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 227386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 228386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp { 229386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PointsOp(BASE_PARAMS, const float* points, const int floatCount) 230386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PointsOp) 231386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , points(points) 232386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , floatCount(floatCount) {} 233386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float* points; 234386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const int floatCount; 235386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 236386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 237b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp { 238b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RectOp(BASE_PARAMS) 239b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(RectOp) {} 240b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 241b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 242386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp { 243386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik RoundRectOp(BASE_PARAMS, float rx, float ry) 244386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(RoundRectOp) 245386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , rx(rx) 246386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , ry(ry) {} 247386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float rx; 248386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float ry; 249386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 250386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 251268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craikstruct RoundRectPropsOp : RecordedOp { 252268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik RoundRectPropsOp(const Matrix4& localMatrix, const Rect& localClipRect, const SkPaint* paint, 253268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik float* left, float* top, float* right, float* bottom, float *rx, float *ry) 254268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik : RecordedOp(RecordedOpId::RoundRectPropsOp, Rect(), localMatrix, localClipRect, paint) 255268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , left(left) 256268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , top(top) 257268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , right(right) 258268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , bottom(bottom) 259268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , rx(rx) 260268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik , ry(ry) {} 261268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* left; 262268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* top; 263268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* right; 264268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* bottom; 265268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* rx; 266268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik const float* ry; 267268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik}; 268268a9c0f29c16a64d5819c7dbe8b0633baedab83Chris Craik 269d3daa3198e2212c985c634821682d5819346b653Chris Craik/** 270d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow. 271d3daa3198e2212c985c634821682d5819346b653Chris Craik * 272d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time, 273d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed. 274d3daa3198e2212c985c634821682d5819346b653Chris Craik * 27598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds. 276d3daa3198e2212c985c634821682d5819346b653Chris Craik */ 277d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp { 27898787e6c9b2c10b1ab7820bdac168686025b924aChris Craik ShadowOp(const RenderNodeOp& casterOp, float casterAlpha, const SkPath* casterPath, 27998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik const Rect& clipRect, const Vector3& lightCenter) 280d3daa3198e2212c985c634821682d5819346b653Chris Craik : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), clipRect, nullptr) 281d3daa3198e2212c985c634821682d5819346b653Chris Craik , shadowMatrixXY(casterOp.localMatrix) 282d3daa3198e2212c985c634821682d5819346b653Chris Craik , shadowMatrixZ(casterOp.localMatrix) 283d3daa3198e2212c985c634821682d5819346b653Chris Craik , casterAlpha(casterAlpha) 28498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik , casterPath(casterPath) 28598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik , lightCenter(lightCenter) { 286d3daa3198e2212c985c634821682d5819346b653Chris Craik const RenderNode& node = *casterOp.renderNode; 287d3daa3198e2212c985c634821682d5819346b653Chris Craik node.applyViewPropertyTransforms(shadowMatrixXY, false); 288d3daa3198e2212c985c634821682d5819346b653Chris Craik node.applyViewPropertyTransforms(shadowMatrixZ, true); 289d3daa3198e2212c985c634821682d5819346b653Chris Craik }; 290d3daa3198e2212c985c634821682d5819346b653Chris Craik Matrix4 shadowMatrixXY; 291d3daa3198e2212c985c634821682d5819346b653Chris Craik Matrix4 shadowMatrixZ; 292d3daa3198e2212c985c634821682d5819346b653Chris Craik const float casterAlpha; 293d3daa3198e2212c985c634821682d5819346b653Chris Craik const SkPath* casterPath; 29498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik const Vector3 lightCenter; 295d3daa3198e2212c985c634821682d5819346b653Chris Craik}; 296d3daa3198e2212c985c634821682d5819346b653Chris Craik 297b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?) 298b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount) 299b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(SimpleRectsOp) 300b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertices(vertices) 301b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertexCount(vertexCount) {} 302b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Vertex* vertices; 303b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const size_t vertexCount; 304b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 305b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 306a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp { 307a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, 308a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik float x, float y) 309a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(TextOp) 310a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphs(glyphs) 311a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , positions(positions) 312a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphCount(glyphCount) 313a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , x(x) 314a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , y(y) {} 315a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const glyph_t* glyphs; 316a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* positions; 317a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int glyphCount; 318a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float x; 319a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float y; 320a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 321a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 322a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 323a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers 324a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 325a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 326a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 3276fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 3286fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer, 3296fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it. 3306fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 3316fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp { 3326fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik BeginLayerOp(BASE_PARAMS) 3336fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : SUPER(BeginLayerOp) {} 3346fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 3356fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 3366fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 3376fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that 3386fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO. 3396fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * 3406fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished. 3416fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 3426fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp { 3436fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik EndLayerOp() 3446fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : RecordedOp(RecordedOpId::EndLayerOp, Rect(0, 0), Matrix4::identity(), Rect(0, 0), nullptr) {} 3456fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 3466fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 3470b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/** 3480b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer. 3490b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * 3500b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated, 3510b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother. 3520b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */ 3536fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp { 3540b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed. 3555854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle) 3560b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : SUPER_PAINTLESS(LayerOp) 3570b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(layerHandle) 3580b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , alpha(paint->getAlpha() / 255.0f) 3590b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , mode(PaintUtils::getXfermodeDirect(paint)) 3600b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , colorFilter(paint->getColorFilter()) 3610b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , destroy(true) {} 3620b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 3630b7e8245db728d127ada698be63d78b33fc6e4daChris Craik LayerOp(RenderNode& node) 3640b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), Rect(node.getWidth(), node.getHeight()), nullptr) 3650b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(node.getLayerHandle()) 3660b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , alpha(node.properties().layerProperties().alpha() / 255.0f) 3670b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , mode(node.properties().layerProperties().xferMode()) 3680b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , colorFilter(node.properties().layerProperties().colorFilter()) 3690b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , destroy(false) {} 3700b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 371818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Records a handle to the Layer object, since the Layer itself won't be 372818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // constructed until after this operation is constructed. 3735854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer** layerHandle; 3740b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const float alpha; 3750b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const SkXfermode::Mode mode; 3760b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 3770b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // pointer to object owned by either LayerProperties, or a recorded Paint object in a 3780b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. 3790b7e8245db728d127ada698be63d78b33fc6e4daChris Craik SkColorFilter* colorFilter; 3800b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 3810b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // whether to destroy the layer, once rendered 3820b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const bool destroy; 3836fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 3846fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 385b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 386b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 387b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 388b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H 389