From patchwork Wed May 5 12:51:43 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 51720 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 96876B7D53 for ; Thu, 6 May 2010 04:46:19 +1000 (EST) Received: from localhost ([127.0.0.1]:52614 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O9jbs-000712-Sl for incoming@patchwork.ozlabs.org; Wed, 05 May 2010 14:46:16 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O9e4z-0001vt-QT for qemu-devel@nongnu.org; Wed, 05 May 2010 08:51:57 -0400 Received: from [140.186.70.92] (port=41347 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O9e4w-0001qD-01 for qemu-devel@nongnu.org; Wed, 05 May 2010 08:51:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O9e4t-0004Ik-6r for qemu-devel@nongnu.org; Wed, 05 May 2010 08:51:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:26032) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O9e4s-0004Id-Uu for qemu-devel@nongnu.org; Wed, 05 May 2010 08:51:51 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o45CpoHj001462 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 5 May 2010 08:51:50 -0400 Received: from zweiblum.home.kraxel.org (vpn2-10-127.ams2.redhat.com [10.36.10.127]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o45Cpk4n014971; Wed, 5 May 2010 08:51:46 -0400 Received: by zweiblum.home.kraxel.org (Postfix, from userid 500) id 1CF1670124; Wed, 5 May 2010 14:51:44 +0200 (CEST) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Wed, 5 May 2010 14:51:43 +0200 Message-Id: <1273063904-6028-3-git-send-email-kraxel@redhat.com> In-Reply-To: <1273063904-6028-1-git-send-email-kraxel@redhat.com> References: <1273063904-6028-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: Gerd Hoffmann Subject: [Qemu-devel] [PATCH 2/3] use new cursor struct + functions for vmware vga and sdl. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Gerd Hoffmann --- hw/vmware_vga.c | 40 +++++++++++++++++++++++++++++++++++----- sdl.c | 52 +++++++++++++--------------------------------------- 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c index e709369..bf2a699 100644 --- a/hw/vmware_vga.c +++ b/hw/vmware_vga.c @@ -477,13 +477,43 @@ struct vmsvga_cursor_definition_s { static inline void vmsvga_cursor_define(struct vmsvga_state_s *s, struct vmsvga_cursor_definition_s *c) { - int i; - for (i = SVGA_BITMAP_SIZE(c->width, c->height) - 1; i >= 0; i --) - c->mask[i] = ~c->mask[i]; + QEMUCursor *qc; + int i, pixels; + + qc = cursor_alloc(c->width, c->height); + qc->hot_x = c->hot_x; + qc->hot_y = c->hot_y; + switch (c->bpp) { + case 1: + cursor_set_mono(qc, 0xffffff, 0x000000, (void*)c->image, + 1, (void*)c->mask); +#ifdef DEBUG + cursor_print_ascii_art(qc, "vmware/mono"); +#endif + break; + case 32: + /* fill alpha channel from mask, set color to zero */ + cursor_set_mono(qc, 0x000000, 0x000000, (void*)c->mask, + 1, (void*)c->mask); + /* add in rgb values */ + pixels = c->width * c->height; + for (i = 0; i < pixels; i++) { + qc->data[i] |= c->image[i] & 0xffffff; + } +#ifdef DEBUG + cursor_print_ascii_art(qc, "vmware/32bit"); +#endif + break; + default: + fprintf(stderr, "%s: unhandled bpp %d, using fallback cursor\n", + __FUNCTION__, c->bpp); + cursor_put(qc); + qc = cursor_builtin_left_ptr(); + } if (s->vga.ds->cursor_define) - s->vga.ds->cursor_define(c->width, c->height, c->bpp, c->hot_x, c->hot_y, - (uint8_t *) c->image, (uint8_t *) c->mask); + s->vga.ds->cursor_define(qc); + cursor_put(qc); } #endif diff --git a/sdl.c b/sdl.c index 16a48e9..7c9ddbf 100644 --- a/sdl.c +++ b/sdl.c @@ -778,49 +778,23 @@ static void sdl_mouse_warp(int x, int y, int on) guest_x = x, guest_y = y; } -static void sdl_mouse_define(int width, int height, int bpp, - int hot_x, int hot_y, - uint8_t *image, uint8_t *mask) +static void sdl_mouse_define(QEMUCursor *c) { - uint8_t sprite[256], *line; - int x, y, dst, bypl, src = 0; + uint8_t *image, *mask; + int bpl; + if (guest_sprite) SDL_FreeCursor(guest_sprite); - memset(sprite, 0, 256); - bypl = ((width * bpp + 31) >> 5) << 2; - for (y = 0, dst = 0; y < height; y ++, image += bypl) { - line = image; - for (x = 0; x < width; x ++, dst ++) { - switch (bpp) { - case 32: - src = *(line ++); src |= *(line ++); src |= *(line ++); line++; - break; - case 24: - src = *(line ++); src |= *(line ++); src |= *(line ++); - break; - case 16: - case 15: - src = *(line ++); src |= *(line ++); - break; - case 8: - src = *(line ++); - break; - case 4: - src = 0xf & (line[x >> 1] >> ((x & 1)) << 2); - break; - case 2: - src = 3 & (line[x >> 2] >> ((x & 3)) << 1); - break; - case 1: - src = 1 & (line[x >> 3] >> (x & 7)); - break; - } - if (!src) - sprite[dst >> 3] |= (1 << (~dst & 7)) & mask[dst >> 3]; - } - } - guest_sprite = SDL_CreateCursor(sprite, mask, width, height, hot_x, hot_y); + bpl = cursor_get_mono_bpl(c); + image = qemu_mallocz(bpl * c->height); + mask = qemu_mallocz(bpl * c->height); + cursor_get_mono_image(c, 0x000000, image); + cursor_get_mono_mask(c, 0, mask); + guest_sprite = SDL_CreateCursor(image, mask, c->width, c->height, + c->hot_x, c->hot_y); + qemu_free(image); + qemu_free(mask); if (guest_cursor && (gui_grab || kbd_mouse_is_absolute() || absolute_enabled))