RecordedOp.h revision f09ff5aa57bff01cb17595fb7ca8e48d238a6acd
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) \ 5115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(LinesOp) \ 52386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(OvalOp) \ 53f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik M_OP_FN(PatchOp) \ 54386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(PathOp) \ 55386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(PointsOp) \ 5615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(RectOp) \ 5715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(RenderNodeOp) \ 58386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(RoundRectOp) \ 5915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(ShadowOp) \ 6015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(SimpleRectsOp) \ 6115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik M_OP_FN(TextOp) \ 6215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(BeginLayerOp) \ 6315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(EndLayerOp) \ 6415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(LayerOp) 6515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 6615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/** 6715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * The provided macro is executed for each op type in order. This is used in cases where 6815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * merge-ability of ops doesn't matter. 6915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */ 70b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define MAP_OPS(OP_FN) \ 7115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik MAP_OPS_BASED_ON_MERGEABILITY(OP_FN, OP_FN) 7215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 7315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type) 7415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 7515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define MAP_MERGED_OPS(OP_FN) \ 7615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik MAP_OPS_BASED_ON_MERGEABILITY(NULL_OP_FN, OP_FN) 77b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 78b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum 79b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type, 80b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId { 81b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik enum { 82b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik MAP_OPS(IDENTITY_FN) 83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Count, 84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik }; 85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 86386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstatic_assert(RecordedOpId::ArcOp == 0, 87b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik "First index must be zero for LUTs to work"); 88b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 89b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect, const SkPaint* paint 90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect 91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, paint) 92b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, nullptr) 93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 94b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp { 95b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* ID from RecordedOpId - generally used for jumping into function tables */ 96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const int opId; 97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 98386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */ 99b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect unmappedBounds; 100b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* transform in recording space (vs DisplayList origin) */ 102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Matrix4 localMatrix; 103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* clip in recording space */ 105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect localClipRect; 106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* optional paint, stored in base object to simplify merging logic */ 108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkPaint* paint; 109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected: 110b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RecordedOp(unsigned int opId, BASE_PARAMS) 111b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : opId(opId) 112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , unmappedBounds(unmappedBounds) 113b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localMatrix(localMatrix) 114b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localClipRect(localClipRect) 115b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , paint(paint) {} 116b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 117b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 118b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp { 119b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode) 120b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER_PAINTLESS(RenderNodeOp) 121b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , renderNode(renderNode) {} 1228d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik RenderNode * renderNode; // not const, since drawing modifies it 1238d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik 1248d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik /** 1258d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Holds the transformation between the projection surface ViewGroup and this RenderNode 1268d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * drawing instance. Represents any translations / transformations done within the drawing of 1278d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this 1288d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * DisplayList draw instance. 1298d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * 1308d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Note: doesn't include transformation within the RenderNode, or its properties. 1318d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik */ 1328d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik Matrix4 transformFromCompositingAncestor; 133161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik bool skipInOrderDraw = false; 134b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 135b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 136a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 137a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops 138a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 139a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 140386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp { 141386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter) 142386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(ArcOp) 143386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , startAngle(startAngle) 144386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , sweepAngle(sweepAngle) 145386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , useCenter(useCenter) {} 146386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float startAngle; 147386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float sweepAngle; 148386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const bool useCenter; 149386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 150386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 151b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp { 152b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik BitmapOp(BASE_PARAMS, const SkBitmap* bitmap) 153b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(BitmapOp) 154b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , bitmap(bitmap) {} 155b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkBitmap* bitmap; 156b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // TODO: asset atlas/texture id lookup? 157b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 158b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 159f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapMeshOp : RecordedOp { 160f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapMeshOp(BASE_PARAMS, const SkBitmap* bitmap, int meshWidth, int meshHeight, 161f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices, const int* colors) 162f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapMeshOp) 163f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 164f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshWidth(meshWidth) 165f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , meshHeight(meshHeight) 166f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , vertices(vertices) 167f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , colors(colors) {} 168f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 169f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshWidth; 170f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int meshHeight; 171f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const float* vertices; 172f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const int* colors; 173f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 174f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 175f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct BitmapRectOp : RecordedOp { 176f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik BitmapRectOp(BASE_PARAMS, const SkBitmap* bitmap, const Rect& src) 177f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(BitmapRectOp) 178f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 179f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , src(src) {} 180f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 181f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Rect src; 182f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 183f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 184a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp { 185a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik LinesOp(BASE_PARAMS, const float* points, const int floatCount) 186a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(LinesOp) 187a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , points(points) 188a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , floatCount(floatCount) {} 189a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* points; 190a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int floatCount; 191a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 192a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 193386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp { 194386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik OvalOp(BASE_PARAMS) 195386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(OvalOp) {} 196386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 197386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 198f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 199f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craikstruct PatchOp : RecordedOp { 200f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik PatchOp(BASE_PARAMS, const SkBitmap* bitmap, const Res_png_9patch* patch) 201f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik : SUPER(PatchOp) 202f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , bitmap(bitmap) 203f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik , patch(patch) {} 204f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const SkBitmap* bitmap; 205f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik const Res_png_9patch* patch; 206f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik}; 207f09ff5aa57bff01cb17595fb7ca8e48d238a6acdChris Craik 208386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp { 209386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PathOp(BASE_PARAMS, const SkPath* path) 210386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PathOp) 211386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , path(path) {} 212386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const SkPath* path; 213386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 214386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 215386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp { 216386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PointsOp(BASE_PARAMS, const float* points, const int floatCount) 217386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PointsOp) 218386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , points(points) 219386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , floatCount(floatCount) {} 220386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float* points; 221386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const int floatCount; 222386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 223386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 224b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp { 225b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RectOp(BASE_PARAMS) 226b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(RectOp) {} 227b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 228b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 229386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp { 230386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik RoundRectOp(BASE_PARAMS, float rx, float ry) 231386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(RoundRectOp) 232386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , rx(rx) 233386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , ry(ry) {} 234386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float rx; 235386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float ry; 236386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 237386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 238d3daa3198e2212c985c634821682d5819346b653Chris Craik/** 239d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow. 240d3daa3198e2212c985c634821682d5819346b653Chris Craik * 241d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time, 242d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed. 243d3daa3198e2212c985c634821682d5819346b653Chris Craik * 24498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds. 245d3daa3198e2212c985c634821682d5819346b653Chris Craik */ 246d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp { 24798787e6c9b2c10b1ab7820bdac168686025b924aChris Craik ShadowOp(const RenderNodeOp& casterOp, float casterAlpha, const SkPath* casterPath, 24898787e6c9b2c10b1ab7820bdac168686025b924aChris Craik const Rect& clipRect, const Vector3& lightCenter) 249d3daa3198e2212c985c634821682d5819346b653Chris Craik : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), clipRect, nullptr) 250d3daa3198e2212c985c634821682d5819346b653Chris Craik , shadowMatrixXY(casterOp.localMatrix) 251d3daa3198e2212c985c634821682d5819346b653Chris Craik , shadowMatrixZ(casterOp.localMatrix) 252d3daa3198e2212c985c634821682d5819346b653Chris Craik , casterAlpha(casterAlpha) 25398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik , casterPath(casterPath) 25498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik , lightCenter(lightCenter) { 255d3daa3198e2212c985c634821682d5819346b653Chris Craik const RenderNode& node = *casterOp.renderNode; 256d3daa3198e2212c985c634821682d5819346b653Chris Craik node.applyViewPropertyTransforms(shadowMatrixXY, false); 257d3daa3198e2212c985c634821682d5819346b653Chris Craik node.applyViewPropertyTransforms(shadowMatrixZ, true); 258d3daa3198e2212c985c634821682d5819346b653Chris Craik }; 259d3daa3198e2212c985c634821682d5819346b653Chris Craik Matrix4 shadowMatrixXY; 260d3daa3198e2212c985c634821682d5819346b653Chris Craik Matrix4 shadowMatrixZ; 261d3daa3198e2212c985c634821682d5819346b653Chris Craik const float casterAlpha; 262d3daa3198e2212c985c634821682d5819346b653Chris Craik const SkPath* casterPath; 26398787e6c9b2c10b1ab7820bdac168686025b924aChris Craik const Vector3 lightCenter; 264d3daa3198e2212c985c634821682d5819346b653Chris Craik}; 265d3daa3198e2212c985c634821682d5819346b653Chris Craik 266b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?) 267b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount) 268b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(SimpleRectsOp) 269b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertices(vertices) 270b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertexCount(vertexCount) {} 271b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Vertex* vertices; 272b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const size_t vertexCount; 273b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 274b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 275a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp { 276a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, 277a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik float x, float y) 278a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(TextOp) 279a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphs(glyphs) 280a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , positions(positions) 281a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphCount(glyphCount) 282a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , x(x) 283a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , y(y) {} 284a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const glyph_t* glyphs; 285a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* positions; 286a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int glyphCount; 287a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float x; 288a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float y; 289a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 290a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 291a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 292a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers 293a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 294a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 295a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 2966fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 2976fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer, 2986fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it. 2996fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 3006fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp { 3016fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik BeginLayerOp(BASE_PARAMS) 3026fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : SUPER(BeginLayerOp) {} 3036fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 3046fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 3056fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 3066fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that 3076fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO. 3086fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * 3096fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished. 3106fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 3116fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp { 3126fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik EndLayerOp() 3136fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : RecordedOp(RecordedOpId::EndLayerOp, Rect(0, 0), Matrix4::identity(), Rect(0, 0), nullptr) {} 3146fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 3156fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 3160b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/** 3170b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer. 3180b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * 3190b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated, 3200b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother. 3210b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */ 3226fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp { 3230b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed. 3245854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle) 3250b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : SUPER_PAINTLESS(LayerOp) 3260b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(layerHandle) 3270b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , alpha(paint->getAlpha() / 255.0f) 3280b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , mode(PaintUtils::getXfermodeDirect(paint)) 3290b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , colorFilter(paint->getColorFilter()) 3300b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , destroy(true) {} 3310b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 3320b7e8245db728d127ada698be63d78b33fc6e4daChris Craik LayerOp(RenderNode& node) 3330b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), Rect(node.getWidth(), node.getHeight()), nullptr) 3340b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(node.getLayerHandle()) 3350b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , alpha(node.properties().layerProperties().alpha() / 255.0f) 3360b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , mode(node.properties().layerProperties().xferMode()) 3370b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , colorFilter(node.properties().layerProperties().colorFilter()) 3380b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , destroy(false) {} 3390b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 340818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Records a handle to the Layer object, since the Layer itself won't be 341818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // constructed until after this operation is constructed. 3425854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer** layerHandle; 3430b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const float alpha; 3440b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const SkXfermode::Mode mode; 3450b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 3460b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // pointer to object owned by either LayerProperties, or a recorded Paint object in a 3470b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. 3480b7e8245db728d127ada698be63d78b33fc6e4daChris Craik SkColorFilter* colorFilter; 3490b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 3500b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // whether to destroy the layer, once rendered 3510b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const bool destroy; 3526fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 3536fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 354b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 355b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 356b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 357b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H 358