qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Denis V. Lunev" <den@openvz.org>
Cc: qemu-devel@nongnu.org, Alexander Graf <agraf@suse.de>,
	Pavel Butsykin <pbutsykin@virtuozzo.com>,
	Gerd Hoffmann <kraxel@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 1/1] vnc: Add support for color map
Date: Tue, 31 May 2016 11:14:53 +0300	[thread overview]
Message-ID: <574D47FD.109@openvz.org> (raw)
In-Reply-To: <1464099559-20789-1-git-send-email-den@openvz.org>

On 05/24/2016 05:19 PM, Denis V. Lunev wrote:
> From: Alexander Graf <agraf@suse.de>
>
> Our current VNC code does not handle color maps (aka non-true-color) at all
> and aborts if a client requests them. There are 2 major issues with this:
>
>   1) A VNC viewer on an 8-bit X11 system may request color maps
>   2) RealVNC _always_ starts requesting color maps, then moves on to full color
>
> In order to support these 2 use cases, let's just create a fake color map
> that covers exactly our normal true color 8 bit color space. That way we don't
> lose anything over a client that wants true color.
>
> Reported-by: Sascha Wehnert <swehnert@suse.com>
> Signed-off-by: Alexander Graf <agraf@suse.de>
>
> Actually this is a very old patch originally submitted in 2013 by
> Alexander. The situation is still the same with RealVNC, it does not
> connect by default to QEMU VNC. The problem is that this client is
> really popular. This is better to be kludged.
>
> Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com>
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> CC: Gerd Hoffmann <kraxel@redhat.com>
> CC: Paolo Bonzini <pbonzini@redhat.com>
> ---
>   ui/vnc.c | 33 +++++++++++++++++++++++++++++++--
>   1 file changed, 31 insertions(+), 2 deletions(-)
>
> diff --git a/ui/vnc.c b/ui/vnc.c
> index d2ebf1f..ddd01fd 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -2094,6 +2094,24 @@ static void set_pixel_conversion(VncState *vs)
>       }
>   }
>   
> +static void send_color_map(VncState *vs)
> +{
> +    int i;
> +
> +    vnc_write_u8(vs, VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES);
> +    vnc_write_u8(vs,  0);    /* padding     */
> +    vnc_write_u16(vs, 0);    /* first color */
> +    vnc_write_u16(vs, 256);  /* # of colors */
> +
> +    for (i = 0; i < 256; i++) {
> +        PixelFormat *pf = &vs->client_pf;
> +
> +        vnc_write_u16(vs, (((i >> pf->rshift) & pf->rmax) << (16 - pf->rbits)));
> +        vnc_write_u16(vs, (((i >> pf->gshift) & pf->gmax) << (16 - pf->gbits)));
> +        vnc_write_u16(vs, (((i >> pf->bshift) & pf->bmax) << (16 - pf->bbits)));
> +    }
> +}
> +
>   static void set_pixel_format(VncState *vs,
>                                int bits_per_pixel, int depth,
>                                int big_endian_flag, int true_color_flag,
> @@ -2101,8 +2119,15 @@ static void set_pixel_format(VncState *vs,
>                                int red_shift, int green_shift, int blue_shift)
>   {
>       if (!true_color_flag) {
> -        vnc_client_error(vs);
> -        return;
> +        /* Expose a reasonable default 256 color map */
> +        bits_per_pixel = 8;
> +        depth = 8;
> +        red_max = 7;
> +        green_max = 7;
> +        blue_max = 3;
> +        red_shift = 0;
> +        green_shift = 3;
> +        blue_shift = 6;
>       }
>   
>       switch (bits_per_pixel) {
> @@ -2132,6 +2157,10 @@ static void set_pixel_format(VncState *vs,
>       vs->client_pf.depth = bits_per_pixel == 32 ? 24 : bits_per_pixel;
>       vs->client_be = big_endian_flag;
>   
> +    if (!true_color_flag) {
> +        send_color_map(vs);
> +    }
> +
>       set_pixel_conversion(vs);
>   
>       graphic_hw_invalidate(vs->vd->dcl.con);
ping

  reply	other threads:[~2016-05-31  8:15 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-24 14:19 [Qemu-devel] [PATCH 1/1] vnc: Add support for color map Denis V. Lunev
2016-05-31  8:14 ` Denis V. Lunev [this message]
2016-05-31 14:06   ` Gerd Hoffmann
2016-05-31 14:07     ` Denis V. Lunev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=574D47FD.109@openvz.org \
    --to=den@openvz.org \
    --cc=agraf@suse.de \
    --cc=kraxel@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=pbutsykin@virtuozzo.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).