[Spice-devel,3/3] Add support for Composite command to the client

Submitted by Soeren Sandmann on Aug. 24, 2012, 1:02 a.m.

Details

Message ID 1345770124-13252-4-git-send-email-sandmann@cs.au.dk
State New
Headers show

Not browsing as part of any series.

Commit Message

Soeren Sandmann Aug. 24, 2012, 1:02 a.m.
From: Søren Sandmann Pedersen <ssp@redhat.com>

All the real work is being done in spice-common, so this patch is just
hooking up the virtual calls.
---
 client/canvas.cpp          |  7 +++++++
 client/canvas.h            |  1 +
 client/display_channel.cpp | 11 +++++++++++
 client/display_channel.h   |  1 +
 4 files changed, 20 insertions(+)

Patch hide | download patch | download mbox

diff --git a/client/canvas.cpp b/client/canvas.cpp
index 7d1561a..f132186 100644
--- a/client/canvas.cpp
+++ b/client/canvas.cpp
@@ -114,6 +114,13 @@  void Canvas::draw_alpha_blend(SpiceMsgDisplayDrawAlphaBlend& alpha_blend, int si
     touched_bbox(&alpha_blend.base.box);
 }
 
+void Canvas::draw_composite(SpiceMsgDisplayDrawComposite& composite, int size)
+{
+    begin_draw(composite.base, size, sizeof(SpiceMsgDisplayDrawComposite));
+    _canvas->ops->draw_composite(_canvas, &composite.base.box, &composite.base.clip, &composite.data);
+    touched_bbox(&composite.base.box);
+}
+
 void Canvas::copy_bits(SpiceMsgDisplayCopyBits& copy, int size)
 {
     begin_draw(copy.base, size, sizeof(SpiceMsgDisplayCopyBits));
diff --git a/client/canvas.h b/client/canvas.h
index 7702568..213a753 100644
--- a/client/canvas.h
+++ b/client/canvas.h
@@ -304,6 +304,7 @@  public:
     void draw_invers(SpiceMsgDisplayDrawInvers& invers, int size);
     void draw_rop3(SpiceMsgDisplayDrawRop3& rop3, int size);
     void draw_stroke(SpiceMsgDisplayDrawStroke& stroke, int size);
+    void draw_composite(SpiceMsgDisplayDrawComposite& composite, int size);
 
     void put_image(
 #ifdef WIN32
diff --git a/client/display_channel.cpp b/client/display_channel.cpp
index 17bdf6a..b566f22 100644
--- a/client/display_channel.cpp
+++ b/client/display_channel.cpp
@@ -692,6 +692,8 @@  void DisplayChannel::set_draw_handlers()
                          &DisplayChannel::handle_draw_transparent);
     handler->set_handler(SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND,
                          &DisplayChannel::handle_draw_alpha_blend);
+    handler->set_handler(SPICE_MSG_DISPLAY_DRAW_COMPOSITE,
+                         &DisplayChannel::handle_draw_composite);
     handler->set_handler(SPICE_MSG_DISPLAY_STREAM_DATA, &DisplayChannel::handle_stream_data);
 }
 
@@ -712,6 +714,7 @@  void DisplayChannel::clear_draw_handlers()
     handler->set_handler(SPICE_MSG_DISPLAY_DRAW_TEXT, NULL);
     handler->set_handler(SPICE_MSG_DISPLAY_DRAW_TRANSPARENT, NULL);
     handler->set_handler(SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND, NULL);
+    handler->set_handler(SPICE_MSG_DISPLAY_DRAW_COMPOSITE, NULL);
     handler->set_handler(SPICE_MSG_DISPLAY_STREAM_DATA, NULL);
 }
 
@@ -1735,6 +1738,14 @@  void DisplayChannel::handle_draw_alpha_blend(RedPeer::InMessage* message)
     DRAW(alpha_blend);
 }
 
+void DisplayChannel::handle_draw_composite(RedPeer::InMessage* message)
+{
+    Canvas *canvas;
+    SpiceMsgDisplayDrawComposite* composite = (SpiceMsgDisplayDrawComposite*)message->data();
+    canvas = _surfaces_cache[composite->base.surface_id];
+    DRAW(composite);
+}
+
 void DisplayChannel::streams_time()
 {
     _next_timer_time = 0;
diff --git a/client/display_channel.h b/client/display_channel.h
index 72856f5..197ae73 100644
--- a/client/display_channel.h
+++ b/client/display_channel.h
@@ -173,6 +173,7 @@  private:
     void handle_draw_text(RedPeer::InMessage* message);
     void handle_draw_transparent(RedPeer::InMessage* message);
     void handle_draw_alpha_blend(RedPeer::InMessage* message);
+    void handle_draw_composite(RedPeer::InMessage* message);
 
     void on_streams_trigger();
     virtual void on_update_completion(uint64_t mark);