diff options
Diffstat (limited to 'src/cursor.c')
-rw-r--r-- | src/cursor.c | 94 |
1 files changed, 94 insertions, 0 deletions
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 <stdbool.h> +#include <stdlib.h> + +#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; +} |