diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c index 7caafcc66dc5a0752931af1808a7c80eb7cb551c..1c2c79dc632e1ca65dae0ead1213da21306a13ed 100644 --- a/src/conio/sdl_con.c +++ b/src/conio/sdl_con.c @@ -80,12 +80,13 @@ struct yuv_settings { int win_width; int win_height; int changed; + int best_format; SDL_Overlay *overlay; SDL_mutex *mutex; Uint8 colours[sizeof(dac_default)/sizeof(struct dac_colors)][3]; }; -static struct yuv_settings yuv={0,640,400,0,NULL,NULL}; +static struct yuv_settings yuv={0,640,400,0,0,NULL,NULL}; struct sdl_keyvals { int keysym @@ -352,7 +353,7 @@ packed: { for(x=0; x<r->w; x+=2) offset[x>>1]=colour; - offset+=overlay->pitches[0]; + offset+=overlay->pitches[0]>>2; } } return; @@ -1250,23 +1251,38 @@ void setup_surfaces(void) sdl.mutexV(yuv.mutex); sdl.FreeYUVOverlay(yuv.overlay); } - yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YUY2_OVERLAY, win); - if(!yuv.overlay->hw_overlay) { - sdl.FreeYUVOverlay(yuv.overlay); - yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_UYVY_OVERLAY, win); - if(!yuv.overlay->hw_overlay) { + if(yuv.best_format==0) { + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YUY2_OVERLAY, win); + if(yuv.overlay) + yuv.best_format=yuv.overlay->format; + if(yuv.overlay==NULL || !yuv.overlay->hw_overlay) { sdl.FreeYUVOverlay(yuv.overlay); - yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YVYU_OVERLAY, win); - if(!yuv.overlay->hw_overlay) { + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_UYVY_OVERLAY, win); + if(yuv.overlay) + yuv.best_format=yuv.overlay->format; + if(yuv.overlay==NULL || !yuv.overlay->hw_overlay) { sdl.FreeYUVOverlay(yuv.overlay); - yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YV12_OVERLAY, win); - if(!yuv.overlay->hw_overlay) { + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YVYU_OVERLAY, win); + if(yuv.overlay) + yuv.best_format=yuv.overlay->format; + if(yuv.overlay==NULL || !yuv.overlay->hw_overlay) { sdl.FreeYUVOverlay(yuv.overlay); - yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_IYUV_OVERLAY, win); + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_YV12_OVERLAY, win); + if(yuv.overlay) + yuv.best_format=yuv.overlay->format; + if(yuv.overlay==NULL || !yuv.overlay->hw_overlay) { + sdl.FreeYUVOverlay(yuv.overlay); + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, SDL_IYUV_OVERLAY, win); + if(yuv.overlay) + yuv.best_format=yuv.overlay->format; + } } } } + if(yuv.overlay) + sdl.FreeYUVOverlay(yuv.overlay); } + yuv.overlay=sdl.CreateYUVOverlay(char_width,char_height, yuv.best_format, win); sdl.mutexP(yuv.mutex); sdl.LockYUVOverlay(yuv.overlay); sdl_setup_yuv_colours();