diff options
Diffstat (limited to 'backends/sdl/fb2opengl.h')
| -rw-r--r-- | backends/sdl/fb2opengl.h | 659 |
1 files changed, 327 insertions, 332 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); + } - } + } } |
