@ -37,49 +37,77 @@ static struct {
void * handle ;
int ( * Init ) ( Uint32 flags ) ;
void ( * Quit ) ( void ) ;
SDL_Surface * ( * SetVideoMode ) ( int width , int height , int bpp , Uint32 flags ) ;
void ( * WM_SetCaption ) ( const char * title , const char * icon ) ;
int ( * ShowCursor ) ( int toggle ) ;
int ( * LockSurface ) ( SDL_Surface * surface ) ;
void ( * UnlockSurface ) ( SDL_Surface * surface ) ;
# if HAVE_SDL == 1
void ( * GetRGB ) ( Uint32 pixel , const SDL_PixelFormat * const fmt , Uint8 * r , Uint8 * g , Uint8 * b ) ;
Uint32 ( * MapRGB ) ( const SDL_PixelFormat * const format , const Uint8 r , const Uint8 g , const Uint8 b ) ;
SDL_Surface * ( * SetVideoMode ) ( int width , int height , int bpp , Uint32 flags ) ;
void ( * WM_SetCaption ) ( const char * title , const char * icon ) ;
void ( * UpdateRect ) ( SDL_Surface * screen , Sint32 x , Sint32 y , Uint32 w , Uint32 h ) ;
# else
void ( * GetRGB ) ( Uint32 pixel , const SDL_PixelFormat * fmt , Uint8 * r , Uint8 * g , Uint8 * b ) ;
Uint32 ( * MapRGB ) ( const SDL_PixelFormat * format , Uint8 r , Uint8 g , Uint8 b ) ;
SDL_Window * ( * CreateWindow ) ( const char * title , int x , int y , int w , int h , Uint32 flags ) ;
SDL_Surface * ( * GetWindowSurface ) ( SDL_Window * window ) ;
SDL_PixelFormat * ( * AllocFormat ) ( Uint32 pixel_format ) ;
int ( * UpdateWindowSurfaceRects ) ( SDL_Window * window , const SDL_Rect * rects , int numrects ) ;
# endif
} sdl ;
static const char * const sdl_syms [ ] =
{
" SDL_Init " ,
" SDL_Quit " ,
" SDL_SetVideoMode " ,
" SDL_WM_SetCaption " ,
" SDL_ShowCursor " ,
" SDL_LockSurface " ,
" SDL_UnlockSurface " ,
" SDL_GetRGB " ,
" SDL_MapRGB " ,
# if HAVE_SDL == 1
" SDL_SetVideoMode " ,
" SDL_WM_SetCaption " ,
" SDL_UpdateRect " ,
# else
" SDL_CreateWindow " ,
" SDL_GetWindowSurface " ,
" SDL_AllocFormat " ,
" SDL_UpdateWindowSurfaceRects " ,
# endif
} ;
struct gui_state {
# if HAVE_SDL == 2
SDL_Window * window ;
# endif
SDL_Surface * screen ;
const SDL_PixelFormat * format ;
int throttle , throttle_limit ;
enum gui_color color ;
int bytes_per_pixel ;
int curr_line ;
} ;
static const char bfin_gui_window_title [ ] = " Blackfin GNU Simulator " ;
/* Load the SDL lib on the fly to avoid hard linking against it. */
static int
bfin_gui_sdl_setup ( void )
{
static const char libsdl_soname [ ] =
# if HAVE_SDL == 1
" libSDL-1.2.so.0 " ;
# else
" libSDL2-2.0.so.0 " ;
# endif
int i ;
uintptr_t * * funcs ;
if ( sdl . handle )
return 0 ;
sdl . handle = dlopen ( " libSDL-1.2.so.0 " , RTLD_LAZY ) ;
sdl . handle = dlopen ( libsdl_soname , RTLD_LAZY ) ;
if ( sdl . handle = = NULL )
return - 1 ;
@ -98,7 +126,8 @@ bfin_gui_sdl_setup (void)
return 0 ;
}
static const SDL_PixelFormat * bfin_gui_color_format ( enum gui_color color ) ;
static const SDL_PixelFormat * bfin_gui_color_format ( enum gui_color color ,
int * bytes_per_pixel ) ;
void *
bfin_gui_setup ( void * state , int enabled , int width , int height ,
@ -118,16 +147,29 @@ bfin_gui_setup (void *state, int enabled, int width, int height,
goto error ;
gui - > color = color ;
gui - > format = bfin_gui_color_format ( gui - > color ) ;
gui - > format = bfin_gui_color_format ( gui - > color , & gui - > bytes_per_pixel ) ;
# if HAVE_SDL == 1
sdl . WM_SetCaption ( bfin_gui_window_title , NULL ) ;
gui - > screen = sdl . SetVideoMode ( width , height , 32 ,
SDL_ANYFORMAT | SDL_HWSURFACE ) ;
# else
gui - > window = sdl . CreateWindow (
bfin_gui_window_title , SDL_WINDOWPOS_CENTERED ,
SDL_WINDOWPOS_CENTERED , width , height , 0 ) ;
if ( ! gui - > window )
{
sdl . Quit ( ) ;
goto error ;
}
gui - > screen = sdl . GetWindowSurface ( gui - > window ) ;
# endif
if ( ! gui - > screen )
{
sdl . Quit ( ) ;
goto error ;
}
sdl . WM_SetCaption ( " GDB Blackfin Simulator " , NULL ) ;
sdl . ShowCursor ( 0 ) ;
gui - > curr_line = 0 ;
gui - > throttle = 0 ;
@ -153,7 +195,10 @@ bfin_gui_setup (void *state, int enabled, int width, int height,
static int
SDL_ConvertBlitLineFrom ( const Uint8 * src , const SDL_PixelFormat * const format ,
SDL_Surface * dst , int dsty )
# if HAVE_SDL == 2
SDL_Window * win ,
# endif
SDL_Surface * dst , int dsty , int bytes_per_pixel )
{
Uint8 r , g , b ;
Uint32 * pixels ;
@ -170,7 +215,7 @@ SDL_ConvertBlitLineFrom (const Uint8 *src, const SDL_PixelFormat * const format,
{
/* Exract the packed source pixel; RGB or BGR. */
Uint32 pix = 0 ;
for ( j = 0 ; j < format - > BytesPerP ixel; + + j )
for ( j = 0 ; j < bytes_per_p ixel; + + j )
if ( format - > Rshift )
pix = ( pix < < 8 ) | src [ j ] ;
else
@ -181,13 +226,26 @@ SDL_ConvertBlitLineFrom (const Uint8 *src, const SDL_PixelFormat * const format,
/* Translate into the screen pixel format. */
* pixels + + = sdl . MapRGB ( dst - > format , r , g , b ) ;
src + = format - > BytesPerP ixel;
src + = bytes_per_p ixel;
}
if ( SDL_MUSTLOCK ( dst ) )
sdl . UnlockSurface ( dst ) ;
# if HAVE_SDL == 1
sdl . UpdateRect ( dst , 0 , dsty , dst - > w , 1 ) ;
# else
{
SDL_Rect rect = {
. x = 0 ,
. y = dsty ,
. w = dst - > w ,
. h = 1 ,
} ;
sdl . UpdateWindowSurfaceRects ( win , & rect , 1 ) ;
}
# endif
return 0 ;
}
@ -206,8 +264,12 @@ bfin_gui_update (void *state, const void *source, unsigned nr_bytes)
if ( gui - > throttle )
return 0 ;
ret = SDL_ConvertBlitLineFrom ( source , gui - > format , gui - > screen ,
gui - > curr_line ) ;
ret = SDL_ConvertBlitLineFrom ( source , gui - > format ,
# if HAVE_SDL == 2
gui - > window ,
# endif
gui - > screen , gui - > curr_line ,
gui - > bytes_per_pixel ) ;
if ( ret )
return 0 ;
@ -216,6 +278,8 @@ bfin_gui_update (void *state, const void *source, unsigned nr_bytes)
return nr_bytes ;
}
# if HAVE_SDL == 1
# define FMASK(cnt, shift) (((1 << (cnt)) - 1) << (shift))
# define _FORMAT(bpp, rcnt, gcnt, bcnt, acnt, rsh, gsh, bsh, ash) \
NULL , bpp , ( bpp ) / 8 , 8 - ( rcnt ) , 8 - ( gcnt ) , 8 - ( bcnt ) , 8 - ( acnt ) , rsh , gsh , bsh , ash , \
@ -228,33 +292,52 @@ static const SDL_PixelFormat sdl_rgb_565 =
{
FORMAT ( 5 , 6 , 5 , 0 , 11 , 5 , 0 , 0 )
} ;
# define SDL_PIXELFORMAT_RGB565 &sdl_rgb_565
static const SDL_PixelFormat sdl_bgr_565 =
{
FORMAT ( 5 , 6 , 5 , 0 , 0 , 5 , 11 , 0 )
} ;
# define SDL_PIXELFORMAT_BGR565 &sdl_bgr_565
static const SDL_PixelFormat sdl_rgb_888 =
{
FORMAT ( 8 , 8 , 8 , 0 , 16 , 8 , 0 , 0 )
} ;
# define SDL_PIXELFORMAT_RGB888 &sdl_rgb_888
static const SDL_PixelFormat sdl_bgr_888 =
{
FORMAT ( 8 , 8 , 8 , 0 , 0 , 8 , 16 , 0 )
} ;
# define SDL_PIXELFORMAT_BGR888 &sdl_bgr_888
static const SDL_PixelFormat sdl_rgba_8888 =
{
FORMAT ( 8 , 8 , 8 , 8 , 24 , 16 , 8 , 0 )
} ;
# define SDL_PIXELFORMAT_RGBA8888 &sdl_rgba_8888
# endif
static const struct {
const char * name ;
/* Since we declare the pixel formats above for SDL 1, we have the bpp
setting , but SDL 2 internally uses larger values for its own memory , so
we can ' t assume the Blackfin pixel format sizes always match SDL . */
int bytes_per_pixel ;
# if HAVE_SDL == 1
const SDL_PixelFormat * format ;
# else
Uint32 format ;
# endif
enum gui_color color ;
} color_spaces [ ] = {
{ " rgb565 " , & sdl_rgb_565 , GUI_COLOR_RGB_565 , } ,
{ " bgr565 " , & sdl_bgr_565 , GUI_COLOR_BGR_565 , } ,
{ " rgb888 " , & sdl_rgb_ 888, GUI_COLOR_RGB_888 , } ,
{ " bgr888 " , & sdl_bgr_ 888, GUI_COLOR_BGR_888 , } ,
{ " rgba8888 " , & sdl_rgba_ 8888, GUI_COLOR_RGBA_8888 , } ,
{ " rgb565 " , 2 , SDL_PIXELFORMAT_RGB 565, GUI_COLOR_RGB_565 , } ,
{ " bgr565 " , 2 , SDL_PIXELFORMAT_BGR 565, GUI_COLOR_BGR_565 , } ,
{ " rgb888 " , 3 , SDL_PIXELFORMAT_RGB 888, GUI_COLOR_RGB_888 , } ,
{ " bgr888 " , 3 , SDL_PIXELFORMAT_BGR 888, GUI_COLOR_BGR_888 , } ,
{ " rgba8888 " , 4 , SDL_PIXELFORMAT_RGBA 8888, GUI_COLOR_RGBA_8888 , } ,
} ;
enum gui_color bfin_gui_color ( const char * color )
@ -273,21 +356,31 @@ enum gui_color bfin_gui_color (const char *color)
return GUI_COLOR_RGB_888 ;
}
static const SDL_PixelFormat * bfin_gui_color_format ( enum gui_color color )
static const SDL_PixelFormat * bfin_gui_color_format ( enum gui_color color ,
int * bytes_per_pixel )
{
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( color_spaces ) ; + + i )
if ( color = = color_spaces [ i ] . color )
return color_spaces [ i ] . format ;
{
* bytes_per_pixel = color_spaces [ i ] . bytes_per_pixel ;
# if HAVE_SDL == 1
return color_spaces [ i ] . format ;
# else
return sdl . AllocFormat ( color_spaces [ i ] . format ) ;
# endif
}
return NULL ;
}
int bfin_gui_color_depth ( enum gui_color color )
{
const SDL_PixelFormat * format = bfin_gui_color_format ( color ) ;
return format ? format - > BitsPerPixel : 0 ;
int bytes_per_pixel ;
const SDL_PixelFormat * format = bfin_gui_color_format ( color ,
& bytes_per_pixel ) ;
return format ? bytes_per_pixel * 8 : 0 ;
}
# endif