fix: osr windows respect display scale factor (#15733)

This commit is contained in:
Andy Dill 2018-11-28 08:16:03 -08:00 committed by Shelley Vohr
parent 07f8f5f95a
commit 55808dffcd
2 changed files with 36 additions and 22 deletions

View file

@ -32,6 +32,7 @@
#include "ui/compositor/compositor.h" #include "ui/compositor/compositor.h"
#include "ui/compositor/layer.h" #include "ui/compositor/layer.h"
#include "ui/compositor/layer_type.h" #include "ui/compositor/layer_type.h"
#include "ui/display/screen.h"
#include "ui/events/base_event_utils.h" #include "ui/events/base_event_utils.h"
#include "ui/events/event_constants.h" #include "ui/events/event_constants.h"
#include "ui/gfx/canvas.h" #include "ui/gfx/canvas.h"
@ -264,7 +265,6 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView(
transparent_(transparent), transparent_(transparent),
callback_(callback), callback_(callback),
frame_rate_(frame_rate), frame_rate_(frame_rate),
scale_factor_(kDefaultScaleFactor),
size_(native_window ? native_window->GetSize() : gfx::Size()), size_(native_window ? native_window->GetSize() : gfx::Size()),
painting_(painting), painting_(painting),
is_showing_(!render_widget_host_->is_hidden()), is_showing_(!render_widget_host_->is_hidden()),
@ -282,7 +282,7 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView(
root_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); root_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR));
#endif #endif
current_device_scale_factor_ = 1; current_device_scale_factor_ = kDefaultScaleFactor;
local_surface_id_ = local_surface_id_allocator_.GenerateId(); local_surface_id_ = local_surface_id_allocator_.GenerateId();
@ -702,7 +702,7 @@ void OffScreenRenderWidgetHostView::GetScreenInfo(
screen_info->depth = 24; screen_info->depth = 24;
screen_info->depth_per_component = 8; screen_info->depth_per_component = 8;
screen_info->orientation_angle = 0; screen_info->orientation_angle = 0;
screen_info->device_scale_factor = 1.0; screen_info->device_scale_factor = current_device_scale_factor_;
screen_info->orientation_type = screen_info->orientation_type =
content::SCREEN_ORIENTATION_VALUES_LANDSCAPE_PRIMARY; content::SCREEN_ORIENTATION_VALUES_LANDSCAPE_PRIMARY;
screen_info->rect = gfx::Rect(size_); screen_info->rect = gfx::Rect(size_);
@ -735,7 +735,8 @@ void OffScreenRenderWidgetHostView::ImeCompositionRangeChanged(
gfx::Size OffScreenRenderWidgetHostView::GetCompositorViewportPixelSize() gfx::Size OffScreenRenderWidgetHostView::GetCompositorViewportPixelSize()
const { const {
return gfx::ScaleToCeiledSize(GetRequestedRendererSize(), scale_factor_); return gfx::ScaleToCeiledSize(GetRequestedRendererSize(),
current_device_scale_factor_);
} }
content::RenderWidgetHostViewBase* content::RenderWidgetHostViewBase*
@ -817,14 +818,15 @@ bool OffScreenRenderWidgetHostView::TransformPointToLocalCoordSpaceLegacy(
gfx::PointF* transformed_point) { gfx::PointF* transformed_point) {
// Transformations use physical pixels rather than DIP, so conversion // Transformations use physical pixels rather than DIP, so conversion
// is necessary. // is necessary.
gfx::PointF point_in_pixels = gfx::ConvertPointToPixel(scale_factor_, point); gfx::PointF point_in_pixels =
gfx::ConvertPointToPixel(current_device_scale_factor_, point);
if (!GetDelegatedFrameHost()->TransformPointToLocalCoordSpaceLegacy( if (!GetDelegatedFrameHost()->TransformPointToLocalCoordSpaceLegacy(
point_in_pixels, original_surface, transformed_point)) { point_in_pixels, original_surface, transformed_point)) {
return false; return false;
} }
*transformed_point = *transformed_point =
gfx::ConvertPointToDIP(scale_factor_, *transformed_point); gfx::ConvertPointToDIP(current_device_scale_factor_, *transformed_point);
return true; return true;
} }
@ -905,8 +907,8 @@ void OffScreenRenderWidgetHostView::RegisterGuestViewFrameSwappedCallback(
void OffScreenRenderWidgetHostView::OnGuestViewFrameSwapped( void OffScreenRenderWidgetHostView::OnGuestViewFrameSwapped(
content::RenderWidgetHostViewGuest* guest_host_view) { content::RenderWidgetHostViewGuest* guest_host_view) {
InvalidateBounds( InvalidateBounds(gfx::ConvertRectToPixel(current_device_scale_factor_,
gfx::ConvertRectToPixel(scale_factor_, guest_host_view->GetViewBounds())); guest_host_view->GetViewBounds()));
RegisterGuestViewFrameSwappedCallback(guest_host_view); RegisterGuestViewFrameSwappedCallback(guest_host_view);
} }
@ -967,23 +969,32 @@ void OffScreenRenderWidgetHostView::OnPaint(const gfx::Rect& damage_rect,
} else { } else {
gfx::Rect damage(damage_rect); gfx::Rect damage(damage_rect);
gfx::Size size = GetViewBounds().size(); gfx::Size size_in_pixels = gfx::ConvertSizeToPixel(
current_device_scale_factor_, GetViewBounds().size());
SkBitmap backing; SkBitmap backing;
backing.allocN32Pixels(size.width(), size.height(), false); backing.allocN32Pixels(size_in_pixels.width(), size_in_pixels.height(),
false);
SkCanvas canvas(backing); SkCanvas canvas(backing);
canvas.writePixels(bitmap, 0, 0); canvas.writePixels(bitmap, 0, 0);
if (popup_host_view_ && popup_bitmap_.get()) { if (popup_host_view_ && popup_bitmap_.get()) {
gfx::Rect pos = popup_host_view_->popup_position_; gfx::Rect rect = popup_host_view_->popup_position_;
damage.Union(pos); gfx::Point origin_in_pixels =
canvas.writePixels(*popup_bitmap_.get(), pos.x(), pos.y()); gfx::ConvertPointToPixel(current_device_scale_factor_, rect.origin());
damage.Union(rect);
canvas.writePixels(*popup_bitmap_.get(), origin_in_pixels.x(),
origin_in_pixels.y());
} }
for (auto* proxy_view : proxy_views_) { for (auto* proxy_view : proxy_views_) {
gfx::Rect pos = proxy_view->GetBounds(); gfx::Rect rect = proxy_view->GetBounds();
damage.Union(pos); gfx::Point origin_in_pixels =
canvas.writePixels(*proxy_view->GetBitmap(), pos.x(), pos.y()); gfx::ConvertPointToPixel(current_device_scale_factor_, rect.origin());
damage.Union(rect);
canvas.writePixels(*proxy_view->GetBitmap(), origin_in_pixels.x(),
origin_in_pixels.y());
} }
damage.Intersect(GetViewBounds()); damage.Intersect(GetViewBounds());
@ -1263,8 +1274,13 @@ void OffScreenRenderWidgetHostView::SetNativeWindow(NativeWindow* window) {
void OffScreenRenderWidgetHostView::ResizeRootLayer(bool force) { void OffScreenRenderWidgetHostView::ResizeRootLayer(bool force) {
SetupFrameRate(false); SetupFrameRate(false);
const float compositorScaleFactor = GetCompositor()->device_scale_factor(); display::Display display =
const bool scaleFactorDidChange = (compositorScaleFactor != scale_factor_); display::Screen::GetScreen()->GetDisplayNearestView(GetNativeView());
const float scaleFactor = display.device_scale_factor();
const bool scaleFactorDidChange =
(scaleFactor != current_device_scale_factor_);
current_device_scale_factor_ = scaleFactor;
gfx::Size size; gfx::Size size;
if (!IsPopupWidget()) if (!IsPopupWidget())
@ -1277,12 +1293,12 @@ void OffScreenRenderWidgetHostView::ResizeRootLayer(bool force) {
return; return;
const gfx::Size& size_in_pixels = const gfx::Size& size_in_pixels =
gfx::ConvertSizeToPixel(scale_factor_, size); gfx::ConvertSizeToPixel(current_device_scale_factor_, size);
local_surface_id_ = local_surface_id_allocator_.GenerateId(); local_surface_id_ = local_surface_id_allocator_.GenerateId();
GetRootLayer()->SetBounds(gfx::Rect(size)); GetRootLayer()->SetBounds(gfx::Rect(size));
GetCompositor()->SetScaleAndSize(scale_factor_, size_in_pixels, GetCompositor()->SetScaleAndSize(current_device_scale_factor_, size_in_pixels,
local_surface_id_); local_surface_id_);
#if defined(OS_MACOSX) #if defined(OS_MACOSX)

View file

@ -271,7 +271,6 @@ class OffScreenRenderWidgetHostView : public content::RenderWidgetHostViewBase,
void SetNativeWindow(NativeWindow* window); void SetNativeWindow(NativeWindow* window);
NativeWindow* window() const { return native_window_; } NativeWindow* window() const { return native_window_; }
gfx::Size size() const { return size_; } gfx::Size size() const { return size_; }
float scale_factor() const { return scale_factor_; }
void set_popup_host_view(OffScreenRenderWidgetHostView* popup_view) { void set_popup_host_view(OffScreenRenderWidgetHostView* popup_view) {
popup_host_view_ = popup_view; popup_host_view_ = popup_view;
@ -319,7 +318,6 @@ class OffScreenRenderWidgetHostView : public content::RenderWidgetHostViewBase,
base::Time last_time_ = base::Time::Now(); base::Time last_time_ = base::Time::Now();
float scale_factor_;
gfx::Vector2dF last_scroll_offset_; gfx::Vector2dF last_scroll_offset_;
gfx::Size size_; gfx::Size size_;
bool painting_; bool painting_;