blob: 599fa7e1024a9977ed3585bdb38709de21894c0c [file] [log] [blame] [edit]
/*
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "DisplayDevice.h"
#include "DisplayRenderArea.h"
#include "LayerRenderArea.h"
#include "ui/Size.h"
#include "ui/Transform.h"
namespace android {
/**
* A parameter object for creating a render area
*/
struct RenderAreaBuilder {
// Source crop of the render area
Rect crop;
// Size of the physical render area
ui::Size reqSize;
// Composition data space of the render area
ui::Dataspace reqDataSpace;
ftl::Flags<RenderArea::Options> options;
virtual std::unique_ptr<RenderArea> build() const = 0;
RenderAreaBuilder(Rect crop, ui::Size reqSize, ui::Dataspace reqDataSpace,
ftl::Flags<RenderArea::Options> options)
: crop(crop), reqSize(reqSize), reqDataSpace(reqDataSpace), options(options) {}
virtual ~RenderAreaBuilder() = default;
};
struct DisplayRenderAreaBuilder : RenderAreaBuilder {
DisplayRenderAreaBuilder(Rect crop, ui::Size reqSize, ui::Dataspace reqDataSpace,
wp<const DisplayDevice> displayWeak,
ftl::Flags<RenderArea::Options> options)
: RenderAreaBuilder(crop, reqSize, reqDataSpace, options), displayWeak(displayWeak) {}
// Display that render area will be on
wp<const DisplayDevice> displayWeak;
std::unique_ptr<RenderArea> build() const override {
return DisplayRenderArea::create(displayWeak, crop, reqSize, reqDataSpace, options);
}
};
struct LayerRenderAreaBuilder : RenderAreaBuilder {
LayerRenderAreaBuilder(Rect crop, ui::Size reqSize, ui::Dataspace reqDataSpace, sp<Layer> layer,
bool childrenOnly, ftl::Flags<RenderArea::Options> options)
: RenderAreaBuilder(crop, reqSize, reqDataSpace, options),
layer(layer),
childrenOnly(childrenOnly) {}
// Root layer of the render area
sp<Layer> layer;
// Layer snapshot of the root layer
frontend::LayerSnapshot layerSnapshot;
// Transform to be applied on the layers to transform them
// into the logical render area
ui::Transform layerTransform{ui::Transform()};
// Buffer bounds
Rect layerBufferSize{Rect()};
// If false, transform is inverted from the parent snapshot
bool childrenOnly;
// Uses parent snapshot to determine layer transform and buffer size
void setLayerSnapshot(const frontend::LayerSnapshot& parentSnapshot) {
layerSnapshot = parentSnapshot;
if (!childrenOnly) {
layerTransform = parentSnapshot.localTransform.inverse();
}
layerBufferSize = parentSnapshot.bufferSize;
}
std::unique_ptr<RenderArea> build() const override {
return std::make_unique<LayerRenderArea>(layer, std::move(layerSnapshot), crop, reqSize,
reqDataSpace, layerTransform, layerBufferSize,
options);
}
};
} // namespace android