diff options
author | Paweł Kołodziejski | 2003-03-06 18:30:44 +0000 |
---|---|---|
committer | Paweł Kołodziejski | 2003-03-06 18:30:44 +0000 |
commit | a8c3057875d7746bd48efd91406473a41bb7f607 (patch) | |
tree | d9c1b64164d473d401e9baf9f660727ce1551567 /backends/sdl | |
parent | 093428ae9a6a1fd33003a8a0827d7410501a74cb (diff) | |
download | scummvm-rg350-a8c3057875d7746bd48efd91406473a41bb7f607.tar.gz scummvm-rg350-a8c3057875d7746bd48efd91406473a41bb7f607.tar.bz2 scummvm-rg350-a8c3057875d7746bd48efd91406473a41bb7f607.zip |
and more cleanup ....
svn-id: r6719
Diffstat (limited to 'backends/sdl')
-rw-r--r-- | backends/sdl/fb2opengl.h | 659 | ||||
-rw-r--r-- | backends/sdl/sdl-common.cpp | 217 | ||||
-rw-r--r-- | backends/sdl/sdl-common.h | 18 | ||||
-rw-r--r-- | backends/sdl/sdl.cpp | 28 | ||||
-rw-r--r-- | backends/sdl/sdl_gl.cpp | 123 |
5 files changed, 525 insertions, 520 deletions
diff --git a/backends/sdl/fb2opengl.h b/backends/sdl/fb2opengl.h index 705093c976..e69f9af180 100644 --- a/backends/sdl/fb2opengl.h +++ b/backends/sdl/fb2opengl.h @@ -42,400 +42,395 @@ #endif class FB2GL { - private: - // Framebuffer for 8 bpp - unsigned char ogl_fb[256][256]; - unsigned char ogl_fbb[256][64]; - // Framebuffer for RGBA - unsigned char ogl_fb1[256][256][4]; - unsigned char ogl_fb2[256][64][4]; - // Framebuffer for the blit function (SDL Blitting) - unsigned char fb1[256*256*4]; // Enough room for RGBA - unsigned char fb2[64*256*4]; // Enough room for RGBA - // Texture(s) - GLuint texture; - GLuint textureb; - // Display list - GLuint dlist; - // Color Table (256 colors, RGB) - char ogl_ctable[256][3]; - char ogl_temp_ctable[256][3]; // Support for OpenGL 1.1 - char flags; - void maketex(); - void makedlist(int xf, int yf); - - public: - SDL_Surface *screen; - FB2GL() { - flags=0; - screen=NULL; - } - int init(int width, int height, int xfix, int yfix, char _flags); - void update(void *fb, int width, int height, int pitch, int xskip, int yskip); - void palette(int index, int r, int g, int b); - void setPalette(int first, int ncolors); - void blit16(SDL_Surface *fb, int num_rect, SDL_Rect *rectlist, int xskip, int yskip); - void display(); + private: + // Framebuffer for 8 bpp + unsigned char ogl_fb[256][256]; + unsigned char ogl_fbb[256][64]; + // Framebuffer for RGBA + unsigned char ogl_fb1[256][256][4]; + unsigned char ogl_fb2[256][64][4]; + // Framebuffer for the blit function (SDL Blitting) + unsigned char fb1[256 * 256 * 4]; // Enough room for RGBA + unsigned char fb2[64 * 256 * 4]; // Enough room for RGBA + // Texture(s) + GLuint texture; + GLuint textureb; + // Display list + GLuint dlist; + // Color Table (256 colors, RGB) + char ogl_ctable[256][3]; + char ogl_temp_ctable[256][3]; // Support for OpenGL 1.1 + char flags; + void maketex(); + void makedlist(int xf, int yf); + public: + SDL_Surface *screen; + FB2GL() { + flags = 0; + screen = NULL; + } + int init(int width, int height, int xfix, int yfix, char _flags); + void update(void *fb, int width, int height, int pitch, int xskip, int yskip); + void palette(int index, int r, int g, int b); + void setPalette(int first, int ncolors); + void blit16(SDL_Surface *fb, int num_rect, SDL_Rect *rectlist, int xskip, int yskip); + void display(); }; -void FB2GL::maketex() -{ - glGenTextures(0,&texture); - glBindTexture(GL_TEXTURE_2D,texture); +void FB2GL::maketex() { + glGenTextures(0,&texture); + glBindTexture(GL_TEXTURE_2D,texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - // Bilinear filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + // Bilinear filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); /* - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */ - - if (flags & FB2GL_RGBA) { - glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,256,256,0,GL_RGBA, GL_UNSIGNED_BYTE, ogl_fb1); - } - else { - glTexImage2D(GL_TEXTURE_2D,0,GL_COLOR_INDEX,256,256,0,GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ogl_fb); - } - - if (flags & FB2GL_320) { - glGenTextures(1,&textureb); - glBindTexture(GL_TEXTURE_2D,textureb); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); - - // Bilinear filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + if (flags & FB2GL_RGBA) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, ogl_fb1); + } + else { + glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX, 256, 256, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, ogl_fb); + } + + if (flags & FB2GL_320) { + glGenTextures(1, &textureb); + glBindTexture(GL_TEXTURE_2D, textureb); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + + // Bilinear filtering + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); /* - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); */ - if (flags & FB2GL_RGBA) { - glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,256,0,GL_RGBA, - GL_UNSIGNED_BYTE, ogl_fb2); - } - else { - glTexImage2D(GL_TEXTURE_2D,0,GL_COLOR_INDEX,64,256,0,GL_COLOR_INDEX, - GL_UNSIGNED_BYTE, ogl_fbb); - } - } - + if (flags & FB2GL_RGBA) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 256, 0, GL_RGBA, + GL_UNSIGNED_BYTE, ogl_fb2); + } + else { + glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX, 64, 256, 0, GL_COLOR_INDEX, + GL_UNSIGNED_BYTE, ogl_fbb); + } + } } -void FB2GL::makedlist(int xf, int yf) -{ - double xfix=(double)xf/128; // 128 = 256/2 (half texture => 0.0 to 1.0) - double yfix=(double)yf/128; - // End of 256x256 (from -1.0 to 1.0) - double texend = (double)96/160; // 160=320/2 (== 0.0), 256-160=96. - - if (glIsList(dlist)) - glDeleteLists(dlist,1); - - dlist=glGenLists(1); - glNewList(dlist,GL_COMPILE); - - glEnable(GL_TEXTURE_2D); - - glBindTexture(GL_TEXTURE_2D, texture); - - if (!(flags & FB2GL_320)) { // Normal 256x256 - glBegin(GL_QUADS); - glTexCoord2f(0.0,1.0); glVertex2f(-1.0,-1.0-yfix); // upper left - glTexCoord2f(0.0,0.0); glVertex2f(-1.0,1.0); // lower left - glTexCoord2f(1.0,0.0); glVertex2f(1.0+xfix,1.0); // lower right - glTexCoord2f(1.0,1.0); glVertex2f(1.0+xfix,-1.0-yfix); // upper right - glEnd(); - } - else { // 320x256 - - // First, the 256x256 texture - glBegin(GL_QUADS); - glTexCoord2f(0.0,1.0); glVertex2f(-1.0,-1.0-yfix); // upper left - glTexCoord2f(0.0,0.0); glVertex2f(-1.0,1.0); // lower left - glTexCoord2f(1.0,0.0); glVertex2f(texend+xfix,1.0); // lower right - glTexCoord2f(1.0,1.0); glVertex2f(texend+xfix,-1.0-yfix); // upper right - glEnd(); - - // 64x256 - glBindTexture(GL_TEXTURE_2D, textureb); - - glBegin(GL_QUADS); - glTexCoord2f(0.0,1.0); glVertex2f(texend+xfix,-1.0-yfix); // upper left - glTexCoord2f(0.0,0.0); glVertex2f(texend+xfix,1.0); // lower left - glTexCoord2f(1.0,0.0); glVertex2f(1.0+xfix,1.0); // lower right - glTexCoord2f(1.0,1.0); glVertex2f(1.0+xfix,-1.0-yfix); // upper right - glEnd(); - } - - glDisable(GL_TEXTURE_2D); - - glEndList(); +void FB2GL::makedlist(int xf, int yf) { + double xfix = (double)xf / 128; // 128 = 256/2 (half texture => 0.0 to 1.0) + double yfix = (double)yf / 128; + // End of 256x256 (from -1.0 to 1.0) + double texend = (double)96 / 160; // 160=320/2 (== 0.0), 256-160=96. + + if (glIsList(dlist)) + glDeleteLists(dlist, 1); + + dlist=glGenLists(1); + glNewList(dlist, GL_COMPILE); + + glEnable(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, texture); + + if (!(flags & FB2GL_320)) { // Normal 256x256 + glBegin(GL_QUADS); + glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, -1.0 - yfix); // upper left + glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, 1.0); // lower left + glTexCoord2f(1.0, 0.0); glVertex2f(1.0 + xfix, 1.0); // lower right + glTexCoord2f(1.0, 1.0); glVertex2f(1.0 + xfix, -1.0 - yfix); // upper right + glEnd(); + } + else { // 320x256 + + // First, the 256x256 texture + glBegin(GL_QUADS); + glTexCoord2f(0.0, 1.0); glVertex2f( -1.0, -1.0 - yfix); // upper left + glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, 1.0); // lower left + glTexCoord2f(1.0, 0.0); glVertex2f(texend + xfix, 1.0); // lower right + glTexCoord2f(1.0, 1.0); glVertex2f(texend + xfix, -1.0 - yfix); // upper right + glEnd(); + + // 64x256 + glBindTexture(GL_TEXTURE_2D, textureb); + + glBegin(GL_QUADS); + glTexCoord2f(0.0, 1.0); glVertex2f(texend + xfix, -1.0 - yfix); // upper left + glTexCoord2f(0.0, 0.0); glVertex2f(texend + xfix, 1.0); // lower left + glTexCoord2f(1.0, 0.0); glVertex2f(1.0 + xfix, 1.0); // lower right + glTexCoord2f(1.0, 1.0); glVertex2f(1.0 + xfix, -1.0 - yfix); // upper right + glEnd(); + } + + glDisable(GL_TEXTURE_2D); + + glEndList(); } -int FB2GL::init(int width, int height, int xfix, int yfix, char _flags) -{ - char gl_ext[4096]; - gl_ext[0]='\0'; - - flags = _flags; - - // Fullscreen? - if (!screen) { - screen = SDL_SetVideoMode(width, height, (flags & FB2GL_16BIT? 16: 0), - SDL_HWPALETTE | SDL_HWSURFACE | SDL_OPENGL | SDL_GL_DOUBLEBUFFER | - (flags & FB2GL_FS? SDL_FULLSCREEN: 0)); - } - - fprintf(stderr,"Screen BitsPerPixel: %d\n",screen->format->BitsPerPixel); - - if (!screen) { - fprintf(stderr, "Couldn't start video res %dx%d\n", width, height); - return 0; - } - - - if (!(flags & FB2GL_RGBA)) { // Check for Paletted Texture Extension - - strcpy(gl_ext, (char *)glGetString(GL_EXTENSIONS)); +int FB2GL::init(int width, int height, int xfix, int yfix, char _flags) { + char gl_ext[4096]; + gl_ext[0]='\0'; + + flags = _flags; + + // Fullscreen? + if (!screen) { + screen = SDL_SetVideoMode(width, height, (flags & FB2GL_16BIT ? 16: 0), + SDL_HWPALETTE | SDL_HWSURFACE | SDL_OPENGL | SDL_GL_DOUBLEBUFFER | + (flags & FB2GL_FS? SDL_FULLSCREEN: 0)); + } + + warning("Screen BitsPerPixel: %d\n",screen->format->BitsPerPixel); + + if (!screen) { + fprintf(stderr, "Couldn't start video res %dx%d\n", width, height); + return 0; + } + + + if (!(flags & FB2GL_RGBA)) { // Check for Paletted Texture Extension + + strcpy(gl_ext, (char *)glGetString(GL_EXTENSIONS)); fprintf(stderr,"gl_ext= %s\n",gl_ext); - if ( strstr( gl_ext , "GL_EXT_paletted_texture") ) - glEnable(GL_EXT_paletted_texture); - else { - fprintf(stderr,"Your OpenGL version doesn't support paletted texture\n"); - return 0; - } - } - - if (width>0 && height>0) - maketex(); - makedlist(xfix, yfix); - -/* glEnable(GL_ALPHA_TEST); - glEnable(GL_BLEND); - glAlphaFunc(GL_GREATER,0); - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);*/ - - return 1; + if ( strstr( gl_ext , "GL_EXT_paletted_texture") ) + glEnable(GL_EXT_paletted_texture); + else { + fprintf(stderr,"Your OpenGL version doesn't support paletted texture\n"); + return 0; + } + } + + if (width>0 && height>0) + maketex(); + makedlist(xfix, yfix); + +/* glEnable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glAlphaFunc(GL_GREATER,0); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);*/ + + return 1; } void FB2GL::display() { - glCallList(dlist); - SDL_GL_SwapBuffers(); + glCallList(dlist); + SDL_GL_SwapBuffers(); } void FB2GL::update(void *fb, int w, int h, int pitch, int xskip, int yskip) { - unsigned char *fb1=(unsigned char *)fb; - int x,y,scr_pitch,byte=0; - - if (flags & FB2GL_PITCH) scr_pitch=pitch; - else { - scr_pitch=w*pitch; - byte = pitch; // Bytes perl pixel (for RGBA mode) - } - - if (flags & FB2GL_RGBA) { - - if (flags & FB2GL_EXPAND) { // Expand the 8 bit fb into a RGB fb - - for (y=yskip; y<h; y++) { + unsigned char *fb1=(unsigned char *)fb; + int x,y,scr_pitch,byte=0; + + if (flags & FB2GL_PITCH) scr_pitch=pitch; + else { + scr_pitch=w*pitch; + byte = pitch; // Bytes perl pixel (for RGBA mode) + } + + if (flags & FB2GL_RGBA) { + + if (flags & FB2GL_EXPAND) { // Expand the 8 bit fb into a RGB fb + + for (y=yskip; y<h; y++) { for (x=xskip; x<w; x++) { - if (x<256) { - ogl_fb1[y][x][0] = ogl_ctable[*(fb1+x)][0]; - ogl_fb1[y][x][1] = ogl_ctable[*(fb1+x)][1]; - ogl_fb1[y][x][2] = ogl_ctable[*(fb1+x)][2]; - ogl_fb1[y][x][3] = 255; - } - else { - ogl_fb2[y][x-256][0] = ogl_ctable[*(fb1+x)][0]; - ogl_fb2[y][x-256][1] = ogl_ctable[*(fb1+x)][1]; - ogl_fb2[y][x-256][2] = ogl_ctable[*(fb1+x)][2]; - ogl_fb2[y][x-256][3] = 255; - } + if (x<256) { + ogl_fb1[y][x][0] = ogl_ctable[*(fb1+x)][0]; + ogl_fb1[y][x][1] = ogl_ctable[*(fb1+x)][1]; + ogl_fb1[y][x][2] = ogl_ctable[*(fb1+x)][2]; + ogl_fb1[y][x][3] = 255; + } + else { + ogl_fb2[y][x-256][0] = ogl_ctable[*(fb1+x)][0]; + ogl_fb2[y][x-256][1] = ogl_ctable[*(fb1+x)][1]; + ogl_fb2[y][x-256][2] = ogl_ctable[*(fb1+x)][2]; + ogl_fb2[y][x-256][3] = 255; + } } fb1 += scr_pitch; - } - } - else { // No expansion - for (y=yskip; y<h; y++) { + } + } + else { // No expansion + for (y=yskip; y<h; y++) { for (x=xskip; x<w; x++) { - if (x<256) { - ogl_fb1[y-yskip][x-xskip][0] = *(fb1+(x*byte)); - ogl_fb1[y-yskip][x-xskip][1] = *(fb1+(x*byte)+1); - ogl_fb1[y-yskip][x-xskip][2] = *(fb1+(x*byte)+2); - } - else { - ogl_fb2[y-yskip][x-256][0] = *(fb1+(x*byte)); - ogl_fb2[y-yskip][x-256][1] = *(fb1+(x*byte)+1); - ogl_fb2[y-yskip][x-256][2] = *(fb1+(x*byte)+2); - } + if (x<256) { + ogl_fb1[y-yskip][x-xskip][0] = *(fb1+(x*byte)); + ogl_fb1[y-yskip][x-xskip][1] = *(fb1+(x*byte)+1); + ogl_fb1[y-yskip][x-xskip][2] = *(fb1+(x*byte)+2); + } + else { + ogl_fb2[y-yskip][x-256][0] = *(fb1+(x*byte)); + ogl_fb2[y-yskip][x-256][1] = *(fb1+(x*byte)+1); + ogl_fb2[y-yskip][x-256][2] = *(fb1+(x*byte)+2); + } } fb1 += scr_pitch; - } - } + } + } - // Update 256x256 texture - glBindTexture(GL_TEXTURE_2D,texture); - glFlush(); - glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,256-xskip,256-yskip,GL_RGBA, + // Update 256x256 texture + glBindTexture(GL_TEXTURE_2D,texture); + glFlush(); + glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,256-xskip,256-yskip,GL_RGBA, GL_UNSIGNED_BYTE,ogl_fb1); - if (flags & FB2GL_320) { - // Update 64x256 texture - glBindTexture(GL_TEXTURE_2D,textureb); - glFlush(); - glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,64-xskip,256-yskip,GL_RGBA, + if (flags & FB2GL_320) { + // Update 64x256 texture + glBindTexture(GL_TEXTURE_2D,textureb); + glFlush(); + glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,64-xskip,256-yskip,GL_RGBA, GL_UNSIGNED_BYTE,ogl_fb2); - } + } - } - else { // non RGBA (paletted) + } + else { // non RGBA (paletted) - for (y=0; y<h; y++) - for (x=0; x<w; x++) { + for (y=0; y<h; y++) + for (x=0; x<w; x++) { if (x<256) { - ogl_fb[ y ][ x ] = *(fb1 + (y)*scr_pitch + x); + ogl_fb[ y ][ x ] = *(fb1 + (y)*scr_pitch + x); } else { - ogl_fbb[ y ][ x - 256 ] = *(fb1 + y*scr_pitch + x); + ogl_fbb[ y ][ x - 256 ] = *(fb1 + y*scr_pitch + x); } - } + } - // Update 256x256 texture - glBindTexture(GL_TEXTURE_2D,texture); - glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,256-xskip,256-yskip, + // Update 256x256 texture + glBindTexture(GL_TEXTURE_2D,texture); + glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,256-xskip,256-yskip, GL_COLOR_INDEX, GL_UNSIGNED_BYTE,ogl_fb); - if (flags & FB2GL_320) { - // Update 64x256 texture - glBindTexture(GL_TEXTURE_2D,textureb); - glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,64-xskip,256-yskip, - GL_COLOR_INDEX, GL_UNSIGNED_BYTE,ogl_fbb); - } + if (flags & FB2GL_320) { + // Update 64x256 texture + glBindTexture(GL_TEXTURE_2D,textureb); + glTexSubImage2D(GL_TEXTURE_2D,0,xskip,yskip,64-xskip,256-yskip, + GL_COLOR_INDEX, GL_UNSIGNED_BYTE,ogl_fbb); + } - } + } - display(); + display(); } void FB2GL::blit16(SDL_Surface *fb, int num_rect, SDL_Rect *rect, int xskip, int yskip) { - int x, y, i; - int rx, ry, rw, rh; - int xend=0, yend=0; - int pitch = fb->pitch/2; // 16 bit pointer access (not char *) - int tex1_w = 0, tex2_w = 0, tex2_x = 0; - - for (i=0; i<num_rect; i++) { - tex1_w = tex2_w = tex2_x = 0; - rx = rect[i].x; - ry = rect[i].y; - rw = rect[i].w; - rh = rect[i].h; - xend = rx + rw; - yend = ry + rh; - if (xend > fb->w) continue; - if (yend > fb->h) continue; - - if (rx < 256) { // Begins before the end of the 1st texture - if (xend >= 256) { // Ends after the first texture + int x, y, i; + int rx, ry, rw, rh; + int xend=0, yend=0; + int pitch = fb->pitch/2; // 16 bit pointer access (not char *) + int tex1_w = 0, tex2_w = 0, tex2_x = 0; + + for (i=0; i<num_rect; i++) { + tex1_w = tex2_w = tex2_x = 0; + rx = rect[i].x; + ry = rect[i].y; + rw = rect[i].w; + rh = rect[i].h; + xend = rx + rw; + yend = ry + rh; + if (xend > fb->w) continue; + if (yend > fb->h) continue; + + if (rx < 256) { // Begins before the end of the 1st texture + if (xend >= 256) { // Ends after the first texture tex2_w = xend-256; // For the 2nd texture tex1_w = rw - tex2_w; // For the 1st texture - } - else tex1_w = rw; - } - else { - tex2_w = rw; - tex2_x = rx - 256; - } - - for (y = ry; y < yend; y++) { - for (x = rx; x < xend; x++) { - - if (x < 256 && tex1_w) { - int pos = (x-rx+(y-ry)*tex1_w)*4; // RGBA - SDL_GetRGB(((Uint16 *)fb->pixels)[x+y*(pitch)],fb->format, - &fb1[pos], - &fb1[pos+1], - &fb1[pos+2]); + } + else tex1_w = rw; + } + else { + tex2_w = rw; + tex2_x = rx - 256; + } + + for (y = ry; y < yend; y++) { + for (x = rx; x < xend; x++) { + + if (x < 256 && tex1_w) { + int pos = (x-rx+(y-ry)*tex1_w)*4; // RGBA + SDL_GetRGB(((Uint16 *)fb->pixels)[x+y*(pitch)],fb->format, + &fb1[pos], + &fb1[pos+1], + &fb1[pos+2]); } else if (x >= 256 && tex2_w) { - int rx2 = rx < 256? 256: rx; - int pos = (x-rx2+(y-ry)*tex2_w)*4; // RGBA - SDL_GetRGB(((Uint16 *)fb->pixels)[x+y*(pitch)],fb->format, - &fb2[pos], - &fb2[pos+1], - &fb2[pos+2]); + int rx2 = rx < 256? 256: rx; + int pos = (x-rx2+(y-ry)*tex2_w)*4; // RGBA + SDL_GetRGB(((Uint16 *)fb->pixels)[x+y*(pitch)],fb->format, + &fb2[pos], + &fb2[pos+1], + &fb2[pos+2]); + } + } + } + + if (tex1_w > 0) { + // Update 256x256 texture + glBindTexture(GL_TEXTURE_2D,texture); + glFlush(); + glTexSubImage2D(GL_TEXTURE_2D,0,rx+xskip,ry+yskip,tex1_w,rh,GL_RGBA, + GL_UNSIGNED_BYTE,fb1); + } + if (tex2_w > 0) { // What was left for this texture + // Update 64x256 texture + glBindTexture(GL_TEXTURE_2D,textureb); + glFlush(); + glTexSubImage2D(GL_TEXTURE_2D,0,tex2_x+xskip,ry+yskip,tex2_w,rh,GL_RGBA, + GL_UNSIGNED_BYTE,fb2); + } } - } - } - - if (tex1_w > 0) { - // Update 256x256 texture - glBindTexture(GL_TEXTURE_2D,texture); - glFlush(); - glTexSubImage2D(GL_TEXTURE_2D,0,rx+xskip,ry+yskip,tex1_w,rh,GL_RGBA, - GL_UNSIGNED_BYTE,fb1); - } - if (tex2_w > 0) { // What was left for this texture - // Update 64x256 texture - glBindTexture(GL_TEXTURE_2D,textureb); - glFlush(); - glTexSubImage2D(GL_TEXTURE_2D,0,tex2_x+xskip,ry+yskip,tex2_w,rh,GL_RGBA, - GL_UNSIGNED_BYTE,fb2); - } - } } void FB2GL::palette(int i, int r, int g, int b) { - if (flags & FB2GL_EXPAND) { - ogl_temp_ctable[i][0]=r; - ogl_temp_ctable[i][1]=g; - ogl_temp_ctable[i][2]=b; - } - else { // Paletted texture - ogl_ctable[i][0]=r; - ogl_ctable[i][1]=g; - ogl_ctable[i][2]=b; - } + if (flags & FB2GL_EXPAND) { + ogl_temp_ctable[i][0]=r; + ogl_temp_ctable[i][1]=g; + ogl_temp_ctable[i][2]=b; + } + else { // Paletted texture + ogl_ctable[i][0]=r; + ogl_ctable[i][1]=g; + ogl_ctable[i][2]=b; + } } void FB2GL::setPalette(int f, int n) { - char temp[256][3]; - int i; + char temp[256][3]; + int i; - if (flags & FB2GL_EXPAND) { - for (i=f; i<n; i++) { - ogl_ctable[i][0] = ogl_temp_ctable[i][0]; - ogl_ctable[i][1] = ogl_temp_ctable[i][1]; - ogl_ctable[i][2] = ogl_temp_ctable[i][2]; - } - } - else { // Paletted texture - glBindTexture(GL_TEXTURE_2D,texture); - glGetColorTable(GL_TEXTURE_2D,GL_RGB,GL_UNSIGNED_BYTE,&temp); + if (flags & FB2GL_EXPAND) { + for (i=f; i<n; i++) { + ogl_ctable[i][0] = ogl_temp_ctable[i][0]; + ogl_ctable[i][1] = ogl_temp_ctable[i][1]; + ogl_ctable[i][2] = ogl_temp_ctable[i][2]; + } + } + else { // Paletted texture + glBindTexture(GL_TEXTURE_2D,texture); + glGetColorTable(GL_TEXTURE_2D,GL_RGB,GL_UNSIGNED_BYTE,&temp); - for (i=f; i<n; i++) { - temp[i][0] = ogl_ctable[i][0]; - temp[i][1] = ogl_ctable[i][1]; - temp[i][2] = ogl_ctable[i][2]; - } + for (i=f; i<n; i++) { + temp[i][0] = ogl_ctable[i][0]; + temp[i][1] = ogl_ctable[i][1]; + temp[i][2] = ogl_ctable[i][2]; + } - glColorTable(GL_TEXTURE_2D,GL_RGB,256,GL_RGB,GL_UNSIGNED_BYTE,&temp); + glColorTable(GL_TEXTURE_2D,GL_RGB,256,GL_RGB,GL_UNSIGNED_BYTE,&temp); - if (flags & FB2GL_320) { - glBindTexture(GL_TEXTURE_2D,textureb); - glColorTable(GL_TEXTURE_2D,GL_RGB,256,GL_RGB,GL_UNSIGNED_BYTE,&temp); - } + if (flags & FB2GL_320) { + glBindTexture(GL_TEXTURE_2D,textureb); + glColorTable(GL_TEXTURE_2D,GL_RGB,256,GL_RGB,GL_UNSIGNED_BYTE,&temp); + } - } + } } diff --git a/backends/sdl/sdl-common.cpp b/backends/sdl/sdl-common.cpp index fe1d5765fe..c390b910f5 100644 --- a/backends/sdl/sdl-common.cpp +++ b/backends/sdl/sdl-common.cpp @@ -73,7 +73,7 @@ OSystem *OSystem_SDL_Common::create(int gfx_mode, bool full_screen) { #ifndef MACOSX // Work around a bug in OS X // Clean up on exit atexit_proc_installed = true; - atexit(atexit_proc); + atexit(atexit_proc); #endif // enable joystick @@ -95,21 +95,18 @@ OSystem_SDL_Common::OSystem_SDL_Common() _cdrom(0), _dirty_checksums(0), _mouseVisible(false), _mouseDrawn(false), _mouseData(0), _mouseHotspotX(0), _mouseHotspotY(0), - _currentShakePos(0), _newShakePos(0) -{ + _currentShakePos(0), _newShakePos(0) { // allocate palette storage - _currentPalette = (SDL_Color*)calloc(sizeof(SDL_Color), 256); + _currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256); // allocate the dirty rect storage - _mouseBackup = (byte*)malloc(MAX_MOUSE_W * MAX_MOUSE_H * MAX_SCALING * 2); - + _mouseBackup = (byte *)malloc(MAX_MOUSE_W * MAX_MOUSE_H * MAX_SCALING * 2); + // reset mouse state memset(&km, 0, sizeof(km)); - } -OSystem_SDL_Common::~OSystem_SDL_Common() -{ +OSystem_SDL_Common::~OSystem_SDL_Common() { if (_dirty_checksums) free(_dirty_checksums); free(_currentPalette); @@ -117,17 +114,16 @@ OSystem_SDL_Common::~OSystem_SDL_Common() } void OSystem_SDL_Common::init_size(uint w, uint h) { - // Avoid redundant res changes if ((int)w == _screenWidth && (int)h == _screenHeight) return; _screenWidth = w; _screenHeight = h; - CKSUM_NUM = (_screenWidth*_screenHeight/(8*8)); + CKSUM_NUM = (_screenWidth * _screenHeight / (8 * 8)); if (_dirty_checksums) free(_dirty_checksums); - _dirty_checksums = (uint32*)calloc(CKSUM_NUM*2, sizeof(uint32)); + _dirty_checksums = (uint32 *)calloc(CKSUM_NUM * 2, sizeof(uint32)); unload_gfx_mode(); load_gfx_mode(); @@ -145,18 +141,33 @@ void OSystem_SDL_Common::copy_rect(const byte *buf, int pitch, int x, int y, int return; if (((uint32)buf & 3) == 0 && pitch == _screenWidth && x==0 && y==0 && - w==_screenWidth && h==_screenHeight && _mode_flags&DF_WANT_RECT_OPTIM) { + w==_screenWidth && h==_screenHeight && _mode_flags&DF_WANT_RECT_OPTIM) { /* Special, optimized case for full screen updates. * It tries to determine what areas were actually changed, * and just updates those, on the actual display. */ add_dirty_rgn_auto(buf); } else { /* Clip the coordinates */ - if (x < 0) { w+=x; buf-=x; x = 0; } - if (y < 0) { h+=y; buf-=y*pitch; y = 0; } - if (w > _screenWidth-x) { w = _screenWidth - x; } - if (h > _screenHeight-y) { h = _screenHeight - y; } - + if (x < 0) { + w += x; + buf -= x; + x = 0; + } + + if (y < 0) { + h += y; + buf -= y * pitch; + y = 0; + } + + if (w > _screenWidth - x) { + w = _screenWidth - x; + } + + if (h > _screenHeight - y) { + h = _screenHeight - y; + } + if (w <= 0 || h <= 0) return; @@ -183,7 +194,6 @@ void OSystem_SDL_Common::copy_rect(const byte *buf, int pitch, int x, int y, int void OSystem_SDL_Common::move_screen(int dx, int dy, int height) { - if ((dx == 0) && (dy == 0)) return; @@ -227,7 +237,6 @@ void OSystem_SDL_Common::add_dirty_rect(int x, int y, int w, int h) { _forceFull = true; else { SDL_Rect *r = &_dirty_rect_list[_num_dirty_rects++]; - // Extend the dirty region by 1 pixel for scalers // that "smear" the screen, e.g. 2xSAI if (_mode_flags & DF_UPDATE_EXPAND_1_PIXEL) { @@ -238,10 +247,22 @@ void OSystem_SDL_Common::add_dirty_rect(int x, int y, int w, int h) { } // clip - if (x < 0) { w+=x; x=0; } - if (y < 0) { h+=y; y=0; } - if (w > _screenWidth-x) { w = _screenWidth - x; } - if (h > _screenHeight-y) { h = _screenHeight - y; } + if (x < 0) { + w += x; x = 0; + } + + if (y < 0) { + h += y; + y=0; + } + + if (w > _screenWidth - x) { + w = _screenWidth - x; + } + + if (h > _screenHeight - y) { + h = _screenHeight - y; + } r->x = x; r->y = y; @@ -250,18 +271,19 @@ void OSystem_SDL_Common::add_dirty_rect(int x, int y, int w, int h) { } } -#define ROL(a,n) a = (a<<(n)) | (a>>(32-(n))) -#define DOLINE(x) a ^= ((uint32*)buf)[0+(x)*(_screenWidth/4)]; b ^= ((uint32*)buf)[1+(x)*(_screenWidth/4)] +#define ROL(a,n) a = (a << (n)) | (a >> (32 - (n))) +#define DOLINE(x) a ^= ((uint32*)buf)[0 + (x) * (_screenWidth / 4)]; b ^= ((uint32 *)buf)[1 + (x) * (_screenWidth / 4)] + void OSystem_SDL_Common::mk_checksums(const byte *buf) { uint32 *sums = _dirty_checksums; uint x,y; - const uint last_x = (uint)_screenWidth/8; - const uint last_y = (uint)_screenHeight/8; + const uint last_x = (uint)_screenWidth / 8; + const uint last_y = (uint)_screenHeight / 8; /* the 8x8 blocks in buf are enumerated starting in the top left corner and * reading each line at a time from left to right */ - for(y=0; y != last_y; y++, buf+=_screenWidth*(8-1)) - for(x=0; x != last_x; x++, buf+=8) { + for(y = 0; y != last_y; y++, buf += _screenWidth * (8 - 1)) + for(x=0; x != last_x; x++, buf += 8) { uint32 a = x; uint32 b = y; @@ -270,8 +292,8 @@ void OSystem_SDL_Common::mk_checksums(const byte *buf) { DOLINE(4); ROL(a,13); ROL(b,11); DOLINE(6); ROL(a,13); ROL(b,11); - a*=0xDEADBEEF; - b*=0xBAADF00D; + a *= 0xDEADBEEF; + b *= 0xBAADF00D; DOLINE(1); ROL(a,13); ROL(b,11); DOLINE(3); ROL(a,13); ROL(b,11); @@ -279,15 +301,14 @@ void OSystem_SDL_Common::mk_checksums(const byte *buf) { DOLINE(7); ROL(a,13); ROL(b,11); /* output the checksum for this block */ - *sums++=a+b; + *sums++ = a + b; } } #undef DOLINE #undef ROL - void OSystem_SDL_Common::add_dirty_rgn_auto(const byte *buf) { - assert( ((uint32)buf & 3) == 0); + assert(((uint32)buf & 3) == 0); /* generate a table of the checksums */ mk_checksums(buf); @@ -304,18 +325,18 @@ void OSystem_SDL_Common::add_dirty_rgn_auto(const byte *buf) { int x,y,w; uint32 *ck = _dirty_checksums; - for(y=0; y!=_screenHeight/8; y++) { - for(x=0; x!=_screenWidth/8; x++,ck++) { + for(y = 0; y!=_screenHeight / 8; y++) { + for(x = 0; x!=_screenWidth / 8; x++,ck++) { if (ck[0] != ck[CKSUM_NUM]) { /* found a dirty 8x8 block, now go as far to the right as possible, and at the same time, unmark the dirty status by setting old to new. */ w=0; do { - ck[w+CKSUM_NUM] = ck[w]; + ck[w + CKSUM_NUM] = ck[w]; w++; - } while (x+w != _screenWidth/8 && ck[w] != ck[w+CKSUM_NUM]); - - add_dirty_rect(x*8, y*8, w*8, 8); + } while (x + w != _screenWidth / 8 && ck[w] != ck[w + CKSUM_NUM]); + + add_dirty_rect(x * 8, y * 8, w * 8, 8); if (_forceFull) goto get_out; @@ -338,18 +359,18 @@ void OSystem_SDL_Common::kbd_mouse() { km.x_down_count = 2; } if (km.y_down_count == 1) { - km.y_down_time = time; + km.y_down_time = time; km.y_down_count = 2; } if (km.x_vel || km.y_vel) { if (km.x_down_count) { - if (time > km.x_down_time + km.delay_time*12) { + if (time > km.x_down_time + km.delay_time * 12) { if (km.x_vel > 0) km.x_vel++; else km.x_vel--; - } else if (time > km.x_down_time + km.delay_time*8) { + } else if (time > km.x_down_time + km.delay_time * 8) { if (km.x_vel > 0) km.x_vel = 5; else @@ -357,12 +378,12 @@ void OSystem_SDL_Common::kbd_mouse() { } } if (km.y_down_count) { - if (time > km.y_down_time + km.delay_time*12) { + if (time > km.y_down_time + km.delay_time * 12) { if (km.y_vel > 0) km.y_vel++; else km.y_vel--; - } else if (time > km.y_down_time + km.delay_time*8) { + } else if (time > km.y_down_time + km.delay_time * 8) { if (km.y_vel > 0) km.y_vel = 5; else @@ -412,7 +433,7 @@ bool OSystem_SDL_Common::show_mouse(bool visible) { return last; } - + void OSystem_SDL_Common::set_mouse_pos(int x, int y) { if (x != _mouseCurState.x || y != _mouseCurState.y) { _mouseCurState.x = x; @@ -427,7 +448,6 @@ void OSystem_SDL_Common::warp_mouse(int x, int y) { } void OSystem_SDL_Common::set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y) { - assert(0 <= w && w <= MAX_MOUSE_W); assert(0 <= h && h <= MAX_MOUSE_H); _mouseCurState.w = w; @@ -436,23 +456,23 @@ void OSystem_SDL_Common::set_mouse_cursor(const byte *buf, uint w, uint h, int h _mouseHotspotX = hotspot_x; _mouseHotspotY = hotspot_y; - _mouseData = (byte*)buf; + _mouseData = (byte *)buf; undraw_mouse(); } - + void OSystem_SDL_Common::set_shake_pos(int shake_pos) { _newShakePos = shake_pos; } - + uint32 OSystem_SDL_Common::get_msecs() { return SDL_GetTicks(); } - + void OSystem_SDL_Common::delay_msecs(uint msecs) { SDL_Delay(msecs); } - + void *OSystem_SDL_Common::create_thread(ThreadProc *proc, void *param) { return SDL_CreateThread(proc, param); } @@ -472,7 +492,7 @@ static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) } return key; } - + bool OSystem_SDL_Common::poll_event(Event *event) { SDL_Event ev; int axis; @@ -579,7 +599,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { default: break; } - + return true; } @@ -589,7 +609,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { event->kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); switch(ev.key.keysym.sym){ - case SDLK_LEFT: + case SDLK_LEFT: if (km.x_vel < 0) { km.x_vel = 0; km.x_down_count = 0; @@ -717,7 +737,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { } } return true; - + case SDL_JOYAXISMOTION: axis = ev.jaxis.value; if ( axis > JOY_DEADZONE) { @@ -728,7 +748,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { event->event_code = EVENT_MOUSEMOVE; } else axis = 0; - + if ( ev.jaxis.axis == JOY_XAXIS) { #ifdef JOY_ANALOG km.x_vel = axis/2000; @@ -748,11 +768,11 @@ bool OSystem_SDL_Common::poll_event(Event *event) { axis = -axis; #endif #ifdef JOY_ANALOG - km.y_vel = -axis/2000; + km.y_vel = -axis / 2000; km.y_down_count = 0; #else if (axis != 0) { - km.y_vel = (-axis > 0) ? 1:-1; + km.y_vel = (-axis > 0) ? 1: -1; km.y_down_count = 1; } else { km.y_vel = 0; @@ -760,7 +780,7 @@ bool OSystem_SDL_Common::poll_event(Event *event) { } #endif } - return true; + return true; case SDL_QUIT: quit(); @@ -772,7 +792,6 @@ bool OSystem_SDL_Common::set_sound_proc(void *param, SoundProc *proc, byte forma SDL_AudioSpec desired; /* only one format supported at the moment */ - desired.freq = SAMPLES_PER_SEC; desired.format = AUDIO_S16SYS; desired.channels = 2; @@ -818,13 +837,13 @@ uint32 OSystem_SDL_Common::property(int param, Property *value) { return 0; } - + void OSystem_SDL_Common::quit() { if(_cdrom) { SDL_CDStop(_cdrom); SDL_CDClose(_cdrom); } - unload_gfx_mode(); + unload_gfx_mode(); exit(0); } @@ -868,10 +887,9 @@ void OSystem_SDL_Common::draw_mouse() { _mouseOldState.h = h; // Draw the mouse cursor; backup the covered area in "bak" - if (SDL_LockSurface(_overlayVisible ? _tmpscreen : _screen) == -1) error("SDL_LockSurface failed: %s.\n", SDL_GetError()); - + // Mark as dirty add_dirty_rect(x, y, w, h); @@ -897,10 +915,10 @@ void OSystem_SDL_Common::draw_mouse() { } } else { - uint16 *bak = (uint16*)_mouseBackup; // Surface used to backup the area obscured by the mouse + uint16 *bak = (uint16 *)_mouseBackup; // Surface used to backup the area obscured by the mouse uint16 *dst; // Surface we are drawing into - dst = (uint16 *)_tmpscreen->pixels + (y+1) * _tmpScreenWidth + (x+1); + dst = (uint16 *)_tmpscreen->pixels + (y + 1) * _tmpScreenWidth + (x + 1); while (h > 0) { int width = w; while (width > 0) { @@ -916,11 +934,10 @@ void OSystem_SDL_Common::draw_mouse() { dst += _tmpScreenWidth - w; h--; } - } SDL_UnlockSurface(_overlayVisible ? _tmpscreen : _screen); - + // Finally, set the flag to indicate the mouse has been drawn _mouseDrawn = true; } @@ -940,9 +957,8 @@ void OSystem_SDL_Common::undraw_mouse() { int x, y; if (!_overlayVisible) { - byte *dst, *bak = _mouseBackup; - + // No need to do clipping here, since draw_mouse() did that already dst = (byte *)_screen->pixels + old_mouse_y * _screenWidth + old_mouse_x; for (y = 0; y < old_mouse_h; ++y, bak += MAX_MOUSE_W, dst += _screenWidth) { @@ -956,7 +972,7 @@ void OSystem_SDL_Common::undraw_mouse() { uint16 *dst, *bak = (uint16 *)_mouseBackup; // No need to do clipping here, since draw_mouse() did that already - dst = (uint16 *)_tmpscreen->pixels + (old_mouse_y+1) * _tmpScreenWidth + (old_mouse_x+1); + dst = (uint16 *)_tmpscreen->pixels + (old_mouse_y + 1) * _tmpScreenWidth + (old_mouse_x + 1); for (y = 0; y < old_mouse_h; ++y, bak += MAX_MOUSE_W, dst += _tmpScreenWidth) { for (x = 0; x < old_mouse_w; ++x) { dst[x] = bak[x]; @@ -972,7 +988,6 @@ void OSystem_SDL_Common::undraw_mouse() { void OSystem_SDL_Common::stop_cdrom() { /* Stop CD Audio in 1/10th of a second */ cd_stop_time = SDL_GetTicks() + 100; cd_num_loops = 0; - } void OSystem_SDL_Common::play_cdrom(int track, int num_loops, int start_frame, int end_frame) { @@ -983,7 +998,7 @@ void OSystem_SDL_Common::play_cdrom(int track, int num_loops, int start_frame, i return; if (end_frame > 0) - end_frame+=5; + end_frame +=5; cd_track = track; cd_num_loops = num_loops; @@ -1009,7 +1024,7 @@ bool OSystem_SDL_Common::poll_cdrom() { void OSystem_SDL_Common::update_cdrom() { if (!_cdrom) return; - + if (cd_stop_time != 0 && SDL_GetTicks() >= cd_stop_time) { SDL_CDStop(_cdrom); cd_num_loops = 0; @@ -1098,8 +1113,7 @@ void OSystem_SDL_Common::delete_mutex(void *mutex) { SDL_DestroyMutex((SDL_mutex *) mutex); } -void OSystem_SDL_Common::show_overlay() -{ +void OSystem_SDL_Common::show_overlay() { // hide the mouse undraw_mouse(); @@ -1107,8 +1121,7 @@ void OSystem_SDL_Common::show_overlay() clear_overlay(); } -void OSystem_SDL_Common::hide_overlay() -{ +void OSystem_SDL_Common::hide_overlay() { // hide the mouse undraw_mouse(); @@ -1116,8 +1129,7 @@ void OSystem_SDL_Common::hide_overlay() _forceFull = true; } -void OSystem_SDL_Common::clear_overlay() -{ +void OSystem_SDL_Common::clear_overlay() { if (!_overlayVisible) return; @@ -1144,8 +1156,7 @@ int16 OSystem_SDL_Common::get_width() { return _screenWidth; } -void OSystem_SDL_Common::grab_overlay(int16 *buf, int pitch) -{ +void OSystem_SDL_Common::grab_overlay(int16 *buf, int pitch) { if (!_overlayVisible) return; @@ -1169,8 +1180,7 @@ void OSystem_SDL_Common::grab_overlay(int16 *buf, int pitch) SDL_UnlockSurface(_tmpscreen); } -void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, int y, int w, int h) -{ +void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, int y, int w, int h) { if (!_overlayVisible) return; @@ -1178,13 +1188,28 @@ void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, i return; // Clip the coordinates - if (x < 0) { w+=x; buf-=x; x = 0; } - if (y < 0) { h+=y; buf-=y*pitch; y = 0; } - if (w > _screenWidth-x) { w = _screenWidth - x; } - if (h > _screenHeight-y) { h = _screenHeight - y; } + if (x < 0) { + w += x; + buf -= x; + x = 0; + } + + if (y < 0) { + h += y; buf -= y * pitch; + y = 0; + } + + if (w > _screenWidth - x) { + w = _screenWidth - x; + } + + if (h > _screenHeight-y) { + h = _screenHeight - y; + } + if (w <= 0 || h <= 0) return; - + // Mark the modified region as dirty cksum_valid = false; add_dirty_rect(x, y, w, h); @@ -1195,9 +1220,9 @@ void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, i if (SDL_LockSurface(_tmpscreen) == -1) error("SDL_LockSurface failed: %s.\n", SDL_GetError()); - int16 *dst = (int16 *)_tmpscreen->pixels + (y+1) * _tmpScreenWidth + (x+1); + int16 *dst = (int16 *)_tmpscreen->pixels + (y + 1) * _tmpScreenWidth + (x + 1); do { - memcpy(dst, buf, w*2); + memcpy(dst, buf, w * 2); dst += _tmpScreenWidth; buf += pitch; } while (--h); @@ -1205,12 +1230,10 @@ void OSystem_SDL_Common::copy_rect_overlay(const int16 *buf, int pitch, int x, i SDL_UnlockSurface(_tmpscreen); } -int16 OSystem_SDL_Common::RBGToColor(uint8 r, uint8 g, uint8 b) -{ +int16 OSystem_SDL_Common::RBGToColor(uint8 r, uint8 g, uint8 b) { return SDL_MapRGB(_tmpscreen->format, r, g, b); } -void OSystem_SDL_Common::colorToRBG(int16 color, uint8 &r, uint8 &g, uint8 &b) -{ +void OSystem_SDL_Common::colorToRBG(int16 color, uint8 &r, uint8 &g, uint8 &b) { SDL_GetRGB(color, _tmpscreen->format, &r, &g, &b); } diff --git a/backends/sdl/sdl-common.h b/backends/sdl/sdl-common.h index e0d4d37a28..0bb63a961c 100644 --- a/backends/sdl/sdl-common.h +++ b/backends/sdl/sdl-common.h @@ -57,29 +57,29 @@ public: // backend of the mouse cursor's current position, this function // actually moves the cursor to the specified position. void warp_mouse(int x, int y); - + // Set the bitmap that's used when drawing the cursor. void set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y); - + // Shaking is used in SCUMM. Set current shake position. void set_shake_pos(int shake_pos); - + // Get the number of milliseconds since the program was started. uint32 get_msecs(); - + // Delay for a specified amount of milliseconds void delay_msecs(uint msecs); - + // Create a thread void *create_thread(ThreadProc *proc, void *param); - + // Get the next event. // Returns true if an event was retrieved. bool poll_event(Event *event); - + // Set function that generates samples bool set_sound_proc(void *param, SoundProc *proc, byte sound); - + // Poll CD status // Returns true if cd audio is playing bool poll_cdrom(); @@ -183,7 +183,7 @@ protected: // joystick SDL_Joystick *_joystick; - + bool _mouseVisible; bool _mouseDrawn; byte *_mouseData; diff --git a/backends/sdl/sdl.cpp b/backends/sdl/sdl.cpp index d618b60065..7e3fb0868a 100644 --- a/backends/sdl/sdl.cpp +++ b/backends/sdl/sdl.cpp @@ -140,7 +140,6 @@ normal_mode:; if (_screen == NULL) error("_screen failed"); - // // Create the surface that contains the scaled graphics in 16 bit mode // @@ -161,9 +160,9 @@ normal_mode:; Init_2xSaI(565); // Need some extra bytes around when using 2xSaI - uint16 *tmp_screen = (uint16*)calloc(_tmpScreenWidth*(_screenHeight+3), sizeof(uint16)); + uint16 *tmp_screen = (uint16 *)calloc(_tmpScreenWidth * (_screenHeight + 3), sizeof(uint16)); _tmpscreen = SDL_CreateRGBSurfaceFrom(tmp_screen, - _tmpScreenWidth, _screenHeight + 3, 16, _tmpScreenWidth*2, + _tmpScreenWidth, _screenHeight + 3, 16, _tmpScreenWidth * 2, _hwscreen->format->Rmask, _hwscreen->format->Gmask, _hwscreen->format->Bmask, @@ -171,13 +170,12 @@ normal_mode:; if (_tmpscreen == NULL) error("_tmpscreen failed"); - + // keyboard cursor control, some other better place for it? km.x_max = _screenWidth * _scaleFactor - 1; km.y_max = _screenHeight * _scaleFactor - 1; km.delay_time = 25; km.last_time = 0; - } void OSystem_SDL::unload_gfx_mode() { @@ -230,12 +228,11 @@ void OSystem_SDL::hotswap_gfx_mode() { } void OSystem_SDL::update_screen() { - assert(_hwscreen != NULL); // If the shake position changed, fill the dirty area with blackness if (_currentShakePos != _newShakePos) { - SDL_Rect blackrect = {0, 0, _screenWidth*_scaleFactor, _newShakePos*_scaleFactor}; + SDL_Rect blackrect = {0, 0, _screenWidth * _scaleFactor, _newShakePos * _scaleFactor}; SDL_FillRect(_hwscreen, &blackrect, 0); _currentShakePos = _newShakePos; @@ -270,11 +267,11 @@ void OSystem_SDL::update_screen() { // Only draw anything if necessary if (_num_dirty_rects > 0) { - + SDL_Rect *r; uint32 srcPitch, dstPitch; SDL_Rect *last_rect = _dirty_rect_list + _num_dirty_rects; - + // Convert appropriate parts of the 8bpp image into 16bpp if (!_overlayVisible) { SDL_Rect dst; @@ -286,7 +283,7 @@ void OSystem_SDL::update_screen() { error("SDL_BlitSurface failed: %s", SDL_GetError()); } } - + SDL_LockSurface(_tmpscreen); SDL_LockSurface(_hwscreen); @@ -300,11 +297,11 @@ void OSystem_SDL::update_screen() { dst_h = r->h; if (dst_h > _screenHeight - dst_y) dst_h = _screenHeight - dst_y; - + dst_y *= _scaleFactor; - - _scaler_proc((byte*)_tmpscreen->pixels + (r->x*2+2) + (r->y+1)*srcPitch, srcPitch, NULL, - (byte*)_hwscreen->pixels + r->x*2*_scaleFactor + dst_y*dstPitch, dstPitch, r->w, dst_h); + + _scaler_proc((byte *)_tmpscreen->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch, NULL, + (byte *)_hwscreen->pixels + r->x * 2 * _scaleFactor + dst_y * dstPitch, dstPitch, r->w, dst_h); } r->x *= _scaleFactor; @@ -332,7 +329,6 @@ void OSystem_SDL::update_screen() { } uint32 OSystem_SDL::property(int param, Property *value) { - if (param == PROP_TOGGLE_FULLSCREEN) { assert(_hwscreen != 0); _full_screen ^= true; @@ -358,8 +354,6 @@ uint32 OSystem_SDL::property(int param, Property *value) { return 1; } - - return OSystem_SDL_Common::property(param, value); } diff --git a/backends/sdl/sdl_gl.cpp b/backends/sdl/sdl_gl.cpp index c0e3875026..378d336c18 100644 --- a/backends/sdl/sdl_gl.cpp +++ b/backends/sdl/sdl_gl.cpp @@ -108,14 +108,14 @@ void OSystem_SDL_OpenGL::load_gfx_mode() { // gl_flags = FB2GL_320 | FB2GL_RGBA | FB2GL_16BIT; - if (_full_screen) { - gl_flags |= (FB2GL_FS); - _glScreenStart = 0; + if (_full_screen) { + gl_flags |= (FB2GL_FS); + _glScreenStart = 0; } // 640x480 screen resolution - fb2gl.init(640,480,0,_glScreenStart? 15: 70,gl_flags); + fb2gl.init(640, 480, 0,_glScreenStart? 15: 70,gl_flags); - SDL_SetGamma(1.25,1.25,1.25); + SDL_SetGamma(1.25, 1.25, 1.25); // @@ -123,9 +123,9 @@ void OSystem_SDL_OpenGL::load_gfx_mode() { // // Need some extra bytes around when using 2xSaI - uint16 *tmp_screen = (uint16*)calloc(_tmpScreenWidth*(_screenHeight+3),sizeof(uint16)); + uint16 *tmp_screen = (uint16 *)calloc(_tmpScreenWidth * (_screenHeight + 3),sizeof(uint16)); _tmpscreen = SDL_CreateRGBSurfaceFrom(tmp_screen, - _tmpScreenWidth, _screenHeight + 3, 16, _tmpScreenWidth*2, + _tmpScreenWidth, _screenHeight + 3, 16, _tmpScreenWidth * 2, Rmask, Gmask, Bmask, @@ -144,16 +144,15 @@ void OSystem_SDL_OpenGL::load_gfx_mode() { tmpBlackRect.y = 0; tmpBlackRect.w = _screenWidth; tmpBlackRect.h = 256-_screenHeight-_glScreenStart; - + if (_tmpscreen == NULL) error("_tmpscreen failed"); - + // keyboard cursor control, some other better place for it? km.x_max = _screenWidth * _scaleFactor - 1; km.y_max = _screenHeight * _scaleFactor - 1; km.delay_time = 25; km.last_time = 0; - } void OSystem_SDL_OpenGL::unload_gfx_mode() { @@ -163,20 +162,19 @@ void OSystem_SDL_OpenGL::unload_gfx_mode() { } if (_tmpscreen) { - free((uint16*)_tmpscreen->pixels); + free((uint16 *)_tmpscreen->pixels); SDL_FreeSurface(_tmpscreen); _tmpscreen = NULL; } } void OSystem_SDL_OpenGL::update_screen() { - // If the shake position changed, fill the dirty area with blackness if (_currentShakePos != _newShakePos) { SDL_Rect blackrect = {0, _glScreenStart, _screenWidth, _newShakePos+_glScreenStart}; SDL_FillRect(tmpSurface, &blackrect, 0); - fb2gl.blit16(tmpSurface,1,&blackrect,0,0); + fb2gl.blit16(tmpSurface, 1, &blackrect, 0, 0); _currentShakePos = _newShakePos; @@ -227,13 +225,14 @@ void OSystem_SDL_OpenGL::update_screen() { } // Almost the same thing as SDL_UpdateRects - fb2gl.blit16(_tmpscreen,_num_dirty_rects,_dirty_rect_list,0, - _currentShakePos+_glScreenStart); + fb2gl.blit16(_tmpscreen, _num_dirty_rects, _dirty_rect_list, 0, + _currentShakePos+_glScreenStart); + + tmpBlackRect.h = 256 - _screenHeight - _glScreenStart - _currentShakePos; - tmpBlackRect.h = 256-_screenHeight-_glScreenStart-_currentShakePos; - SDL_FillRect(tmpSurface, &tmpBlackRect, 0); - fb2gl.blit16(tmpSurface,1,&tmpBlackRect,0,_screenHeight+_glScreenStart+_currentShakePos); + fb2gl.blit16(tmpSurface, 1, &tmpBlackRect, 0,_screenHeight + + _glScreenStart+_currentShakePos); fb2gl.display(); } @@ -243,67 +242,61 @@ void OSystem_SDL_OpenGL::update_screen() { } uint32 OSystem_SDL_OpenGL::property(int param, Property *value) { + int i; if (param == PROP_TOGGLE_FULLSCREEN) { _full_screen ^= true; - + SDL_WM_ToggleFullScreen(fb2gl.screen); return 1; } else if (param == PROP_SET_GFX_MODE) { - SDL_Rect full = {0,0,_screenWidth,_screenHeight}; + SDL_Rect full = {0, 0, _screenWidth, _screenHeight}; glPopMatrix(); switch(value->gfx_mode) { - case 0: // Bilinear Filtering (on/off) - _glBilinearFilter ^= true; - for (int i=0; i<2; i++) { - glBindTexture(GL_TEXTURE_2D,i); - if (_glBilinearFilter) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, - GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, - GL_LINEAR); - } - else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, - GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, - GL_NEAREST); - } - } - break; - case 1: // Don't fit the whole screen - fb2gl.init(0,0,0,15,gl_flags); - _glScreenStart = 20; - SDL_FillRect(tmpSurface,&tmpBlackRect,0); - fb2gl.blit16(tmpSurface,1,&tmpBlackRect,0,0); - break; - case 2: // Fit the whole screen - fb2gl.init(0,0,0,70,gl_flags); - _glScreenStart = 0; - break; - default: // Zooming - glPushMatrix(); -/* SDL_FillRect(tmpSurface, &full, 0); - fb2gl.blit16(tmpSurface,1,&full,0,_glScreenStart); - fb2gl.display(); - double x = (double)((_mouseCurState.x) - - (_screenWidth/2)) / (_screenWidth/2); - double y = (double)((_mouseCurState.y) - - (_screenHeight/2)) / (_screenHeight/2); - glTranslatef(-x,y,0); + case 0: // Bilinear Filtering (on/off) + _glBilinearFilter ^= true; + for (i = 0; i < 2; i++) { + glBindTexture(GL_TEXTURE_2D, i); + if (_glBilinearFilter) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + } + break; + case 1: // Don't fit the whole screen + fb2gl.init(0, 0, 0, 15, gl_flags); + _glScreenStart = 20; + SDL_FillRect(tmpSurface, &tmpBlackRect, 0); + fb2gl.blit16(tmpSurface, 1, &tmpBlackRect, 0, 0); + break; + case 2: // Fit the whole screen + fb2gl.init(0, 0, 0, 70, gl_flags); + _glScreenStart = 0; + break; + default: // Zooming + glPushMatrix(); +/* SDL_FillRect(tmpSurface, &full, 0); + fb2gl.blit16(tmpSurface, 1, &full,0, _glScreenStart); + fb2gl.display(); + double x = (double)((_mouseCurState.x) + - (_screenWidth / 2)) / (_screenWidth / 2); + double y = (double)((_mouseCurState.y) + - (_screenHeight / 2)) / (_screenHeight / 2); + glTranslatef(-x, y, 0); */ - glScalef(1.0+(double)(value->gfx_mode-1)/10, - 1.0+(double)(value->gfx_mode-1)/10, - 0); + glScalef(1.0 + (double)(value->gfx_mode - 1) / 10, + 1.0 + (double)(value->gfx_mode - 1) / 10, 0); }; - fb2gl.blit16(_tmpscreen,1,&full,0,_glScreenStart); + fb2gl.blit16(_tmpscreen, 1, &full, 0, _glScreenStart); fb2gl.display(); - + return 1; } - - + return OSystem_SDL_Common::property(param, value); } |