RecordedOp.h revision 386aa031793bb037ec43b6cdbd8908c343cc86cb
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 27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "SkXfermode.h" 28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap; 30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint; 31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android { 33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer { 34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 355854b34881b1a747ac80b5077869ef270a92b1f4Chris Craikclass OffscreenBuffer; 36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode; 37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex; 38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/** 4015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * On of the provided macros is executed for each op type in order. The first will be used for ops 4115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * that cannot merge, and the second for those that can. 42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * 43b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * This serves as the authoritative list of ops, used for generating ID enum, and ID based LUTs. 44b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */ 4515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define MAP_OPS_BASED_ON_MERGEABILITY(U_OP_FN, M_OP_FN) \ 46386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(ArcOp) \ 4715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik M_OP_FN(BitmapOp) \ 4815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(LinesOp) \ 49386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(OvalOp) \ 50386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(PathOp) \ 51386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(PointsOp) \ 5215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(RectOp) \ 5315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(RenderNodeOp) \ 54386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik U_OP_FN(RoundRectOp) \ 5515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(ShadowOp) \ 5615c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(SimpleRectsOp) \ 5715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik M_OP_FN(TextOp) \ 5815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(BeginLayerOp) \ 5915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(EndLayerOp) \ 6015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik U_OP_FN(LayerOp) 6115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 6215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik/** 6315c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * The provided macro is executed for each op type in order. This is used in cases where 6415c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik * merge-ability of ops doesn't matter. 6515c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik */ 66b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define MAP_OPS(OP_FN) \ 6715c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik MAP_OPS_BASED_ON_MERGEABILITY(OP_FN, OP_FN) 6815c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 6915c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define NULL_OP_FN(Type) 7015c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik 7115c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik#define MAP_MERGED_OPS(OP_FN) \ 7215c3f19a445b8df575911a16e8a6dba755a084b5Chris Craik MAP_OPS_BASED_ON_MERGEABILITY(NULL_OP_FN, OP_FN) 73b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 74b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum 75b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type, 76b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId { 77b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik enum { 78b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik MAP_OPS(IDENTITY_FN) 79b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Count, 80b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik }; 81b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik} 82386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstatic_assert(RecordedOpId::ArcOp == 0, 83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik "First index must be zero for LUTs to work"); 84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect, const SkPaint* paint 86b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect 87b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, paint) 88b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, nullptr) 89b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp { 91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* ID from RecordedOpId - generally used for jumping into function tables */ 92b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const int opId; 93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 94386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik /* bounds in *local* space, without accounting for DisplayList transformation, or stroke */ 95b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect unmappedBounds; 96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* transform in recording space (vs DisplayList origin) */ 98b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Matrix4 localMatrix; 99b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 100b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* clip in recording space */ 101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const Rect localClipRect; 102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik /* optional paint, stored in base object to simplify merging logic */ 104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkPaint* paint; 105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected: 106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RecordedOp(unsigned int opId, BASE_PARAMS) 107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : opId(opId) 108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , unmappedBounds(unmappedBounds) 109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localMatrix(localMatrix) 110b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , localClipRect(localClipRect) 111b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , paint(paint) {} 112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 113b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 114b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp { 115b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode) 116b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER_PAINTLESS(RenderNodeOp) 117b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , renderNode(renderNode) {} 1188d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik RenderNode * renderNode; // not const, since drawing modifies it 1198d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik 1208d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik /** 1218d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Holds the transformation between the projection surface ViewGroup and this RenderNode 1228d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * drawing instance. Represents any translations / transformations done within the drawing of 1238d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * the compositing ancestor ViewGroup's draw, before the draw of the View represented by this 1248d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * DisplayList draw instance. 1258d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * 1268d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik * Note: doesn't include transformation within the RenderNode, or its properties. 1278d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik */ 1288d1f2120fe80b23ab03c7168e3b6b2d13bafe2e7Chris Craik Matrix4 transformFromCompositingAncestor; 129161f54b2d4160b8d3f3da9eba5746da5162e4821Chris Craik bool skipInOrderDraw = false; 130b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 131b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 132a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 133a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Standard Ops 134a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 135a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 136386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct ArcOp : RecordedOp { 137386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik ArcOp(BASE_PARAMS, float startAngle, float sweepAngle, bool useCenter) 138386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(ArcOp) 139386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , startAngle(startAngle) 140386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , sweepAngle(sweepAngle) 141386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , useCenter(useCenter) {} 142386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float startAngle; 143386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float sweepAngle; 144386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const bool useCenter; 145386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 146386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 147b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp { 148b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik BitmapOp(BASE_PARAMS, const SkBitmap* bitmap) 149b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(BitmapOp) 150b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , bitmap(bitmap) {} 151b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const SkBitmap* bitmap; 152b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik // TODO: asset atlas/texture id lookup? 153b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 154b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 155a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct LinesOp : RecordedOp { 156a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik LinesOp(BASE_PARAMS, const float* points, const int floatCount) 157a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(LinesOp) 158a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , points(points) 159a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , floatCount(floatCount) {} 160a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* points; 161a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int floatCount; 162a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 163a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 164386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct OvalOp : RecordedOp { 165386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik OvalOp(BASE_PARAMS) 166386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(OvalOp) {} 167386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 168386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 169386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PathOp : RecordedOp { 170386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PathOp(BASE_PARAMS, const SkPath* path) 171386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PathOp) 172386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , path(path) {} 173386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const SkPath* path; 174386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 175386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 176386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct PointsOp : RecordedOp { 177386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik PointsOp(BASE_PARAMS, const float* points, const int floatCount) 178386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(PointsOp) 179386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , points(points) 180386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , floatCount(floatCount) {} 181386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float* points; 182386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const int floatCount; 183386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 184386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 185b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp { 186b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik RectOp(BASE_PARAMS) 187b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(RectOp) {} 188b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 189b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 190386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craikstruct RoundRectOp : RecordedOp { 191386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik RoundRectOp(BASE_PARAMS, float rx, float ry) 192386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik : SUPER(RoundRectOp) 193386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , rx(rx) 194386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik , ry(ry) {} 195386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float rx; 196386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik const float ry; 197386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik}; 198386aa031793bb037ec43b6cdbd8908c343cc86cbChris Craik 199d3daa3198e2212c985c634821682d5819346b653Chris Craik/** 200d3daa3198e2212c985c634821682d5819346b653Chris Craik * Real-time, dynamic-lit shadow. 201d3daa3198e2212c985c634821682d5819346b653Chris Craik * 202d3daa3198e2212c985c634821682d5819346b653Chris Craik * Uses invalid/empty bounds and matrix since ShadowOp bounds aren't known at defer time, 203d3daa3198e2212c985c634821682d5819346b653Chris Craik * and are resolved dynamically, and transform isn't needed. 204d3daa3198e2212c985c634821682d5819346b653Chris Craik * 20598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik * State construction handles these properties specially, ignoring matrix/bounds. 206d3daa3198e2212c985c634821682d5819346b653Chris Craik */ 207d3daa3198e2212c985c634821682d5819346b653Chris Craikstruct ShadowOp : RecordedOp { 20898787e6c9b2c10b1ab7820bdac168686025b924aChris Craik ShadowOp(const RenderNodeOp& casterOp, float casterAlpha, const SkPath* casterPath, 20998787e6c9b2c10b1ab7820bdac168686025b924aChris Craik const Rect& clipRect, const Vector3& lightCenter) 210d3daa3198e2212c985c634821682d5819346b653Chris Craik : RecordedOp(RecordedOpId::ShadowOp, Rect(), Matrix4::identity(), clipRect, nullptr) 211d3daa3198e2212c985c634821682d5819346b653Chris Craik , shadowMatrixXY(casterOp.localMatrix) 212d3daa3198e2212c985c634821682d5819346b653Chris Craik , shadowMatrixZ(casterOp.localMatrix) 213d3daa3198e2212c985c634821682d5819346b653Chris Craik , casterAlpha(casterAlpha) 21498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik , casterPath(casterPath) 21598787e6c9b2c10b1ab7820bdac168686025b924aChris Craik , lightCenter(lightCenter) { 216d3daa3198e2212c985c634821682d5819346b653Chris Craik const RenderNode& node = *casterOp.renderNode; 217d3daa3198e2212c985c634821682d5819346b653Chris Craik node.applyViewPropertyTransforms(shadowMatrixXY, false); 218d3daa3198e2212c985c634821682d5819346b653Chris Craik node.applyViewPropertyTransforms(shadowMatrixZ, true); 219d3daa3198e2212c985c634821682d5819346b653Chris Craik }; 220d3daa3198e2212c985c634821682d5819346b653Chris Craik Matrix4 shadowMatrixXY; 221d3daa3198e2212c985c634821682d5819346b653Chris Craik Matrix4 shadowMatrixZ; 222d3daa3198e2212c985c634821682d5819346b653Chris Craik const float casterAlpha; 223d3daa3198e2212c985c634821682d5819346b653Chris Craik const SkPath* casterPath; 22498787e6c9b2c10b1ab7820bdac168686025b924aChris Craik const Vector3 lightCenter; 225d3daa3198e2212c985c634821682d5819346b653Chris Craik}; 226d3daa3198e2212c985c634821682d5819346b653Chris Craik 227b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?) 228b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount) 229b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik : SUPER(SimpleRectsOp) 230b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertices(vertices) 231b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik , vertexCount(vertexCount) {} 232b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik Vertex* vertices; 233b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik const size_t vertexCount; 234b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; 235b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 236a1717271caac5e8ea3808c331d4141ac01a42134Chris Craikstruct TextOp : RecordedOp { 237a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik TextOp(BASE_PARAMS, const glyph_t* glyphs, const float* positions, int glyphCount, 238a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik float x, float y) 239a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik : SUPER(TextOp) 240a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphs(glyphs) 241a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , positions(positions) 242a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , glyphCount(glyphCount) 243a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , x(x) 244a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik , y(y) {} 245a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const glyph_t* glyphs; 246a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float* positions; 247a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const int glyphCount; 248a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float x; 249a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik const float y; 250a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik}; 251a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 252a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 253a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik// Layers 254a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik//////////////////////////////////////////////////////////////////////////////////////////////////// 255a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 256a1717271caac5e8ea3808c331d4141ac01a42134Chris Craik 2576fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 2586fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! denotes the creation of an off-screen layer, 2596fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * and that commands following will render into it. 2606fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 2616fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct BeginLayerOp : RecordedOp { 2626fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik BeginLayerOp(BASE_PARAMS) 2636fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : SUPER(BeginLayerOp) {} 2646fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 2656fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 2666fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik/** 2676fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * Stateful operation! Denotes end of off-screen layer, and that 2686fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * commands since last BeginLayerOp should be drawn into parent FBO. 2696fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * 2706fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik * State in this op is empty, it just serves to signal that a layer has been finished. 2716fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik */ 2726fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct EndLayerOp : RecordedOp { 2736fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik EndLayerOp() 2746fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik : RecordedOp(RecordedOpId::EndLayerOp, Rect(0, 0), Matrix4::identity(), Rect(0, 0), nullptr) {} 2756fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 2766fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 2770b7e8245db728d127ada698be63d78b33fc6e4daChris Craik/** 2780b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Draws an OffscreenBuffer. 2790b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * 2800b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * Alpha, mode, and colorfilter are embedded, since LayerOps are always dynamically generated, 2810b7e8245db728d127ada698be63d78b33fc6e4daChris Craik * when creating/tracking a SkPaint* during defer isn't worth the bother. 2820b7e8245db728d127ada698be63d78b33fc6e4daChris Craik */ 2836fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craikstruct LayerOp : RecordedOp { 2840b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // Records a one-use (saveLayer) layer for drawing. Once drawn, the layer will be destroyed. 2855854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik LayerOp(BASE_PARAMS, OffscreenBuffer** layerHandle) 2860b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : SUPER_PAINTLESS(LayerOp) 2870b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(layerHandle) 2880b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , alpha(paint->getAlpha() / 255.0f) 2890b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , mode(PaintUtils::getXfermodeDirect(paint)) 2900b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , colorFilter(paint->getColorFilter()) 2910b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , destroy(true) {} 2920b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 2930b7e8245db728d127ada698be63d78b33fc6e4daChris Craik LayerOp(RenderNode& node) 2940b7e8245db728d127ada698be63d78b33fc6e4daChris Craik : RecordedOp(RecordedOpId::LayerOp, Rect(node.getWidth(), node.getHeight()), Matrix4::identity(), Rect(node.getWidth(), node.getHeight()), nullptr) 2950b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , layerHandle(node.getLayerHandle()) 2960b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , alpha(node.properties().layerProperties().alpha() / 255.0f) 2970b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , mode(node.properties().layerProperties().xferMode()) 2980b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , colorFilter(node.properties().layerProperties().colorFilter()) 2990b7e8245db728d127ada698be63d78b33fc6e4daChris Craik , destroy(false) {} 3000b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 301818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // Records a handle to the Layer object, since the Layer itself won't be 302818c9fbf1d76d5df19253ba4eb964efa939ec9ecChris Craik // constructed until after this operation is constructed. 3035854b34881b1a747ac80b5077869ef270a92b1f4Chris Craik OffscreenBuffer** layerHandle; 3040b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const float alpha; 3050b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const SkXfermode::Mode mode; 3060b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 3070b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // pointer to object owned by either LayerProperties, or a recorded Paint object in a 3080b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // BeginLayerOp. Lives longer than LayerOp in either case, so no skia ref counting is used. 3090b7e8245db728d127ada698be63d78b33fc6e4daChris Craik SkColorFilter* colorFilter; 3100b7e8245db728d127ada698be63d78b33fc6e4daChris Craik 3110b7e8245db728d127ada698be63d78b33fc6e4daChris Craik // whether to destroy the layer, once rendered 3120b7e8245db728d127ada698be63d78b33fc6e4daChris Craik const bool destroy; 3136fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik}; 3146fe991e5e76f9af9dab960100d5768d96d5f4daaChris Craik 315b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer 316b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android 317b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik 318b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H 319