From db948a01094b0da8b9b554a65bffcd4a22527487 Mon Sep 17 00:00:00 2001
From: jsalmon3 <>
Date: Wed, 2 Apr 2003 04:14:11 +0000
Subject: [PATCH] Allow more than one filler

---
 src/editor/editloop.cpp    | 14 ++++++++++----
 src/include/freecraft.h    |  2 +-
 src/include/ui.h           | 11 ++++++-----
 src/stratagus/mainloop.cpp | 27 ++++++++++++++++++---------
 src/ui/script_ui.cpp       | 21 ++++++++++++++++-----
 src/ui/ui.cpp              | 20 +++++++++++++-------
 6 files changed, 64 insertions(+), 31 deletions(-)

diff --git a/src/editor/editloop.cpp b/src/editor/editloop.cpp
index becd6a339..61731aacf 100644
--- a/src/editor/editloop.cpp
+++ b/src/editor/editloop.cpp
@@ -868,6 +868,8 @@ local void ShowUnitInfo(const Unit* unit)
 */
 global void EditorUpdateDisplay(void)
 {
+    int i;
+
     VideoLockScreen();			// { prepare video write
 
     HideAnyCursor();			// remove cursor (when available)
@@ -940,11 +942,15 @@ global void EditorUpdateDisplay(void)
     }
 
     //
-    //  Filler
+    //  Fillers
     //
