blob: ad08a92885e365c4e249784b99c433190f559d29 [file] [log] [blame]
/*
* Copyright (C) 2018 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.
*/
// #define LOG_NDEBUG 0
#undef LOG_TAG
#define LOG_TAG "ContainerLayer"
#include "ContainerLayer.h"
namespace android {
ContainerLayer::ContainerLayer(const LayerCreationArgs& args) : Layer(args) {}
ContainerLayer::~ContainerLayer() = default;
bool ContainerLayer::prepareClientLayer(const RenderArea&, const Region&, bool, Region&, const bool,
renderengine::LayerSettings&) {
return false;
}
bool ContainerLayer::isVisible() const {
return false;
}
bool ContainerLayer::canReceiveInput() const {
return !isHiddenByPolicy();
}
void ContainerLayer::setPerFrameData(const sp<const DisplayDevice>&, const ui::Transform&,
const Rect&, int32_t, const ui::Dataspace) {}
Layer::RoundedCornerState ContainerLayer::getRoundedCornerStateInternal(
const FloatRect bounds) const {
const auto& p = mDrawingParent.promote();
if (p != nullptr) {
RoundedCornerState parentState = p->getRoundedCornerStateInternal(bounds);
if (parentState.radius > 0) {
ui::Transform t = getActiveTransform(getDrawingState());
t = t.inverse();
parentState.cropRect = t.transform(parentState.cropRect);
// The rounded corners shader only accepts 1 corner radius for performance reasons,
// but a transform matrix can define horizontal and vertical scales.
// Let's take the average between both of them and pass into the shader, practically we
// never do this type of transformation on windows anyway.
parentState.radius *= (t[0][0] + t[1][1]) / 2.0f;
return parentState;
}
}
const float radius = getDrawingState().cornerRadius;
if (radius > 0) {
const Rect crop = getCrop(getDrawingState());
if (!crop.isEmpty()) {
return RoundedCornerState(bounds.intersect(crop.toFloatRect()), radius);
}
return RoundedCornerState(bounds, radius);
}
return RoundedCornerState();
}
} // namespace android