diff options
Diffstat (limited to 'apps/plugins/lib/grey_parm.c')
| -rw-r--r-- | apps/plugins/lib/grey_parm.c | 161 |
1 files changed, 152 insertions, 9 deletions
diff --git a/apps/plugins/lib/grey_parm.c b/apps/plugins/lib/grey_parm.c index 00193e1..9b4ba8c 100644 --- a/apps/plugins/lib/grey_parm.c +++ b/apps/plugins/lib/grey_parm.c @@ -28,6 +28,9 @@ #include "plugin.h" #include "grey.h" +/* Default greylib viewport struct */ +struct viewport _grey_default_vp; + /* Set position of the top left corner of the greyscale overlay Note that depending on the target LCD, either x or y gets rounded to the nearest multiple of 4 or 8 */ @@ -64,37 +67,37 @@ void grey_set_position(int x, int y) /* Set the draw mode for subsequent drawing operations */ void grey_set_drawmode(int mode) { - _grey_info.drawmode = mode & (DRMODE_SOLID|DRMODE_INVERSEVID); + _grey_info.vp->drawmode = mode & (DRMODE_SOLID|DRMODE_INVERSEVID); } /* Return the current draw mode */ int grey_get_drawmode(void) { - return _grey_info.drawmode; + return _grey_info.vp->drawmode; } /* Set the foreground shade for subsequent drawing operations */ void grey_set_foreground(unsigned brightness) { - _grey_info.fg_brightness = brightness; + _GREY_FG_BRIGHTNESS(_grey_info.vp) = brightness; } /* Return the current foreground shade */ unsigned grey_get_foreground(void) { - return _grey_info.fg_brightness; + return _GREY_FG_BRIGHTNESS(_grey_info.vp); } /* Set the background shade for subsequent drawing operations */ void grey_set_background(unsigned brightness) { - _grey_info.bg_brightness = brightness; + _GREY_BG_BRIGHTNESS(_grey_info.vp) = brightness; } /* Return the current background shade */ unsigned grey_get_background(void) { - return _grey_info.bg_brightness; + return _GREY_BG_BRIGHTNESS(_grey_info.vp); } /* Set draw mode, foreground and background shades at once */ @@ -108,11 +111,151 @@ void grey_set_drawinfo(int mode, unsigned fg_brightness, unsigned bg_brightness) /* Set font for the text output routines */ void grey_setfont(int newfont) { - _grey_info.curfont = newfont; + _grey_info.vp->font = newfont; } /* Get width and height of a text when printed with the current font */ -int grey_getstringsize(const unsigned char *str, int *w, int *h) +int grey_getstringsize(const unsigned char *str, int *w, int *h) +{ + return rb->font_getstringsize(str, w, h, _grey_info.vp->font); +} + +/* Helper to establish visible area between viewport and framebuffer */ +static void grey_update_clip_rect(void) +{ + if (!(_grey_info.flags & GREY_BUFFERED)) + return; /* no chunky buffer */ + + struct viewport *vp = _grey_info.vp; + + if (!vp || !_grey_info.curbuffer) + return; + + /* Get overall intersection of framebuffer and viewport in viewport + coordinates so that later clipping of drawing is kept as simple as + possible. If l <= r and/or b <= t after intersecting, draw routines + will see this as an empty area. */ + _grey_info.clip_l = _grey_info.cb_x - vp->x; + _grey_info.clip_t = _grey_info.cb_y - vp->y; + _grey_info.clip_r = _grey_info.clip_l + _grey_info.cb_width; + _grey_info.clip_b = _grey_info.clip_t + _grey_info.cb_height; + + if (_grey_info.clip_l < 0) + _grey_info.clip_l = 0; + + if (_grey_info.clip_t < 0) + _grey_info.clip_t = 0; + + if (_grey_info.clip_r > vp->width) + _grey_info.clip_r = vp->width; + + if (_grey_info.clip_b > vp->height) + _grey_info.clip_b = vp->height; +} + +/* Set current grey viewport for draw routines */ +void grey_set_viewport(struct viewport *vp) +{ + if (vp == NULL) + vp = &_grey_default_vp; + + if (_grey_info.vp != vp) + { + _grey_info.vp = vp; + grey_update_clip_rect(); + } +} + +/* Set viewport to default settings */ +void grey_viewport_set_fullscreen(struct viewport *vp, + const enum screen_type screen) +{ + if (vp == NULL) + vp = &_grey_default_vp; + + vp->x = 0; + vp->y = 0; + vp->width = _grey_info.width; + vp->height = _grey_info.height; + _GREY_FG_BRIGHTNESS(vp) = 0; + _GREY_BG_BRIGHTNESS(vp) = 255; + vp->drawmode = DRMODE_SOLID; + vp->font = FONT_SYSFIXED; + + if (vp == _grey_info.vp) + grey_update_clip_rect(); /* is current one in use */ + + (void)screen; +} + +void grey_viewport_set_pos(struct viewport *vp, + int x, int y, int width, int height) +{ + if (vp == NULL || vp == &_grey_default_vp) + return; /* Cannot be moved or resized */ + + if (width < 0) + width = 0; /* 'tis okay */ + + if (height < 0) + height = 0; + + vp->x = x; + vp->y = y; + vp->width = width; + vp->height = height; + + if (vp == _grey_info.vp) + grey_update_clip_rect(); /* is current one in use */ +} + +/* Set current grey chunky buffer for draw routines */ +void grey_set_framebuffer(unsigned char *buffer) +{ + if (!(_grey_info.flags & GREY_BUFFERED)) + return; /* no chunky buffer */ + + if (buffer == NULL) + buffer = _grey_info.buffer; /* Default */ + + if (buffer != _grey_info.curbuffer) + { + _grey_info.curbuffer = buffer; + + if (buffer == _grey_info.buffer) + { + /* Setting to default fb resets dimensions */ + grey_framebuffer_set_pos(0, 0, 0, 0); + } + } +} + +/* Specify the dimensions of the current framebuffer */ +void grey_framebuffer_set_pos(int x, int y, int width, int height) { - return rb->font_getstringsize(str, w, h, _grey_info.curfont); + if (!(_grey_info.flags & GREY_BUFFERED)) + return; /* no chunky buffer */ + + if (_grey_info.curbuffer == _grey_info.buffer) + { + /* This cannot be moved or resized */ + x = 0; + y = 0; + width = _grey_info.width; + height = _grey_info.height; + } + else if (width <= 0 || height <= 0) + return; + + if (x == _grey_info.cb_x && y == _grey_info.cb_y && + width == _grey_info.cb_width && height == _grey_info.cb_height) + return; /* No change */ + + _grey_info.cb_x = x; + _grey_info.cb_y = y; + _grey_info.cb_width = width; + _grey_info.cb_height = height; + + grey_update_clip_rect(); } + |