* vnc client, 16 bit, strange colors when viewing a PV guest
@ 2008-02-26 17:06 Pat Campbell
2008-02-26 17:17 ` Daniel P. Berrange
0 siblings, 1 reply; 2+ messages in thread
From: Pat Campbell @ 2008-02-26 17:06 UTC (permalink / raw)
To: xen-devel, Daniel P. Berrange
[-- Attachment #1: Type: text/plain, Size: 2002 bytes --]
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++; \
} \
}
[-- Attachment #2: pv_32_16_color_trans.patch --]
[-- Type: text/x-patch, Size: 2302 bytes --]
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);
}
}
}
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: vnc client, 16 bit, strange colors when viewing a PV guest
2008-02-26 17:06 vnc client, 16 bit, strange colors when viewing a PV guest Pat Campbell
@ 2008-02-26 17:17 ` Daniel P. Berrange
0 siblings, 0 replies; 2+ messages in thread
From: Daniel P. Berrange @ 2008-02-26 17:17 UTC (permalink / raw)
To: Pat Campbell; +Cc: xen-devel
On Tue, Feb 26, 2008 at 10:06:13AM -0700, Pat Campbell wrote:
>
> 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. )
Yes, clearly that last GRS is bogus & should have been BRS.
> 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++; \
> } \
> }
Note that there is also a colour shift problem in GTK-VNC (used by
virt-viewer & virt-manager) - you need latest GTK-VNC from the source
repo to get the fix. So you may have been seeing a cobmo of 2 bugs
Dan.
--
|=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=|
|=- Perl modules: http://search.cpan.org/~danberr/ -=|
|=- Projects: http://freshmeat.net/~danielpb/ -=|
|=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-02-26 17:17 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-02-26 17:06 vnc client, 16 bit, strange colors when viewing a PV guest Pat Campbell
2008-02-26 17:17 ` Daniel P. Berrange
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.