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 Committed: https://code.google.com/p/webrtc/source/detail?r=5310 Review URL: https://webrtc-codereview.appspot.com/6059005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5314 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
f8be8df33a
commit
8ae72560dd
@ -81,7 +81,7 @@ DesktopFrameWithCursor::DesktopFrameWithCursor(DesktopFrame* frame,
|
||||
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 @@ DesktopFrameWithCursor::DesktopFrameWithCursor(DesktopFrame* frame,
|
||||
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());
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,8 @@
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
MouseCursor::MouseCursor() {}
|
||||
|
||||
MouseCursor::MouseCursor(DesktopFrame* image, const DesktopVector& hotspot)
|
||||
: image_(image),
|
||||
hotspot_(hotspot) {
|
||||
@ -25,8 +27,9 @@ MouseCursor::~MouseCursor() {}
|
||||
|
||||
// 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
|
||||
|
@ -21,13 +21,19 @@ class DesktopFrame;
|
||||
|
||||
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:
|
||||
|
@ -182,10 +182,10 @@ void MouseCursorMonitorMac::CaptureImage() {
|
||||
|
||||
// Compare the cursor with the previous one.
|
||||
if (last_cursor_.get() &&
|
||||
last_cursor_->image().size().equals(size) &&
|
||||
last_cursor_->image()->size().equals(size) &&
|
||||
last_cursor_->hotspot().equals(hotspot) &&
|
||||
memcmp(last_cursor_->image().data(), src_data,
|
||||
last_cursor_->image().stride() * size.height()) == 0) {
|
||||
memcmp(last_cursor_->image()->data(), src_data,
|
||||
last_cursor_->image()->stride() * size.height()) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -66,10 +66,10 @@ TEST_F(MouseCursorMonitorTest, MAYBE(FromScreen)) {
|
||||
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_);
|
||||
|
@ -336,13 +336,13 @@ void ScreenCapturerWin::CaptureCursor() {
|
||||
|
||||
scoped_ptr<MouseCursorShape> cursor(new MouseCursorShape);
|
||||
cursor->hotspot = cursor_image->hotspot();
|
||||
cursor->size = cursor_image->image().size();
|
||||
uint8_t* current_row = cursor_image->image().data();
|
||||
for (int y = 0; y < cursor_image->image().size().height(); ++y) {
|
||||
cursor->size = cursor_image->image()->size();
|
||||
uint8_t* current_row = cursor_image->image()->data();
|
||||
for (int y = 0; y < cursor_image->image()->size().height(); ++y) {
|
||||
cursor->data.append(current_row,
|
||||
current_row + cursor_image->image().size().width() *
|
||||
current_row + cursor_image->image()->size().width() *
|
||||
DesktopFrame::kBytesPerPixel);
|
||||
current_row += cursor_image->image().stride();
|
||||
current_row += cursor_image->image()->stride();
|
||||
}
|
||||
|
||||
// Compare the current cursor with the last one we sent to the client. If
|
||||
|
@ -58,7 +58,7 @@ bool ConvertToMouseShapeAndCompare(unsigned left, unsigned right) {
|
||||
|
||||
int width = bitmap_info.bmWidth;
|
||||
int height = bitmap_info.bmHeight;
|
||||
EXPECT_TRUE(DesktopSize(width, height).equals(mouse_shape->image().size()));
|
||||
EXPECT_TRUE(DesktopSize(width, height).equals(mouse_shape->image()->size()));
|
||||
|
||||
// Get the pixels from |scoped_color|.
|
||||
int size = width * height;
|
||||
@ -66,7 +66,7 @@ bool ConvertToMouseShapeAndCompare(unsigned left, unsigned right) {
|
||||
EXPECT_TRUE(GetBitmapBits(scoped_color, size * sizeof(uint32_t), data.get()));
|
||||
|
||||
// Compare the 32bpp image in |mouse_shape| with the one loaded from |right|.
|
||||
return memcmp(data.get(), mouse_shape->image().data(),
|
||||
return memcmp(data.get(), mouse_shape->image()->data(),
|
||||
size * sizeof(uint32_t)) == 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user