From 2dd32c7adb7116f1ad9ab2632d9fcf57a31e9fa2 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Mon, 21 Nov 2011 08:44:10 +0000 Subject: Improve API to allow for RAM surfaces instead of direct blitting Improve and update tests Fix RAM surface Fix VNC surface svn path=/trunk/libnsfb/; revision=13158 --- test/bitmap.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 test/bitmap.c (limited to 'test/bitmap.c') diff --git a/test/bitmap.c b/test/bitmap.c new file mode 100644 index 0000000..b14f2f6 --- /dev/null +++ b/test/bitmap.c @@ -0,0 +1,168 @@ +/* libnsfb plotter test program */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libnsfb.h" +#include "libnsfb_plot.h" +#include "libnsfb_event.h" + +#define UNUSED(x) ((x) = (x)) + +extern const struct { + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + unsigned char pixel_data[132 * 135 * 4 + 1]; +} nsglobe; + +static bool +dump(nsfb_t *nsfb, const char *filename) +{ + int fd; + + if (filename == NULL) + return false; + + fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU); + if (fd < 0) + return false; + + nsfb_dump(nsfb, fd); + + close(fd); + + return true; +} + +int main(int argc, char **argv) +{ + const char *fename; + enum nsfb_type_e fetype; + nsfb_t *nsfb; + nsfb_t *bmp; + nsfb_event_t event; + int waitloop = 3; + + nsfb_bbox_t box; + nsfb_bbox_t box2; + nsfb_bbox_t box3; + uint8_t *fbptr; + int fbstride; + const char *dumpfile = NULL; + + if (argc < 2) { + fename="sdl"; + } else { + fename = argv[1]; + if (argc >= 3) { + dumpfile = argv[2]; + } + } + + fetype = nsfb_type_from_name(fename); + if (fetype == NSFB_SURFACE_NONE) { + fprintf(stderr, "Unable to convert \"%s\" to nsfb surface type\n", fename); + return 1; + } + + nsfb = nsfb_new(fetype); + if (nsfb == NULL) { + fprintf(stderr, "Unable to allocate \"%s\" nsfb surface\n", fename); + return 2; + } + + if (nsfb_init(nsfb) == -1) { + fprintf(stderr, "Unable to initialise nsfb surface\n"); + nsfb_free(nsfb); + return 4; + } + + + bmp = nsfb_new(NSFB_SURFACE_RAM); + nsfb_set_geometry(bmp, nsglobe.width, nsglobe.height, NSFB_FMT_ABGR8888); + nsfb_init(bmp); + nsfb_get_buffer(bmp, &fbptr, &fbstride); + + memcpy(fbptr, nsglobe.pixel_data, nsglobe.width * nsglobe.height * 4); + + /* get the geometry of the whole screen */ + box.x0 = box.y0 = 0; + nsfb_get_geometry(nsfb, &box.x1, &box.y1, NULL); + + /* claim the whole screen for update */ + nsfb_claim(nsfb, &box); + + nsfb_plot_clg(nsfb, 0xffffffff); + + box3.x0 = 0; + box3.y0 = 0; + box3.x1 = 132; + box3.y1 = 135; + + nsfb_plot_copy(bmp, &box3, nsfb, &box3); + + box3.x0 = 132; + box3.y0 = 135; + box3.x1 = box3.x0 + 264; + box3.y1 = box3.y0 + 135; + + nsfb_plot_copy(bmp, &box3, nsfb, &box3); + + box3.x0 = 396; + box3.y0 = 270; + box3.x1 = box3.x0 + 264; + box3.y1 = box3.y0 + 270; + + nsfb_plot_copy(bmp, &box3, nsfb, &box3); + + box2.x0 = 64; + box2.y0 = 64; + box2.x1 = 128; + box2.y1 = 128; + + box3.x0 = 270; + box3.y0 = 270; + box3.x1 = box3.x0 + 64; + box3.y1 = box3.y0 + 64; + + nsfb_plot_copy(nsfb, &box2, nsfb, &box3); + + nsfb_update(nsfb, &box); + + /* wait for quit event or timeout */ + while (waitloop > 0) { + if (nsfb_event(nsfb, &event, 1000) == false) { + break; + } + if (event.type == NSFB_EVENT_CONTROL) { + if (event.value.controlcode == NSFB_CONTROL_TIMEOUT) { + /* timeout */ + waitloop--; + } else if (event.value.controlcode == NSFB_CONTROL_QUIT) { + break; + } + } + } + + dump(nsfb, dumpfile); + + nsfb_free(bmp); + + nsfb_free(nsfb); + + return 0; +} + +/* + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * End: + */ -- cgit v1.2.3