test/graywin.c
author Sam Lantinga <slouken@libsdl.org>
Tue, 28 May 2002 19:31:32 +0000
changeset 380 bce7171e7a85
parent 0 74212992fb08
child 538 d3abe873e3f7
permissions -rw-r--r--
Date: Wed, 22 May 2002 22:30:58 +0300
From: "Mike Gorchak" <mike@malva.com.ua>
Subject: One more QNX patch

Hi !

- Fixed graywin test application. Added properly support for
window size not equal to 640x480.
- Added support for not aligned pitch of image in SDL_SWSURFACE
and SDL_HWSURFACE. Using Photon builtin alignes.
- Added memory clear after each malloc to avoid problems in the
future :)
- Removed unused variables and static variables, fixed some warnings.
- Updated readme.QNX file.
     1 
     2 /* Simple program:  Fill a colormap with gray and stripe it down the screen */
     3 
     4 #include <stdio.h>
     5 #include <stdlib.h>
     6 #include <string.h>
     7 #include <time.h>
     8 
     9 #include "SDL.h"
    10 
    11 #ifdef TEST_VGA16 /* Define this if you want to test VGA 16-color video modes */
    12 #define NUM_COLORS	16
    13 #else
    14 #define NUM_COLORS	256
    15 #endif
    16 
    17 /* Draw a randomly sized and colored box centered about (X,Y) */
    18 void DrawBox(SDL_Surface *screen, int X, int Y, int width, int height)
    19 {
    20 	static unsigned int seeded = 0;
    21 	SDL_Rect area;
    22 	Uint32 color;
    23 
    24 	/* Seed the random number generator */
    25 	if ( seeded == 0 ) {
    26 		srand(time(NULL));
    27 		seeded = 1;
    28 	}
    29 
    30 	/* Get the bounds of the rectangle */
    31 	area.w = (rand()%width);
    32 	area.h = (rand()%height);
    33 	area.x = X-(area.w/2);
    34 	area.y = Y-(area.h/2);
    35 	color = (rand()%NUM_COLORS);
    36 
    37 	/* Do it! */
    38 	SDL_FillRect(screen, &area, color);
    39 	SDL_UpdateRects(screen, 1, &area);
    40 }
    41 
    42 SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags)
    43 {
    44 	SDL_Surface *screen;
    45 	int i;
    46 	SDL_Color palette[NUM_COLORS];
    47 	Uint8 *buffer;
    48 
    49 	/* Set the video mode */
    50 	screen = SDL_SetVideoMode(w, h, bpp, flags);
    51 	if ( screen == NULL ) {
    52 		fprintf(stderr, "Couldn't set display mode: %s\n",
    53 							SDL_GetError());
    54 		return(NULL);
    55 	}
    56 	fprintf(stderr, "Screen is in %s mode\n",
    57 		(screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");
    58 
    59 	/* Set a gray colormap, reverse order from white to black */
    60 	for ( i=0; i<NUM_COLORS; ++i ) {
    61 		palette[i].r = (NUM_COLORS-1)-i * (256 / NUM_COLORS);
    62 		palette[i].g = (NUM_COLORS-1)-i * (256 / NUM_COLORS);
    63 		palette[i].b = (NUM_COLORS-1)-i * (256 / NUM_COLORS);
    64 	}
    65 	SDL_SetColors(screen, palette, 0, NUM_COLORS);
    66 
    67 	/* Set the surface pixels and refresh! */
    68 	if ( SDL_LockSurface(screen) < 0 ) {
    69 		fprintf(stderr, "Couldn't lock display surface: %s\n",
    70 							SDL_GetError());
    71 		return(NULL);
    72 	}
    73 	buffer = (Uint8 *)screen->pixels;
    74 	for ( i=0; i<screen->h; ++i ) {
    75 		memset(buffer,(i*(NUM_COLORS-1))/screen->h, screen->w * screen->format->BytesPerPixel);
    76 		buffer += screen->pitch;
    77 	}
    78 	SDL_UnlockSurface(screen);
    79 	SDL_UpdateRect(screen, 0, 0, 0, 0);
    80 
    81 	return(screen);
    82 }
    83 
    84 int main(int argc, char *argv[])
    85 {
    86 	SDL_Surface *screen;
    87 	Uint32 videoflags;
    88 	int    done;
    89 	SDL_Event event;
    90 	int width, height, bpp;
    91 
    92 	/* Initialize SDL */
    93 	if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
    94 		fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
    95 		exit(1);
    96 	}
    97 
    98 	/* See if we try to get a hardware colormap */
    99 	width = 640;
   100 	height = 480;
   101 	bpp = 8;
   102 	videoflags = SDL_SWSURFACE;
   103 	while ( argc > 1 ) {
   104 		--argc;
   105 		if ( argv[argc-1] && (strcmp(argv[argc-1], "-width") == 0) ) {
   106 			width = atoi(argv[argc]);
   107 			--argc;
   108 		} else
   109 		if ( argv[argc-1] && (strcmp(argv[argc-1], "-height") == 0) ) {
   110 			height = atoi(argv[argc]);
   111 			--argc;
   112 		} else
   113 		if ( argv[argc-1] && (strcmp(argv[argc-1], "-bpp") == 0) ) {
   114 			bpp = atoi(argv[argc]);
   115 			--argc;
   116 		} else
   117 		if ( argv[argc] && (strcmp(argv[argc], "-hw") == 0) ) {
   118 			videoflags |= SDL_HWSURFACE;
   119 		} else
   120 		if ( argv[argc] && (strcmp(argv[argc], "-hwpalette") == 0) ) {
   121 			videoflags |= SDL_HWPALETTE;
   122 		} else
   123 		if ( argv[argc] && (strcmp(argv[argc], "-noframe") == 0) ) {
   124 			videoflags |= SDL_NOFRAME;
   125 		} else
   126 		if ( argv[argc] && (strcmp(argv[argc], "-fullscreen") == 0) ) {
   127 			videoflags |= SDL_FULLSCREEN;
   128 		} else {
   129 			fprintf(stderr, "Usage: %s [-width] [-height] [-bpp] [-hw] [-hwpalette] [-noframe] [-fullscreen]\n",
   130 								argv[0]);
   131 			exit(1);
   132 		}
   133 	}
   134 
   135 	/* Set a video mode */
   136 	screen = CreateScreen(width, height, bpp, videoflags);
   137 	if ( screen == NULL ) {
   138 		exit(2);
   139 	}
   140 		
   141 	/* Wait for a keystroke */
   142 	done = 0;
   143 	while ( !done && SDL_WaitEvent(&event) ) {
   144 		switch (event.type) {
   145 			case SDL_MOUSEBUTTONDOWN:
   146 				DrawBox(screen, event.button.x, event.button.y, width, height);
   147 				break;
   148 			case SDL_KEYDOWN:
   149 				/* Ignore ALT-TAB for windows */
   150 				if ( (event.key.keysym.sym == SDLK_LALT) ||
   151 				     (event.key.keysym.sym == SDLK_TAB) ) {
   152 					break;
   153 				}
   154 				/* Center the mouse on <SPACE> */
   155 				if ( event.key.keysym.sym == SDLK_SPACE ) {
   156 					SDL_WarpMouse(width/2, height/2);
   157 					break;
   158 				}
   159 				/* Toggle fullscreen mode on <RETURN> */
   160 				if ( event.key.keysym.sym == SDLK_RETURN ) {
   161 					videoflags ^= SDL_FULLSCREEN;
   162 					screen = CreateScreen(
   163 						screen->w, screen->h,
   164 						screen->format->BitsPerPixel,
   165 								videoflags);
   166 					if ( screen == NULL ) {
   167 						fprintf(stderr,
   168 					"Couldn't toggle fullscreen mode\n");
   169 						done = 1;
   170 					}
   171 					break;
   172 				}
   173 				/* Any other key quits the application... */
   174 			case SDL_QUIT:
   175 				done = 1;
   176 				break;
   177 			default:
   178 				break;
   179 		}
   180 	}
   181 	SDL_Quit();
   182 	return(0);
   183 }