mirror of
https://github.com/yawut/SDL.git
synced 2026-04-11 03:28:41 -05:00
Bugfixes: some info about current framebuffer overwritten by some default values, and screen width must be multiple of 16 pixels to work correctly
This commit is contained in:
parent
150e133b96
commit
08f8a081ea
|
|
@ -63,7 +63,7 @@ static char rcsid =
|
|||
|
||||
/* Defines */
|
||||
|
||||
/*#define DEBUG_VIDEO_GEM 1*/
|
||||
#define DEBUG_VIDEO_GEM 0
|
||||
|
||||
#define GEM_VID_DRIVER_NAME "gem"
|
||||
|
||||
|
|
@ -217,6 +217,7 @@ static void VDI_ReadExtInfo(_THIS, short *work_out)
|
|||
VDI_pitch = work_out[5];
|
||||
VDI_screen = (void *) *((unsigned long *) &work_out[6]);
|
||||
|
||||
#if 0 /* lecoat */
|
||||
switch(num_colours) {
|
||||
case 32768UL:
|
||||
if (work_out[14] & (1<<7)) {
|
||||
|
|
@ -268,6 +269,7 @@ static void VDI_ReadExtInfo(_THIS, short *work_out)
|
|||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
switch(clut_type) {
|
||||
|
|
@ -284,7 +286,7 @@ static void VDI_ReadExtInfo(_THIS, short *work_out)
|
|||
}
|
||||
break;
|
||||
case VDI_CLUT_SOFTWARE:
|
||||
if (EdDI_version < EDDI_11) {
|
||||
/* lecoat if (EdDI_version < EDDI_11) */ {
|
||||
int component; /* red, green, blue, alpha, overlay */
|
||||
int num_bit;
|
||||
unsigned short *tmp_p;
|
||||
|
|
@ -454,15 +456,27 @@ int GEM_VideoInit(_THIS, SDL_PixelFormat *vformat)
|
|||
GEM_win_fulled = SDL_FALSE;
|
||||
|
||||
VDI_screen = NULL;
|
||||
#if 1 /* lecoat */
|
||||
VDI_pitch = VDI_w * VDI_pixelsize;
|
||||
VDI_format = ( (VDI_bpp <= 8) ? VDI_FORMAT_INTER : VDI_FORMAT_PACK);
|
||||
VDI_redmask = VDI_greenmask = VDI_bluemask = VDI_alphamask = 0;
|
||||
VDI_ReadExtInfo(this, work_out);
|
||||
#else
|
||||
VDI_ReadExtInfo(this, work_out);
|
||||
if (VDI_screen == NULL) {
|
||||
VDI_pitch = VDI_w * VDI_pixelsize;
|
||||
VDI_format = VDI_FORMAT_PACK;
|
||||
if (VDI_bpp <= 8) {
|
||||
VDI_format = VDI_FORMAT_INTER;
|
||||
}
|
||||
VDI_format = ( (VDI_bpp <= 8) ? VDI_FORMAT_INTER : VDI_FORMAT_PACK);
|
||||
VDI_redmask = VDI_greenmask = VDI_bluemask = VDI_alphamask = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_VIDEO_GEM
|
||||
printf("sdl:video:gem: screen: address=0x%08x, pitch=%d\n", VDI_screen, VDI_pitch);
|
||||
printf("sdl:video:gem: format=%d\n", VDI_format);
|
||||
printf("sdl:video:gem: masks: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
|
||||
VDI_alphamask, VDI_redmask, VDI_greenmask, VDI_bluemask
|
||||
);
|
||||
#endif
|
||||
|
||||
/* Setup destination mfdb */
|
||||
VDI_dst_mfdb.fd_addr = NULL;
|
||||
|
|
@ -598,6 +612,11 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
maxheight=GEM_desk_h;
|
||||
}
|
||||
|
||||
/* width must be multiple of 16, for vro_cpyfm() and c2p_convert() */
|
||||
if ((width & -16) != 0) {
|
||||
width = (width | 15) +1;
|
||||
}
|
||||
|
||||
if ((maxwidth < width) || (maxheight < height) || (VDI_bpp != bpp)) {
|
||||
SDL_SetError("Couldn't find requested mode in list");
|
||||
return(NULL);
|
||||
|
|
@ -611,6 +630,10 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
|
||||
screensize = width * height * VDI_pixelsize;
|
||||
|
||||
#ifdef DEBUG_VIDEO_GEM
|
||||
printf("sdl:video:gem: setvideomode(): %dx%dx%d = %d\n", width, height, bpp, screensize);
|
||||
#endif
|
||||
|
||||
/*--- Allocate shadow buffers if needed, and conversion operations ---*/
|
||||
GEM_bufops=0;
|
||||
use_shadow1=use_shadow2=SDL_FALSE;
|
||||
|
|
@ -730,7 +753,7 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
current->h = height;
|
||||
if (use_shadow1) {
|
||||
current->pixels = GEM_buffer1;
|
||||
current->pitch = width * (VDI_bpp >> 3);
|
||||
current->pitch = width * VDI_pixelsize;
|
||||
} else {
|
||||
current->pixels = VDI_screen;
|
||||
current->pixels += VDI_pitch * ((VDI_h - height) >> 1);
|
||||
|
|
@ -738,6 +761,10 @@ SDL_Surface *GEM_SetVideoMode(_THIS, SDL_Surface *current,
|
|||
current->pitch = VDI_pitch;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_VIDEO_GEM
|
||||
printf("sdl:video:gem: surface: %dx%d\n", current->w, current->h);
|
||||
#endif
|
||||
|
||||
this->UpdateRects = GEM_UpdateRects;
|
||||
|
||||
/* We're done */
|
||||
|
|
@ -766,9 +793,14 @@ static void GEM_UnlockHWSurface(_THIS, SDL_Surface *surface)
|
|||
static void GEM_UpdateRectsFullscreen(_THIS, int numrects, SDL_Rect *rects)
|
||||
{
|
||||
SDL_Surface *surface;
|
||||
int i;
|
||||
int i, surf_width;
|
||||
|
||||
surface = this->screen;
|
||||
/* Need to be a multiple of 16 pixels */
|
||||
surf_width=surface->w;
|
||||
if ((surf_width & -16) != 0) {
|
||||
surf_width = (surf_width | 15) + 1;
|
||||
}
|
||||
|
||||
if (GEM_bufops & (B2S_C2P_1TO2|B2S_C2P_1TOS)) {
|
||||
void *destscr;
|
||||
|
|
@ -779,7 +811,7 @@ static void GEM_UpdateRectsFullscreen(_THIS, int numrects, SDL_Rect *rects)
|
|||
|
||||
destscr = VDI_screen;
|
||||
destscr += VDI_pitch * ((VDI_h - surface->h) >> 1);
|
||||
destx = (VDI_w - surface->w) >> 1;
|
||||
destx = (VDI_w - surf_width) >> 1;
|
||||
destx &= ~15;
|
||||
destscr += destx;
|
||||
destpitch = VDI_pitch;
|
||||
|
|
@ -820,9 +852,9 @@ static void GEM_UpdateRectsFullscreen(_THIS, int numrects, SDL_Rect *rects)
|
|||
short blitcoords[8];
|
||||
|
||||
mfdb_src.fd_addr=surface->pixels;
|
||||
mfdb_src.fd_w=surface->w;
|
||||
mfdb_src.fd_w=surf_width;
|
||||
mfdb_src.fd_h=surface->h;
|
||||
mfdb_src.fd_wdwidth=(surface->w) >> 4;
|
||||
mfdb_src.fd_wdwidth=mfdb_src.fd_w >> 4;
|
||||
mfdb_src.fd_nplanes=surface->format->BitsPerPixel;
|
||||
mfdb_src.fd_stand=
|
||||
mfdb_src.fd_r1=
|
||||
|
|
@ -882,6 +914,14 @@ static void GEM_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
|
|||
|
||||
static int GEM_FlipHWSurfaceFullscreen(_THIS, SDL_Surface *surface)
|
||||
{
|
||||
int surf_width;
|
||||
|
||||
/* Need to be a multiple of 16 pixels */
|
||||
surf_width=surface->w;
|
||||
if ((surf_width & -16) != 0) {
|
||||
surf_width = (surf_width | 15) + 1;
|
||||
}
|
||||
|
||||
if (GEM_bufops & (B2S_C2P_1TO2|B2S_C2P_1TOS)) {
|
||||
void *destscr;
|
||||
int destpitch;
|
||||
|
|
@ -891,7 +931,7 @@ static int GEM_FlipHWSurfaceFullscreen(_THIS, SDL_Surface *surface)
|
|||
|
||||
destscr = VDI_screen;
|
||||
destscr += VDI_pitch * ((VDI_h - surface->h) >> 1);
|
||||
destx = (VDI_w - surface->w) >> 1;
|
||||
destx = (VDI_w - surf_width) >> 1;
|
||||
destx &= ~15;
|
||||
destscr += destx;
|
||||
destpitch = VDI_pitch;
|
||||
|
|
@ -902,7 +942,7 @@ static int GEM_FlipHWSurfaceFullscreen(_THIS, SDL_Surface *surface)
|
|||
|
||||
SDL_Atari_C2pConvert(
|
||||
surface->pixels, destscr,
|
||||
surface->w, surface->h,
|
||||
surf_width, surface->h,
|
||||
SDL_FALSE,
|
||||
surface->pitch, destpitch
|
||||
);
|
||||
|
|
@ -912,9 +952,9 @@ static int GEM_FlipHWSurfaceFullscreen(_THIS, SDL_Surface *surface)
|
|||
MFDB mfdb_src;
|
||||
short blitcoords[8];
|
||||
|
||||
mfdb_src.fd_w=surface->w;
|
||||
mfdb_src.fd_w=surf_width;
|
||||
mfdb_src.fd_h=surface->h;
|
||||
mfdb_src.fd_wdwidth=(surface->w) >> 4;
|
||||
mfdb_src.fd_wdwidth=mfdb_src.fd_w >> 4;
|
||||
mfdb_src.fd_nplanes=surface->format->BitsPerPixel;
|
||||
mfdb_src.fd_stand=
|
||||
mfdb_src.fd_r1=
|
||||
|
|
@ -1084,7 +1124,7 @@ void GEM_wind_redraw(_THIS, int winhandle, short *inside)
|
|||
|
||||
v_show_c(VDI_handle,1);
|
||||
|
||||
#if DEBUG_VIDEO_GEM
|
||||
#if 0 /*DEBUG_VIDEO_GEM*/
|
||||
fflush(stdout);
|
||||
#endif
|
||||
}
|
||||
|
|
@ -1136,7 +1176,7 @@ static void refresh_window(_THIS, int winhandle, short *rect)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_VIDEO_GEM
|
||||
#if DEBUG_VIDEO_GEM
|
||||
printf("sdl:video:gem: clip(0,0,%d,%d) to (%d,%d,%d,%d)\n",
|
||||
surface->w-1,surface->h-1, dst_rect[0],dst_rect[1],dst_rect[2],dst_rect[3]);
|
||||
printf("sdl:video:gem: icon(%d,%d,%d,%d)\n",
|
||||
|
|
@ -1165,7 +1205,7 @@ static void refresh_window(_THIS, int winhandle, short *rect)
|
|||
} else {
|
||||
surface = this->screen;
|
||||
|
||||
#ifdef DEBUG_VIDEO_GEM
|
||||
#if DEBUG_VIDEO_GEM
|
||||
printf("sdl:video:gem: refresh_window(): draw frame buffer\n");
|
||||
#endif
|
||||
|
||||
|
|
@ -1208,7 +1248,16 @@ static void refresh_window(_THIS, int winhandle, short *rect)
|
|||
}
|
||||
|
||||
mfdb_src.fd_addr=surface->pixels;
|
||||
mfdb_src.fd_w=surface->w;
|
||||
{
|
||||
int width;
|
||||
|
||||
/* Need to be a multiple of 16 pixels */
|
||||
width=surface->w;
|
||||
if ((width & -16) != 0) {
|
||||
width = (width | 15) + 1;
|
||||
}
|
||||
mfdb_src.fd_w=width;
|
||||
}
|
||||
mfdb_src.fd_h=surface->h;
|
||||
mfdb_src.fd_nplanes=surface->format->BitsPerPixel;
|
||||
mfdb_src.fd_wdwidth=mfdb_src.fd_w>>4;
|
||||
|
|
@ -1221,8 +1270,9 @@ static void refresh_window(_THIS, int winhandle, short *rect)
|
|||
mfdb_src.fd_addr=GEM_buffer2;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_VIDEO_GEM
|
||||
printf("sdl:video:gem: redraw (%d,%d,%d,%d) to (%d,%d,%d,%d)\n",
|
||||
#if DEBUG_VIDEO_GEM
|
||||
printf("sdl:video:gem: redraw %dx%d: (%d,%d,%d,%d) to (%d,%d,%d,%d)\n",
|
||||
surface->w, surface->h,
|
||||
pxy[0],pxy[1],pxy[2],pxy[3],
|
||||
pxy[4],pxy[5],pxy[6],pxy[7]
|
||||
);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user