-    if (TheUI.Filler1.Graphic) {
-	VideoDrawSub(TheUI.Filler1.Graphic, 0, 0, TheUI.Filler1.Graphic->Width,
-	    TheUI.Filler1.Graphic->Height, TheUI.Filler1X, TheUI.Filler1Y);
+    for (i = 0; i < TheUI.NumFillers; ++i) {
+	if (TheUI.Filler[i].Graphic) {
+	    VideoDrawSub(TheUI.Filler[i].Graphic, 0, 0,
+		    TheUI.Filler[i].Graphic->Width,
+		    TheUI.Filler[i].Graphic->Height,
+		    TheUI.FillerX[i], TheUI.FillerY[i]);
+	}
     }
     //
     //  Status line
diff --git a/src/include/freecraft.h b/src/include/freecraft.h
index 43d0bbb30..518fe96c1 100644
--- a/src/include/freecraft.h
+++ b/src/include/freecraft.h
@@ -397,7 +397,7 @@ enum _must_redraw_flags_ {
     RedrawStatusLine	= 1<<14,	/// Statusline
     RedrawInfoPanel	= 1<<15,	/// Unit description
     RedrawButtonPanel	= 1<<16,	/// Unit buttons
-    RedrawFiller1	= 1<<17,	/// Filler1: Border on right side
+    RedrawFillers	= 1<<17,	/// Fillers
     RedrawMinimapBorder	= 1<<18,	/// Area around minimap
     RedrawCosts		= 1<<19,	/// Costs in status line
     RedrawMenuButton	= 1<<20,	/// Area above minimap
diff --git a/src/include/ui.h b/src/include/ui.h
index b7850d5f4..f292e8ad2 100644
--- a/src/include/ui.h
+++ b/src/include/ui.h
@@ -10,7 +10,7 @@
 //
 /**@name ui.h		-	The user interface header file. */
 //
-//	(c) Copyright 1999-2003 by Lutz Sammer
+//	(c) Copyright 1999-2003 by Lutz Sammer and Jimmy Salmon
 //
 //	FreeCraft is free software; you can redistribute it and/or modify
 //	it under the terms of the GNU General Public License as published
@@ -169,16 +169,17 @@ typedef struct _ui_ {
     char*	ReverseFontColor;	/// Color for reverse text displayed
 
     //	Fillers
-    GraphicConfig Filler1;		/// filler 1 graphic
-    int		Filler1X;		/// filler 1 X position
-    int		Filler1Y;		/// filler 1 Y position
+    GraphicConfig* Filler;		/// Filler graphics
+    int*	FillerX;		/// Filler X positions
+    int*	FillerY;		/// Filler Y positions
+    int		NumFillers;		/// Number of fillers
 
     //	Resource line
     GraphicConfig Resource;		/// Resource background
     int		ResourceX;		/// Resource X position
     int		ResourceY;		/// Resource Y position
 
-    int		OriginalResources;	/// original resource mode
+    int		OriginalResources;	/// Original resource mode
 
     struct {
 #if 0
diff --git a/src/stratagus/mainloop.cpp b/src/stratagus/mainloop.cpp
index f9855cfcb..ae2187103 100644
--- a/src/stratagus/mainloop.cpp
+++ b/src/stratagus/mainloop.cpp
@@ -456,10 +456,15 @@ global void UpdateDisplay(void)
 	DrawMessages();
     }
 
-    if( (MustRedraw&RedrawFiller1) && TheUI.Filler1.Graphic ) {
-	VideoDrawSub(TheUI.Filler1.Graphic,0,0
-		,TheUI.Filler1.Graphic->Width,TheUI.Filler1.Graphic->Height
-		,TheUI.Filler1X,TheUI.Filler1Y);
+    if( MustRedraw&RedrawFillers ) {
+	int i;
+
+	for( i=0; i<TheUI.NumFillers; ++i ) {
+	    VideoDrawSub(TheUI.Filler[i].Graphic,0,0
+		    ,TheUI.Filler[i].Graphic->Width
+		    ,TheUI.Filler[i].Graphic->Height
+		    ,TheUI.FillerX[i],TheUI.FillerY[i]);
+	}
     }
 
     if( MustRedraw&RedrawMenuButton ) {
@@ -529,11 +534,15 @@ global void UpdateDisplay(void)
 		    ,TheUI.MapArea.EndX-TheUI.MapArea.X+1
 		    ,TheUI.MapArea.EndY-TheUI.MapArea.Y+1);
 	}
-	if( (MustRedraw&RedrawFiller1) && TheUI.Filler1.Graphic ) {
-	    InvalidateAreaAndCheckCursor(
-		     TheUI.Filler1X,TheUI.Filler1Y
-		    ,TheUI.Filler1.Graphic->Width
-		    ,TheUI.Filler1.Graphic->Height);
+	if( MustRedraw&RedrawFillers ) {
+	    int i;
+
+	    for( i=0; i<TheUI.NumFillers; ++i ) {
+		InvalidateAreaAndCheckCursor(
+			 TheUI.FillerX[i],TheUI.FillerY[i]
+			,TheUI.Filler[i].Graphic->Width
+			,TheUI.Filler[i].Graphic->Height);
+	    }
 	}
 	if(MustRedraw&RedrawMenuButton ) {
 	    InvalidateAreaAndCheckCursor(
diff --git a/src/ui/script_ui.cpp b/src/ui/script_ui.cpp
index b4c7b0be3..8a92f1f26 100644
--- a/src/ui/script_ui.cpp
+++ b/src/ui/script_ui.cpp
@@ -629,10 +629,21 @@ local SCM CclDefineUI(SCM list)
     temp=gh_cdr(temp);
     y=gh_scm2int(value);
 
-    free(ui->Filler1.File);
-    ui->Filler1.File=str;
-    ui->Filler1X=x;
-    ui->Filler1Y=y;
+    for( i=0; i<ui->NumFillers; ++i ) {
+	free(ui->Filler[i].File);
+    }
+    free(ui->Filler);
+    free(ui->FillerX);
+    free(ui->FillerY);
+
+    ui->NumFillers=1;
+    ui->Filler=malloc(ui->NumFillers*sizeof(*ui->Filler));
+    ui->FillerX=malloc(ui->NumFillers*sizeof(*ui->FillerX));
+    ui->FillerY=malloc(ui->NumFillers*sizeof(*ui->FillerY));
+
+    ui->Filler[0].File=str;
+    ui->FillerX[0]=x;
+    ui->FillerY[0]=y;
 
     //	Resource
     temp=gh_car(list);
@@ -1338,7 +1349,7 @@ local SCM CclDefineNewUI(SCM list)
 	    value=gh_car(list);
 	    list=gh_cdr(list);
 	    ui->ReverseFontColor=gh_scm2newstr(value,NULL);
-	} else if( gh_eq_p(value,gh_symbol2scm("filler-1")) ) {
+	} else if( gh_eq_p(value,gh_symbol2scm("filler")) ) {
 	    value=gh_car(list);
 	    list=gh_cdr(list);
 	} else if( gh_eq_p(value,gh_symbol2scm("resources")) ) {
diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp
index df3de40e6..862d3b1bf 100644
--- a/src/ui/ui.cpp
+++ b/src/ui/ui.cpp
@@ -172,11 +172,13 @@ global void LoadUserInterface(void)
     //
     //	Load graphics
     //
-    if( TheUI.Filler1.File ) {
-	TheUI.Filler1.Graphic=LoadGraphic(TheUI.Filler1.File);
+    for( i=0; i<TheUI.NumFillers; ++i ) {
+	if( TheUI.Filler[i].File ) {
+	    TheUI.Filler[i].Graphic=LoadGraphic(TheUI.Filler[i].File);
 #ifdef USE_OPENGL
-	MakeTexture(TheUI.Filler1.Graphic,TheUI.Filler1.Graphic->Width,TheUI.Filler1.Graphic->Height);
+	    MakeTexture(TheUI.Filler[i].Graphic,TheUI.Filler[i].Graphic->Width,TheUI.Filler[i].Graphic->Height);
 #endif
+	}
     }
     if( TheUI.Resource.File ) {
 	TheUI.Resource.Graphic=LoadGraphic(TheUI.Resource.File);
@@ -308,7 +310,7 @@ local void OldSaveUi(FILE* file,const UI* ui)
 	    ui->Name,ui->Width,ui->Height);
     fprintf(file,"  ; Filler 1\n");
     fprintf(file,"  (list \"%s\" %d %d)\n",
-	    ui->Filler1.File,ui->Filler1X,ui->Filler1Y);
+	    ui->Filler[0].File,ui->FillerX[0],ui->FillerY[0]);
     fprintf(file,"  ; Resource line\n");
     fprintf(file,"  (list \"%s\" %d %d)\n",
 	    ui->Resource.File,ui->ResourceX,ui->ResourceY);
@@ -428,8 +430,10 @@ local void NewSaveUi(FILE * file, const UI * ui)
     fprintf(file, "  'normal-font-color %s 'reverse-font-color %s\n",
 	ui->NormalFontColor, ui->ReverseFontColor);
 
-    fprintf(file, "  'filler-1 '(pos (%d %d) image \"%s\")\n",
-	ui->Filler1X, ui->Filler1Y, ui->Filler1.File);
+    for( i=0; i<TheUI.NumFillers; ++i ) {
+	fprintf(file, "  'filler '(pos (%d %d) image \"%s\")\n",
+	    ui->FillerX[i], ui->FillerY[i], ui->Filler[i].File);
+    }
 
     fprintf(file, "  'resources '(pos (%d %d) image \"%s\"",
 	ui->ResourceX, ui->ResourceY, ui->Resource.File);
@@ -589,7 +593,9 @@ global void CleanUserInterface(void)
     //
     //	Free the graphics. FIXME: if they are shared this will crash.
     //
-    VideoSaveFree(TheUI.Filler1.Graphic);
+    for( i=0; i<TheUI.NumFillers; ++i ) {
+	VideoSaveFree(TheUI.Filler[i].Graphic);
+    }
     VideoSaveFree(TheUI.Resource.Graphic);
 
     for( i=0; i<MaxCosts; ++i ) {