[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] vnc client, 16 bit, strange colors when viewing a PV guest



Using tightVNC, the colors are messed up when viewing a PV guest running
on a 3.2 hypervisor from a client system with a 16 bit deep display.
virt-manager --> viewer works OK.
Standalone virt-viewer and other VNC clients have bad colors.  

This problem is new with Xen 3.2 and the qemu xenfb code.

As a short term fix I added a second macro in tools/ioemu/hw/xenfb.c to
munge the colors from 32 bit  to 16 bit based on an algorithm used by
RealVNC.  Patch I used is attached, not suggesting it be merged.

Is anybody else seeing this problem?

By the way, while looking at the original macro I think the last shift
for blue should of used BRS instead if GRS.  ( Changing that did not
make the colors better. )

#define BLT(SRC_T,DST_T,RLS,GLS,BLS,RRS,GRS,BRS,RM,GM,BM)               \
    for (line = y ; line < h ; line++) {                                \
        SRC_T *src = (SRC_T *)(xenfb->pixels                            \
                               + (line * xenfb->row_stride)             \
                               + (x * xenfb->depth / 8));               \
        DST_T *dst = (DST_T
*)(xenfb->ds->data                                 \
                               + (line *
xenfb->ds->linesize)                  \
                               + (x * xenfb->ds->depth /
8));                  \
        int col;                                                        \
        for (col = x ; col < w ; col++) {                               \
            *dst = (((*src >> RRS) & RM) << RLS) |                      \
                (((*src >> GRS) & GM) << GLS) |                         \
-                (((*src >> GRS) & BM) << BLS);                          \
+               (((*src >> BRS) & BM) << BLS);                          \
            src++;                                                      \
            dst++;                                                      \
        }                                                               \
    }


Index: xen-3.2-testing/tools/ioemu/hw/xenfb.c
===================================================================
--- xen-3.2-testing.orig/tools/ioemu/hw/xenfb.c 2008-02-26 07:38:20.000000000 
-0700
+++ xen-3.2-testing/tools/ioemu/hw/xenfb.c      2008-02-26 07:43:56.000000000 
-0700
@@ -1103,6 +1103,25 @@
         }                                                               \
     }
 
+/* 32 bit to 16 bit pixel munging, dst algo came from RealVNC transInitTempl.h 
*/
+#define BLT_32_16(SRC_T,DST_T,RRS,GRS,BRS,RLS,GLS,BLS,RIM,GIM,BIM,ROM,GOM,BOM) 
              \
+    for (line = y ; line < h ; line++) {                                   \
+        SRC_T *src = (SRC_T *)(xenfb->pixels                               \
+                               + (line * xenfb->row_stride)                \
+                               + (x * xenfb->depth / 8));                  \
+        DST_T *dst = (DST_T *)(xenfb->ds->data                             \
+                               + (line * xenfb->ds->linesize)              \
+                               + (x * xenfb->ds->depth / 8));              \
+        int col;                                                           \
+        for (col = x ; col < w ; col++) {                                  \
+            *dst = ((((*src >> RRS & RIM) * ROM + RIM/2) / RIM) << RLS) |  \
+                ((((*src >> GRS & GIM) * GOM + GIM/2) / GIM) << GLS ) |    \
+                ((((*src >> BRS & BIM) * BOM + BIM/2) / BIM) << BLS);      \
+            src++;                                                         \
+            dst++;                                                         \
+        }                                                                  \
+    }
+
 
 /* This copies data from the guest framebuffer region, into QEMU's copy
  * NB. QEMU's copy is stored in the pixel format of a) the local X 
@@ -1139,7 +1158,7 @@
             if (xenfb->ds->depth == 8) {
                 BLT(uint32_t, uint8_t,    16, 8, 0,   5, 2, 0,    255, 255, 
255);
             } else if (xenfb->ds->depth == 16) {
-                BLT(uint32_t, uint16_t,   16, 8, 0,   11, 5, 0,   255, 255, 
255);
+                BLT_32_16(uint32_t, uint16_t,   16, 8, 0,   11, 5, 0,   255, 
255, 255,   31, 63, 31);
             }
         }
     }
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.