diff options
-rw-r--r-- | hw/vmware_vga.c | 40 | ||||
-rw-r--r-- | sdl.c | 52 |
2 files changed, 48 insertions, 44 deletions
diff --git a/hw/vmware_vga.c b/hw/vmware_vga.c index e70936913d..bf2a6998c3 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 @@ -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)) |