diff --git a/src/opengl.c b/src/opengl.c index dc2a076..7240184 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -58,7 +58,11 @@ static GLboolean gl_hasExt(char* name); * MISC! */ -/* Get the closest power of two. */ +/** + * @brief Get the closest power of two. + * @param n Number to get closest power of two to. + * @return Closest power of two to the number. + */ int gl_pot(int n) { int i = 1; while(i < n) @@ -66,7 +70,11 @@ int gl_pot(int n) { return i; } -/* Flips the surface vertically. Return 0 on success. */ +/** + * @brief Flips the surface vertically. + * @param surface Surface to flip. + * @return 0 on success. + */ static int SDL_VFlipSurface(SDL_Surface* surface) { /* Flip the image. */ Uint8* rowhi, *rowlo, *tmpbuf; @@ -92,7 +100,13 @@ static int SDL_VFlipSurface(SDL_Surface* surface) { return 0; } -/* Return true if position (x,y) of s is transparent. */ +/** + * @brief Check to see if a position of the surface is transparent. + * @param s Surface to check for transparency. + * @param x X position of the pixel to check. + * @param y Y position of the pixel to check. + * @return 0 if the pixel isn't transparent, 0 if it is. + */ static int SDL_IsTrans(SDL_Surface* s, int x, int y) { int bpp = s->format->BytesPerPixel; /* p is the address to the pixel we want to retrieve. */ @@ -122,8 +136,14 @@ static int SDL_IsTrans(SDL_Surface* s, int x, int y) { return (pixelcolour == s->format->colorkey); } -/* Map the surface transparancy. */ -/* Return 0 on success. */ +/** + * @brief Maps the surface transparency. + * + * Basically generates a map of what pixels are transparent. Good for pixel + * perfect collision routines. + * @param s Surface to map it's transparency. + * @return 0 on success. + */ static uint8_t* SDL_MapTrans(SDL_Surface* s) { /* Allocate memory for just enough bits to hold all the data we need. */ int size = s->w*s->h/8 + ((s->w*s->h%8)?1:0); @@ -143,7 +163,10 @@ static uint8_t* SDL_MapTrans(SDL_Surface* s) { return t; } -/* Take a screenshot. */ +/** + * @brief Takes a screenshot. + * @param filename Name of the file to save screenshot as. + */ void gl_screenshot(const char* filename) { SDL_Surface* screen = SDL_GetVideoSurface(); unsigned rowbytes = screen->w * 3; @@ -158,23 +181,28 @@ void gl_screenshot(const char* filename) { gl_checkErr(); } -/* Save a surface to a file as a png. */ +/** + * @brief Saves a surface to a file as a png. + * @param surface Surface to save. + * @param file Path to save surface to. + * @return 0 on success. + */ int SDL_savePNG(SDL_Surface* surface, const char* file) { - static unsigned char** ss_rows; - static int ss_size; - static int ss_w, ss_h; + unsigned char** ss_rows; + int ss_size; + int ss_w, ss_h; SDL_Surface* ss_surface; SDL_Rect ss_rect; int r, i; - int alpha = 0; - int pixel_bits = 32; + + int alpha; + int pixel_bits; + unsigned int surf_flags; + unsigned int surf_alpha; - unsigned surf_flags; - unsigned surf_alpha; - - ss_rows = 0; + ss_rows = NULL; ss_size = 0; - ss_surface = 0; + ss_surface = NULL; ss_w = surface->w; ss_h = surface->h; @@ -183,13 +211,14 @@ int SDL_savePNG(SDL_Surface* surface, const char* file) { alpha = 1; pixel_bits = 32; } else { + alpha = 0; pixel_bits = 24; } ss_surface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA, ss_w, ss_h, pixel_bits, RGBAMASK); - if(ss_surface == 0) { + if(ss_surface == NULL) { return -1; } @@ -209,7 +238,7 @@ int SDL_savePNG(SDL_Surface* surface, const char* file) { if(ss_size == 0) { ss_size = ss_h; ss_rows = (unsigned char**)malloc(sizeof(unsigned char*)*ss_size); - if(ss_rows == 0) { + if(ss_rows == NULL) { return -1; } } @@ -218,20 +247,17 @@ int SDL_savePNG(SDL_Surface* surface, const char* file) { if(surf_flags & SDL_SRCCOLORKEY) SDL_SetColorKey(surface, SDL_SRCCOLORKEY, surface->format->colorkey); - for(i = 0; i < ss_h; i++) { + for(i = 0; i < ss_h; i++) ss_rows[i] = ((unsigned char*)ss_surface->pixels) + i * ss_surface->pitch; - } - if(alpha) { + if(alpha) r = write_png(file, ss_rows, surface->w, surface->h, PNG_COLOR_TYPE_RGB_ALPHA, 8); - } else { + else r = write_png(file, ss_rows, surface->w, surface->h, PNG_COLOR_TYPE_RGB, 8); - } free(ss_rows); SDL_FreeSurface(ss_surface); - ss_surface = NULL; - + return r; } @@ -241,8 +267,10 @@ int SDL_savePNG(SDL_Surface* surface, const char* file) { * ================ */ -/* Returns the texture ID. - * Stores real sizes in rw/rh (from POT padding). +/** + * @brief Prepares the surface to be loaded as a texture. + * @param surface to load that is freed in the process. + * @return New surface that is prepared for texture loading. */ SDL_Surface* gl_prepareSurface(SDL_Surface* surface) { SDL_Surface* tmp; @@ -788,7 +816,11 @@ void gl_drawCircleInRect(const double cx, const double cy, const double r, /* GLOBAL. */ /* ================ */ -/* Check for extensions. */ +/** + * @brief Check for an opengl extension. + * @param name Extension to check for. + * @return GL_TRUE if found, GL_FALSE if it isn't. + */ static GLboolean gl_hasExt(char* name) { /* ====================================================== */ /* Search for name in the extensions string. Use of strstr() */ @@ -814,10 +846,11 @@ static GLboolean gl_hasExt(char* name) { return GL_FALSE; } -/* Check and report if there's been an error. */ -/*#ifndef gl_checkErr // I know, I know, it's a little hackish. */ +#ifndef gl_checkErr // I know, I know, it's a little hackish. +/** + * @brief Check and report if there's been an error. + */ void gl_checkErr(void) { -#ifdef DEBUG GLenum err; char* errstr; @@ -852,13 +885,14 @@ void gl_checkErr(void) { break; } WARN("OpenGL error: %s", errstr); -#endif } -/*#endif */ +#endif -/* Initialize SDL/OpenGL etc. */ +/** + * @brief Initializes SDL/OpenGL and the works. + * @return 0 on success. + */ int gl_init(void) { - double dmin; int doublebuf, depth, i, j, off, toff, supported, fsaa; SDL_Rect** modes; int flags = SDL_OPENGL; @@ -959,10 +993,6 @@ int gl_init(void) { } } - /* Save real window width/height. */ - gl_screen.rw = SCREEN_W; - gl_screen.rh = SCREEN_H; - /* Get info about the OpenGL window. */ SDL_GL_GetAttribute(SDL_GL_RED_SIZE, &gl_screen.r); SDL_GL_GetAttribute(SDL_GL_GREEN_SIZE, &gl_screen.g); @@ -1018,19 +1048,19 @@ int gl_init(void) { glShadeModel(GL_FLAT); /* Default shade model. Functions should keep this when done.. */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* Good blend model. */ - /* Set up the matrix. */ - dmin = 1.; + /* Set up the proper viewport to use. */ + gl_screen.rw = SCREEN_W; + gl_screen.rh = SCREEN_H; if((SCREEN_W < 640) && (SCREEN_W <= SCREEN_H)) { gl_screen.w = (gl_screen.w * 640) / SCREEN_H; gl_screen.rw = (gl_screen.rw * SCREEN_H) / 640; gl_screen.h = 640; } - else if((SCREEN_W >= 640) && (SCREEN_W >= SCREEN_H)) { + else if((SCREEN_W < 640) && (SCREEN_W >= SCREEN_H)) { gl_screen.w = (gl_screen.w * 640) / SCREEN_H; gl_screen.rw = (gl_screen.rw * SCREEN_H) / 640; gl_screen.h = 640; } - DEBUG("%dx%d on %dx%d", gl_screen.w, gl_screen.h, gl_screen.rw, gl_screen.rh); gl_defViewport(); /* Finishing touches. */ @@ -1044,17 +1074,20 @@ int gl_init(void) { void gl_defViewport(void) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); - /*glViewport(0, 0, (GLsizei)SCREEN_W, (GLsizei)SCREEN_H);*/ glOrtho(-SCREEN_W /2, /* Left edge. */ SCREEN_W /2, /* Right edge. */ -SCREEN_H /2, /* Bottom edge. */ SCREEN_H /2, /* Top edge. */ -1., /* Near. */ 1.); /* Far. */ - glScaled(gl_screen.w / gl_screen.rw, gl_screen.h / gl_screen.rh, 1.); + /* Take into account possible scaling. */ + glScaled((double)gl_screen.w / (double)gl_screen.rw, + (double)gl_screen.h / (double)gl_screen.rh, 1.); } -/* Clean up our mess. */ +/** + * @brief Cleans up OpenGL, the works. + */ void gl_exit(void) { glTexList* tex; @@ -1069,7 +1102,16 @@ void gl_exit(void) { SDL_QuitSubSystem(SDL_INIT_VIDEO); } -/* Saves a png. */ +/** + * @brief Saves a png. + * @param file_name Name of the file to save the png as. + * @param rows Rows containing the data. + * @param w Width of the png. + * @param h Height of the png. + * @param colourtype Colour type of the png. + * @param bitdepth But depth of the png. + * @return 0 on success. + */ int write_png(const char* file_name, png_bytep* rows, int w, int h, int colourtype, int bitdepth) { png_structp png_ptr;