RecordedOp.h revision b565df13a9e5c7b1d7d93bdfa4a793752d66d3cc
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
20b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "utils/LinearAllocator.h"
21b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Rect.h"
22b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "Matrix.h"
23b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
24b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#include "SkXfermode.h"
25b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
26b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkBitmap;
27b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass SkPaint;
28b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
29b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace android {
30b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace uirenderer {
31b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
32b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikclass RenderNode;
33b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct Vertex;
34b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
35b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik/**
36b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * The provided macro is executed for each op type in order, with the results separated by commas.
37b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik *
38b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik * This serves as the authoritative list of ops, used for generating ID enum, and ID based LUTs.
39b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik */
40b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define MAP_OPS(OP_FN) \
41b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        OP_FN(BitmapOp) \
42b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        OP_FN(RectOp) \
43b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        OP_FN(RenderNodeOp) \
44b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        OP_FN(SimpleRectsOp)
45b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
46b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik// Generate OpId enum
47b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define IDENTITY_FN(Type) Type,
48b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craiknamespace RecordedOpId {
49b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    enum {
50b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        MAP_OPS(IDENTITY_FN)
51b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        Count,
52b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    };
53b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}
54b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstatic_assert(RecordedOpId::BitmapOp == 0,
55b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik        "First index must be zero for LUTs to work");
56b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
57b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect, const SkPaint* paint
58b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define BASE_PARAMS_PAINTLESS const Rect& unmappedBounds, const Matrix4& localMatrix, const Rect& localClipRect
59b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, paint)
60b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#define SUPER_PAINTLESS(Type) RecordedOp(RecordedOpId::Type, unmappedBounds, localMatrix, localClipRect, nullptr)
61b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
62b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RecordedOp {
63b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* ID from RecordedOpId - generally used for jumping into function tables */
64b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const int opId;
65b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
66b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* bounds in *local* space, without accounting for DisplayList transformation */
67b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Rect unmappedBounds;
68b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
69b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* transform in recording space (vs DisplayList origin) */
70b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Matrix4 localMatrix;
71b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
72b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* clip in recording space */
73b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const Rect localClipRect;
74b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
75b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    /* optional paint, stored in base object to simplify merging logic */
76b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkPaint* paint;
77b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikprotected:
78b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RecordedOp(unsigned int opId, BASE_PARAMS)
79b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : opId(opId)
80b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , unmappedBounds(unmappedBounds)
81b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , localMatrix(localMatrix)
82b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , localClipRect(localClipRect)
83b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , paint(paint) {}
84b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
85b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
86b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RenderNodeOp : RecordedOp {
87b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RenderNodeOp(BASE_PARAMS_PAINTLESS, RenderNode* renderNode)
88b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER_PAINTLESS(RenderNodeOp)
89b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , renderNode(renderNode) {}
90b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RenderNode * renderNode; // not const, since drawing modifies it (somehow...)
91b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
92b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
93b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct BitmapOp : RecordedOp {
94b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    BitmapOp(BASE_PARAMS, const SkBitmap* bitmap)
95b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(BitmapOp)
96b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , bitmap(bitmap) {}
97b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const SkBitmap* bitmap;
98b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    // TODO: asset atlas/texture id lookup?
99b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
100b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
101b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct RectOp : RecordedOp {
102b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    RectOp(BASE_PARAMS)
103b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(RectOp) {}
104b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
105b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
106b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craikstruct SimpleRectsOp : RecordedOp { // Filled, no AA (TODO: better name?)
107b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    SimpleRectsOp(BASE_PARAMS, Vertex* vertices, size_t vertexCount)
108b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            : SUPER(SimpleRectsOp)
109b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertices(vertices)
110b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik            , vertexCount(vertexCount) {}
111b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    Vertex* vertices;
112b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik    const size_t vertexCount;
113b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik};
114b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
115b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace uirenderer
116b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik}; // namespace android
117b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik
118b565df13a9e5c7b1d7d93bdfa4a793752d66d3ccChris Craik#endif // ANDROID_HWUI_RECORDED_OP_H
119