qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: [PATCH 1/3] cursor: add cursor functions.


From: Paolo Bonzini
Subject: [Qemu-devel] Re: [PATCH 1/3] cursor: add cursor functions.
Date: Fri, 07 May 2010 09:05:05 +0200
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9) Gecko/20100330 Fedora/3.0.4-1.fc12 Lightning/1.0b2pre Thunderbird/3.0.4

On 05/06/2010 08:12 PM, Blue Swirl wrote:
On 5/5/10, Gerd Hoffmann<address@hidden>  wrote:
Add a new cursor type to console.h and a bunch of functions to
  deal with cursors the (new) cursor.c file.

  Signed-off-by: Gerd Hoffmann<address@hidden>
  ---
   Makefile.objs |    3 +-
   console.h     |   24 ++++++-
   cursor.c      |  208 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   3 files changed, 232 insertions(+), 3 deletions(-)
   create mode 100644 cursor.c

  diff --git a/Makefile.objs b/Makefile.objs
  index ecdd53e..1ee6e9d 100644
  --- a/Makefile.objs
  +++ b/Makefile.objs
  @@ -48,7 +48,8 @@ common-obj-y = $(block-obj-y)
   common-obj-y += $(net-obj-y)
   common-obj-y += $(qobject-obj-y)
   common-obj-$(CONFIG_LINUX) += $(fsdev-obj-$(CONFIG_LINUX))
  -common-obj-y += readline.o console.o async.o qemu-error.o
  +common-obj-y += readline.o console.o cursor.o async.o qemu-error.o
  +
   common-obj-y += tcg-runtime.o host-utils.o
   common-obj-y += irq.o ioport.o input.o
   common-obj-$(CONFIG_PTIMER) += ptimer.o
  diff --git a/console.h b/console.h
  index 6def115..88861cb 100644
  --- a/console.h
  +++ b/console.h
  @@ -126,6 +126,27 @@ struct DisplaySurface {
      struct PixelFormat pf;
   };

  +/* cursor data format is 32bit RGBA */
  +typedef struct QEMUCursor {
  +    int                 width, height;
  +    int                 hot_x, hot_y;
  +    int                 refcount;
  +    uint32_t            data[];
  +} QEMUCursor;
  +
  +QEMUCursor *cursor_alloc(int width, int height);
  +void cursor_get(QEMUCursor *c);
  +void cursor_put(QEMUCursor *c);
  +QEMUCursor *cursor_builtin_hidden(void);
  +QEMUCursor *cursor_builtin_left_ptr(void);
  +void cursor_print_ascii_art(QEMUCursor *c, const char *prefix);
  +int cursor_get_mono_bpl(QEMUCursor *c);
  +void cursor_set_mono(QEMUCursor *c,
  +                     uint32_t foreground, uint32_t background, uint8_t 
*image,
  +                     int transparent, uint8_t *mask);
  +void cursor_get_mono_image(QEMUCursor *c, int foreground, uint8_t *mask);
  +void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask);
  +
   struct DisplayChangeListener {
      int idle;
      uint64_t gui_timer_interval;
  @@ -158,8 +179,7 @@ struct DisplayState {
      struct DisplayChangeListener* listeners;

      void (*mouse_set)(int x, int y, int on);
  -    void (*cursor_define)(int width, int height, int bpp, int hot_x, int 
hot_y,
  -                          uint8_t *image, uint8_t *mask);
  +    void (*cursor_define)(QEMUCursor *cursor);

      struct DisplayState *next;
   };
  diff --git a/cursor.c b/cursor.c
  new file mode 100644
  index 0000000..3995a31
  --- /dev/null
  +++ b/cursor.c
  @@ -0,0 +1,208 @@
  +#include "qemu-common.h"
  +#include "console.h"
  +
  +static const char cursor_hidden_32[32*32];
  +static const char cursor_left_ptr_32[32*32] = {
  +    "                                "
  +    " X                              "
  +    " XX                             "
  +    " X.X                            "
  +    " X..X                           "
  +    " X...X                          "
  +    " X....X                         "
  +    " X.....X                        "
  +    " X......X                       "
  +    " X.......X                      "
  +    " X........X                     "
  +    " X.....XXXXX                    "
  +    " X..X..X                        "
  +    " X.X X..X                       "
  +    " XX  X..X                       "
  +    " X    X..X                      "
  +    "      X..X                      "
  +    "       X..X                     "
  +    "       X..X                     "
  +    "        XX                      "
  +    "                                "
  +};

Is this format standard? How about using X bitmap format instead:
$ cat /usr/include/X11/bitmaps/left_ptr
#define left_ptr_width 16
#define left_ptr_height 16
#define left_ptr_x_hot 3
#define left_ptr_y_hot 1
static char left_ptr_bits[] = {
    0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x38, 0x00, 0x78, 0x00, 0xf8, 0x00,
    0xf8, 0x01, 0xf8, 0x03, 0xf8, 0x07, 0xf8, 0x00, 0xd8, 0x00, 0x88, 0x01,
    0x80, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00};

Then there would be no need of parsing.

You would need _two_ bitmaps (e.g. mask and cursor, so that mask=1 gives transparent, mask=0 cursor=0 gives black and mask=0 cursor=1 gives white).

Paolo




reply via email to

[Prev in Thread] Current Thread [Next in Thread]