Make MouseCursor mutable

MouseCursor objects were previous immutable which makes it harder to
implement deserializers when MouseCursor is sent over IPC in Chromium.

R=dcaiafa@chromium.org

Review URL: https://webrtc-codereview.appspot.com/6059005

git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@5310 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/modules/desktop_capture/desktop_and_cursor_composer.cc b/modules/desktop_capture/desktop_and_cursor_composer.cc
index 6ed3ae8..59d564e 100644
--- a/modules/desktop_capture/desktop_and_cursor_composer.cc
+++ b/modules/desktop_capture/desktop_and_cursor_composer.cc
@@ -81,7 +81,7 @@
   mutable_updated_region()->Swap(frame->mutable_updated_region());
 
   DesktopVector image_pos = position.subtract(cursor.hotspot());
-  DesktopRect target_rect = DesktopRect::MakeSize(cursor.image().size());
+  DesktopRect target_rect = DesktopRect::MakeSize(cursor.image()->size());
   target_rect.Translate(image_pos);
   DesktopVector target_origin = target_rect.top_left();
   target_rect.IntersectWith(DesktopRect::MakeSize(size()));
@@ -101,10 +101,10 @@
                               target_rect.left() * DesktopFrame::kBytesPerPixel;
   DesktopVector origin_shift = target_rect.top_left().subtract(target_origin);
   AlphaBlend(target_rect_data, stride(),
-             cursor.image().data() +
-                 origin_shift.y() * cursor.image().stride() +
+             cursor.image()->data() +
+                 origin_shift.y() * cursor.image()->stride() +
                  origin_shift.x() * DesktopFrame::kBytesPerPixel,
-             cursor.image().stride(),
+             cursor.image()->stride(),
              target_rect.size());
 }
 
diff --git a/modules/desktop_capture/mouse_cursor.cc b/modules/desktop_capture/mouse_cursor.cc
index 3f1ab3d..c6c58d8 100644
--- a/modules/desktop_capture/mouse_cursor.cc
+++ b/modules/desktop_capture/mouse_cursor.cc
@@ -14,6 +14,8 @@
 
 namespace webrtc {
 
+MouseCursor::MouseCursor() {}
+
 MouseCursor::MouseCursor(DesktopFrame* image, const DesktopVector& hotspot)
     : image_(image),
       hotspot_(hotspot) {
@@ -25,8 +27,9 @@
 
 // static
 MouseCursor* MouseCursor::CopyOf(const MouseCursor& cursor) {
-  return new MouseCursor(BasicDesktopFrame::CopyOf(cursor.image()),
-                         cursor.hotspot());
+  return new MouseCursor(
+      cursor.image() ? NULL : BasicDesktopFrame::CopyOf(*cursor.image()),
+      cursor.hotspot());
 }
 
 }  // namespace webrtc
diff --git a/modules/desktop_capture/mouse_cursor.h b/modules/desktop_capture/mouse_cursor.h
index 4cf7708..3acfa45 100644
--- a/modules/desktop_capture/mouse_cursor.h
+++ b/modules/desktop_capture/mouse_cursor.h
@@ -21,13 +21,19 @@
 
 class MouseCursor {
  public:
+  MouseCursor();
+
   // Takes ownership of |image|. |hotspot| must be within |image| boundaries.
   MouseCursor(DesktopFrame* image, const DesktopVector& hotspot);
+
   ~MouseCursor();
 
   static MouseCursor* CopyOf(const MouseCursor& cursor);
 
-  const DesktopFrame& image() const { return *image_; }
+  void set_image(DesktopFrame* image) { image_.reset(image); }
+  const DesktopFrame* image() const { return image_.get(); }
+
+  void set_hotspot(const DesktopVector& hotspot ) { hotspot_ = hotspot; }
   const DesktopVector& hotspot() const { return hotspot_; }
 
  private:
diff --git a/modules/desktop_capture/mouse_cursor_monitor_unittest.cc b/modules/desktop_capture/mouse_cursor_monitor_unittest.cc
index 18bf1ca..f91a9af 100644
--- a/modules/desktop_capture/mouse_cursor_monitor_unittest.cc
+++ b/modules/desktop_capture/mouse_cursor_monitor_unittest.cc
@@ -66,10 +66,10 @@
   EXPECT_TRUE(cursor_image_.get());
   EXPECT_GE(cursor_image_->hotspot().x(), 0);
   EXPECT_LE(cursor_image_->hotspot().x(),
-            cursor_image_->image().size().width());
+            cursor_image_->image()->size().width());
   EXPECT_GE(cursor_image_->hotspot().y(), 0);
   EXPECT_LE(cursor_image_->hotspot().y(),
-            cursor_image_->image().size().height());
+            cursor_image_->image()->size().height());
 
   EXPECT_TRUE(position_received_);
   EXPECT_EQ(MouseCursorMonitor::INSIDE, state_);