On 5/7/10, Paolo Bonzini <pbonz...@redhat.com> wrote: > On 05/06/2010 08:12 PM, Blue Swirl wrote: > > > On 5/5/10, Gerd Hoffmann<kra...@redhat.com> 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<kra...@redhat.com> > > > --- > > > 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).
Yes, but it's still packed more efficiently. There's yet another way: #define _ 0, #define X 0xff000000, #define o 0xffffffff, { _ _ _ X o X _ _ _ } #undef _ #undef X #undef o This would not allow any drawing tool use, but there are no conversions at startup.