[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |