Index: ui/ozone/common/display_util.cc |
diff --git a/ui/ozone/common/display_util.cc b/ui/ozone/common/display_util.cc |
index 432e85807e61ef752ca54d82604a5e3a7051cfea..e5af057346a8921e9ea8e80d17c519150c56550f 100644 |
--- a/ui/ozone/common/display_util.cc |
+++ b/ui/ozone/common/display_util.cc |
@@ -5,8 +5,13 @@ |
#include "ui/ozone/common/display_util.h" |
#include "base/command_line.h" |
+#include "base/files/file_path.h" |
+#include "base/files/file_util.h" |
+#include "base/threading/thread_restrictions.h" |
#include "ui/display/types/display_mode.h" |
#include "ui/display/types/display_snapshot.h" |
+#include "ui/display/util/edid_parser.h" |
+#include "ui/display/util/edid_parser.h" |
#include "ui/ozone/public/ozone_switches.h" |
namespace ui { |
@@ -59,25 +64,19 @@ DisplaySnapshot_Params GetDisplaySnapshotParams( |
return params; |
} |
-DisplaySnapshot_Params CreateSnapshotFromCommandLine() { |
- DisplaySnapshot_Params display_param; |
- |
+bool CreateSnapshotFromCommandLine(DisplaySnapshot_Params* snapshot_out) { |
base::CommandLine* cmd = base::CommandLine::ForCurrentProcess(); |
std::string spec = |
cmd->GetSwitchValueASCII(switches::kOzoneInitialDisplayBounds); |
std::string physical_spec = |
cmd->GetSwitchValueASCII(switches::kOzoneInitialDisplayPhysicalSizeMm); |
- if (spec.empty()) |
- return display_param; |
- |
int width = 0; |
int height = 0; |
- if (sscanf(spec.c_str(), "%dx%d", &width, &height) < 2) |
- return display_param; |
- |
- if (width == 0 || height == 0) |
- return display_param; |
+ if (spec.empty() || sscanf(spec.c_str(), "%dx%d", &width, &height) < 2 || |
+ width == 0 || height == 0) { |
+ return false; |
+ } |
int physical_width = 0; |
int physical_height = 0; |
@@ -87,16 +86,67 @@ DisplaySnapshot_Params CreateSnapshotFromCommandLine() { |
mode_param.size = gfx::Size(width, height); |
mode_param.refresh_rate = 60; |
- display_param.display_id = kDummyDisplayId; |
- display_param.modes.push_back(mode_param); |
- display_param.type = DISPLAY_CONNECTION_TYPE_INTERNAL; |
- display_param.physical_size = gfx::Size(physical_width, physical_height); |
- display_param.has_current_mode = true; |
- display_param.current_mode = mode_param; |
- display_param.has_native_mode = true; |
- display_param.native_mode = mode_param; |
+ snapshot_out->display_id = kDummyDisplayId; |
+ snapshot_out->modes.push_back(mode_param); |
+ snapshot_out->type = DISPLAY_CONNECTION_TYPE_INTERNAL; |
+ snapshot_out->physical_size = gfx::Size(physical_width, physical_height); |
+ snapshot_out->has_current_mode = true; |
+ snapshot_out->current_mode = mode_param; |
+ snapshot_out->has_native_mode = true; |
+ snapshot_out->native_mode = mode_param; |
+ return true; |
+} |
+ |
+bool CreateSnapshotFromEDID(bool internal, |
+ std::vector<uint8_t> edid, |
+ DisplaySnapshot_Params* snapshot_out) { |
+ uint16_t manufacturer_id = 0; |
+ gfx::Size resolution; |
+ |
+ DisplayMode_Params mode_param; |
+ mode_param.refresh_rate = 60.0f; |
+ |
+ if (!ParseOutputDeviceData(edid, &manufacturer_id, |
+ &snapshot_out->display_name, &mode_param.size, |
+ &snapshot_out->physical_size) || |
+ !GetDisplayIdFromEDID(edid, 0, &snapshot_out->display_id)) { |
+ return false; |
+ } |
+ ParseOutputOverscanFlag(edid, &snapshot_out->has_overscan); |
+ |
+ snapshot_out->modes.push_back(mode_param); |
+ // Use VGA for external display for now. |
+ // TODO(oshima): frecon should set this value in the display_info.bin file. |
+ snapshot_out->type = |
+ internal ? DISPLAY_CONNECTION_TYPE_INTERNAL : DISPLAY_CONNECTION_TYPE_VGA; |
+ snapshot_out->has_current_mode = true; |
+ snapshot_out->current_mode = mode_param; |
+ snapshot_out->has_native_mode = true; |
+ snapshot_out->native_mode = mode_param; |
+ return true; |
+} |
- return display_param; |
+bool CreateSnapshotFromEDIDFile(const base::FilePath& file, |
+ DisplaySnapshot_Params* snapshot_out) { |
+ // const base::FilePath kDisplayInfoPath("/tmp/display_info.bin"); |
+ std::string raw_display_info; |
+ { |
+ const int kEDIDMaxSize = 128; |
+ // Just read it on current thread as this is necessary information |
+ // to start. |
+ base::ThreadRestrictions::ScopedAllowIO allow_io; |
+ if (!base::ReadFileToString(file, &raw_display_info, kEDIDMaxSize + 1) || |
+ raw_display_info.size() < 10) { |
+ return false; |
+ } |
+ } |
+ std::vector<uint8_t> edid; |
+ // The head of the file contains one byte flag that indicates the type of |
+ // display. |
+ bool internal = raw_display_info[0] == 1; |
+ edid.assign(raw_display_info.c_str() + 1, |
+ raw_display_info.c_str() + raw_display_info.size()); |
+ return CreateSnapshotFromEDID(internal, edid, snapshot_out); |
} |
} // namespace ui |