blob: 1d919340029f7f410a4b4ab967038d30cccec178 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/display/types/display_snapshot.h"
#include <inttypes.h>
#include <algorithm>
#include <sstream>
#include <utility>
#include "base/strings/stringprintf.h"
namespace display {
namespace {
// The display serial number beginning byte position and its length in the
// EDID number as defined in the spec.
// https://en.wikipedia.org/wiki/Extended_Display_Identification_Data
constexpr size_t kSerialNumberBeginingByte = 12U;
constexpr size_t kSerialNumberLengthInBytes = 4U;
std::string ModeListString(
const std::vector<std::unique_ptr<const DisplayMode>>& modes) {
std::stringstream stream;
bool first = true;
for (auto& mode : modes) {
if (!first)
stream << ", ";
stream << mode->ToString();
first = false;
}
return stream.str();
}
std::string DisplayConnectionTypeString(DisplayConnectionType type) {
switch (type) {
case DISPLAY_CONNECTION_TYPE_NONE:
return "none";
case DISPLAY_CONNECTION_TYPE_UNKNOWN:
return "unknown";
case DISPLAY_CONNECTION_TYPE_INTERNAL:
return "internal";
case DISPLAY_CONNECTION_TYPE_VGA:
return "vga";
case DISPLAY_CONNECTION_TYPE_HDMI:
return "hdmi";
case DISPLAY_CONNECTION_TYPE_DVI:
return "dvi";
case DISPLAY_CONNECTION_TYPE_DISPLAYPORT:
return "dp";
case DISPLAY_CONNECTION_TYPE_NETWORK:
return "network";
}
NOTREACHED();
return "";
}
} // namespace
DisplaySnapshot::DisplaySnapshot(int64_t display_id,
const gfx::Point& origin,
const gfx::Size& physical_size,
DisplayConnectionType type,
bool is_aspect_preserving_scaling,
bool has_overscan,
bool has_color_correction_matrix,
const gfx::ColorSpace& color_space,
std::string display_name,
const base::FilePath& sys_path,
DisplayModeList modes,
const std::vector<uint8_t>& edid,
const DisplayMode* current_mode,
const DisplayMode* native_mode,
int64_t product_id,
const gfx::Size& maximum_cursor_size)
: display_id_(display_id),
origin_(origin),
physical_size_(physical_size),
type_(type),
is_aspect_preserving_scaling_(is_aspect_preserving_scaling),
has_overscan_(has_overscan),
has_color_correction_matrix_(has_color_correction_matrix),
color_space_(color_space),
display_name_(display_name),
sys_path_(sys_path),
modes_(std::move(modes)),
edid_(edid),
current_mode_(current_mode),
native_mode_(native_mode),
product_id_(product_id),
maximum_cursor_size_(maximum_cursor_size) {
// We must explicitly clear out the bytes that represent the serial number.
const size_t end =
std::min(kSerialNumberBeginingByte + kSerialNumberLengthInBytes,
edid_.size());
for (size_t i = kSerialNumberBeginingByte; i < end; ++i)
edid_[i] = 0;
}
DisplaySnapshot::~DisplaySnapshot() {}
std::unique_ptr<DisplaySnapshot> DisplaySnapshot::Clone() {
DisplayModeList clone_modes;
const DisplayMode* cloned_current_mode = nullptr;
const DisplayMode* cloned_native_mode = nullptr;
// Clone the display modes and find equivalent pointers to the native and
// current mode.
for (auto& mode : modes_) {
clone_modes.push_back(mode->Clone());
if (mode.get() == current_mode_)
cloned_current_mode = clone_modes.back().get();
if (mode.get() == native_mode_)
cloned_native_mode = clone_modes.back().get();
}
return std::make_unique<DisplaySnapshot>(
display_id_, origin_, physical_size_, type_,
is_aspect_preserving_scaling_, has_overscan_,
has_color_correction_matrix_, color_space_, display_name_, sys_path_,
std::move(clone_modes), edid_, cloned_current_mode, cloned_native_mode,
product_id_, maximum_cursor_size_);
}
std::string DisplaySnapshot::ToString() const {
return base::StringPrintf(
"id=%" PRId64
" current_mode=%s native_mode=%s origin=%s"
" physical_size=%s, type=%s name=\"%s\" modes=(%s)",
display_id_,
current_mode_ ? current_mode_->ToString().c_str() : "nullptr",
native_mode_ ? native_mode_->ToString().c_str() : "nullptr",
origin_.ToString().c_str(), physical_size_.ToString().c_str(),
DisplayConnectionTypeString(type_).c_str(), display_name_.c_str(),
ModeListString(modes_).c_str());
}
// static
gfx::BufferFormat DisplaySnapshot::PrimaryFormat() {
return gfx::BufferFormat::BGRX_8888;
}
} // namespace display