@ -1363,8 +1363,8 @@ void DrawMouseCursor()
/* Draw cursor on screen */
_cur_dpi = & _screen ;
for ( uint i = 0 ; i < _cursor . sprite_count ; + + i ) {
DrawSprite ( _cursor. sprite_seq [ i ] . sprite , _cursor . sprite_seq [ i ] . pal , _cursor . pos . x + _ cur sor . sprite_ pos[i ] .x , _cursor . pos . y + _ cur sor . sprite_ pos[ i ] . y ) ;
for ( const auto & cs : _cursor . sprites ) {
DrawSprite ( cs. image . sprite , cs . image . pal , _cursor . pos . x + cs. pos .x , _cursor . pos . y + cs. pos. y ) ;
}
VideoDriver : : GetInstance ( ) - > MakeDirty ( _cursor . draw_pos . x , _cursor . draw_pos . y , _cursor . draw_size . x , _cursor . draw_size . y ) ;
@ -1615,20 +1615,22 @@ void UpdateCursorSize()
/* Ignore setting any cursor before the sprites are loaded. */
if ( GetMaxSpriteID ( ) = = 0 ) return ;
static_assert ( lengthof ( _cursor . sprite_seq ) = = lengthof ( _cursor . sprite_pos ) ) ;
assert ( _cursor . sprite_count < = lengthof ( _cursor . sprite_seq ) ) ;
for ( uint i = 0 ; i < _cursor . sprite_count ; + + i ) {
const Sprite * p = GetSprite ( GB ( _cursor . sprite_seq [ i ] . sprite , 0 , SPRITE_WIDTH ) , SpriteType : : Normal ) ;
bool first = true ;
for ( const auto & cs : _cursor . sprites ) {
const Sprite * p = GetSprite ( GB ( cs . image . sprite , 0 , SPRITE_WIDTH ) , SpriteType : : Normal ) ;
Point offs , size ;
offs . x = UnScaleGUI ( p - > x_offs ) + _ cur sor . sprite_ pos[ i ] . x ;
offs . y = UnScaleGUI ( p - > y_offs ) + _ cur sor . sprite_ pos[ i ] . y ;
offs . x = UnScaleGUI ( p - > x_offs ) + cs. pos. x ;
offs . y = UnScaleGUI ( p - > y_offs ) + cs. pos. y ;
size . x = UnScaleGUI ( p - > width ) ;
size . y = UnScaleGUI ( p - > height ) ;
if ( i = = 0 ) {
if ( first ) {
/* First sprite sets the total. */
_cursor . total_offs = offs ;
_cursor . total_size = size ;
first = false ;
} else {
/* Additional sprites expand the total. */
int right = std : : max ( _cursor . total_offs . x + _cursor . total_size . x , offs . x + size . x ) ;
int bottom = std : : max ( _cursor . total_offs . y + _cursor . total_size . y , offs . y + size . y ) ;
if ( offs . x < _cursor . total_offs . x ) _cursor . total_offs . x = offs . x ;
@ -1648,13 +1650,10 @@ void UpdateCursorSize()
*/
static void SetCursorSprite ( CursorID cursor , PaletteID pal )
{
if ( _cursor . sprite _count = = 1 & & _cursor . sprite _ seq [ 0 ] . sprite = = cursor & & _cursor . sprite _ seq [ 0 ] . pal = = pal ) return ;
if ( _cursor . sprite s. size ( ) = = 1 & & _cursor . sprite s[ 0 ] . image . sprite = = cursor & & _cursor . sprite s[ 0 ] . image . pal = = pal ) return ;
_cursor . sprite_count = 1 ;
_cursor . sprite_seq [ 0 ] . sprite = cursor ;
_cursor . sprite_seq [ 0 ] . pal = pal ;
_cursor . sprite_pos [ 0 ] . x = 0 ;
_cursor . sprite_pos [ 0 ] . y = 0 ;
_cursor . sprites . clear ( ) ;
_cursor . sprites . emplace_back ( cursor , pal , 0 , 0 ) ;
UpdateCursorSize ( ) ;
}
@ -1665,7 +1664,8 @@ static void SwitchAnimatedCursor()
if ( cur = = nullptr | | cur - > sprite = = AnimCursor : : LAST ) cur = _cursor . animate_list ;
SetCursorSprite ( cur - > sprite , _cursor . sprite_seq [ 0 ] . pal ) ;
assert ( ! _cursor . sprites . empty ( ) ) ;
SetCursorSprite ( cur - > sprite , _cursor . sprites [ 0 ] . image . pal ) ;
_cursor . animate_timeout = cur - > display_time ;
_cursor . animate_cur = cur + 1 ;
@ -1684,10 +1684,11 @@ void CursorTick()
*/
void SetMouseCursorBusy ( bool busy )
{
assert ( ! _cursor . sprites . empty ( ) ) ;
if ( busy ) {
if ( _cursor . sprite _ seq [ 0 ] . sprite = = SPR_CURSOR_MOUSE ) SetMouseCursor ( SPR_CURSOR_ZZZ , PAL_NONE ) ;
if ( _cursor . sprite s[ 0 ] . image . sprite = = SPR_CURSOR_MOUSE ) SetMouseCursor ( SPR_CURSOR_ZZZ , PAL_NONE ) ;
} else {
if ( _cursor . sprite _ seq [ 0 ] . sprite = = SPR_CURSOR_ZZZ ) SetMouseCursor ( SPR_CURSOR_MOUSE , PAL_NONE ) ;
if ( _cursor . sprite s[ 0 ] . image . sprite = = SPR_CURSOR_ZZZ ) SetMouseCursor ( SPR_CURSOR_MOUSE , PAL_NONE ) ;
}
}
@ -1712,9 +1713,10 @@ void SetMouseCursor(CursorID sprite, PaletteID pal)
*/
void SetAnimatedMouseCursor ( const AnimCursor * table )
{
assert ( ! _cursor . sprites . empty ( ) ) ;
_cursor . animate_list = table ;
_cursor . animate_cur = nullptr ;
_cursor . sprite _ seq [ 0 ] . pal = PAL_NONE ;
_cursor . sprite s[ 0 ] . image . pal = PAL_NONE ;
SwitchAnimatedCursor ( ) ;
}