From 31def6a33878b1ca8f5340d30708c853cdafefa1 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sat, 26 Jul 2014 22:12:55 +0100 Subject: Add rudimentary support for resizing. - Currently only libnsfb's SDL surface supports resizing. - Flickers like crazy while resizing. Possibly because the SDL surface is not set to use double buffering. - The internal widget library, fbtk, was never intended for this, as such it has no knowledge of how a widget should be positioned with respect to its parent. This means the top level window has to track everything and move them itself. --- framebuffer/framebuffer.c | 85 +++++++++++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 28 deletions(-) (limited to 'framebuffer/framebuffer.c') diff --git a/framebuffer/framebuffer.c b/framebuffer/framebuffer.c index 4cd064c34..1b0c34b54 100644 --- a/framebuffer/framebuffer.c +++ b/framebuffer/framebuffer.c @@ -341,6 +341,42 @@ const struct plotter_table fb_plotters = { }; +static bool framebuffer_format_from_bpp(int bpp, enum nsfb_format_e *fmt) +{ + switch (bpp) { + case 32: + *fmt = NSFB_FMT_XRGB8888; + break; + + case 24: + *fmt = NSFB_FMT_RGB888; + break; + + case 16: + *fmt = NSFB_FMT_RGB565; + break; + + case 8: + *fmt = NSFB_FMT_I8; + break; + + case 4: + *fmt = NSFB_FMT_I4; + break; + + case 1: + *fmt = NSFB_FMT_I1; + break; + + default: + LOG(("Bad bits per pixel (%d)\n", bpp)); + return false; + } + + return true; +} + + nsfb_t * framebuffer_initialise(const char *fename, int width, int height, int bpp) @@ -349,34 +385,8 @@ framebuffer_initialise(const char *fename, int width, int height, int bpp) enum nsfb_format_e fbfmt; /* bpp is a proxy for the framebuffer format */ - switch (bpp) { - case 32: - fbfmt = NSFB_FMT_XRGB8888; - break; - - case 24: - fbfmt = NSFB_FMT_RGB888; - break; - - case 16: - fbfmt = NSFB_FMT_RGB565; - break; - - case 8: - fbfmt = NSFB_FMT_I8; - break; - - case 4: - fbfmt = NSFB_FMT_I4; - break; - - case 1: - fbfmt = NSFB_FMT_I1; - break; - - default: - LOG(("Bad bits per pixel (%d)\n", bpp)); - return NULL; + if (framebuffer_format_from_bpp(bpp, &fbfmt) == false) { + return NULL; } fbtype = nsfb_type_from_name(fename); @@ -409,6 +419,25 @@ framebuffer_initialise(const char *fename, int width, int height, int bpp) } +bool +framebuffer_resize(nsfb_t *nsfb, int width, int height, int bpp) +{ + enum nsfb_format_e fbfmt; + + /* bpp is a proxy for the framebuffer format */ + if (framebuffer_format_from_bpp(bpp, &fbfmt) == false) { + return false; + } + + if (nsfb_set_geometry(nsfb, width, height, fbfmt) == -1) { + LOG(("Unable to change surface geometry\n")); + return false; + } + + return true; + +} + void framebuffer_finalise(void) { -- cgit v1.2.3