blob: fa456bb2137948a503e01660c4887c7c277823bc [file] [log] [blame]
/*
* Copyright (C) 2017 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.
*/
#ifndef _LIBINPUT_DISPLAY_VIEWPORT_H
#define _LIBINPUT_DISPLAY_VIEWPORT_H
#include <android-base/stringprintf.h>
#include <ui/DisplayInfo.h>
#include <input/Input.h>
#include <inttypes.h>
#include <optional>
using android::base::StringPrintf;
namespace android {
/**
* Describes the different type of viewports supported by input flinger.
* Keep in sync with values in InputManagerService.java.
*/
enum class ViewportType : int32_t {
VIEWPORT_INTERNAL = 1,
VIEWPORT_EXTERNAL = 2,
VIEWPORT_VIRTUAL = 3,
};
static const char* viewportTypeToString(ViewportType type) {
switch(type) {
case ViewportType::VIEWPORT_INTERNAL:
return "INTERNAL";
case ViewportType::VIEWPORT_EXTERNAL:
return "EXTERNAL";
case ViewportType::VIEWPORT_VIRTUAL:
return "VIRTUAL";
default:
return "UNKNOWN";
}
}
/*
* Describes how coordinates are mapped on a physical display.
* See com.android.server.display.DisplayViewport.
*/
struct DisplayViewport {
int32_t displayId; // -1 if invalid
int32_t orientation;
int32_t logicalLeft;
int32_t logicalTop;
int32_t logicalRight;
int32_t logicalBottom;
int32_t physicalLeft;
int32_t physicalTop;
int32_t physicalRight;
int32_t physicalBottom;
int32_t deviceWidth;
int32_t deviceHeight;
std::string uniqueId;
// The actual (hardware) port that the associated display is connected to.
// Not all viewports will have this specified.
std::optional<uint8_t> physicalPort;
ViewportType type;
DisplayViewport() :
displayId(ADISPLAY_ID_NONE), orientation(DISPLAY_ORIENTATION_0),
logicalLeft(0), logicalTop(0), logicalRight(0), logicalBottom(0),
physicalLeft(0), physicalTop(0), physicalRight(0), physicalBottom(0),
deviceWidth(0), deviceHeight(0), uniqueId(), physicalPort(std::nullopt),
type(ViewportType::VIEWPORT_INTERNAL) {
}
bool operator==(const DisplayViewport& other) const {
return displayId == other.displayId
&& orientation == other.orientation
&& logicalLeft == other.logicalLeft
&& logicalTop == other.logicalTop
&& logicalRight == other.logicalRight
&& logicalBottom == other.logicalBottom
&& physicalLeft == other.physicalLeft
&& physicalTop == other.physicalTop
&& physicalRight == other.physicalRight
&& physicalBottom == other.physicalBottom
&& deviceWidth == other.deviceWidth
&& deviceHeight == other.deviceHeight
&& uniqueId == other.uniqueId
&& physicalPort == other.physicalPort
&& type == other.type;
}
bool operator!=(const DisplayViewport& other) const {
return !(*this == other);
}
inline bool isValid() const {
return displayId >= 0;
}
void setNonDisplayViewport(int32_t width, int32_t height) {
displayId = ADISPLAY_ID_NONE;
orientation = DISPLAY_ORIENTATION_0;
logicalLeft = 0;
logicalTop = 0;
logicalRight = width;
logicalBottom = height;
physicalLeft = 0;
physicalTop = 0;
physicalRight = width;
physicalBottom = height;
deviceWidth = width;
deviceHeight = height;
uniqueId.clear();
physicalPort = std::nullopt;
type = ViewportType::VIEWPORT_INTERNAL;
}
std::string toString() const {
return StringPrintf("Viewport %s: displayId=%d, uniqueId=%s, port=%s, orientation=%d, "
"logicalFrame=[%d, %d, %d, %d], "
"physicalFrame=[%d, %d, %d, %d], "
"deviceSize=[%d, %d]",
viewportTypeToString(type), displayId,
uniqueId.c_str(),
physicalPort ? StringPrintf("%" PRIu8, *physicalPort).c_str() : "<none>",
orientation,
logicalLeft, logicalTop,
logicalRight, logicalBottom,
physicalLeft, physicalTop,
physicalRight, physicalBottom,
deviceWidth, deviceHeight);
}
};
} // namespace android
#endif // _LIBINPUT_DISPLAY_VIEWPORT_H