Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Unified Diff: chromeos/display/output_util.cc

Issue 21297003: Add ability to set resolution on external display (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: adraddressed comment, adjusted test Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chromeos/display/output_util.h ('k') | chromeos/display/output_util_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chromeos/display/output_util.cc
diff --git a/chromeos/display/output_util.cc b/chromeos/display/output_util.cc
index ba26684b565d55db60ec2720b40aea144fbba031..d9d291319d54d61a6773c511e42d17c080bff773 100644
--- a/chromeos/display/output_util.cc
+++ b/chromeos/display/output_util.cc
@@ -111,6 +111,16 @@ bool GetOutputDeviceData(XID output,
return result;
}
+float GetRefreshRate(const XRRModeInfo* mode_info) {
+ if (mode_info->hTotal && mode_info->vTotal) {
+ return static_cast<float>(mode_info->dotClock) /
+ (static_cast<float>(mode_info->hTotal) *
+ static_cast<float>(mode_info->vTotal));
+ } else {
+ return 0.0f;
+ }
+}
+
} // namespace
std::string GetDisplayName(XID output_id) {
@@ -321,4 +331,75 @@ bool IsInternalOutputName(const std::string& name) {
name.find(kInternal_DSI) == 0;
}
+const XRRModeInfo* FindModeInfo(const XRRScreenResources* screen_resources,
+ XID current_mode) {
+ for (int m = 0; m < screen_resources->nmode; m++) {
+ XRRModeInfo *mode = &screen_resources->modes[m];
+ if (mode->id == current_mode)
+ return mode;
+ }
+ return NULL;
+}
+
+// Find a mode that matches the given size with highest
+// reflesh rate.
+RRMode FindOutputModeMatchingSize(
+ const XRRScreenResources* screen_resources,
+ const XRROutputInfo* output_info,
+ size_t width,
+ size_t height) {
+ RRMode found = None;
+ float best_rate = 0;
+ bool non_interlaced_found = false;
+ for (int i = 0; i < output_info->nmode; ++i) {
+ RRMode mode = output_info->modes[i];
+ const XRRModeInfo* info = FindModeInfo(screen_resources, mode);
+
+ if (info->width == width && info->height == height) {
+ float rate = GetRefreshRate(info);
+
+ if (info->modeFlags & RR_Interlace) {
+ if (non_interlaced_found)
+ continue;
+ } else {
+ // Reset the best rate if the non interlaced is
+ // found the first time.
+ if (!non_interlaced_found) {
+ best_rate = rate;
+ }
+ non_interlaced_found = true;
+ }
+ if (rate < best_rate)
+ continue;
+
+ found = mode;
+ best_rate = rate;
+ }
+ }
+ return found;
+}
+
+namespace test {
+
+XRRModeInfo CreateModeInfo(int id,
+ int width,
+ int height,
+ bool interlaced,
+ float refresh_rate) {
+ XRRModeInfo mode_info = {0};
+ mode_info.id = id;
+ mode_info.width = width;
+ mode_info.height = height;
+ if (interlaced)
+ mode_info.modeFlags = RR_Interlace;
+ if (refresh_rate != 0.0f) {
+ mode_info.hTotal = 1;
+ mode_info.vTotal = 1;
+ mode_info.dotClock = refresh_rate;
+ }
+ return mode_info;
+}
+
+} // namespace test
+
} // namespace chromeos
« no previous file with comments | « chromeos/display/output_util.h ('k') | chromeos/display/output_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698