From 480b2353d815540dca310edc8496da1d3f1b3295 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sun, 30 Sep 2012 09:40:46 +0100 Subject: Split 32bpp support into xrgba, xbgr, and common. Should allow for BGR surfaces as well as RGB. --- src/plot/32bpp-common.c | 63 ++++++++++++++++++++++++ src/plot/32bpp-xbgr8888.c | 74 ++++++++++++++++++++++++++++ src/plot/32bpp-xrgb8888.c | 74 ++++++++++++++++++++++++++++ src/plot/32bpp.c | 121 ---------------------------------------------- src/plot/Makefile | 2 +- src/plot/generic.c | 7 +-- src/surface/sdl.c | 31 +++++++++++- 7 files changed, 246 insertions(+), 126 deletions(-) create mode 100644 src/plot/32bpp-common.c create mode 100644 src/plot/32bpp-xbgr8888.c create mode 100644 src/plot/32bpp-xrgb8888.c delete mode 100644 src/plot/32bpp.c (limited to 'src') diff --git a/src/plot/32bpp-common.c b/src/plot/32bpp-common.c new file mode 100644 index 0000000..9626acf --- /dev/null +++ b/src/plot/32bpp-common.c @@ -0,0 +1,63 @@ +/* + * Copyright 2009 Vincent Sanders + * Copyright 2010 Michael Drake + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + +#include "common.c" + +static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c) +{ + int w; + uint32_t *pvid; + uint32_t ent; + uint32_t llen; + uint32_t width; + uint32_t height; + + if (!nsfb_plot_clip_ctx(nsfb, rect)) + return true; /* fill lies outside current clipping region */ + + ent = colour_to_pixel(nsfb, c); + width = rect->x1 - rect->x0; + height = rect->y1 - rect->y0; + llen = (nsfb->linelen >> 2) - width; + + pvid = get_xy_loc(nsfb, rect->x0, rect->y0); + + while (height-- > 0) { + w = width; + while (w >= 16) { + *pvid++ = ent; *pvid++ = ent; + *pvid++ = ent; *pvid++ = ent; + *pvid++ = ent; *pvid++ = ent; + *pvid++ = ent; *pvid++ = ent; + *pvid++ = ent; *pvid++ = ent; + *pvid++ = ent; *pvid++ = ent; + *pvid++ = ent; *pvid++ = ent; + *pvid++ = ent; *pvid++ = ent; + w-=16; + } + while (w >= 4) { + *pvid++ = ent; *pvid++ = ent; + *pvid++ = ent; *pvid++ = ent; + w-=4; + } + while (w > 0) { + *pvid++ = ent; + w--; + } + pvid += llen; + } + + return true; +} + +/* + * Local Variables: + * c-basic-offset:8 + * End: + */ diff --git a/src/plot/32bpp-xbgr8888.c b/src/plot/32bpp-xbgr8888.c new file mode 100644 index 0000000..9050903 --- /dev/null +++ b/src/plot/32bpp-xbgr8888.c @@ -0,0 +1,74 @@ +/* + * Copyright 2009 Vincent Sanders + * Copyright 2010 Michael Drake + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + +#include +#include +#include + +#include "libnsfb.h" +#include "libnsfb_plot.h" +#include "libnsfb_plot_util.h" + +#include "nsfb.h" +#include "plot.h" + + +#define UNUSED __attribute__((unused)) + +static inline uint32_t *get_xy_loc(nsfb_t *nsfb, int x, int y) +{ + return (void *)(nsfb->ptr + (y * nsfb->linelen) + (x << 2)); +} + +#if __BYTE_ORDER == __BIG_ENDIAN +static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel) +{ + /* TODO: FIX */ + return (pixel >> 8) & ~0xFF000000U; +} + +/* convert a colour value to a 32bpp pixel value ready for screen output */ +static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c) +{ + /* TODO: FIX */ + return (c << 8); +} +#else /* __BYTE_ORDER == __BIG_ENDIAN */ +static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel) +{ + return pixel | 0xFF000000U; +} + +/* convert a colour value to a 32bpp pixel value ready for screen output */ +static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c) +{ + return c; +} +#endif + +#define PLOT_TYPE uint32_t +#define PLOT_LINELEN(ll) ((ll) >> 2) + +#include "32bpp-common.c" + +const nsfb_plotter_fns_t _nsfb_32bpp_xbgr8888_plotters = { + .line = line, + .fill = fill, + .point = point, + .bitmap = bitmap, + .glyph8 = glyph8, + .glyph1 = glyph1, + .readrect = readrect, +}; + +/* + * Local Variables: + * c-basic-offset:8 + * End: + */ diff --git a/src/plot/32bpp-xrgb8888.c b/src/plot/32bpp-xrgb8888.c new file mode 100644 index 0000000..548c970 --- /dev/null +++ b/src/plot/32bpp-xrgb8888.c @@ -0,0 +1,74 @@ +/* + * Copyright 2009 Vincent Sanders + * Copyright 2010 Michael Drake + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + +#include +#include +#include + +#include "libnsfb.h" +#include "libnsfb_plot.h" +#include "libnsfb_plot_util.h" + +#include "nsfb.h" +#include "plot.h" + + +#define UNUSED __attribute__((unused)) + +static inline uint32_t *get_xy_loc(nsfb_t *nsfb, int x, int y) +{ + return (void *)(nsfb->ptr + (y * nsfb->linelen) + (x << 2)); +} + +#if __BYTE_ORDER == __BIG_ENDIAN +static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel) +{ + return (pixel >> 8) & ~0xFF000000U; +} + +/* convert a colour value to a 32bpp pixel value ready for screen output */ +static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c) +{ + return (c << 8); +} +#else /* __BYTE_ORDER == __BIG_ENDIAN */ +static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel) +{ + return ((pixel & 0xFF) << 16) | + ((pixel & 0xFF00)) | + ((pixel & 0xFF0000) >> 16); +} + +/* convert a colour value to a 32bpp pixel value ready for screen output */ +static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c) +{ + return ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16); +} +#endif + +#define PLOT_TYPE uint32_t +#define PLOT_LINELEN(ll) ((ll) >> 2) + +#include "32bpp-common.c" + +const nsfb_plotter_fns_t _nsfb_32bpp_xrgb8888_plotters = { + .line = line, + .fill = fill, + .point = point, + .bitmap = bitmap, + .glyph8 = glyph8, + .glyph1 = glyph1, + .readrect = readrect, +}; + +/* + * Local Variables: + * c-basic-offset:8 + * End: + */ diff --git a/src/plot/32bpp.c b/src/plot/32bpp.c deleted file mode 100644 index aae1b39..0000000 --- a/src/plot/32bpp.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2009 Vincent Sanders - * Copyright 2010 Michael Drake - * - * This file is part of libnsfb, http://www.netsurf-browser.org/ - * Licenced under the MIT License, - * http://www.opensource.org/licenses/mit-license.php - */ - -#include -#include -#include - -#include "libnsfb.h" -#include "libnsfb_plot.h" -#include "libnsfb_plot_util.h" - -#include "nsfb.h" -#include "plot.h" - - -#define UNUSED __attribute__((unused)) - -static inline uint32_t *get_xy_loc(nsfb_t *nsfb, int x, int y) -{ - return (void *)(nsfb->ptr + (y * nsfb->linelen) + (x << 2)); -} - -#if __BYTE_ORDER == __BIG_ENDIAN -static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel) -{ - return (pixel >> 8) & ~0xFF000000U; -} - -/* convert a colour value to a 32bpp pixel value ready for screen output */ -static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c) -{ - return (c << 8); -} -#else /* __BYTE_ORDER == __BIG_ENDIAN */ -static inline nsfb_colour_t pixel_to_colour(UNUSED nsfb_t *nsfb, uint32_t pixel) -{ - return ((pixel & 0xFF) << 16) | - ((pixel & 0xFF00)) | - ((pixel & 0xFF0000) >> 16); -} - -/* convert a colour value to a 32bpp pixel value ready for screen output */ -static inline uint32_t colour_to_pixel(UNUSED nsfb_t *nsfb, nsfb_colour_t c) -{ - return ((c & 0xff0000) >> 16) | (c & 0xff00) | ((c & 0xff) << 16); -} -#endif - -#define PLOT_TYPE uint32_t -#define PLOT_LINELEN(ll) ((ll) >> 2) - -#include "common.c" - -static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c) -{ - int w; - uint32_t *pvid; - uint32_t ent; - uint32_t llen; - uint32_t width; - uint32_t height; - - if (!nsfb_plot_clip_ctx(nsfb, rect)) - return true; /* fill lies outside current clipping region */ - - ent = colour_to_pixel(nsfb, c); - width = rect->x1 - rect->x0; - height = rect->y1 - rect->y0; - llen = (nsfb->linelen >> 2) - width; - - pvid = get_xy_loc(nsfb, rect->x0, rect->y0); - - while (height-- > 0) { - w = width; - while (w >= 16) { - *pvid++ = ent; *pvid++ = ent; - *pvid++ = ent; *pvid++ = ent; - *pvid++ = ent; *pvid++ = ent; - *pvid++ = ent; *pvid++ = ent; - *pvid++ = ent; *pvid++ = ent; - *pvid++ = ent; *pvid++ = ent; - *pvid++ = ent; *pvid++ = ent; - *pvid++ = ent; *pvid++ = ent; - w-=16; - } - while (w >= 4) { - *pvid++ = ent; *pvid++ = ent; - *pvid++ = ent; *pvid++ = ent; - w-=4; - } - while (w > 0) { - *pvid++ = ent; - w--; - } - pvid += llen; - } - - return true; -} - -const nsfb_plotter_fns_t _nsfb_32bpp_plotters = { - .line = line, - .fill = fill, - .point = point, - .bitmap = bitmap, - .glyph8 = glyph8, - .glyph1 = glyph1, - .readrect = readrect, -}; - -/* - * Local Variables: - * c-basic-offset:8 - * End: - */ diff --git a/src/plot/Makefile b/src/plot/Makefile index e99f440..71ebc61 100644 --- a/src/plot/Makefile +++ b/src/plot/Makefile @@ -1,4 +1,4 @@ # Sources -DIR_SOURCES := api.c util.c generic.c 32bpp.c 16bpp.c 8bpp.c +DIR_SOURCES := api.c util.c generic.c 32bpp-xrgb8888.c 32bpp-xbgr8888.c 16bpp.c 8bpp.c include $(NSBUILD)/Makefile.subdir diff --git a/src/plot/generic.c b/src/plot/generic.c index 6a627ff..0c3d9e8 100644 --- a/src/plot/generic.c +++ b/src/plot/generic.c @@ -28,7 +28,8 @@ extern const nsfb_plotter_fns_t _nsfb_1bpp_plotters; extern const nsfb_plotter_fns_t _nsfb_8bpp_plotters; extern const nsfb_plotter_fns_t _nsfb_16bpp_plotters; extern const nsfb_plotter_fns_t _nsfb_24bpp_plotters; -extern const nsfb_plotter_fns_t _nsfb_32bpp_plotters; +extern const nsfb_plotter_fns_t _nsfb_32bpp_xrgb8888_plotters; +extern const nsfb_plotter_fns_t _nsfb_32bpp_xbgr8888_plotters; static bool set_clip(nsfb_t *nsfb, nsfb_bbox_t *clip) { @@ -860,13 +861,13 @@ bool select_plotters(nsfb_t *nsfb) case NSFB_FMT_XBGR8888: /* 32bpp Unused Blue Green Red */ case NSFB_FMT_ABGR8888: /* 32bpp Alpha Blue Green Red */ - table = &_nsfb_32bpp_plotters; + table = &_nsfb_32bpp_xbgr8888_plotters; nsfb->bpp = 32; break; case NSFB_FMT_XRGB8888: /* 32bpp Unused Red Green Blue */ case NSFB_FMT_ARGB8888: /* 32bpp Alpha Red Green Blue */ - table = &_nsfb_32bpp_plotters; + table = &_nsfb_32bpp_xrgb8888_plotters; nsfb->bpp = 32; break; diff --git a/src/surface/sdl.c b/src/surface/sdl.c index 0554e26..48052a8 100644 --- a/src/surface/sdl.c +++ b/src/surface/sdl.c @@ -411,7 +411,8 @@ sdlcopy(nsfb_t *nsfb, nsfb_bbox_t *srcbox, nsfb_bbox_t *dstbox) } -static int sdl_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_format_e format) +static int sdl_set_geometry(nsfb_t *nsfb, int width, int height, + enum nsfb_format_e format) { if (nsfb->surface_priv != NULL) return -1; /* fail if surface already initialised */ @@ -431,6 +432,8 @@ static int sdl_set_geometry(nsfb_t *nsfb, int width, int height, enum nsfb_forma static int sdl_initialise(nsfb_t *nsfb) { SDL_Surface *sdl_screen; + SDL_PixelFormat *sdl_fmt; + enum nsfb_format_e fmt; if (nsfb->surface_priv != NULL) return -1; @@ -455,6 +458,32 @@ static int sdl_initialise(nsfb_t *nsfb) return -1; } + /* find out what pixel format we got */ + sdl_fmt = sdl_screen->format; + + switch (sdl_fmt->BitsPerPixel) { + case 32: + if (sdl_fmt->Rshift == 0) + fmt = NSFB_FMT_XBGR8888; + else + fmt = NSFB_FMT_XRGB8888; + break; + + default: + fmt = nsfb->format; + break; + } + + /* If we didn't get what we asked for, reselect plotters */ + if (nsfb->format != fmt) { + nsfb->format = fmt; + + if (sdl_set_geometry(nsfb, nsfb->width, nsfb->height, + nsfb->format) != 0) { + return -1; + } + } + nsfb->surface_priv = sdl_screen; if (nsfb->bpp == 8) { -- cgit v1.2.3