[Spice-commits] Branch '0.8' - client/display_channel.cpp

Yonit Halperin yhalperi at kemper.freedesktop.org
Thu May 19 04:33:54 PDT 2011


 client/display_channel.cpp |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

New commits:
commit 04595c74ada945fcc2a1c5b37208cfae844b5bf6
Author: Yonit Halperin <yhalperi at redhat.com>
Date:   Wed May 18 17:28:20 2011 +0300

    client: fix flipped video in Linux guest on windows client, RHBZ #667689
    
    Video streams from Linux guests are oriented top-down, where gdi_canvas_put_image always
    received display context for down-top oriented bitmap. I fixed create_bitmap
    to consider the stream orientation.

diff --git a/client/display_channel.cpp b/client/display_channel.cpp
index 45673b4..3d2d8e8 100644
--- a/client/display_channel.cpp
+++ b/client/display_channel.cpp
@@ -214,7 +214,7 @@ public:
 #ifdef WIN32
 static int create_bitmap(HDC *dc, HBITMAP *prev_bitmap,
                          uint8_t **data, int *nstride,
-                         int width, int height)
+                         int width, int height, bool top_down)
 {
     HBITMAP bitmap;
     struct {
@@ -225,7 +225,7 @@ static int create_bitmap(HDC *dc, HBITMAP *prev_bitmap,
     memset(&bitmap_info, 0, sizeof(bitmap_info));
     bitmap_info.inf.bmiHeader.biSize = sizeof(bitmap_info.inf.bmiHeader);
     bitmap_info.inf.bmiHeader.biWidth = width;
-    bitmap_info.inf.bmiHeader.biHeight = height;
+    bitmap_info.inf.bmiHeader.biHeight = top_down ? -height : height;
 
     bitmap_info.inf.bmiHeader.biPlanes = 1;
     bitmap_info.inf.bmiHeader.biBitCount = 32;
@@ -281,7 +281,7 @@ VideoStream::VideoStream(RedClient& client, Canvas& canvas, DisplayChannel& chan
     try {
 #ifdef WIN32
         if (!create_bitmap(&_dc, &_prev_bitmap, &_uncompressed_data, &_stride,
-                           stream_width, stream_height)) {
+                           stream_width, stream_height, _top_down)) {
             THROW("create_bitmap failed");
         }
 #else
@@ -296,6 +296,8 @@ VideoStream::VideoStream(RedClient& client, Canvas& canvas, DisplayChannel& chan
         SetViewportOrgEx(_dc, 0, stream_height - src_height, NULL);
 #endif
 
+    // this doesn't have effect when using gdi_canvas. The sign of BITMAPINFO's biHeight
+    // determines the orientation (see create_bitmap).
 	if (_top_down) {
 	    _pixmap.data = _uncompressed_data;
 	    _pixmap.stride = _stride;


More information about the Spice-commits mailing list