From 30edb722902dff842b5b9544f9b43846b93adc92 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 2 Jun 2009 13:01:45 +0000 Subject: add cursor support svn path=/trunk/libnsfb/; revision=7687 --- src/cursor.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/cursor.c (limited to 'src/cursor.c') diff --git a/src/cursor.c b/src/cursor.c new file mode 100644 index 0000000..faa96b1 --- /dev/null +++ b/src/cursor.c @@ -0,0 +1,94 @@ +#include +#include + +#include "libnsfb.h" +#include "libnsfb_plot.h" +#include "libnsfb_cursor.h" + +#include "nsfb.h" +#include "cursor.h" +#include "nsfb_plot.h" +#include "frontend.h" + + +bool nsfb_cursor_init(nsfb_t *nsfb) +{ + if (nsfb->cursor != NULL) + return false; + + nsfb->cursor = calloc(1, sizeof(struct nsfb_cursor_s)); + if (nsfb->cursor == NULL) + return false; + + nsfb->cursor->loc.x0 = nsfb->width / 2; + nsfb->cursor->loc.y0 = nsfb->height / 2; + return true; +} + +bool nsfb_cursor_set(nsfb_t *nsfb, const nsfb_colour_t *pixel, int bmp_width, int bmp_height, int bmp_stride) +{ + if (nsfb->cursor == NULL) + return false; + + nsfb->cursor->pixel = pixel; + nsfb->cursor->bmp_width = bmp_width; + nsfb->cursor->bmp_height = bmp_height; + nsfb->cursor->bmp_stride = bmp_stride; + nsfb->cursor->loc.x1 = nsfb->cursor->loc.x0 + nsfb->cursor->bmp_width; + nsfb->cursor->loc.y1 = nsfb->cursor->loc.y0 + nsfb->cursor->bmp_height; + + return nsfb->frontend_rtns->cursor(nsfb, nsfb->cursor); +} + +bool nsfb_cursor_loc_set(nsfb_t *nsfb, const nsfb_bbox_t *loc) +{ + if (nsfb->cursor == NULL) + return false; + + nsfb->cursor->loc = *loc; + nsfb->cursor->loc.x1 = nsfb->cursor->loc.x0 + nsfb->cursor->bmp_width; + nsfb->cursor->loc.y1 = nsfb->cursor->loc.y0 + nsfb->cursor->bmp_height; + + return nsfb->frontend_rtns->cursor(nsfb, nsfb->cursor); +} + +bool nsfb_cursor_loc_get(nsfb_t *nsfb, nsfb_bbox_t *loc) +{ + if (nsfb->cursor == NULL) + return false; + + *loc = nsfb->cursor->loc; + return true; +} + +/* documented in cursor.h */ +bool nsfb_cursor_plot(nsfb_t *nsfb, struct nsfb_cursor_s *cursor) +{ + int sav_size; + + cursor->savloc = cursor->loc; + + cursor->sav_width = cursor->savloc.x1 - cursor->savloc.x0; + cursor->sav_height = cursor->savloc.y1 - cursor->savloc.y0; + + sav_size = cursor->sav_width * cursor->sav_height * sizeof(nsfb_colour_t); + if (cursor->sav_size < sav_size) { + cursor->sav = realloc(cursor->sav, sav_size); + cursor->sav_size = sav_size; + } + + nsfb->plotter_fns->readrect(nsfb, &cursor->savloc, cursor->sav ); + cursor->sav_width = cursor->savloc.x1 - cursor->savloc.x0; + cursor->sav_height = cursor->savloc.y1 - cursor->savloc.y0; + + nsfb->plotter_fns->bitmap(nsfb, + &cursor->loc, + cursor->pixel, + cursor->bmp_width, + cursor->bmp_height, + cursor->bmp_stride, + true); + cursor->plotted = true; + + return true; +} -- cgit v1.2.3