summaryrefslogtreecommitdiff
path: root/framebuffer/framebuffer.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2014-07-26 22:12:55 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2014-07-26 22:12:55 +0100
commit31def6a33878b1ca8f5340d30708c853cdafefa1 (patch)
treee8ec8b84db672163a1a01ee93937adefe6b1cc57 /framebuffer/framebuffer.c
parent989e82544e3a5b2f74216e91d269e3572c8053ce (diff)
downloadnetsurf-31def6a33878b1ca8f5340d30708c853cdafefa1.tar.gz
netsurf-31def6a33878b1ca8f5340d30708c853cdafefa1.tar.bz2
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.
Diffstat (limited to 'framebuffer/framebuffer.c')
-rw-r--r--framebuffer/framebuffer.c85
1 files changed, 57 insertions, 28 deletions
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)
{