Index: components/exo/surface.cc |
diff --git a/components/exo/surface.cc b/components/exo/surface.cc |
index d822e5b03a59697ebc90f6d5852593e55966a454..ba35eae26aec0db9fc0c7acc3ad211e5d19141bf 100644 |
--- a/components/exo/surface.cc |
+++ b/components/exo/surface.cc |
@@ -19,6 +19,7 @@ |
#include "ui/compositor/layer.h" |
#include "ui/gfx/buffer_format_util.h" |
#include "ui/gfx/gpu_memory_buffer.h" |
+#include "ui/gfx/transform_util.h" |
DECLARE_WINDOW_PROPERTY_TYPE(exo::Surface*); |
@@ -90,6 +91,7 @@ class EmptyWindowDelegate : public aura::WindowDelegate { |
Surface::Surface() |
: aura::Window(new EmptyWindowDelegate), |
has_pending_contents_(false), |
+ pending_buffer_scale_(1.0f), |
needs_commit_surface_hierarchy_(false), |
update_contents_after_successful_compositing_(false), |
compositor_(nullptr), |
@@ -149,6 +151,12 @@ void Surface::SetOpaqueRegion(const SkRegion& region) { |
pending_opaque_region_ = region; |
} |
+void Surface::SetBufferScale(float scale) { |
+ TRACE_EVENT1("exo", "Surface::SetBufferScale", "scale", scale); |
+ |
+ pending_buffer_scale_ = scale; |
+} |
+ |
void Surface::AddSubSurface(Surface* sub_surface) { |
TRACE_EVENT1("exo", "Surface::AddSubSurface", "sub_surface", |
sub_surface->AsTracedValue()); |
@@ -271,10 +279,15 @@ void Surface::CommitSurfaceHierarchy() { |
texture_mailbox_release_callback.Pass(), |
texture_mailbox.size_in_pixels()); |
layer()->SetTextureFlipped(false); |
- layer()->SetBounds(gfx::Rect(layer()->bounds().origin(), |
- texture_mailbox.size_in_pixels())); |
+ gfx::Size contents_size(gfx::ScaleToFlooredSize( |
+ texture_mailbox.size_in_pixels(), 1.0f / pending_buffer_scale_)); |
+ layer()->SetBounds(gfx::Rect(layer()->bounds().origin(), contents_size)); |
layer()->SetFillsBoundsOpaquely(pending_opaque_region_.contains( |
- gfx::RectToSkIRect(gfx::Rect(texture_mailbox.size_in_pixels())))); |
+ gfx::RectToSkIRect(gfx::Rect(contents_size)))); |
+ layer()->SetTransform(gfx::GetScaleTransform( |
+ gfx::Rect(texture_mailbox.size_in_pixels()).CenterPoint(), |
+ static_cast<float>(contents_size.width()) / |
+ texture_mailbox.size_in_pixels().width())); |
} else { |
// Show solid color content if no buffer is attached or we failed |
// to produce a texture mailbox for the currently attached buffer. |
@@ -331,7 +344,9 @@ void Surface::CommitSurfaceHierarchy() { |
} |
gfx::Size Surface::GetPreferredSize() const { |
- return pending_buffer_ ? pending_buffer_->GetSize() : layer()->size(); |
+ return pending_buffer_ ? gfx::ScaleToFlooredSize(pending_buffer_->GetSize(), |
+ 1.0f / pending_buffer_scale_) |
+ : layer()->size(); |
} |
bool Surface::IsSynchronized() const { |