Index: remoting/client/plugin/pepper_view.cc |
diff --git a/remoting/client/plugin/pepper_view.cc b/remoting/client/plugin/pepper_view.cc |
index b86af03f4c6567254cc7c97517999e790900849a..aabcba09ca5cec612e9ff4f9306aacf90bcd017d 100644 |
--- a/remoting/client/plugin/pepper_view.cc |
+++ b/remoting/client/plugin/pepper_view.cc |
@@ -11,7 +11,8 @@ |
#include "base/time.h" |
#include "base/synchronization/waitable_event.h" |
#include "ppapi/cpp/completion_callback.h" |
-#include "ppapi/cpp/graphics_2d.h" |
+#include "ppapi/cpp/dev/graphics_2d_dev.h" |
+#include "ppapi/cpp/dev/view_dev.h" |
#include "ppapi/cpp/image_data.h" |
#include "ppapi/cpp/point.h" |
#include "ppapi/cpp/rect.h" |
@@ -46,6 +47,8 @@ PepperView::PepperView(ChromotingInstance* instance, |
clip_area_(SkIRect::MakeEmpty()), |
source_size_(SkISize::Make(0, 0)), |
source_dpi_(SkIPoint::Make(0, 0)), |
+ view_size_dips_(SkISize::Make(0, 0)), |
+ view_scale_(1.0f), |
flush_pending_(false), |
frame_received_(false) { |
InitiateDrawing(); |
@@ -66,27 +69,46 @@ PepperView::~PepperView() { |
} |
} |
-void PepperView::SetView(const SkISize& view_size, const SkIRect& clip_area) { |
+void PepperView::SetView(const pp::View& view) { |
bool view_changed = false; |
- if (view_size_ != view_size) { |
+ pp::Rect pp_size = view.GetRect(); |
+ SkISize new_size_dips = SkISize::Make(pp_size.width(), pp_size.height()); |
+ pp::ViewDev view_dev(view); |
+ float new_scale = view_dev.GetDeviceScale(); |
+ |
+ if (view_size_dips_ != new_size_dips || view_scale_ != new_scale) { |
view_changed = true; |
- view_size_ = view_size; |
+ view_scale_ = new_scale; |
+ view_size_dips_ = new_size_dips; |
+ view_size_ = SkISize::Make(ceilf(view_size_dips_.width() * view_scale_), |
+ ceilf(view_size_dips_.height() * view_scale_)); |
pp::Size pp_size = pp::Size(view_size_.width(), view_size_.height()); |
graphics2d_ = pp::Graphics2D(instance_, pp_size, true); |
+ |
+ // Ideally we would always let Graphics2D scale us, but the output quality |
+ // is lousy, so we don't. |
+ pp::Graphics2DDev graphics2d_dev(graphics2d_); |
+ graphics2d_dev.SetScale(1.0f / view_scale_); |
+ |
bool result = instance_->BindGraphics(graphics2d_); |
// There is no good way to handle this error currently. |
DCHECK(result) << "Couldn't bind the device context."; |
} |
- if (clip_area_ != clip_area) { |
+ pp::Rect pp_clip = view.GetClipRect(); |
+ SkIRect new_clip = SkIRect::MakeLTRB(floorf(pp_clip.x() * view_scale_), |
+ floorf(pp_clip.y() * view_scale_), |
+ ceilf(pp_clip.right() * view_scale_), |
+ ceilf(pp_clip.bottom() * view_scale_)); |
+ if (clip_area_ != new_clip) { |
view_changed = true; |
// YUV to RGB conversion may require even X and Y coordinates for |
// the top left corner of the clipping area. |
- clip_area_ = AlignRect(clip_area); |
+ clip_area_ = AlignRect(new_clip); |
clip_area_.intersect(SkIRect::MakeSize(view_size_)); |
} |