changeset 15717:9801d1b69c4e draft

(svn r20384) -Fix: Update cursor dimensions when reloading grfs resp. changing base graphics, so the cursor does not glitch if it becomes bigger.
author frosch <frosch@openttd.org>
date Thu, 05 Aug 2010 19:23:19 +0000
parents e14bc18e6e9b
children 86def847782e
files src/gfx.cpp src/gfx_func.h src/gfxinit.cpp
diffstat 3 files changed, 36 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -1775,22 +1775,37 @@
 	return true;
 }
 
-static void SetCursorSprite(CursorID cursor, PaletteID pal)
+/**
+ * Update cursor dimension.
+ * Called when changing cursor sprite resp. reloading grfs.
+ */
+void UpdateCursorSize()
 {
 	CursorVars *cv = &_cursor;
-	const Sprite *p;
-
-	if (cv->sprite == cursor) return;
+	const Sprite *p = GetSprite(GB(cv->sprite, 0, SPRITE_WIDTH), ST_NORMAL);
 
-	p = GetSprite(GB(cursor, 0, SPRITE_WIDTH), ST_NORMAL);
-	cv->sprite = cursor;
-	cv->pal    = pal;
 	cv->size.y = p->height;
 	cv->size.x = p->width;
 	cv->offs.x = p->x_offs;
 	cv->offs.y = p->y_offs;
 
 	cv->dirty = true;
+}
+
+/**
+ * Switch cursor to different sprite.
+ * @param cursor Sprite to draw for the cursor.
+ * @param pal Palette to use for recolouring.
+ */
+static void SetCursorSprite(CursorID cursor, PaletteID pal)
+{
+	CursorVars *cv = &_cursor;
+	if (cv->sprite == cursor) return;
+
+	cv->sprite = cursor;
+	cv->pal    = pal;
+	UpdateCursorSize();
+
 	cv->short_vehicle_offset = 0;
 }
 
@@ -1813,6 +1828,12 @@
 	}
 }
 
+/**
+ * Assign a single non-animated sprite to the cursor.
+ * @param sprite Sprite to draw for the cursor.
+ * @param pal Palette to use for recolouring.
+ * @see SetAnimatedMouseCursor
+ */
 void SetMouseCursor(CursorID sprite, PaletteID pal)
 {
 	/* Turn off animation */
@@ -1821,6 +1842,11 @@
 	SetCursorSprite(sprite, pal);
 }
 
+/**
+ * Assign an animation to the cursor.
+ * @param table Array of animation states.
+ * @see SetMouseCursor
+ */
 void SetAnimatedMouseCursor(const AnimCursor *table)
 {
 	_cursor.animate_list = table;
--- a/src/gfx_func.h
+++ b/src/gfx_func.h
@@ -159,6 +159,7 @@
 void SetMouseCursor(CursorID cursor, PaletteID pal);
 void SetAnimatedMouseCursor(const AnimCursor *table);
 void CursorTick();
+void UpdateCursorSize();
 bool ChangeResInGame(int w, int h);
 void SortResolutions(int count);
 bool ToggleFullScreen(bool fs);
--- a/src/gfxinit.cpp
+++ b/src/gfxinit.cpp
@@ -207,6 +207,8 @@
 	GfxInitSpriteMem();
 	LoadSpriteTables();
 	GfxInitPalettes();
+
+	UpdateCursorSize();
 }
 
 bool GraphicsSet::FillSetDetails(IniFile *ini, const char *path, const char *full_filename)