| 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 {
|
|
|