blob: 599fa7e1024a9977ed3585bdb38709de21894c0c [file] [log] [blame]
Melody Hsu41ade202024-05-03 01:25:50 +00001/*
2 * Copyright 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include "DisplayDevice.h"
20#include "DisplayRenderArea.h"
21#include "LayerRenderArea.h"
22#include "ui/Size.h"
23#include "ui/Transform.h"
24
25namespace android {
26/**
27 * A parameter object for creating a render area
28 */
29struct RenderAreaBuilder {
30 // Source crop of the render area
31 Rect crop;
32
33 // Size of the physical render area
34 ui::Size reqSize;
35
36 // Composition data space of the render area
37 ui::Dataspace reqDataSpace;
38
Vishnu Nair96a5aaf2024-06-26 17:17:51 -070039 ftl::Flags<RenderArea::Options> options;
Melody Hsu41ade202024-05-03 01:25:50 +000040 virtual std::unique_ptr<RenderArea> build() const = 0;
41
42 RenderAreaBuilder(Rect crop, ui::Size reqSize, ui::Dataspace reqDataSpace,
Vishnu Nair96a5aaf2024-06-26 17:17:51 -070043 ftl::Flags<RenderArea::Options> options)
44 : crop(crop), reqSize(reqSize), reqDataSpace(reqDataSpace), options(options) {}
Melody Hsu41ade202024-05-03 01:25:50 +000045
46 virtual ~RenderAreaBuilder() = default;
47};
48
49struct DisplayRenderAreaBuilder : RenderAreaBuilder {
50 DisplayRenderAreaBuilder(Rect crop, ui::Size reqSize, ui::Dataspace reqDataSpace,
Vishnu Nair96a5aaf2024-06-26 17:17:51 -070051 wp<const DisplayDevice> displayWeak,
52 ftl::Flags<RenderArea::Options> options)
53 : RenderAreaBuilder(crop, reqSize, reqDataSpace, options), displayWeak(displayWeak) {}
Melody Hsu41ade202024-05-03 01:25:50 +000054
55 // Display that render area will be on
56 wp<const DisplayDevice> displayWeak;
57
58 std::unique_ptr<RenderArea> build() const override {
Vishnu Nair96a5aaf2024-06-26 17:17:51 -070059 return DisplayRenderArea::create(displayWeak, crop, reqSize, reqDataSpace, options);
Melody Hsu41ade202024-05-03 01:25:50 +000060 }
61};
62
63struct LayerRenderAreaBuilder : RenderAreaBuilder {
Vishnu Nair96a5aaf2024-06-26 17:17:51 -070064 LayerRenderAreaBuilder(Rect crop, ui::Size reqSize, ui::Dataspace reqDataSpace, sp<Layer> layer,
65 bool childrenOnly, ftl::Flags<RenderArea::Options> options)
66 : RenderAreaBuilder(crop, reqSize, reqDataSpace, options),
Melody Hsu41ade202024-05-03 01:25:50 +000067 layer(layer),
68 childrenOnly(childrenOnly) {}
69
Melody Hsu50c151a2024-05-14 06:11:12 +000070 // Root layer of the render area
Melody Hsu41ade202024-05-03 01:25:50 +000071 sp<Layer> layer;
72
Melody Hsu50c151a2024-05-14 06:11:12 +000073 // Layer snapshot of the root layer
74 frontend::LayerSnapshot layerSnapshot;
75
Melody Hsu41ade202024-05-03 01:25:50 +000076 // Transform to be applied on the layers to transform them
77 // into the logical render area
78 ui::Transform layerTransform{ui::Transform()};
79
80 // Buffer bounds
81 Rect layerBufferSize{Rect()};
82
83 // If false, transform is inverted from the parent snapshot
84 bool childrenOnly;
85
86 // Uses parent snapshot to determine layer transform and buffer size
Melody Hsu50c151a2024-05-14 06:11:12 +000087 void setLayerSnapshot(const frontend::LayerSnapshot& parentSnapshot) {
88 layerSnapshot = parentSnapshot;
Melody Hsu41ade202024-05-03 01:25:50 +000089 if (!childrenOnly) {
Melody Hsu50c151a2024-05-14 06:11:12 +000090 layerTransform = parentSnapshot.localTransform.inverse();
Melody Hsu41ade202024-05-03 01:25:50 +000091 }
Melody Hsu50c151a2024-05-14 06:11:12 +000092 layerBufferSize = parentSnapshot.bufferSize;
Melody Hsu41ade202024-05-03 01:25:50 +000093 }
94
95 std::unique_ptr<RenderArea> build() const override {
Melody Hsu50c151a2024-05-14 06:11:12 +000096 return std::make_unique<LayerRenderArea>(layer, std::move(layerSnapshot), crop, reqSize,
Vishnu Nair96a5aaf2024-06-26 17:17:51 -070097 reqDataSpace, layerTransform, layerBufferSize,
98 options);
Melody Hsu41ade202024-05-03 01:25:50 +000099 }
100};
101
102} // namespace android