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

Unified Diff: remoting/host/resizing_host_observer.cc

Issue 47653003: Make DesktopResizer use ScreenResolution to facilitate DPI-awareness. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 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 | « remoting/host/resizing_host_observer.h ('k') | remoting/host/resizing_host_observer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/host/resizing_host_observer.cc
diff --git a/remoting/host/resizing_host_observer.cc b/remoting/host/resizing_host_observer.cc
index 8ef130601af9f96f0916124ce1f5ff65c290e533..5b69e85e5aaef7fde5c4f508720f557ef6ed11c8 100644
--- a/remoting/host/resizing_host_observer.cc
+++ b/remoting/host/resizing_host_observer.cc
@@ -12,6 +12,7 @@
#include "remoting/host/desktop_resizer.h"
#include "remoting/host/screen_resolution.h"
+namespace remoting {
namespace {
// Minimum amount of time to wait between desktop resizes. Note that this
@@ -19,22 +20,25 @@ namespace {
// unit-test and must be kept in sync.
const int kMinimumResizeIntervalMs = 1000;
-class CandidateSize {
+class CandidateResolution {
public:
- CandidateSize(const SkISize& candidate, const SkISize& preferred)
- : size_(candidate) {
+ CandidateResolution(const ScreenResolution& candidate,
+ const ScreenResolution& preferred)
+ : resolution_(candidate) {
// Protect against division by zero.
- CHECK(!candidate.isEmpty());
- DCHECK(!preferred.isEmpty());
+ CHECK(!candidate.IsEmpty());
+ DCHECK(!preferred.IsEmpty());
// The client scale factor is the smaller of the candidate:preferred ratios
// for width and height.
- if ((candidate.width() > preferred.width()) ||
- (candidate.height() > preferred.height())) {
+ if ((candidate.dimensions().width() > preferred.dimensions().width()) ||
+ (candidate.dimensions().height() > preferred.dimensions().height())) {
const float width_ratio =
- static_cast<float>(preferred.width()) / candidate.width();
+ static_cast<float>(preferred.dimensions().width()) /
+ candidate.dimensions().width();
const float height_ratio =
- static_cast<float>(preferred.height()) / candidate.height();
+ static_cast<float>(preferred.dimensions().height()) /
+ candidate.dimensions().height();
client_scale_factor_ = std::min(width_ratio, height_ratio);
} else {
// Since clients do not scale up, 1.0 is the maximum.
@@ -48,9 +52,11 @@ class CandidateSize {
// By keeping the values < 1.0, it allows ratios that differ in opposite
// directions to be compared numerically.
float candidate_aspect_ratio =
- static_cast<float>(candidate.width()) / candidate.height();
+ static_cast<float>(candidate.dimensions().width()) /
+ candidate.dimensions().height();
float preferred_aspect_ratio =
- static_cast<float>(preferred.width()) / preferred.height();
+ static_cast<float>(preferred.dimensions().width()) /
+ preferred.dimensions().height();
if (candidate_aspect_ratio > preferred_aspect_ratio) {
aspect_ratio_goodness_ = preferred_aspect_ratio / candidate_aspect_ratio;
} else {
@@ -58,64 +64,67 @@ class CandidateSize {
}
}
- const SkISize& size() const { return size_; }
+ const ScreenResolution& resolution() const { return resolution_; }
float client_scale_factor() const { return client_scale_factor_; }
float aspect_ratio_goodness() const { return aspect_ratio_goodness_; }
int64 area() const {
- return static_cast<int64>(size_.width()) * size_.height();
+ return static_cast<int64>(resolution_.dimensions().width()) *
+ resolution_.dimensions().height();
}
- bool IsBetterThan(const CandidateSize& other) const {
- // If either size would require down-scaling, prefer the one that down-
- // scales the least (since the client scale factor is at most 1.0, this
- // does not differentiate between sizes that don't require down-scaling).
+ // TODO(jamiewalch): Also compare the DPI: http://crbug.com/172405
+ bool IsBetterThan(const CandidateResolution& other) const {
+ // If either resolution would require down-scaling, prefer the one that
+ // down-scales the least (since the client scale factor is at most 1.0,
+ // this does not differentiate between resolutions that don't require
+ // down-scaling).
if (client_scale_factor() < other.client_scale_factor()) {
return false;
} else if (client_scale_factor() > other.client_scale_factor()) {
return true;
}
- // If the scale factors are the same, pick the size with the largest area.
+ // If the scale factors are the same, pick the resolution with the largest
+ // area.
if (area() < other.area()) {
return false;
} else if (area() > other.area()) {
return true;
}
- // If the areas are equal, pick the size with the "best" aspect ratio.
+ // If the areas are equal, pick the resolution with the "best" aspect ratio.
if (aspect_ratio_goodness() < other.aspect_ratio_goodness()) {
return false;
} else if (aspect_ratio_goodness() > other.aspect_ratio_goodness()) {
return true;
}
- // If the aspect ratios are equally good (for example, comparing 640x480
- // to 480x640 w.r.t. 640x640), just pick the widest, since desktop UIs
- // are typically designed for landscape aspect ratios.
- return size().width() > other.size().width();
+ // All else being equal (for example, comparing 640x480 to 480x640 w.r.t.
+ // 640x640), just pick the widest, since desktop UIs are typically designed
+ // for landscape aspect ratios.
+ return resolution().dimensions().width() >
+ other.resolution().dimensions().width();
}
private:
float client_scale_factor_;
float aspect_ratio_goodness_;
- SkISize size_;
+ ScreenResolution resolution_;
};
} // namespace
-namespace remoting {
-
ResizingHostObserver::ResizingHostObserver(
scoped_ptr<DesktopResizer> desktop_resizer)
: desktop_resizer_(desktop_resizer.Pass()),
- original_size_(desktop_resizer_->GetCurrentSize()),
+ original_resolution_(desktop_resizer_->GetCurrentResolution()),
now_function_(base::Bind(base::Time::Now)),
weak_factory_(this) {
}
ResizingHostObserver::~ResizingHostObserver() {
- if (!original_size_.isZero())
- desktop_resizer_->RestoreSize(original_size_);
+ if (!original_resolution_.IsEmpty())
+ desktop_resizer_->RestoreResolution(original_resolution_);
}
void ResizingHostObserver::SetScreenResolution(
@@ -143,24 +152,24 @@ void ResizingHostObserver::SetScreenResolution(
return;
}
- // If the implementation returns any sizes, pick the best one according to
- // the algorithm described in CandidateSize::IsBetterThen.
- SkISize dimensions = SkISize::Make(
- resolution.dimensions().width(), resolution.dimensions().height());
- std::list<SkISize> sizes = desktop_resizer_->GetSupportedSizes(dimensions);
- if (sizes.empty())
+ // If the implementation returns any resolutions, pick the best one according
+ // to the algorithm described in CandidateResolution::IsBetterThen.
+ std::list<ScreenResolution> resolutions =
+ desktop_resizer_->GetSupportedResolutions(resolution);
+ if (resolutions.empty())
return;
- CandidateSize best_size(sizes.front(), dimensions);
- for (std::list<SkISize>::const_iterator i = ++sizes.begin();
- i != sizes.end(); ++i) {
- CandidateSize candidate_size(*i, dimensions);
- if (candidate_size.IsBetterThan(best_size)) {
- best_size = candidate_size;
+ CandidateResolution best_candidate(resolutions.front(), resolution);
+ for (std::list<ScreenResolution>::const_iterator i = ++resolutions.begin();
+ i != resolutions.end(); ++i) {
+ CandidateResolution candidate(*i, resolution);
+ if (candidate.IsBetterThan(best_candidate)) {
+ best_candidate = candidate;
}
}
- SkISize current_size = desktop_resizer_->GetCurrentSize();
- if (best_size.size() != current_size)
- desktop_resizer_->SetSize(best_size.size());
+ ScreenResolution current_resolution =
+ desktop_resizer_->GetCurrentResolution();
+ if (!best_candidate.resolution().Equals(current_resolution))
+ desktop_resizer_->SetResolution(best_candidate.resolution());
// Update the time of last resize to allow it to be rate-limited.
previous_resize_time_ = now;
« no previous file with comments | « remoting/host/resizing_host_observer.h ('k') | remoting/host/resizing_host_observer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698