diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-08-10 18:44:57 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-08-24 13:45:31 -0400 |
commit | 37be9e0c2efd21e088e8106b4356de7fcbe5a95b (patch) | |
tree | 3cb472decbaccec1ad3c7f84aa11d89eb892a17a /client | |
parent | a91daa2feb50a3d39150993a9d1b397b3c85ad03 (diff) | |
download | spice-37be9e0c2efd21e088e8106b4356de7fcbe5a95b.tar.gz spice-37be9e0c2efd21e088e8106b4356de7fcbe5a95b.tar.xz spice-37be9e0c2efd21e088e8106b4356de7fcbe5a95b.zip |
Add support for Composite command to the client
All the real work is being done in spice-common, so this patch is just
hooking up the virtual calls and adding the SPICE_DISPLAY_CAP_COMPOSITE
capability.
Diffstat (limited to 'client')
-rw-r--r-- | client/canvas.cpp | 7 | ||||
-rw-r--r-- | client/canvas.h | 1 | ||||
-rw-r--r-- | client/display_channel.cpp | 13 | ||||
-rw-r--r-- | client/display_channel.h | 1 |
4 files changed, 22 insertions, 0 deletions
diff --git a/client/canvas.cpp b/client/canvas.cpp index 7d1561a3..f132186a 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 77025687..213a7538 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 17bdf6a6..d08072de 100644 --- a/client/display_channel.cpp +++ b/client/display_channel.cpp @@ -650,6 +650,8 @@ DisplayChannel::DisplayChannel(RedClient& client, uint32_t id, get_process_loop().add_trigger(_interrupt_update); set_draw_handlers(); + + set_capability(SPICE_DISPLAY_CAP_COMPOSITE); } DisplayChannel::~DisplayChannel() @@ -692,6 +694,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 +716,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 +1740,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 72856f59..197ae73a 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); |