Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright 2010 Vincent Sanders <vince@kyllikki.org>
  3.  *
  4.  * This file is part of libnsfb, http://www.netsurf-browser.org/
  5.  * Licenced under the MIT License,
  6.  *                http://www.opensource.org/licenses/mit-license.php
  7.  */
  8.  
  9. /** \file
  10.  * cursor (implementation).
  11.  */
  12.  
  13. #include <stdbool.h>
  14. #include <stdlib.h>
  15.  
  16. #include "libnsfb.h"
  17. #include "libnsfb_plot.h"
  18. #include "libnsfb_cursor.h"
  19.  
  20. #include "nsfb.h"
  21. #include "cursor.h"
  22. #include "plot.h"
  23. #include "surface.h"
  24.  
  25. bool nsfb_cursor_init(nsfb_t *nsfb)
  26. {
  27.     if (nsfb->cursor != NULL)
  28.         return false;
  29.  
  30.     nsfb->cursor = calloc(1, sizeof(struct nsfb_cursor_s));
  31.     if (nsfb->cursor == NULL)
  32.         return false;
  33.  
  34.     nsfb->cursor->loc.x0 = nsfb->width / 2;
  35.     nsfb->cursor->loc.y0 = nsfb->height / 2;
  36.     return true;
  37. }
  38.  
  39. bool nsfb_cursor_set(nsfb_t *nsfb, const nsfb_colour_t *pixel,
  40.         int bmp_width, int bmp_height, int bmp_stride,
  41.         int hotspot_x, int hotspot_y)
  42. {
  43.     if (nsfb->cursor == NULL)
  44.         return false;
  45.  
  46.     nsfb->cursor->pixel = pixel;
  47.     nsfb->cursor->bmp_width = bmp_width;
  48.     nsfb->cursor->bmp_height = bmp_height;
  49.     nsfb->cursor->bmp_stride = bmp_stride;
  50.     nsfb->cursor->loc.x1 = nsfb->cursor->loc.x0 + nsfb->cursor->bmp_width;
  51.     nsfb->cursor->loc.y1 = nsfb->cursor->loc.y0 + nsfb->cursor->bmp_height;
  52.  
  53.     nsfb->cursor->hotspot_x = hotspot_x;
  54.     nsfb->cursor->hotspot_y = hotspot_y;
  55.  
  56.     return nsfb->surface_rtns->cursor(nsfb, nsfb->cursor);
  57. }
  58.  
  59. bool nsfb_cursor_loc_set(nsfb_t *nsfb, const nsfb_bbox_t *loc)
  60. {
  61.     if (nsfb->cursor == NULL)
  62.         return false;
  63.  
  64.     nsfb->cursor->loc = *loc;
  65.     nsfb->cursor->loc.x1 = nsfb->cursor->loc.x0 + nsfb->cursor->bmp_width;
  66.     nsfb->cursor->loc.y1 = nsfb->cursor->loc.y0 + nsfb->cursor->bmp_height;
  67.  
  68.     return nsfb->surface_rtns->cursor(nsfb, nsfb->cursor);
  69. }
  70.  
  71. bool nsfb_cursor_loc_get(nsfb_t *nsfb, nsfb_bbox_t *loc)
  72. {
  73.     if (nsfb->cursor == NULL)
  74.         return false;
  75.  
  76.     *loc = nsfb->cursor->loc;
  77.     return true;
  78. }
  79.  
  80. /* documented in cursor.h */
  81. bool nsfb_cursor_plot(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
  82. {
  83.     int sav_size;
  84.     nsfb_bbox_t sclip; /* saved clipping area */
  85.  
  86.     nsfb->plotter_fns->get_clip(nsfb, &sclip);
  87.     nsfb->plotter_fns->set_clip(nsfb, NULL);
  88.  
  89.     /* offset cursor rect for hotspot */
  90.     cursor->loc.x0 -= cursor->hotspot_x;
  91.     cursor->loc.y0 -= cursor->hotspot_y;
  92.     cursor->loc.x1 -= cursor->hotspot_x;
  93.     cursor->loc.y1 -= cursor->hotspot_y;
  94.  
  95.     cursor->savloc = cursor->loc;
  96.  
  97.     cursor->sav_width = cursor->savloc.x1 - cursor->savloc.x0;
  98.     cursor->sav_height = cursor->savloc.y1 - cursor->savloc.y0;
  99.  
  100.     sav_size = cursor->sav_width * cursor->sav_height * sizeof(nsfb_colour_t);
  101.     if (cursor->sav_size < sav_size) {
  102.         cursor->sav = realloc(cursor->sav, sav_size);
  103.         cursor->sav_size = sav_size;
  104.     }
  105.  
  106.     nsfb->plotter_fns->readrect(nsfb, &cursor->savloc, cursor->sav);
  107.     cursor->sav_width = cursor->savloc.x1 - cursor->savloc.x0;
  108.     cursor->sav_height = cursor->savloc.y1 - cursor->savloc.y0;
  109.  
  110.     nsfb->plotter_fns->set_clip(nsfb, NULL);
  111.     nsfb->plotter_fns->bitmap(nsfb,
  112.                               &cursor->loc,  
  113.                               cursor->pixel,
  114.                               cursor->bmp_width,
  115.                               cursor->bmp_height,
  116.                               cursor->bmp_stride,
  117.                               true);
  118.  
  119.     /* undo hotspot offset */
  120.     cursor->loc.x0 += cursor->hotspot_x;
  121.     cursor->loc.y0 += cursor->hotspot_y;
  122.     cursor->loc.x1 += cursor->hotspot_x;
  123.     cursor->loc.y1 += cursor->hotspot_y;
  124.  
  125.     nsfb->plotter_fns->set_clip(nsfb, &sclip);
  126.  
  127.     cursor->plotted = true;
  128.  
  129.     return true;
  130. }
  131.  
  132. bool nsfb_cursor_clear(nsfb_t *nsfb, struct nsfb_cursor_s *cursor)
  133. {
  134.         nsfb_bbox_t sclip; /* saved clipping area */
  135.  
  136.         nsfb->plotter_fns->get_clip(nsfb, &sclip);
  137.         nsfb->plotter_fns->set_clip(nsfb, NULL);
  138.  
  139.         nsfb->plotter_fns->bitmap(nsfb,
  140.                                   &cursor->savloc,
  141.                                   cursor->sav,
  142.                                   cursor->sav_width,
  143.                                   cursor->sav_height,
  144.                                   cursor->sav_width,
  145.                                   false);
  146.  
  147.         nsfb->plotter_fns->set_clip(nsfb, &sclip);
  148.  
  149.         cursor->plotted = false;
  150.         return true;
  151.  
  152. }
  153.