diff --git a/src/video/X11.cpp b/src/video/X11.cpp index e69580ff5..76dcc63ba 100644 --- a/src/video/X11.cpp +++ b/src/video/X11.cpp @@ -837,6 +837,8 @@ global VMemType* VideoCreateNewPalette(const Palette *palette) pixels=malloc(256*sizeof(VMemType16)); break; case 24: + // pixels=malloc(256*sizeof(VMemType24)); + // break; case 32: pixels=malloc(256*sizeof(VMemType32)); break; @@ -896,7 +898,7 @@ global VMemType* VideoCreateNewPalette(const Palette *palette) ((VMemType16*)pixels)[i]=color.pixel; break; case 24: - //((VMemType32*)pixels)[i]=color.pixel; + //((VMemType24*)pixels)[i]=color.pixel; //break; // FIXME: real 24bpp mode. case 32: diff --git a/src/video/font.cpp b/src/video/font.cpp index 8699c3d84..0caef66a8 100644 --- a/src/video/font.cpp +++ b/src/video/font.cpp @@ -220,6 +220,61 @@ local void VideoDrawChar16(const Graphic* sprite, } } +/** +** Draw character with current color into 24bit video memory. +** +** @param sprite Pointer to object +** @param gx X offset into object +** @param gy Y offset into object +** @param w width to display +** @param h height to display +** @param x X screen position +** @param y Y screen position +*/ +local void VideoDrawChar24(const Graphic* sprite, + int gx,int gy,int w,int h,int x,int y) +{ + int p; + const unsigned char* sp; + const unsigned char* lp; + const unsigned char* gp; + int sa; + VMemType24* dp; + int da; + + sp=sprite->Frames+gx+gy*sprite->Width-1; + gp=sp+sprite->Width*h; + sa=sprite->Width-w; + dp=VideoMemory24+x+y*VideoWidth-1; + da=VideoWidth-w; + --w; + + while( sp<gp ) { + lp=sp+w; + while( sp<lp ) { // loop with unroll + ++dp; + p=*++sp; + if( p!=255 ) { + *dp=Pixels24[TextColor[p]]; + } + ++dp; + p=*++sp; + if( p!=255 ) { + *dp=Pixels24[TextColor[p]]; + } + } + if( sp<=lp ) { + ++dp; + p=*++sp; + if( p!=255 ) { + *dp=Pixels24[TextColor[p]]; + } + } + sp+=sa; + dp+=da; + } +} + /** ** Draw character with current color into 32bit video memory. ** @@ -553,6 +608,9 @@ global void LoadFonts(void) break; case 24: + VideoDrawChar=VideoDrawChar24; + // FIXME: real 24bpp break; + case 32: VideoDrawChar=VideoDrawChar32; break; diff --git a/src/video/linedraw.cpp b/src/video/linedraw.cpp index f121ec6d5..0dc53b335 100644 --- a/src/video/linedraw.cpp +++ b/src/video/linedraw.cpp @@ -136,6 +136,18 @@ local void DrawPixel16(SysColors color,int x,int y) VideoMemory16[x+y*VideoWidth]=Pixels16[color]; } +/** +** Draw pixel unclipped into 24bit framebuffer. +** +** @param color Color index. +** @param x x coordinate on the screen +** @param y y coordinate on the screen +*/ +local void DrawPixel24(SysColors color,int x,int y) +{ + VideoMemory24[x+y*VideoWidth]=Pixels24[color]; +} + /** ** Draw pixel unclipped into 32bit framebuffer. ** @@ -180,6 +192,22 @@ local void DrawPixelClip16(SysColors color,int x,int y) VideoMemory16[x+y*VideoWidth]=Pixels16[color]; } +/** +** Draw pixel clipped to current clip setting into 24bit framebuffer. +** +** @param color Color index. +** @param x x coordinate on the screen +** @param y y coordinate on the screen +*/ +local void DrawPixelClip24(SysColors color,int x,int y) +{ + // Clipping: + if( x<ClipX1 || x>=ClipX2 || y<ClipY1 || y>=ClipY2 ) { + return; + } + VideoMemory24[x+y*VideoWidth]=Pixels24[color]; +} + /** ** Draw pixel clipped to current clip setting into 32bit framebuffer. ** @@ -250,6 +278,31 @@ local void DrawHLine16(SysColors color,int x,int y,unsigned width) } } +/** +** Draw horizontal line unclipped into 24bit framebuffer. +** +** @param color Color index. +** @param x x coordinate on the screen +** @param y y coordinate on the screen +** @param width width of line. +*/ +local void DrawHLine24(SysColors color,int x,int y,unsigned width) +{ + VMemType24* p; + VMemType24* e; + int w; + VMemType24 f; + + w=VideoWidth; + p=VideoMemory24+y*w+x; + e=p+width; + f=Pixels24[color]; + + while( p<e ) { + *p++=f; + } +} + /** ** Draw horizontal line unclipped into 32bit framebuffer. ** @@ -341,6 +394,38 @@ local void DrawHLineClip16(SysColors color,int x,int y,unsigned width) DrawHLine16(color,x,y,width); } +/** +** Draw horizontal line clipped into 24bit framebuffer. +** +** @param color Color index. +** @param x x coordinate on the screen +** @param y y coordinate on the screen +** @param width width of line. +*/ +local void DrawHLineClip24(SysColors color,int x,int y,unsigned width) +{ + int f; + + if( y<ClipY1 || y>=ClipY2 ) { // Clipping: + return; + } + if( x<ClipX1 ) { + f=ClipX1-x; + x=ClipX1; + if( width<f ) { + return; + } + width-=f; + } + if( (x+width)>ClipX2 ) { + if( width<ClipX2-x ) { + return; + } + width=ClipX2-x; + } + + DrawHLine24(color,x,y,width); +} /** ** Draw horizontal line clipped into 32bit framebuffer. @@ -425,6 +510,31 @@ local void DrawVLine16(SysColors color,int x,int y,unsigned height) } } +/** +** Draw vertical line unclipped into 24bit framebuffer. +** +** @param color Color index. +** @param x x coordinate on the screen +** @param y y coordinate on the screen +** @param height height of line. +*/ +local void DrawVLine24(SysColors color,int x,int y,unsigned height) +{ + VMemType24* p; + VMemType24* e; + int w; + VMemType24 f; + + w=VideoWidth; + p=VideoMemory24+y*w+x; + e=p+height*w; + f=Pixels24[color]; + while( p<e ) { // FIXME: better + *p=f; + p+=w; + } +} + /** ** Draw vertical line unclipped into 32bit framebuffer. ** @@ -540,6 +650,53 @@ local void DrawVLineClip16(SysColors color,int x,int y,unsigned height) } } +/** +** Draw vertical line clipped into 24bit framebuffer. +** +** @param color Color index. +** @param x x coordinate on the screen +** @param y y coordinate on the screen +** @param height height of line. +*/ +local void DrawVLineClip24(SysColors color,int x,int y,unsigned height) +{ + VMemType24* p; + VMemType24* e; + int w; + int t; + VMemType24 f; + + // Clipping: + if( x<ClipX1 || x>=ClipX2 ) { + return; + } + if( y<ClipY1 ) { + t=ClipY1-y; + y=ClipY1; + if( height<t ) { + return; + } + height-=t; + } + if( (y+height)>ClipY2 ) { + if( height<ClipY2-y ) { + return; + } + height=ClipY2-y; + } + if( height>640 ) + abort(); + + w=VideoWidth; + p=VideoMemory24+y*w+x; + e=p+height*w; + f=Pixels24[color]; + while( p<e ) { + *p=f; + p+=w; + } +} + /** ** Draw vertical line clipped into 32bit framebuffer. ** @@ -651,6 +808,14 @@ global void InitLineDraw(void) break; case 24: + VideoDrawPixel=DrawPixel24; + VideoDrawPixelClip=DrawPixelClip24; + VideoDrawHLine=DrawHLine24; + VideoDrawHLineClip=DrawHLineClip24; + VideoDrawVLine=DrawVLine24; + VideoDrawVLineClip=DrawVLineClip24; + // FIXME: real 24bpp break; + case 32: VideoDrawPixel=DrawPixel32; VideoDrawPixelClip=DrawPixelClip32; diff --git a/src/video/sdl.cpp b/src/video/sdl.cpp index 1230e8e46..1cde05c2b 100644 --- a/src/video/sdl.cpp +++ b/src/video/sdl.cpp @@ -591,6 +591,8 @@ global VMemType* VideoCreateNewPalette(const Palette *palette) pixels=malloc(256*sizeof(VMemType16)); break; case 24: + //pixels=malloc(256*sizeof(VMemType24)); + //break; case 32: pixels=malloc(256*sizeof(VMemType32)); break; @@ -639,6 +641,11 @@ global VMemType* VideoCreateNewPalette(const Palette *palette) ((VMemType16*)pixels)[i]=SDL_MapRGB(Screen->format,r,g,b); break; case 24: + v=SDL_MapRGB(Screen->format,r,g,b); + ((VMemType24*)pixels)[i].a=v>>16; + ((VMemType24*)pixels)[i].b=v>> 8; + ((VMemType24*)pixels)[i].c=v>> 0; + //break; case 32: ((VMemType32*)pixels)[i]=SDL_MapRGB(Screen->format,r,g,b); break;