diff options
author | Steve Kondik <shade@chemlab.org> | 2012-11-18 15:47:18 -0800 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2012-11-18 15:47:18 -0800 |
commit | a546c7006355a7bd1df4267ee53d0bfa2c017c8c (patch) | |
tree | 01be0bf6c0d6968e1468ec9661fd52110f9b05a7 /distrib/sdl-1.2.15/test/testbitmap.c | |
parent | baf3d7830396202df5cc47bd7bcee109c319cdb3 (diff) | |
parent | 0f809250987b64f491bd3b4b73c0f0d33036a786 (diff) | |
download | external_qemu-a546c7006355a7bd1df4267ee53d0bfa2c017c8c.zip external_qemu-a546c7006355a7bd1df4267ee53d0bfa2c017c8c.tar.gz external_qemu-a546c7006355a7bd1df4267ee53d0bfa2c017c8c.tar.bz2 |
Merge branch 'jb-mr1-release' of https://android.googlesource.com/platform/external/qemu into mr1-staging
Change-Id: I8a4a71ac65b08e6e17f26c942f67a15b85211115
Diffstat (limited to 'distrib/sdl-1.2.15/test/testbitmap.c')
-rw-r--r-- | distrib/sdl-1.2.15/test/testbitmap.c | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.15/test/testbitmap.c b/distrib/sdl-1.2.15/test/testbitmap.c new file mode 100644 index 0000000..50cfcbb --- /dev/null +++ b/distrib/sdl-1.2.15/test/testbitmap.c @@ -0,0 +1,184 @@ + +/* Simple program: Test bitmap blits */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "SDL.h" +#include "picture.xbm" + +/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ +static void quit(int rc) +{ + SDL_Quit(); + exit(rc); +} + +SDL_Surface *LoadXBM(SDL_Surface *screen, int w, int h, Uint8 *bits) +{ + SDL_Surface *bitmap; + Uint8 *line; + + /* Allocate the bitmap */ + bitmap = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 1, 0, 0, 0, 0); + if ( bitmap == NULL ) { + fprintf(stderr, "Couldn't allocate bitmap: %s\n", + SDL_GetError()); + return(NULL); + } + + /* Copy the pixels */ + line = (Uint8 *)bitmap->pixels; + w = (w+7)/8; + while ( h-- ) { + memcpy(line, bits, w); + /* X11 Bitmap images have the bits reversed */ + { int i, j; Uint8 *buf, byte; + for ( buf=line, i=0; i<w; ++i, ++buf ) { + byte = *buf; + *buf = 0; + for ( j=7; j>=0; --j ) { + *buf |= (byte&0x01)<<j; + byte >>= 1; + } + } + } + line += bitmap->pitch; + bits += w; + } + return(bitmap); +} + +int main(int argc, char *argv[]) +{ + SDL_Surface *screen; + SDL_Surface *bitmap; + Uint8 video_bpp; + Uint32 videoflags; + Uint8 *buffer; + int i, k, done; + SDL_Event event; + Uint16 *buffer16; + Uint16 color; + Uint8 gradient; + SDL_Color palette[256]; + + + /* Initialize SDL */ + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { + fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); + return(1); + } + + video_bpp = 0; + videoflags = SDL_SWSURFACE; + while ( argc > 1 ) { + --argc; + if ( strcmp(argv[argc-1], "-bpp") == 0 ) { + video_bpp = atoi(argv[argc]); + --argc; + } else + if ( strcmp(argv[argc], "-warp") == 0 ) { + videoflags |= SDL_HWPALETTE; + } else + if ( strcmp(argv[argc], "-hw") == 0 ) { + videoflags |= SDL_HWSURFACE; + } else + if ( strcmp(argv[argc], "-fullscreen") == 0 ) { + videoflags |= SDL_FULLSCREEN; + } else { + fprintf(stderr, + "Usage: %s [-bpp N] [-warp] [-hw] [-fullscreen]\n", + argv[0]); + quit(1); + } + } + + /* Set 640x480 video mode */ + if ( (screen=SDL_SetVideoMode(640,480,video_bpp,videoflags)) == NULL ) { + fprintf(stderr, "Couldn't set 640x480x%d video mode: %s\n", + video_bpp, SDL_GetError()); + quit(2); + } + + if (video_bpp==8) { + /* Set a gray colormap, reverse order from white to black */ + for ( i=0; i<256; ++i ) { + palette[i].r = 255-i; + palette[i].g = 255-i; + palette[i].b = 255-i; + } + SDL_SetColors(screen, palette, 0, 256); + } + + /* Set the surface pixels and refresh! */ + if ( SDL_LockSurface(screen) < 0 ) { + fprintf(stderr, "Couldn't lock the display surface: %s\n", + SDL_GetError()); + quit(2); + } + buffer=(Uint8 *)screen->pixels; + if (screen->format->BytesPerPixel!=2) { + for ( i=0; i<screen->h; ++i ) { + memset(buffer,(i*255)/screen->h, screen->pitch); + buffer += screen->pitch; + } + } + else + { + for ( i=0; i<screen->h; ++i ) { + gradient=((i*255)/screen->h); + color = SDL_MapRGB(screen->format, gradient, gradient, gradient); + buffer16=(Uint16*)buffer; + for (k=0; k<screen->w; k++) + { + *(buffer16+k)=color; + } + buffer += screen->pitch; + } + } + SDL_UnlockSurface(screen); + SDL_UpdateRect(screen, 0, 0, 0, 0); + + /* Load the bitmap */ + bitmap = LoadXBM(screen, picture_width, picture_height, + (Uint8 *)picture_bits); + if ( bitmap == NULL ) { + quit(1); + } + + /* Wait for a keystroke */ + done = 0; + while ( !done ) { + /* Check for events */ + while ( SDL_PollEvent(&event) ) { + switch (event.type) { + case SDL_MOUSEBUTTONDOWN: { + SDL_Rect dst; + + dst.x = event.button.x - bitmap->w/2; + dst.y = event.button.y - bitmap->h/2; + dst.w = bitmap->w; + dst.h = bitmap->h; + SDL_BlitSurface(bitmap, NULL, + screen, &dst); + SDL_UpdateRects(screen,1,&dst); + } + break; + case SDL_KEYDOWN: + /* Any key press quits the app... */ + done = 1; + break; + case SDL_QUIT: + done = 1; + break; + default: + break; + } + } + } + SDL_FreeSurface(bitmap); + SDL_Quit(); + return(0); +} |